Changeset 5d8d71e in mainline for kernel/arch/amd64/src/boot/boot.S
- Timestamp:
- 2009-03-03T21:17:45Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 06f96234
- Parents:
- c22e964
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/src/boot/boot.S
rc22e964 r5d8d71e 176 176 start64: 177 177 movq $(PA2KA(START_STACK)), %rsp 178 movl grub_eax, %eax 179 movl grub_ebx, %ebx 180 181 cmpl $MULTIBOOT_LOADER_MAGIC, %eax # compare GRUB signature 182 je valid_boot 183 184 xorl %ecx, %ecx # no memory size or map available 185 movl %ecx, e820counter 186 187 jmp invalid_boot 188 189 valid_boot: 190 191 movl (%ebx), %eax # ebx = physical address of struct multiboot_info 192 193 bt $3, %eax # mbi->flags[3] (mods_count, mods_addr valid) 194 jc mods_valid 195 196 xorq %rcx, %rcx 197 movq %rcx, init 198 jmp mods_end 199 200 mods_valid: 201 202 xorq %rcx, %rcx 203 movl 20(%ebx), %ecx # mbi->mods_count 204 movq %rcx, init 205 206 cmpl $0, %ecx 207 je mods_end 208 209 movl 24(%ebx), %esi # mbi->mods_addr 210 movq $init, %rdi 211 212 mods_loop: 213 214 xorq %rdx, %rdx 215 movl 0(%esi), %edx # mods->mod_start 216 movq $0xffff800000000000, %r10 217 addq %r10, %rdx 218 movq %rdx, 8(%rdi) 219 220 xorq %rdx, %rdx 221 movl 4(%esi), %edx 222 subl 0(%esi), %edx # mods->mod_end - mods->mod_start 223 movq %rdx, 16(%rdi) 224 225 addl $16, %esi 226 addq $48, %rdi 227 228 loop mods_loop 229 230 mods_end: 231 232 bt $6, %eax # mbi->flags[6] (mmap_length, mmap_addr valid) 233 jc mmap_valid 234 235 xorl %edx, %edx 236 jmp mmap_invalid 237 238 mmap_valid: 239 movl 44(%ebx), %ecx # mbi->mmap_length 240 movl 48(%ebx), %esi # mbi->mmap_addr 241 movq $e820table, %rdi 242 xorl %edx, %edx 243 244 mmap_loop: 245 cmpl $0, %ecx 246 jle mmap_end 247 248 movl 4(%esi), %eax # mmap->base_addr_low 249 movl %eax, (%rdi) 250 251 movl 8(%esi), %eax # mmap->base_addr_high 252 movl %eax, 4(%rdi) 253 254 movl 12(%esi), %eax # mmap->length_low 255 movl %eax, 8(%rdi) 256 257 movl 16(%esi), %eax # mmap->length_high 258 movl %eax, 12(%rdi) 259 260 movl 20(%esi), %eax # mmap->type 261 movl %eax, 16(%rdi) 262 263 movl (%esi), %eax # mmap->size 264 addl $0x4, %eax 265 addl %eax, %esi 266 subl %eax, %ecx 267 addq $MEMMAP_E820_RECORD_SIZE, %rdi 268 incl %edx 269 jmp mmap_loop 270 271 mmap_end: 272 273 mmap_invalid: 274 movl %edx, e820counter 275 276 invalid_boot: 277 278 #ifdef CONFIG_SMP 279 280 # copy AP bootstrap routines below 1 MB 281 282 movq $BOOT_OFFSET, %rsi 283 movq $AP_BOOT_OFFSET, %rdi 284 movq $_hardcoded_unmapped_size, %rcx 285 rep movsb 286 287 #endif 288 289 call main_bsp # never returns 178 179 # arch_pre_main(grub_eax, grub_ebx) 180 xorq %rdi, %rdi 181 movl grub_eax, %edi 182 xorq %rsi, %rsi 183 movl grub_ebx, %esi 184 call arch_pre_main 185 186 call main_bsp 187 188 # Not reached. 290 189 291 190 cli
Note:
See TracChangeset
for help on using the changeset viewer.