Rev 3802 | Rev 3985 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3802 | Rev 3984 | ||
---|---|---|---|
Line 99... | Line 99... | ||
99 | mov %di, KA2PA(vesa_width) |
99 | mov %di, KA2PA(vesa_width) |
100 | mov %bx, KA2PA(vesa_scanline) |
100 | mov %bx, KA2PA(vesa_scanline) |
101 | shr $16, %ebx |
101 | shr $16, %ebx |
102 | mov %bx, KA2PA(vesa_bpp) |
102 | mov %bx, KA2PA(vesa_bpp) |
103 | #endif |
103 | #endif |
104 | 104 | ||
105 | call map_kernel # map kernel and turn paging on |
105 | call map_kernel # map kernel and turn paging on |
106 | 106 | ||
107 | movl grub_eax, %eax |
107 | movl grub_eax, %eax |
108 | movl grub_ebx, %ebx |
108 | movl grub_ebx, %ebx |
109 | cmpl $MULTIBOOT_LOADER_MAGIC, %eax # compare GRUB signature |
109 | cmpl $MULTIBOOT_LOADER_MAGIC, %eax # compare GRUB signature |
110 | je valid_boot |
110 | je valid_boot |
111 | 111 | ||
112 | xorl %ecx, %ecx # no memory map available |
112 | xorl %ecx, %ecx # no memory map available |
113 | movl %ecx, e820counter |
113 | movl %ecx, e820counter |
114 | 114 | ||
115 | jmp invalid_boot |
115 | jmp invalid_boot |
116 | 116 | ||
117 | valid_boot: |
117 | valid_boot: |
118 | - | ||
119 | movl (%ebx), %eax # ebx = physical address of struct multiboot_info |
- | |
120 | - | ||
121 | bt $3, %eax # mbi->flags[3] (mods_count, mods_addr valid) |
- | |
122 | jc mods_valid |
- | |
123 | - | ||
124 | xorl %ecx, %ecx |
- | |
125 | movl %ecx, init |
- | |
126 | jmp mods_end |
- | |
127 | - | ||
128 | mods_valid: |
- | |
129 | - | ||
130 | movl 20(%ebx), %ecx # mbi->mods_count |
- | |
131 | movl %ecx, init |
- | |
132 | - | ||
133 | cmpl $0, %ecx |
- | |
134 | je mods_end |
- | |
135 | - | ||
136 | movl 24(%ebx), %esi # mbi->mods_addr |
- | |
137 | movl $init, %edi |
- | |
138 | - | ||
139 | mods_loop: |
- | |
140 | - | ||
141 | movl 0(%esi), %edx # mods->mod_start |
- | |
142 | addl $0x80000000, %edx |
- | |
143 | movl %edx, 4(%edi) |
- | |
144 | - | ||
145 | movl 4(%esi), %edx |
- | |
146 | subl 0(%esi), %edx # mods->mod_end - mods->mod_start |
- | |
147 | movl %edx, 8(%edi) |
- | |
148 | - | ||
149 | addl $16, %esi |
- | |
150 | addl $8 , %edi |
- | |
151 | - | ||
152 | loop mods_loop |
- | |
153 | - | ||
154 | mods_end: |
- | |
155 | - | ||
156 | bt $6, %eax # mbi->flags[6] (mmap_length, mmap_addr valid) |
- | |
157 | jc mmap_valid |
- | |
158 | - | ||
159 | xorl %edx, %edx |
- | |
160 | jmp mmap_invalid |
- | |
161 | - | ||
162 | mmap_valid: |
- | |
163 | movl 44(%ebx), %ecx # mbi->mmap_length |
- | |
164 | movl 48(%ebx), %esi # mbi->mmap_addr |
- | |
165 | movl $e820table, %edi |
- | |
166 | xorl %edx, %edx |
- | |
167 | - | ||
168 | mmap_loop: |
- | |
169 | cmpl $0, %ecx |
- | |
170 | jle mmap_end |
- | |
171 | - | ||
172 | movl 4(%esi), %eax # mmap->base_addr_low |
- | |
173 | movl %eax, (%edi) |
- | |
174 | - | ||
175 | movl 8(%esi), %eax # mmap->base_addr_high |
- | |
176 | movl %eax, 4(%edi) |
- | |
177 | - | ||
178 | movl 12(%esi), %eax # mmap->length_low |
- | |
179 | movl %eax, 8(%edi) |
- | |
180 | - | ||
181 | movl 16(%esi), %eax # mmap->length_high |
- | |
182 | movl %eax, 12(%edi) |
- | |
183 | - | ||
184 | movl 20(%esi), %eax # mmap->type |
- | |
185 | movl %eax, 16(%edi) |
- | |
186 | - | ||
187 | movl (%esi), %eax # mmap->size |
- | |
188 | addl $0x4, %eax |
- | |
189 | addl %eax, %esi |
- | |
190 | subl %eax, %ecx |
- | |
191 | addl $MEMMAP_E820_RECORD_SIZE, %edi |
- | |
192 | incl %edx |
- | |
193 | jmp mmap_loop |
- | |
194 | - | ||
195 | mmap_end: |
- | |
196 | - | ||
197 | mmap_invalid: |
- | |
198 | movl %edx, e820counter |
- | |
199 | - | ||
200 | invalid_boot: |
- | |
201 | - | ||
202 | #ifdef CONFIG_SMP |
- | |
203 | - | ||
204 | # copy AP bootstrap routines below 1 MB |
- | |
205 | - | ||
206 | movl $BOOT_OFFSET, %esi |
- | |
207 | movl $AP_BOOT_OFFSET, %edi |
- | |
208 | movl $_hardcoded_unmapped_size, %ecx |
- | |
209 | rep movsb |
- | |
210 | - | ||
211 | #endif |
- | |
212 | 118 | ||
- | 119 | movl grub_eax, %eax |
|
- | 120 | movl grub_ebx, %ebx |
|
- | 121 | ||
- | 122 | # ia32_boot(grub_eax, grub_ebx) |
|
- | 123 | pushl %ebx |
|
- | 124 | pushl %eax |
|
213 | call main_bsp # never returns |
125 | call ia32_cboot # Does not return. |
- | 126 | ||
- | 127 | # Not reached. |
|
- | 128 | ||
- | 129 | invalid_boot: |
|
214 | 130 | ||
215 | cli |
131 | cli |
216 | hlt |
132 | hlt |
217 | 133 | ||
218 | .global map_kernel |
134 | .global map_kernel |