Changeset 921b84f in mainline for kernel/arch/ia32/src/boot/boot.S


Ignore:
Timestamp:
2011-08-19T17:36:25Z (13 years ago)
Author:
Petr Koupy <petr.koupy@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5fb32c5
Parents:
ea186c6 (diff), f00af83 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge libposix changes.

File:
1 edited

Legend:

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

    rea186c6 r921b84f  
    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        
    11599#include "vesa_prot.inc"
    116100       
     
    140124                jmp hlt0
    141125
     126/** Calculate unmapped address of the end of the kernel. */
     127calc_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 */
     146find_mem_for_pt:
     147        /* Check if multiboot info is present */
     148        cmpl $0x2BADB002, grub_eax
     149        je check_multiboot_map
     150        ret
     151check_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
     159use_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
    142193/** Setup mapping for the kernel.
    143194 *
     
    148199.global map_kernel
    149200map_kernel:
     201        /* Paging features */
    150202        movl %cr4, %ecx
    151         orl $(1 << 4), %ecx      /* PSE on */
    152203        andl $(~(1 << 5)), %ecx  /* PAE off */
    153204        movl %ecx, %cr4
    154205       
     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
     215use_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 */
    155244        movl $(page_directory + 0), %esi
    156245        movl $(page_directory + 2048), %edi
    157246        xorl %ecx, %ecx
    158         xorl %ebx, %ebx
     247        movl pt_loc, %ebx
    159248       
    160249        floop:
    161                 movl $((1 << 7) | (1 << 1) | (1 << 0)), %eax
     250                movl $((1 << 1) | (1 << 0)), %eax
    162251                orl %ebx, %eax
    163252                /* Mapping 0x00000000 + %ecx * 4M => 0x00000000 + %ecx * 4M */
     
    165254                /* Mapping 0x80000000 + %ecx * 4M => 0x00000000 + %ecx * 4M */
    166255                movl %eax, (%edi, %ecx, 4)
    167                 addl $(4 * 1024 * 1024), %ebx
     256                addl $(4 * 1024), %ebx
    168257               
    169258                incl %ecx
     
    523612
    524613grub_ebx:
     614        .long 0
     615
     616pt_loc:
     617        .long 0
     618end_of_kernel:
     619        .long 0
     620free_area:
    525621        .long 0
    526622
Note: See TracChangeset for help on using the changeset viewer.