Rev 1806 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1806 | Rev 1809 | ||
---|---|---|---|
Line 37... | Line 37... | ||
37 | .ascii "HYPERCALL_PAGE=0x2," |
37 | .ascii "HYPERCALL_PAGE=0x2," |
38 | .ascii "LOADER=generic," |
38 | .ascii "LOADER=generic," |
39 | .ascii "PT_MODE_WRITABLE" |
39 | .ascii "PT_MODE_WRITABLE" |
40 | .byte 0 |
40 | .byte 0 |
41 | 41 | ||
42 | #define START_STACK (BOOT_OFFSET - BOOT_STACK_SIZE) |
- | |
43 | - | ||
44 | .section K_TEXT_START, "ax" |
42 | .section K_TEXT_START, "ax" |
45 | 43 | ||
46 | KTEXT=8 |
44 | KTEXT=8 |
47 | KDATA=16 |
45 | KDATA=16 |
48 | 46 | ||
49 | .code32 |
47 | .code32 |
50 | .align 4 |
48 | .align 4 |
51 | .global multiboot_image_start |
49 | .global kernel_image_start |
52 | multiboot_header: |
- | |
53 | .long MULTIBOOT_HEADER_MAGIC |
- | |
54 | .long MULTIBOOT_HEADER_FLAGS |
- | |
55 | .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) # checksum |
- | |
56 | .long multiboot_header |
- | |
57 | .long unmapped_ktext_start |
- | |
58 | .long 0 |
- | |
59 | .long 0 |
- | |
60 | .long multiboot_image_start |
- | |
61 | 50 | ||
62 | multiboot_image_start: |
51 | kernel_image_start: |
63 | movl $START_STACK, %esp # initialize stack pointer |
- | |
64 | lgdt KA2PA(bootstrap_gdtr) # initialize Global Descriptor Table register |
52 | lgdt KA2PA(bootstrap_gdtr) # initialize Global Descriptor Table register |
65 | 53 | ||
66 | movw $KDATA, %cx |
54 | movw $KDATA, %cx |
67 | movw %cx, %es |
55 | movw %cx, %es |
68 | movw %cx, %fs |
56 | movw %cx, %fs |
Line 99... | Line 87... | ||
99 | 87 | ||
100 | call map_kernel # map kernel and turn paging on |
88 | call map_kernel # map kernel and turn paging on |
101 | 89 | ||
102 | popl %eax |
90 | popl %eax |
103 | popl %ebx |
91 | popl %ebx |
104 | cmpl $MULTIBOOT_LOADER_MAGIC, %eax # compare GRUB signature |
- | |
105 | je valid_boot |
- | |
106 | - | ||
107 | xorl %ecx, %ecx # no memory size or map available |
- | |
108 | movl %ecx, e801memorysize |
- | |
109 | movl %ecx, e820counter |
- | |
110 | - | ||
111 | jmp invalid_boot |
- | |
112 | - | ||
113 | valid_boot: |
- | |
114 | - | ||
115 | movl (%ebx), %eax # ebx = physical address of struct multiboot_info |
- | |
116 | - | ||
117 | bt $0, %eax # mbi->flags[0] (mem_lower, mem_upper valid) |
- | |
118 | jc mem_valid |
- | |
119 | - | ||
120 | xorl %ecx, %ecx |
- | |
121 | jmp mem_invalid |
- | |
122 | - | ||
123 | mem_valid: |
- | |
124 | movl 4(%ebx), %ecx # mbi->mem_lower |
- | |
125 | addl 8(%ebx), %ecx # mbi->mem_upper |
- | |
126 | - | ||
127 | mem_invalid: |
- | |
128 | movl %ecx, e801memorysize |
- | |
129 | - | ||
130 | bt $3, %eax # mbi->flags[3] (mods_count, mods_addr valid) |
- | |
131 | jc mods_valid |
- | |
132 | - | ||
133 | xorl %ecx, %ecx |
- | |
134 | movl %ecx, init |
- | |
135 | jmp mods_end |
- | |
136 | - | ||
137 | mods_valid: |
- | |
138 | - | ||
139 | movl 20(%ebx), %ecx # mbi->mods_count |
- | |
140 | movl %ecx, init |
- | |
141 | - | ||
142 | cmpl $0, %ecx |
- | |
143 | je mods_end |
- | |
144 | - | ||
145 | movl 24(%ebx), %esi # mbi->mods_addr |
- | |
146 | movl $init, %edi |
- | |
147 | - | ||
148 | mods_loop: |
- | |
149 | - | ||
150 | movl 0(%esi), %edx # mods->mod_start |
- | |
151 | addl $0x80000000, %edx |
- | |
152 | movl %edx, 4(%edi) |
- | |
153 | - | ||
154 | movl 4(%esi), %edx |
- | |
155 | subl 0(%esi), %edx # mods->mod_end - mods->mod_start |
- | |
156 | movl %edx, 8(%edi) |
- | |
157 | - | ||
158 | addl $16, %esi |
- | |
159 | addl $8 , %edi |
- | |
160 | - | ||
161 | loop mods_loop |
- | |
162 | - | ||
163 | mods_end: |
- | |
164 | - | ||
165 | invalid_boot: |
- | |
166 | - | ||
167 | #ifdef CONFIG_SMP |
- | |
168 | - | ||
169 | # copy AP bootstrap routines below 1 MB |
- | |
170 | - | ||
171 | movl $BOOT_OFFSET, %esi |
- | |
172 | movl $AP_BOOT_OFFSET, %edi |
- | |
173 | movl $_hardcoded_unmapped_size, %ecx |
- | |
174 | cld |
- | |
175 | rep movsb |
- | |
176 | - | ||
177 | #endif |
- | |
178 | 92 | ||
179 | call main_bsp # never returns |
93 | call main_bsp # never returns |
180 | 94 | ||
181 | cli |
95 | cli |
182 | hlt |
96 | hlt |