Rev 2125 | Rev 3104 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2125 | Rev 2465 | ||
|---|---|---|---|
| Line 95... | Line 95... | ||
| 95 | */ |
95 | */ |
| 96 | pte_t *ptl0_create(int flags) |
96 | pte_t *ptl0_create(int flags) |
| 97 | { |
97 | { |
| 98 | pte_t *src_ptl0, *dst_ptl0; |
98 | pte_t *src_ptl0, *dst_ptl0; |
| 99 | ipl_t ipl; |
99 | ipl_t ipl; |
| - | 100 | int table_size; |
|
| 100 | 101 | ||
| 101 | dst_ptl0 = (pte_t *) frame_alloc(ONE_FRAME, FRAME_KA); |
102 | dst_ptl0 = (pte_t *) frame_alloc(PTL0_SIZE, FRAME_KA); |
| - | 103 | table_size = FRAME_SIZE << PTL0_SIZE; |
|
| 102 | 104 | ||
| 103 | if (flags & FLAG_AS_KERNEL) { |
105 | if (flags & FLAG_AS_KERNEL) { |
| 104 | memsetb((uintptr_t) dst_ptl0, PAGE_SIZE, 0); |
106 | memsetb((uintptr_t) dst_ptl0, table_size, 0); |
| 105 | } else { |
107 | } else { |
| 106 | uintptr_t src, dst; |
108 | uintptr_t src, dst; |
| 107 | 109 | ||
| 108 | /* |
110 | /* |
| 109 | * Copy the kernel address space portion to new PTL0. |
111 | * Copy the kernel address space portion to new PTL0. |
| Line 114... | Line 116... | ||
| 114 | src_ptl0 = (pte_t *) PA2KA((uintptr_t) AS_KERNEL->genarch.page_table); |
116 | src_ptl0 = (pte_t *) PA2KA((uintptr_t) AS_KERNEL->genarch.page_table); |
| 115 | 117 | ||
| 116 | src = (uintptr_t) &src_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)]; |
118 | src = (uintptr_t) &src_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)]; |
| 117 | dst = (uintptr_t) &dst_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)]; |
119 | dst = (uintptr_t) &dst_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)]; |
| 118 | 120 | ||
| 119 | memsetb((uintptr_t) dst_ptl0, PAGE_SIZE, 0); |
121 | memsetb((uintptr_t) dst_ptl0, table_size, 0); |
| 120 | memcpy((void *) dst, (void *) src, PAGE_SIZE - (src - (uintptr_t) src_ptl0)); |
122 | memcpy((void *) dst, (void *) src, table_size - (src - (uintptr_t) src_ptl0)); |
| 121 | mutex_unlock(&AS_KERNEL->lock); |
123 | mutex_unlock(&AS_KERNEL->lock); |
| 122 | interrupts_restore(ipl); |
124 | interrupts_restore(ipl); |
| 123 | } |
125 | } |
| 124 | 126 | ||
| 125 | return (pte_t *) KA2PA((uintptr_t) dst_ptl0); |
127 | return (pte_t *) KA2PA((uintptr_t) dst_ptl0); |