Changeset 339e053 in mainline


Ignore:
Timestamp:
2005-09-04T09:59:13Z (19 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8ec9bae
Parents:
23f4b1fb
Message:

finish GRUB booting (including memory map and SMP)

Location:
arch/ia32
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • arch/ia32/_link.ld

    r23f4b1fb r339e053  
    5454       
    5555        _hardcoded_kernel_size = (ktext_end - ktext_start) + (unmapped_ktext_end - unmapped_ktext_start) + (kdata_end - kdata_start) + (unmapped_kdata_end - unmapped_kdata_start);
     56        _hardcoded_unmapped_size = (unmapped_ktext_end - unmapped_ktext_start) + (unmapped_kdata_end - unmapped_kdata_start);
    5657       
    5758        _map_address = 0x80100000;
  • arch/ia32/src/boot/boot.S

    r23f4b1fb r339e053  
    2828
    2929#include <arch/boot/boot.h>
     30#include <arch/boot/memmapasm.h>
    3031
    3132.section K_TEXT_START
     
    8182        movw %ax, %ss
    8283       
    83         call map_kernel                 # map kernel and turn paging on
    84        
    8584        movb $0xd1, %al                 # enable A20 using the keyboard controller
    8685        outb %al, $0x64
     
    9392        cld
    9493        rep movsb
     94       
     95        call map_kernel                 # map kernel and turn paging on
    9596       
    9697        call main_bsp                   # never returns
     
    114115        multiboot_meeting_point:
    115116       
    116         pushl %ebx
     117        pushl %ebx                                                                              # save parameters from GRUB
    117118        pushl %eax
     119       
     120        movl $BOOTSTRAP_OFFSET + BOOT_OFFSET, %esi
     121        movl $BOOTSTRAP_OFFSET, %edi
     122        movl $_hardcoded_unmapped_size, %ecx
     123        cld
     124        rep movsb
    118125       
    119126        call map_kernel                                                                 # map kernel and turn paging on
     
    121128        popl %eax
    122129        popl %ebx
    123         cmpl $MULTIBOOT_LOADER_MAGIC, %eax
     130        cmpl $MULTIBOOT_LOADER_MAGIC, %eax                      # compare GRUB signature
    124131        je valid_boot
    125        
    126                 # ...
     132               
     133                xorl %ecx, %ecx                                                 # no memory size or map available
     134                movl %ecx, e801memorysize
     135                movl %ecx, e820counter
    127136               
    128137                jmp invalid_boot
    129        
     138               
    130139        valid_boot:
    131140               
    132                 movl (%ebx), %eax
    133                
    134                 # ... check flags in eax
    135                
    136                 movl 4(%ebx), %ecx
    137                 addl 8(%ebx), %ecx
     141                movl (%ebx), %eax                                               # ebx = physical address of struct multiboot_info
     142               
     143                bt $0, %eax                                                             # mbi->flags[0] (mem_lower, mem_upper valid)
     144                jc mem_valid
     145                       
     146                        xorl %ecx, %ecx
     147                        jmp mem_invalid
     148                       
     149                mem_valid:
     150                movl 4(%ebx), %ecx                                              # mbi->mem_lower
     151                addl 8(%ebx), %ecx                                              # mbi->mem_upper
     152               
     153                mem_invalid:
    138154                movl %ecx, e801memorysize
    139155               
    140 #               movl 44(%ebx), %ecx
    141                 xorl %ecx, %ecx
    142                 movl %ecx, e820counter
    143 #               movl 48(%ebx), %esi
    144 #               movl $e820table, %edi
    145 #               cld
    146 #               rep movsb
     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
    147199               
    148200        invalid_boot:
  • arch/ia32/src/boot/memmap.S

    r23f4b1fb r339e053  
    3030#include <arch/boot/memmapasm.h>
    3131
    32 E820_RECORD_SIZE = MEMMAP_E820_RECORD_SIZE
    33 E820_MAX_RECORDS = MEMMAP_E820_MAX_RECORDS
    3432E820_SMAP = 0x534d4150
    3533
     
    4745        movw    %bx,%es
    4846        movw    $e820table_boot,%di
    49         movb    $E820_MAX_RECORDS,e820counter_boot
     47        movb    $MEMMAP_E820_MAX_RECORDS,e820counter_boot
    5048e820loop:       
    5149        movl    $E820_SMAP,%edx         # control sequence "SMAP"
    5250
    5351        movl    $0x0000e820,%eax        # service
    54         movl    $E820_RECORD_SIZE,%ecx
     52        movl    $MEMMAP_E820_RECORD_SIZE,%ecx
    5553        int     $0x15
    5654        jc      e820err
     
    5957        jne     e820err
    6058
    61         cmpl    $E820_RECORD_SIZE,%ecx
     59        cmpl    $MEMMAP_E820_RECORD_SIZE,%ecx
    6260        jne     e820err                 # bad record size - bug in bios
    6361       
    6462        movw    %di,%ax         # next record
    65         addw    $E820_RECORD_SIZE,%ax
     63        addw    $MEMMAP_E820_RECORD_SIZE,%ax
    6664        movw    %ax,%di
    6765               
     
    7371       
    7472e820end:
    75         movb    $E820_MAX_RECORDS,%al
     73        movb    $MEMMAP_E820_MAX_RECORDS,%al
    7674        subb    e820counter_boot,%al
    7775        movb    %al,e820counter_boot # store # of valid entries in e820counter
Note: See TracChangeset for help on using the changeset viewer.