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 |