Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/src/boot/multiboot.S

    r7ba16eb r8844e70  
    3131#include <abi/asmtool.h>
    3232#include <arch/boot/boot.h>
    33 #include <arch/boot/memmap.h>
    3433#include <arch/mm/page.h>
    3534#include <arch/pm.h>
    3635#include <genarch/multiboot/multiboot.h>
    3736#include <arch/cpuid.h>
    38 #include <arch/cpu.h>
    3937
    4038#define START_STACK  (BOOT_OFFSET - BOOT_STACK_SIZE)
     
    168166        /* Paging features */
    169167        movl %cr4, %ecx
    170         orl $CR4_PSE, %ecx      /* PSE on */
    171         andl $~CR4_PAE, %ecx    /* PAE off */
     168        orl $(1 << 4), %ecx      /* PSE on */
     169        andl $(~(1 << 5)), %ecx  /* PAE off */
    172170        movl %ecx, %cr4
    173171       
     
    178176       
    179177        floop_pse:
    180                 movl $(PDE_4M | PDE_RW | PDE_P), %eax
     178                movl $((1 << 7) | (1 << 1) | (1 << 0)), %eax
    181179                orl %ebx, %eax
    182180                /* Mapping 0x00000000 + %ecx * 4M => 0x00000000 + %ecx * 4M */
     
    193191       
    194192        movl %cr0, %ebx
    195         orl $CR0_PG, %ebx       /* paging on */
     193        orl $(1 << 31), %ebx  /* paging on */
    196194        movl %ebx, %cr0
    197195        ret
     
    207205        /* Paging features */
    208206        movl %cr4, %ecx
    209         andl $~CR4_PAE, %ecx  /* PAE off */
     207        andl $(~(1 << 5)), %ecx  /* PAE off */
    210208        movl %ecx, %cr4
    211209       
     
    222220               
    223221                /* Align address down to 4k */
    224                 andl $(~(PAGE_SIZE - 1)), %esi
     222                andl $(~4095), %esi
    225223               
    226224        use_kernel_end:
    227225               
    228226                /* Align address to 4k */
    229                 addl $(PAGE_SIZE - 1), %esi
    230                 andl $(~(PAGE_SIZE - 1)), %esi
     227                addl $4095, %esi
     228                andl $(~4095), %esi
    231229               
    232230                /* Allocate space for page tables */
    233231                movl %esi, pt_loc
    234                 movl $KA2PA(ballocs), %edi
     232                movl $ballocs, %edi
     233                andl $0x7fffffff, %edi
    235234               
    236235                movl %esi, (%edi)
     
    243242               
    244243                floop_pt:
    245                         movl $(PTE_RW | PTE_P), %eax
     244                        movl $((1 << 1) | (1 << 0)), %eax
    246245                        orl %ebx, %eax
    247246                        movl %eax, (%esi, %ecx, 4)
    248                         addl $PAGE_SIZE, %ebx
     247                        addl $(4 * 1024), %ebx
    249248                       
    250249                        incl %ecx
     
    260259               
    261260                floop:
    262                         movl $(PDE_RW | PDE_P), %eax
     261                        movl $((1 << 1) | (1 << 0)), %eax
    263262                        orl %ebx, %eax
    264263                       
     
    268267                        /* Mapping 0x80000000 + %ecx * 4M => 0x00000000 + %ecx * 4M */
    269268                        movl %eax, (%edi, %ecx, 4)
    270                         addl $PAGE_SIZE, %ebx
     269                        addl $(4 * 1024), %ebx
    271270                       
    272271                        incl %ecx
     
    278277               
    279278                movl %cr0, %ebx
    280                 orl $CR0_PG, %ebx  /* paging on */
     279                orl $(1 << 31), %ebx  /* paging on */
    281280                movl %ebx, %cr0
    282281               
     
    286285/** Calculate unmapped address of the end of the kernel. */
    287286calc_kernel_end:
    288         movl $KA2PA(hardcoded_load_address), %edi
     287        movl $hardcoded_load_address, %edi
     288        andl $0x7fffffff, %edi
    289289        movl (%edi), %esi
    290         leal KA2PA(0)(%esi), %esi
    291        
    292         movl $KA2PA(hardcoded_ktext_size), %edi
     290        andl $0x7fffffff, %esi
     291       
     292        movl $hardcoded_ktext_size, %edi
     293        andl $0x7fffffff, %edi
    293294        addl (%edi), %esi
    294         leal KA2PA(0)(%esi), %esi
    295        
    296         movl $KA2PA(hardcoded_kdata_size), %edi
     295        andl $0x7fffffff, %esi
     296       
     297        movl $hardcoded_kdata_size, %edi
     298        andl $0x7fffffff, %edi
    297299        addl (%edi), %esi
    298         leal KA2PA(0)(%esi), %esi
     300        andl $0x7fffffff, %esi
    299301        movl %esi, kernel_end
    300302       
     
    316318                /* Check if memory map flag is present */
    317319                movl (%ebx), %edx
    318                 andl $MULTIBOOT_INFO_FLAGS_MMAP, %edx
     320                andl $(1 << 6), %edx
    319321                jnz use_multiboot_map
    320322                       
     
    324326               
    325327                /* Copy address of the memory map to edx */
    326                 movl MULTIBOOT_INFO_OFFSET_MMAP_ADDR(%ebx), %edx
     328                movl 48(%ebx), %edx
    327329                movl %edx, %ecx
    328330               
    329                 addl MULTIBOOT_INFO_OFFSET_MMAP_LENGTH(%ebx), %ecx
     331                addl 44(%ebx), %ecx
    330332               
    331333                /* Find a free region at least 2M in size */
     
    333335                       
    334336                        /* Is this a free region? */
    335                         cmpl $MEMMAP_MEMORY_AVAILABLE, MULTIBOOT_MEMMAP_OFFSET_MM_INFO + E820MEMMAP_OFFSET_TYPE(%edx)
     337                        cmp $1, 20(%edx)
    336338                        jnz next_region
    337339                       
    338340                        /* Check size */
    339                         cmpl $0, MULTIBOOT_MEMMAP_OFFSET_MM_INFO + E820MEMMAP_OFFSET_SIZE + 4(%edx)
     341                        cmp $0, 16(%edx)
    340342                        jnz next_region
    341                         cmpl $(2 * 1024 * 1024 + PAGE_SIZE), MULTIBOOT_MEMMAP_OFFSET_MM_INFO + E820MEMMAP_OFFSET_SIZE(%edx)
     343                       
     344                        cmpl $(2 * 1024 * 1024 + 4 * 1024), 12(%edx)
    342345                        jbe next_region
    343346                       
    344                         cmpl $0, MULTIBOOT_MEMMAP_OFFSET_MM_INFO + E820MEMMAP_OFFSET_BASE_ADDRESS + 4(%edx)
     347                        cmp $0, 8(%edx)
    345348                        jz found_region
    346349               
     
    354357                next_region_do:
    355358                       
    356                         addl MULTIBOOT_MEMMAP_OFFSET_SIZE(%edx), %edx
    357                         addl $MULTIBOOT_MEMMAP_SIZE_SIZE, %edx
     359                        addl (%edx), %edx
     360                        addl $4, %edx
    358361                        jmp check_memmap_loop
    359362                       
     
    361364                       
    362365                        /* Use end of the found region */
    363                         mov MULTIBOOT_MEMMAP_OFFSET_MM_INFO + E820MEMMAP_OFFSET_BASE_ADDRESS(%edx), %ecx
    364                         add MULTIBOOT_MEMMAP_OFFSET_MM_INFO + E820MEMMAP_OFFSET_SIZE(%edx), %ecx
     366                        mov 4(%edx), %ecx
     367                        add 12(%edx), %ecx
    365368                        sub $(2 * 1024 * 1024), %ecx
    366369                        mov %ecx, free_area
Note: See TracChangeset for help on using the changeset viewer.