Changes in kernel/arch/amd64/src/mm/page.c [40c8c17:7e752b2] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/src/mm/page.c
r40c8c17 r7e752b2 46 46 #include <panic.h> 47 47 #include <align.h> 48 #include <macros.h>49 48 50 49 void page_arch_init(void) 51 50 { 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); 53 69 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); 76 72 } 77 73 … … 98 94 } 99 95 96 uintptr_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 100 117 /** @} 101 118 */
Note:
See TracChangeset
for help on using the changeset viewer.