Ignore:
File:
1 edited

Legend:

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

    rf4fa6d9 r1d3d2cf  
    9797        pm_status $status_prot
    9898       
     99        movl $(INTEL_CPUID_LEVEL), %eax
     100        cpuid
     101        cmp $0x0, %eax  /* any function > 0? */
     102        jbe pse_unsupported
     103       
     104        movl $(INTEL_CPUID_STANDARD), %eax
     105        cpuid
     106        bt $(INTEL_PSE), %edx
     107        jc pse_supported
     108       
     109        pse_unsupported:
     110               
     111                pm_error $err_pse
     112       
     113        pse_supported:
     114       
    99115#include "vesa_prot.inc"
    100116       
     
    124140                jmp hlt0
    125141
    126 /** Calculate unmapped address of the end of the kernel. */
    127 calc_end_of_kernel:
    128         movl $hardcoded_load_address, %edi
    129         andl $0x7fffffff, %edi
    130         movl (%edi), %esi
    131         andl $0x7fffffff, %esi
    132        
    133         movl $hardcoded_ktext_size, %edi
    134         andl $0x7fffffff, %edi
    135         addl (%edi), %esi
    136         andl $0x7fffffff, %esi
    137        
    138         movl $hardcoded_kdata_size, %edi
    139         andl $0x7fffffff, %edi
    140         addl (%edi), %esi
    141         andl $0x7fffffff, %esi
    142         movl %esi, end_of_kernel
    143         ret
    144 
    145 /** Find free 2M (+4k for alignment) region where to store page tables */
    146 find_mem_for_pt:
    147         /* Check if multiboot info is present */
    148         cmpl $0x2BADB002, grub_eax
    149         je check_multiboot_map
    150         ret
    151 check_multiboot_map:
    152         /* Copy address of the multiboot info to ebx */
    153         movl grub_ebx, %ebx
    154         /* Check if memory map flag is present */
    155         movl (%ebx), %edx
    156         andl $(1 << 6), %edx
    157         jnz use_multiboot_map
    158         ret
    159 use_multiboot_map:
    160         /* Copy address of the memory map to edx */
    161         movl 48(%ebx), %edx
    162         movl %edx, %ecx
    163         addl 44(%ebx), %ecx
    164         /* Find a free region at least 2M in size */
    165         check_memmap_loop:
    166                 /* Is this a free region? */
    167                 cmp $1, 20(%edx)
    168                 jnz next_region
    169                 /* Check size */
    170                 cmp $0, 16(%edx)
    171                 jnz next_region
    172                 cmpl $(2 * 1024 * 1024 + 4 * 1024), 12(%edx)
    173                 jbe next_region
    174                 cmp $0, 8(%edx)
    175                 jz found_region
    176         next_region:
    177                 cmp %ecx, %edx
    178                 jbe next_region_do
    179                 ret
    180         next_region_do:
    181                 addl (%edx), %edx
    182                 addl $4, %edx
    183                 jmp check_memmap_loop
    184         found_region:
    185                 /* Use end of the found region */
    186                 mov 4(%edx), %ecx
    187                 add 12(%edx), %ecx
    188                 sub $(2 * 1024 * 1024), %ecx
    189                 mov %ecx, free_area
    190         ret
    191                
    192 
    193142/** Setup mapping for the kernel.
    194143 *
     
    199148.global map_kernel
    200149map_kernel:
    201         /* Paging features */
    202150        movl %cr4, %ecx
     151        orl $(1 << 4), %ecx      /* PSE on */
    203152        andl $(~(1 << 5)), %ecx  /* PAE off */
    204153        movl %ecx, %cr4
    205154       
    206         call calc_end_of_kernel
    207         call find_mem_for_pt
    208         mov end_of_kernel, %esi
    209         mov free_area, %ecx
    210         cmpl %esi, %ecx
    211         jbe use_end_of_kernel
    212         mov %ecx, %esi
    213         /* Align address down to 4k */
    214         andl $(~4095), %esi
    215 use_end_of_kernel:
    216        
    217         /* Align address to 4k */
    218         addl $4095, %esi
    219         andl $(~4095), %esi
    220        
    221         /* Allocate space for page tables*/     
    222         movl %esi, pt_loc
    223         movl $ballocs, %edi
    224         andl $0x7fffffff, %edi
    225         movl %esi, (%edi)
    226         addl $4, %edi
    227         movl $(2*1024*1024), (%edi)
    228        
    229         /* Fill page tables */
    230         xorl %ecx, %ecx
    231         xorl %ebx, %ebx
    232        
    233         floop_pt:
    234                 movl $((1 << 1) | (1 << 0)), %eax
    235                 orl %ebx, %eax
    236                 movl %eax, (%esi, %ecx, 4)
    237                 addl $(4 * 1024), %ebx
    238                
    239                 incl %ecx
    240                 cmpl $(512 * 1024), %ecx
    241                 jl floop_pt
    242        
    243         /* Fill page directory */
    244155        movl $(page_directory + 0), %esi
    245156        movl $(page_directory + 2048), %edi
    246157        xorl %ecx, %ecx
    247         movl pt_loc, %ebx
     158        xorl %ebx, %ebx
    248159       
    249160        floop:
    250                 movl $((1 << 1) | (1 << 0)), %eax
     161                movl $((1 << 7) | (1 << 1) | (1 << 0)), %eax
    251162                orl %ebx, %eax
    252163                /* Mapping 0x00000000 + %ecx * 4M => 0x00000000 + %ecx * 4M */
     
    254165                /* Mapping 0x80000000 + %ecx * 4M => 0x00000000 + %ecx * 4M */
    255166                movl %eax, (%edi, %ecx, 4)
    256                 addl $(4 * 1024), %ebx
     167                addl $(4 * 1024 * 1024), %ebx
    257168               
    258169                incl %ecx
     
    612523
    613524grub_ebx:
    614         .long 0
    615 
    616 pt_loc:
    617         .long 0
    618 end_of_kernel:
    619         .long 0
    620 free_area:
    621525        .long 0
    622526
Note: See TracChangeset for help on using the changeset viewer.