|
5 | 5 | # memory at physical address 0x7c00 and starts executing in real mode |
6 | 6 | # with %cs=0 %ip=7c00. |
7 | 7 |
|
8 | | -.set CSEG32, 0x8 # kernel code segment selector |
9 | | -.set DSEG32, 0x10 # kernel data segment selector |
10 | | -.set CR0_PE, 0x1 # protected mode enable flag |
| 8 | +#define SEG_KCODE 1 // kernel code |
| 9 | +#define SEG_KDATA 2 // kernel data+stack |
| 10 | +#define SEG_KCPU 3 // kernel per-cpu data |
| 11 | + |
| 12 | +#define CR0_PE 1 // protected mode enable bit |
11 | 13 |
|
12 | 14 | .code16 # Assemble for 16-bit mode |
13 | 15 | .globl start |
14 | 16 | start: |
15 | 17 | cli # Disable interrupts |
16 | | - cld # String operations increment |
17 | 18 |
|
18 | 19 | # Set up the important data segment registers (DS, ES, SS). |
19 | 20 | xorw %ax,%ax # Segment number zero |
@@ -53,18 +54,19 @@ seta20.2: |
53 | 54 |
|
54 | 55 | # Jump to next instruction, but in 32-bit code segment. |
55 | 56 | # Switches processor into 32-bit mode. |
56 | | - ljmp $CSEG32, $start32 |
| 57 | + ljmp $(SEG_KCODE<<3), $start32 |
57 | 58 |
|
58 | 59 | .code32 # Assemble for 32-bit mode |
59 | 60 | start32: |
60 | 61 | # Set up the protected-mode data segment registers |
61 | | - movw $DSEG32, %ax # Our data segment selector |
| 62 | + movw $(SEG_KDATA<<3), %ax # Our data segment selector |
62 | 63 | movw %ax, %ds # -> DS: Data Segment |
63 | 64 | movw %ax, %es # -> ES: Extra Segment |
| 65 | + movw %ax, %ss # -> SS: Stack Segment |
| 66 | + movw $(SEG_KCPU<<3), %ax # Our per-cpu segment selector |
64 | 67 | movw %ax, %fs # -> FS |
65 | 68 | movw %ax, %gs # -> GS |
66 | | - movw %ax, %ss # -> SS: Stack Segment |
67 | | - |
| 69 | + |
68 | 70 | # Set up the stack pointer and call into C. |
69 | 71 | movl $start, %esp |
70 | 72 | call bootmain |
|
85 | 87 | SEG_NULLASM # null seg |
86 | 88 | SEG_ASM(STA_X|STA_R, 0x0, 0xffffffff) # code seg |
87 | 89 | SEG_ASM(STA_W, 0x0, 0xffffffff) # data seg |
| 90 | + SEG_ASM(STA_W, 0x100, 0xffffffff) # per-cpu data seg; 0x100 is okay for now |
88 | 91 |
|
89 | 92 | gdtdesc: |
90 | | - .word 0x17 # sizeof(gdt) - 1 |
| 93 | + .word 0x1f # sizeof(gdt) - 1 |
91 | 94 | .long gdt # address gdt |
0 commit comments