- Timestamp:
- 2006-03-16T23:54:05Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5fceec7
- Parents:
- ff14c520
- Location:
- arch/amd64
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/amd64/include/mm/as.h
rff14c520 r93165be 32 32 #include <arch/types.h> 33 33 34 #define KERNEL_ADDRESS_SPACE_START_ARCH (__address) 0xffff ffff8000000034 #define KERNEL_ADDRESS_SPACE_START_ARCH (__address) 0xffff800000000000 35 35 #define KERNEL_ADDRESS_SPACE_END_ARCH (__address) 0xffffffffffffffff 36 36 #define USER_ADDRESS_SPACE_START_ARCH (__address) 0x0000000000000000 -
arch/amd64/include/mm/page.h
rff14c520 r93165be 27 27 */ 28 28 29 /** Paging on AMD64 30 * 31 * The space is divided in positive numbers - userspace and 32 * negative numbers - kernel space. The 'negative' space starting 33 * with 0xffff800000000000 and ending with 0xffffffff80000000 34 * (-2GB) is identically mapped physical memory. The area 35 * (0xffffffff80000000 ... 0xffffffffffffffff is again identically 36 * mapped first 2GB. 37 * 38 * ATTENTION - PA2KA(KA2PA(x)) != x if 'x' is in kernel 39 */ 40 29 41 #ifndef __amd64_PAGE_H__ 30 42 #define __amd64_PAGE_H__ … … 43 55 44 56 #ifndef __ASM__ 45 # define KA2PA(x) (((__address) (x)) - 0xffffffff80000000) 46 # define PA2KA(x) (((__address) (x)) + 0xffffffff80000000) 57 static inline __address ka2pa(__address x) 58 { 59 if (x > 0xffffffff80000000) 60 return x - 0xffffffff80000000; 61 else 62 return x - 0xffff800000000000; 63 } 64 /* Linker symbol */ 65 extern int ktext_start; 66 extern int kdata_end; 67 static inline __address pa2ka(__address x) 68 { 69 if (x >= ka2pa((__address)(&kdata_end)) || \ 70 x <= ka2pa((__address)&ktext_start)) 71 return x + 0xffff800000000000; 72 else 73 return x + 0xffffffff80000000; 74 } 75 # define KA2PA(x) ka2pa((__address)x) 76 # define PA2KA(x) pa2ka((__address)x) 77 # define PA2KA_IDENT(x) (((__address) (x)) + 0xffff800000000000) 78 # define PA2KA_CODE(x) (((__address) (x)) + 0xffffffff80000000) 47 79 #else 48 80 # define KA2PA(x) ((x) - 0xffffffff80000000) 49 81 # define PA2KA(x) ((x) + 0xffffffff80000000) 82 # define PA2KA_DATA(x) ((x) + 0xffff800000000000) 50 83 #endif 51 84 -
arch/amd64/src/boot/boot.S
rff14c520 r93165be 175 175 xorq %rdx, %rdx 176 176 movl 0(%esi), %edx # mods->mod_start 177 addq $0xffffffff80000000, %rdx 177 movq $0xffff800000000000, %r10 178 addq %r10, %rdx 178 179 movq %rdx, 8(%rdi) 179 180 … … 304 305 ptl_0: 305 306 .quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT) 306 .fill 510,8,0 307 .fill 255,8,0 308 .quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT) 309 .fill 254,8,0 307 310 .quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT) 308 311 -
arch/amd64/src/mm/page.c
rff14c520 r93165be 40 40 #include <print.h> 41 41 #include <panic.h> 42 #include <align.h> 42 43 43 44 /* Definitions for identity page mapper */ … … 71 72 SET_FRAME_FLAGS_ARCH(ptl3, PTL3_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ 72 73 } 73 74 74 void page_arch_init(void) 75 75 { 76 76 __address cur; 77 int flags; 77 int i; 78 int identity_flags = PAGE_CACHEABLE | PAGE_EXEC | PAGE_GLOBAL; 78 79 79 80 if (config.cpu_active == 1) { … … 84 85 */ 85 86 for (cur = 0; cur < last_frame; cur += FRAME_SIZE) { 86 flags = PAGE_CACHEABLE | PAGE_EXEC; 87 if ((PA2KA(cur) >= config.base) && (PA2KA(cur) < config.base + config.kernel_size)) 88 flags |= PAGE_GLOBAL; 89 page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); 87 /* Standard identity mapping */ 88 page_mapping_insert(AS_KERNEL, PA2KA_IDENT(cur), cur, identity_flags); 90 89 } 90 /* Upper kernel mapping 91 * - from zero to top of kernel (include bottom addresses 92 * because some are needed for init ) 93 */ 94 for (cur = PA2KA_CODE(0); cur < config.base+config.kernel_size; cur += FRAME_SIZE) { 95 page_mapping_insert(AS_KERNEL, cur, KA2PA(cur), identity_flags); 96 } 97 for (i=0; i < init.cnt; i++) { 98 for (cur=init.tasks[i].addr;cur < init.tasks[i].size; cur += FRAME_SIZE) { 99 page_mapping_insert(AS_KERNEL, PA2KA_CODE(KA2PA(cur)), KA2PA(cur), identity_flags); 100 } 101 } 102 91 103 exc_register(14, "page_fault", (iroutine)page_fault); 92 104 write_cr3((__address) AS_KERNEL->page_table);
Note:
See TracChangeset
for help on using the changeset viewer.