Rev 3386 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3386 | Rev 4153 | ||
---|---|---|---|
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 88... | Line 84... | ||
88 | */ |
84 | */ |
89 | uintptr_t hw_map(uintptr_t physaddr, size_t size) |
85 | uintptr_t hw_map(uintptr_t physaddr, size_t size) |
90 | { |
86 | { |
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 | /** @} |