Rev 3973 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3973 | Rev 4117 | ||
|---|---|---|---|
| Line 49... | Line 49... | ||
| 49 | * 1:1 virtual-physical mapping is created in kernel address space. Mapping |
49 | * 1:1 virtual-physical mapping is created in kernel address space. Mapping |
| 50 | * for table with exception vectors is also created. |
50 | * for table with exception vectors is also created. |
| 51 | */ |
51 | */ |
| 52 | void page_arch_init(void) |
52 | void page_arch_init(void) |
| 53 | { |
53 | { |
| 54 | uintptr_t cur; |
- | |
| 55 | int flags; |
54 | int flags = PAGE_CACHEABLE; |
| 56 | - | ||
| 57 | page_mapping_operations = &pt_mapping_operations; |
55 | page_mapping_operations = &pt_mapping_operations; |
| 58 | 56 | ||
| 59 | flags = PAGE_CACHEABLE; |
57 | uintptr_t cur; |
| 60 | - | ||
| 61 | /* PA2KA(identity) mapping for all frames until last_frame */ |
58 | /* Kernel identity mapping */ |
| 62 | for (cur = 0; cur < last_frame; cur += FRAME_SIZE) { |
59 | for (cur = 0; cur < last_frame; cur += FRAME_SIZE) |
| 63 | page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); |
60 | page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); |
| 64 | } |
- | |
| 65 | 61 | ||
| 66 | /* create mapping for exception table at high offset */ |
62 | /* Create mapping for exception table at high offset */ |
| 67 | #ifdef HIGH_EXCEPTION_VECTORS |
63 | #ifdef HIGH_EXCEPTION_VECTORS |
| 68 | void *virtaddr = frame_alloc(ONE_FRAME, FRAME_KA); |
64 | void *virtaddr = frame_alloc(ONE_FRAME, FRAME_KA); |
| 69 | page_mapping_insert(AS_KERNEL, EXC_BASE_ADDRESS, KA2PA(virtaddr), flags); |
65 | page_mapping_insert(AS_KERNEL, EXC_BASE_ADDRESS, KA2PA(virtaddr), flags); |
| 70 | #else |
66 | #else |
| 71 | #error "Only high exception vector supported now" |
67 | #error "Only high exception vector supported now" |
| 72 | #endif |
68 | #endif |
| 73 | 69 | ||
| 74 | as_switch(NULL, AS_KERNEL); |
70 | as_switch(NULL, AS_KERNEL); |
| 75 | 71 | ||
| 76 | boot_page_table_free(); |
72 | boot_page_table_free(); |
| 77 | } |
73 | } |
| 78 | 74 | ||
| 79 | /** Maps device into the kernel space. |
75 | /** Maps device into the kernel space. |
| 80 | * |
76 | * |
| Line 91... | Line 87... | ||
| 91 | if (last_frame + ALIGN_UP(size, PAGE_SIZE) > |
87 | if (last_frame + ALIGN_UP(size, PAGE_SIZE) > |
| 92 | KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) { |
88 | KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) { |
| 93 | panic("Unable to map physical memory %p (%d bytes).", |
89 | panic("Unable to map physical memory %p (%d bytes).", |
| 94 | physaddr, size) |
90 | physaddr, size) |
| 95 | } |
91 | } |
| 96 | 92 | ||
| 97 | uintptr_t virtaddr = PA2KA(last_frame); |
93 | uintptr_t virtaddr = PA2KA(last_frame); |
| 98 | pfn_t i; |
94 | pfn_t i; |
| 99 | for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) { |
95 | for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) { |
| 100 | page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), |
96 | page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), |
| 101 | physaddr + PFN2ADDR(i), |
97 | physaddr + PFN2ADDR(i), |
| 102 | PAGE_NOT_CACHEABLE | PAGE_READ | PAGE_WRITE | PAGE_KERNEL); |
98 | PAGE_NOT_CACHEABLE | PAGE_READ | PAGE_WRITE | PAGE_KERNEL); |
| 103 | } |
99 | } |
| 104 | 100 | ||
| 105 | last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE); |
101 | last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE); |
| 106 | return virtaddr; |
102 | return virtaddr; |
| 107 | } |
103 | } |
| 108 | 104 | ||
| 109 | /** @} |
105 | /** @} |