Changeset 5d8d71e in mainline for kernel/arch/amd64/src/boot/boot.S


Ignore:
Timestamp:
2009-03-03T21:17:45Z (15 years ago)
Author:
Jiri Svoboda <jirik.svoboda@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
06f96234
Parents:
c22e964
Message:

Move multiboot parsing to genarch/*/multiboot and adapt it for use with both ia32 and amd64. Multiboot info parsing now supported on amd64, too.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/amd64/src/boot/boot.S

    rc22e964 r5d8d71e  
    176176start64:
    177177        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.
    290189       
    291190        cli
Note: See TracChangeset for help on using the changeset viewer.