diff options
author | rsc <rsc> | 2006-09-06 17:04:06 +0000 |
---|---|---|
committer | rsc <rsc> | 2006-09-06 17:04:06 +0000 |
commit | a650c606fecc7e3938345e2bc52050a9ea725e7a (patch) | |
tree | 3bd2cfcd215f7ad4abdb087cdfe91f608c7f0801 /bootother.S | |
parent | 45854caa93eecc3f80d34940b7cf6a400b640d69 (diff) | |
download | xv6-labs-a650c606fecc7e3938345e2bc52050a9ea725e7a.tar.gz xv6-labs-a650c606fecc7e3938345e2bc52050a9ea725e7a.tar.bz2 xv6-labs-a650c606fecc7e3938345e2bc52050a9ea725e7a.zip |
spacing fixes: no tabs, 2-space indents (for rtm)
Diffstat (limited to 'bootother.S')
-rw-r--r-- | bootother.S | 99 |
1 files changed, 50 insertions, 49 deletions
diff --git a/bootother.S b/bootother.S index 99e4713..e4cbd67 100644 --- a/bootother.S +++ b/bootother.S @@ -1,5 +1,5 @@ #include "asm.h" - + /* * Start an Application Processor. This must be placed on a 4KB boundary * somewhere in the 1st MB of conventional memory (APBOOTSTRAP). However, @@ -13,67 +13,68 @@ * mp.c causes each non-boot CPU in turn to jump to start. * mp.c puts the correct %esp in start-4, and the place to jump * to in start-8. - * + * */ -.set PROT_MODE_CSEG,0x8 # code segment selector +.set PROT_MODE_CSEG,0x8 # code segment selector .set PROT_MODE_DSEG,0x10 # data segment selector -.set CR0_PE_ON,0x1 # protected mode enable flag +.set CR0_PE_ON,0x1 # protected mode enable flag .globl start -start: .code16 # This runs in real mode - cli # Disable interrupts - cld # String operations increment +start: + .code16 # This runs in real mode + cli # Disable interrupts + cld # String operations increment - # Set up the important data segment registers (DS, ES, SS). - xorw %ax,%ax # Segment number zero - movw %ax,%ds # -> Data Segment - movw %ax,%es # -> Extra Segment - movw %ax,%ss # -> Stack Segment + # Set up the important data segment registers (DS, ES, SS). + xorw %ax,%ax # Segment number zero + movw %ax,%ds # -> Data Segment + movw %ax,%es # -> Extra Segment + movw %ax,%ss # -> Stack Segment - # Set up the stack pointer, growing downward from 0x7000-8. - movw $start-8,%sp # Stack Pointer - -#### Switch from real to protected mode + # Set up the stack pointer, growing downward from 0x7000-8. + movw $start-8,%sp # Stack Pointer + +#### Switch from real to protected mode #### The descriptors in our GDT allow all physical memory to be accessed. #### Furthermore, the descriptors have base addresses of 0, so that the #### segment translation is a NOP, ie. virtual addresses are identical to #### their physical addresses. With this setup, immediately after -#### enabling protected mode it will still appear to this code -#### that it is running directly on physical memory with no translation. -#### This initial NOP-translation setup is required by the processor -#### to ensure that the transition to protected mode occurs smoothly. - - lgdt gdtdesc # load GDT -- mandatory in protected mode - movl %cr0, %eax # turn on protected mode - orl $CR0_PE_ON, %eax # - movl %eax, %cr0 # - ### CPU magic: jump to relocation, flush prefetch queue, and reload %cs - ### Has the effect of just jmp to the next instruction, but simultaneous - ### loads CS with $PROT_MODE_CSEG. - ljmp $PROT_MODE_CSEG, $protcseg - +#### enabling protected mode it will still appear to this code +#### that it is running directly on physical memory with no translation. +#### This initial NOP-translation setup is required by the processor +#### to ensure that the transition to protected mode occurs smoothly. + + lgdt gdtdesc # load GDT -- mandatory in protected mode + movl %cr0, %eax # turn on protected mode + orl $CR0_PE_ON, %eax # + movl %eax, %cr0 # + ### CPU magic: jump to relocation, flush prefetch queue, and reload %cs + ### Has the effect of just jmp to the next instruction, but simultaneous + ### loads CS with $PROT_MODE_CSEG. + ljmp $PROT_MODE_CSEG, $protcseg + #### we are in 32-bit protected mode (hence the .code32) .code32 -protcseg: - # Set up the protected-mode data segment registers - movw $PROT_MODE_DSEG, %ax # Our data segment selector - movw %ax, %ds # -> DS: Data Segment - movw %ax, %es # -> ES: Extra Segment - movw %ax, %fs # -> FS - movw %ax, %gs # -> GS - movw %ax, %ss # -> SS: Stack Segment +protcseg: + # Set up the protected-mode data segment registers + movw $PROT_MODE_DSEG, %ax # Our data segment selector + movw %ax, %ds # -> DS: Data Segment + movw %ax, %es # -> ES: Extra Segment + movw %ax, %fs # -> FS + movw %ax, %gs # -> GS + movw %ax, %ss # -> SS: Stack Segment - movl start-8, %eax - movl start-4, %esp - jmp *%eax - -.p2align 2 # force 4 byte alignment + movl start-8, %eax + movl start-4, %esp + jmp *%eax + +.p2align 2 # force 4 byte alignment gdt: - SEG_NULLASM # null seg - SEG_ASM(STA_X|STA_R, 0x0, 0xffffffff) # code seg - SEG_ASM(STA_W, 0x0, 0xffffffff) # data seg - + SEG_NULLASM # null seg + SEG_ASM(STA_X|STA_R, 0x0, 0xffffffff) # code seg + SEG_ASM(STA_W, 0x0, 0xffffffff) # data seg + gdtdesc: - .word 0x17 # sizeof(gdt) - 1 - .long gdt # address gdt + .word 0x17 # sizeof(gdt) - 1 + .long gdt # address gdt |