Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/amd64/src/mm/page.c

    r40c8c17 r7e752b2  
    4646#include <panic.h>
    4747#include <align.h>
    48 #include <macros.h>
    4948
    5049void page_arch_init(void)
    5150{
    52         if (config.cpu_active > 1) {
     51        if (config.cpu_active == 1) {
     52                uintptr_t cur;
     53                unsigned int identity_flags =
     54                    PAGE_CACHEABLE | PAGE_EXEC | PAGE_GLOBAL | PAGE_WRITE;
     55               
     56                page_mapping_operations = &pt_mapping_operations;
     57               
     58                page_table_lock(AS_KERNEL, true);
     59               
     60                /*
     61                 * PA2KA(identity) mapping for all frames.
     62                 */
     63                for (cur = 0; cur < last_frame; cur += FRAME_SIZE)
     64                        page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, identity_flags);
     65               
     66                page_table_unlock(AS_KERNEL, true);
     67               
     68                exc_register(14, "page_fault", true, (iroutine_t) page_fault);
    5369                write_cr3((uintptr_t) AS_KERNEL->genarch.page_table);
    54                 return;
    55         }
    56 
    57         uintptr_t cur;
    58         unsigned int identity_flags =
    59             PAGE_CACHEABLE | PAGE_EXEC | PAGE_GLOBAL | PAGE_WRITE;
    60                
    61         page_mapping_operations = &pt_mapping_operations;
    62                
    63         page_table_lock(AS_KERNEL, true);
    64                
    65         /*
    66          * PA2KA(identity) mapping for all low-memory frames.
    67          */
    68         for (cur = 0; cur < min(config.identity_size, config.physmem_end);
    69             cur += FRAME_SIZE)
    70                 page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, identity_flags);
    71                
    72         page_table_unlock(AS_KERNEL, true);
    73                
    74         exc_register(14, "page_fault", true, (iroutine_t) page_fault);
    75         write_cr3((uintptr_t) AS_KERNEL->genarch.page_table);
     70        } else
     71                write_cr3((uintptr_t) AS_KERNEL->genarch.page_table);
    7672}
    7773
     
    9894}
    9995
     96uintptr_t hw_map(uintptr_t physaddr, size_t size)
     97{
     98        if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH))
     99                panic("Unable to map physical memory %p (%zu bytes).",
     100                    (void *) physaddr, size);
     101       
     102        uintptr_t virtaddr = PA2KA(last_frame);
     103        pfn_t i;
     104       
     105        page_table_lock(AS_KERNEL, true);
     106       
     107        for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++)
     108                page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE | PAGE_WRITE);
     109       
     110        page_table_unlock(AS_KERNEL, true);
     111       
     112        last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE);
     113       
     114        return virtaddr;
     115}
     116
    100117/** @}
    101118 */
Note: See TracChangeset for help on using the changeset viewer.