Rev 1816 | Rev 1829 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1816 | Rev 1824 | ||
---|---|---|---|
Line 34... | Line 34... | ||
34 | 34 | ||
35 | #include <arch.h> |
35 | #include <arch.h> |
36 | 36 | ||
37 | #include <arch/types.h> |
37 | #include <arch/types.h> |
38 | #include <typedefs.h> |
38 | #include <typedefs.h> |
- | 39 | #include <align.h> |
|
39 | 40 | ||
40 | #include <arch/pm.h> |
41 | #include <arch/pm.h> |
41 | 42 | ||
42 | #include <arch/drivers/xconsole.h> |
43 | #include <arch/drivers/xconsole.h> |
- | 44 | #include <arch/mm/page.h> |
|
43 | 45 | ||
44 | #include <arch/context.h> |
46 | #include <arch/context.h> |
45 | 47 | ||
46 | #include <config.h> |
48 | #include <config.h> |
47 | 49 | ||
Line 58... | Line 60... | ||
58 | #include <proc/thread.h> |
60 | #include <proc/thread.h> |
59 | #include <syscall/syscall.h> |
61 | #include <syscall/syscall.h> |
60 | #include <console/console.h> |
62 | #include <console/console.h> |
61 | 63 | ||
62 | start_info_t start_info; |
64 | start_info_t start_info; |
- | 65 | memzone_t meminfo; |
|
- | 66 | ||
- | 67 | void arch_pre_main(void) |
|
- | 68 | { |
|
- | 69 | xen_vm_assist(VMASST_CMD_ENABLE, VMASST_TYPE_WRITABLE_PAGETABLES); |
|
- | 70 | ||
- | 71 | pte_t pte; |
|
- | 72 | memsetb((uintptr_t) &pte, sizeof(pte), 0); |
|
- | 73 | ||
- | 74 | pte.present = 1; |
|
- | 75 | pte.writeable = 1; |
|
- | 76 | pte.frame_address = ADDR2PFN((uintptr_t) start_info.shared_info); |
|
- | 77 | xen_update_va_mapping(&shared_info, pte, UVMF_INVLPG); |
|
- | 78 | ||
- | 79 | /* Create identity mapping */ |
|
- | 80 | ||
- | 81 | meminfo.start = ADDR2PFN(ALIGN_UP(KA2PA(start_info.ptl0), PAGE_SIZE)) + start_info.pt_frames; |
|
- | 82 | meminfo.size = start_info.frames - meminfo.start; |
|
- | 83 | meminfo.reserved = 0; |
|
- | 84 | ||
- | 85 | uintptr_t pa; |
|
- | 86 | index_t last_ptl0 = 0; |
|
- | 87 | for (pa = PFN2ADDR(meminfo.start); pa < PFN2ADDR(meminfo.start + meminfo.size); pa += FRAME_SIZE) { |
|
- | 88 | uintptr_t va = PA2KA(pa); |
|
- | 89 | ||
- | 90 | if ((PTL0_INDEX(va) != last_ptl0) && (GET_PTL1_FLAGS(start_info.ptl0, PTL0_INDEX(va)) & PAGE_NOT_PRESENT)) { |
|
- | 91 | /* New page directory entry needed */ |
|
- | 92 | uintptr_t tpa = PFN2ADDR(meminfo.start + meminfo.reserved); |
|
- | 93 | uintptr_t tva = PA2KA(tpa); |
|
- | 94 | ||
- | 95 | memsetb(tva, PAGE_SIZE, 0); |
|
- | 96 | ||
- | 97 | pte_t *tptl3 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(start_info.ptl0, PTL0_INDEX(tva))); |
|
- | 98 | SET_FRAME_FLAGS(tptl3, PTL3_INDEX(tva), PAGE_PRESENT); |
|
- | 99 | SET_PTL1_ADDRESS(start_info.ptl0, PTL0_INDEX(va), tpa); |
|
- | 100 | ||
- | 101 | last_ptl0 = PTL0_INDEX(va); |
|
- | 102 | meminfo.reserved++; |
|
- | 103 | } |
|
- | 104 | ||
- | 105 | pte_t *ptl3 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(start_info.ptl0, PTL0_INDEX(va))); |
|
- | 106 | ||
- | 107 | SET_FRAME_ADDRESS(ptl3, PTL3_INDEX(va), pa); |
|
- | 108 | SET_FRAME_FLAGS(ptl3, PTL3_INDEX(va), PAGE_PRESENT | PAGE_WRITE); |
|
- | 109 | } |
|
- | 110 | } |
|
63 | 111 | ||
64 | void arch_pre_mm_init(void) |
112 | void arch_pre_mm_init(void) |
65 | { |
113 | { |
66 | pm_init(); |
114 | pm_init(); |
67 | 115 |