Changeset 8565a42 in mainline for kernel/arch/ppc32
- Timestamp:
- 2018-03-02T20:34:50Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- a1a81f69, d5e5fd1
- Parents:
- 3061bc1 (diff), 34e1206 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:34:50)
- git-committer:
- GitHub <noreply@…> (2018-03-02 20:34:50)
- Location:
- kernel/arch/ppc32
- Files:
-
- 21 edited
-
_link.ld.in (modified) (3 diffs)
-
include/arch/asm.h (modified) (6 diffs)
-
include/arch/atomic.h (modified) (2 diffs)
-
include/arch/barrier.h (modified) (3 diffs)
-
include/arch/cycle.h (modified) (2 diffs)
-
include/arch/mm/frame.h (modified) (1 diff)
-
include/arch/mm/page.h (modified) (2 diffs)
-
src/asm.S (modified) (7 diffs)
-
src/boot/boot.S (modified) (1 diff)
-
src/context.S (modified) (2 diffs)
-
src/cpu/cpu.c (modified) (2 diffs)
-
src/drivers/pic.c (modified) (2 diffs)
-
src/exception.S (modified) (22 diffs)
-
src/fpu_context.S (modified) (3 diffs)
-
src/interrupt.c (modified) (3 diffs)
-
src/mm/as.c (modified) (1 diff)
-
src/mm/frame.c (modified) (5 diffs)
-
src/mm/pht.c (modified) (8 diffs)
-
src/mm/tlb.c (modified) (6 diffs)
-
src/ppc32.c (modified) (12 diffs)
-
src/proc/scheduler.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ppc32/_link.ld.in
r3061bc1 r8565a42 22 22 *(K_UNMAPPED_TEXT_START); 23 23 unmapped_ktext_end = .; 24 24 25 25 unmapped_kdata_start = .; 26 26 *(K_UNMAPPED_DATA_START); 27 27 unmapped_kdata_start = .; 28 28 } 29 29 30 30 .mapped PA2KA(BOOT_OFFSET): AT (BOOT_OFFSET) { 31 31 ktext_start = .; … … 33 33 *(.text); 34 34 ktext_end = .; 35 35 36 36 kdata_start = .; 37 37 *(K_DATA_START); … … 49 49 *(.bss); /* uninitialized static variables */ 50 50 *(COMMON); /* global variables */ 51 51 52 52 . = ALIGN(8); 53 53 symbol_table = .; 54 54 *(symtab.*); /* Symbol table, must be LAST symbol!*/ 55 55 56 56 kdata_end = .; 57 57 } -
kernel/arch/ppc32/include/arch/asm.h
r3061bc1 r8565a42 45 45 { 46 46 uint32_t msr; 47 47 48 48 asm volatile ( 49 49 "mfmsr %[msr]\n" 50 50 : [msr] "=r" (msr) 51 51 ); 52 52 53 53 return msr; 54 54 } … … 77 77 { 78 78 uint32_t vsid; 79 79 80 80 asm volatile ( 81 81 "mfsrin %[vsid], %[vaddr]\n" … … 83 83 : [vaddr] "r" (vaddr) 84 84 ); 85 85 86 86 return vsid; 87 87 } … … 90 90 { 91 91 uint32_t sdr1; 92 92 93 93 asm volatile ( 94 94 "mfsdr1 %[sdr1]\n" 95 95 : [sdr1] "=r" (sdr1) 96 96 ); 97 97 98 98 return sdr1; 99 99 } … … 173 173 { 174 174 uintptr_t base; 175 175 176 176 asm volatile ( 177 177 "and %[base], %%sp, %[mask]\n" … … 179 179 : [mask] "r" (~(STACK_SIZE - 1)) 180 180 ); 181 181 182 182 return base; 183 183 } -
kernel/arch/ppc32/include/arch/atomic.h
r3061bc1 r8565a42 41 41 { 42 42 atomic_count_t tmp; 43 43 44 44 asm volatile ( 45 45 "1:\n" … … 59 59 { 60 60 atomic_count_t tmp; 61 61 62 62 asm volatile ( 63 63 "1:\n" -
kernel/arch/ppc32/include/arch/barrier.h
r3061bc1 r8565a42 77 77 { 78 78 unsigned int i; 79 79 80 80 for (i = 0; i < len; i += COHERENCE_INVAL_MIN) 81 81 asm volatile ( … … 83 83 :: [addr] "r" (addr + i) 84 84 ); 85 85 86 86 memory_barrier(); 87 87 88 88 for (i = 0; i < len; i += COHERENCE_INVAL_MIN) 89 89 asm volatile ( … … 91 91 :: [addr] "r" (addr + i) 92 92 ); 93 93 94 94 instruction_barrier(); 95 95 } -
kernel/arch/ppc32/include/arch/cycle.h
r3061bc1 r8565a42 43 43 uint32_t upper; 44 44 uint32_t tmp; 45 45 46 46 do { 47 47 asm volatile ( … … 54 54 ); 55 55 } while (upper != tmp); 56 56 57 57 return ((uint64_t) upper << 32) + (uint64_t) lower; 58 58 } -
kernel/arch/ppc32/include/arch/mm/frame.h
r3061bc1 r8565a42 49 49 { 50 50 uint32_t physmem; 51 51 52 52 asm volatile ( 53 53 "mfsprg3 %[physmem]\n" 54 54 : [physmem] "=r" (physmem) 55 55 ); 56 56 57 57 return physmem; 58 58 } -
kernel/arch/ppc32/include/arch/mm/page.h
r3061bc1 r8565a42 165 165 { 166 166 pte_t *entry = &pt[i]; 167 167 168 168 return (((!entry->page_cache_disable) << PAGE_CACHEABLE_SHIFT) | 169 169 ((!entry->present) << PAGE_PRESENT_SHIFT) | … … 178 178 { 179 179 pte_t *entry = &pt[i]; 180 180 181 181 entry->page_cache_disable = !(flags & PAGE_CACHEABLE); 182 182 entry->present = !(flags & PAGE_NOT_PRESENT); -
kernel/arch/ppc32/src/asm.S
r3061bc1 r8565a42 40 40 * r5 = entry 41 41 */ 42 42 43 43 /* Disable interrupts */ 44 44 45 45 mfmsr r31 46 46 rlwinm r31, r31, 0, 17, 15 47 47 mtmsr r31 48 48 isync 49 49 50 50 /* Set entry point */ 51 51 52 52 mtsrr0 r5 53 53 54 54 /* Set privileged state, enable interrupts */ 55 55 56 56 ori r31, r31, MSR_PR 57 57 ori r31, r31, MSR_EE 58 58 mtsrr1 r31 59 59 60 60 /* Set stack */ 61 61 62 62 mr sp, r4 63 63 64 64 /* %r6 is defined to hold pcb_ptr - set it to 0 */ 65 65 66 66 xor r6, r6, r6 67 67 68 68 /* Jump to userspace */ 69 69 70 70 rfi 71 71 FUNCTION_END(userspace_asm) … … 73 73 SYMBOL(iret) 74 74 /* Disable interrupts */ 75 75 76 76 mfmsr r31 77 77 rlwinm r31, r31, 0, 17, 15 78 78 mtmsr r31 79 79 isync 80 80 81 81 lwz r0, ISTATE_OFFSET_R0(sp) 82 82 lwz r2, ISTATE_OFFSET_R2(sp) … … 109 109 lwz r30, ISTATE_OFFSET_R30(sp) 110 110 lwz r31, ISTATE_OFFSET_R31(sp) 111 111 112 112 lwz r12, ISTATE_OFFSET_CR(sp) 113 113 mtcr r12 114 114 115 115 lwz r12, ISTATE_OFFSET_PC(sp) 116 116 mtsrr0 r12 117 117 118 118 lwz r12, ISTATE_OFFSET_SRR1(sp) 119 119 mtsrr1 r12 120 120 121 121 lwz r12, ISTATE_OFFSET_LR(sp) 122 122 mtlr r12 123 123 124 124 lwz r12, ISTATE_OFFSET_CTR(sp) 125 125 mtctr r12 126 126 127 127 lwz r12, ISTATE_OFFSET_XER(sp) 128 128 mtxer r12 129 129 130 130 lwz r12, ISTATE_OFFSET_R12(sp) 131 131 lwz sp, ISTATE_OFFSET_SP(sp) 132 132 133 133 rfi 134 134 135 135 SYMBOL(iret_syscall) 136 136 /* Disable interrupts */ 137 137 138 138 mfmsr r31 139 139 rlwinm r31, r31, 0, 17, 15 140 140 mtmsr r31 141 141 isync 142 142 143 143 lwz r0, ISTATE_OFFSET_R0(sp) 144 144 lwz r2, ISTATE_OFFSET_R2(sp) … … 170 170 lwz r30, ISTATE_OFFSET_R30(sp) 171 171 lwz r31, ISTATE_OFFSET_R31(sp) 172 172 173 173 lwz r12, ISTATE_OFFSET_CR(sp) 174 174 mtcr r12 175 175 176 176 lwz r12, ISTATE_OFFSET_PC(sp) 177 177 mtsrr0 r12 178 178 179 179 lwz r12, ISTATE_OFFSET_SRR1(sp) 180 180 mtsrr1 r12 181 181 182 182 lwz r12, ISTATE_OFFSET_LR(sp) 183 183 mtlr r12 184 184 185 185 lwz r12, ISTATE_OFFSET_CTR(sp) 186 186 mtctr r12 187 187 188 188 lwz r12, ISTATE_OFFSET_XER(sp) 189 189 mtxer r12 190 190 191 191 lwz r12, ISTATE_OFFSET_R12(sp) 192 192 lwz sp, ISTATE_OFFSET_SP(sp) 193 193 194 194 rfi 195 195 … … 200 200 addi r4, r4, -4 201 201 beq 2f 202 202 203 203 andi. r0, r6, 3 204 204 mtctr r7 205 205 bne 5f 206 206 207 207 1: 208 208 209 209 lwz r7, 4(r4) 210 210 lwzu r8, 8(r4) … … 212 212 stwu r8, 8(r6) 213 213 bdnz 1b 214 214 215 215 andi. r5, r5, 7 216 216 217 217 2: 218 218 219 219 cmplwi 0, r5, 4 220 220 blt 3f 221 221 222 222 lwzu r0, 4(r4) 223 223 addi r5, r5, -4 224 224 stwu r0, 4(r6) 225 225 226 226 3: 227 227 228 228 cmpwi 0, r5, 0 229 229 beqlr … … 231 231 addi r4, r4, 3 232 232 addi r6, r6, 3 233 233 234 234 4: 235 235 236 236 lbzu r0, 1(r4) 237 237 stbu r0, 1(r6) 238 238 bdnz 4b 239 239 blr 240 240 241 241 5: 242 242 243 243 subfic r0, r0, 4 244 244 mtctr r0 245 245 246 246 6: 247 247 248 248 lbz r7, 4(r4) 249 249 addi r4, r4, 1 -
kernel/arch/ppc32/src/boot/boot.S
r3061bc1 r8565a42 35 35 SYMBOL(kernel_image_start) 36 36 # load temporal kernel stack 37 37 38 38 lis sp, kernel_stack@ha 39 39 addi sp, sp, kernel_stack@l 40 40 41 41 # set kernel stack for interrupt handling 42 42 43 43 mr r31, sp 44 44 subis r31, r31, 0x8000 45 45 mtsprg0 r31 46 46 47 47 # r3 contains physical address of bootinfo_t 48 48 49 49 addis r3, r3, 0x8000 50 50 bl ppc32_pre_main -
kernel/arch/ppc32/src/context.S
r3061bc1 r8565a42 55 55 stw r30, CONTEXT_OFFSET_R30(r3) 56 56 stw r31, CONTEXT_OFFSET_R31(r3) 57 57 58 58 mflr r4 59 59 stw r4, CONTEXT_OFFSET_PC(r3) 60 60 61 61 mfcr r4 62 62 stw r4, CONTEXT_OFFSET_CR(r3) 63 63 64 64 # context_save returns 1 65 65 li r3, 1 … … 89 89 lwz r30, CONTEXT_OFFSET_R30(r3) 90 90 lwz r31, CONTEXT_OFFSET_R31(r3) 91 91 92 92 lwz r4, CONTEXT_OFFSET_CR(r3) 93 93 mtcr r4 94 94 95 95 lwz r4, CONTEXT_OFFSET_PC(r3) 96 96 mtlr r4 97 97 98 98 # context_restore returns 0 99 99 li r3, 0 -
kernel/arch/ppc32/src/cpu/cpu.c
r3061bc1 r8565a42 54 54 { 55 55 const char *name; 56 56 57 57 switch (cpu->arch.version) { 58 58 case 8: … … 71 71 name = "unknown"; 72 72 } 73 73 74 74 printf("cpu%u: version=%" PRIu16" (%s), revision=%" PRIu16 "\n", cpu->id, 75 75 cpu->arch.version, name, cpu->arch.revision); -
kernel/arch/ppc32/src/drivers/pic.c
r3061bc1 r8565a42 55 55 pic[PIC_MASK_HIGH] = pic[PIC_MASK_HIGH] | (1 << (intnum - 32)); 56 56 } 57 57 58 58 } 59 59 … … 85 85 if (pic) { 86 86 uint32_t pending; 87 87 88 88 pending = pic[PIC_PENDING_LOW]; 89 89 if (pending != 0) 90 90 return fnzb32(pending); 91 91 92 92 pending = pic[PIC_PENDING_HIGH]; 93 93 if (pending != 0) 94 94 return fnzb32(pending) + 32; 95 95 } 96 96 97 97 return 255; 98 98 } -
kernel/arch/ppc32/src/exception.S
r3061bc1 r8565a42 38 38 39 39 .macro CONTEXT_STORE 40 40 41 41 # save r12 in SPRG1, backup CR in r12 42 42 # save SP in SPRG2 43 43 44 44 mtsprg1 r12 45 45 mfcr r12 46 46 mtsprg2 sp 47 47 48 48 # check whether the previous mode was user or kernel 49 49 50 50 mfsrr1 sp # use sp as a temporary register to hold SRR1 51 51 andi. sp, sp, MSR_PR 52 52 bne 1f 53 53 # previous mode was kernel 54 54 55 55 mfsprg2 sp 56 56 subis sp, sp, 0x8000 57 57 b 2f 58 58 59 59 1: 60 60 # previous mode was user 61 61 62 62 mfsprg0 sp 63 63 2: 64 64 65 65 subi sp, sp, ALIGN_UP(ISTATE_SIZE, STACK_ALIGNMENT) 66 66 stw r0, ISTATE_OFFSET_R0(sp) … … 94 94 stw r30, ISTATE_OFFSET_R30(sp) 95 95 stw r31, ISTATE_OFFSET_R31(sp) 96 96 97 97 stw r12, ISTATE_OFFSET_CR(sp) 98 98 99 99 mfsrr0 r12 100 100 stw r12, ISTATE_OFFSET_PC(sp) 101 101 102 102 mfsrr1 r12 103 103 stw r12, ISTATE_OFFSET_SRR1(sp) 104 104 105 105 mflr r12 106 106 stw r12, ISTATE_OFFSET_LR(sp) 107 107 108 108 mfctr r12 109 109 stw r12, ISTATE_OFFSET_CTR(sp) 110 110 111 111 mfxer r12 112 112 stw r12, ISTATE_OFFSET_XER(sp) 113 113 114 114 mfdar r12 115 115 stw r12, ISTATE_OFFSET_DAR(sp) 116 116 117 117 mfsprg1 r12 118 118 stw r12, ISTATE_OFFSET_R12(sp) 119 119 120 120 mfsprg2 r12 121 121 stw r12, ISTATE_OFFSET_SP(sp) … … 129 129 SYMBOL(exc_system_reset) 130 130 CONTEXT_STORE 131 131 132 132 li r3, 0 133 133 b jump_to_kernel … … 136 136 SYMBOL(exc_machine_check) 137 137 CONTEXT_STORE 138 138 139 139 li r3, 1 140 140 b jump_to_kernel … … 143 143 SYMBOL(exc_data_storage) 144 144 CONTEXT_STORE 145 145 146 146 li r3, 2 147 147 b jump_to_kernel … … 150 150 SYMBOL(exc_instruction_storage) 151 151 CONTEXT_STORE 152 152 153 153 li r3, 3 154 154 b jump_to_kernel … … 157 157 SYMBOL(exc_external) 158 158 CONTEXT_STORE 159 159 160 160 li r3, 4 161 161 b jump_to_kernel … … 164 164 SYMBOL(exc_alignment) 165 165 CONTEXT_STORE 166 166 167 167 li r3, 5 168 168 b jump_to_kernel … … 171 171 SYMBOL(exc_program) 172 172 CONTEXT_STORE 173 173 174 174 li r3, 6 175 175 b jump_to_kernel … … 178 178 SYMBOL(exc_fp_unavailable) 179 179 CONTEXT_STORE 180 180 181 181 li r3, 7 182 182 b jump_to_kernel … … 185 185 SYMBOL(exc_decrementer) 186 186 CONTEXT_STORE 187 187 188 188 li r3, 8 189 189 b jump_to_kernel … … 192 192 SYMBOL(exc_reserved0) 193 193 CONTEXT_STORE 194 194 195 195 li r3, 9 196 196 b jump_to_kernel … … 199 199 SYMBOL(exc_reserved1) 200 200 CONTEXT_STORE 201 201 202 202 li r3, 10 203 203 b jump_to_kernel … … 206 206 SYMBOL(exc_syscall) 207 207 CONTEXT_STORE 208 208 209 209 b jump_to_kernel_syscall 210 210 … … 212 212 SYMBOL(exc_trace) 213 213 CONTEXT_STORE 214 214 215 215 li r3, 12 216 216 b jump_to_kernel … … 219 219 SYMBOL(exc_itlb_miss) 220 220 CONTEXT_STORE 221 221 222 222 li r3, 13 223 223 b jump_to_kernel … … 226 226 SYMBOL(exc_dtlb_miss_load) 227 227 CONTEXT_STORE 228 228 229 229 li r3, 14 230 230 b jump_to_kernel … … 233 233 SYMBOL(exc_dtlb_miss_store) 234 234 CONTEXT_STORE 235 235 236 236 li r3, 15 237 237 b jump_to_kernel … … 244 244 # Previous mode was kernel. 245 245 # We can construct a proper frame linkage. 246 246 247 247 mfsrr0 r12 248 248 stw r12, ISTATE_OFFSET_LR_FRAME(sp) … … 265 265 ori r12, r12, (MSR_IR | MSR_DR) 266 266 mtsrr1 r12 267 267 268 268 addis sp, sp, 0x8000 269 269 mr r4, sp 270 270 271 271 rfi 272 272 … … 275 275 addi r12, r12, syscall_handler@l 276 276 mtsrr0 r12 277 277 278 278 lis r12, iret_syscall@ha 279 279 addi r12, r12, iret_syscall@l … … 286 286 ori r12, r12, (MSR_IR | MSR_DR | MSR_EE) 287 287 mtsrr1 r12 288 288 289 289 addis sp, sp, 0x8000 290 290 rfi -
kernel/arch/ppc32/src/fpu_context.S
r3061bc1 r8565a42 106 106 FUNCTION_BEGIN(fpu_context_save) 107 107 FPU_CONTEXT_STORE r3 108 108 109 109 mffs fr0 110 110 stfd fr0, FPU_CONTEXT_OFFSET_FPSCR(r3) 111 111 112 112 blr 113 113 FUNCTION_END(fpu_context_save) … … 116 116 lfd fr0, FPU_CONTEXT_OFFSET_FPSCR(r3) 117 117 mtfsf 0xff, fr0 118 118 119 119 FPU_CONTEXT_LOAD r3 120 120 121 121 blr 122 122 FUNCTION_END(fpu_context_restore) … … 125 125 mfmsr r0 126 126 ori r0, r0, MSR_FP 127 127 128 128 # Disable FPU exceptions 129 129 li r3, MSR_FE0 | MSR_FE1 130 130 andc r0, r0, r3 131 131 132 132 mtmsr r0 133 133 isync 134 134 135 135 blr 136 136 FUNCTION_END(fpu_init) -
kernel/arch/ppc32/src/interrupt.c
r3061bc1 r8565a42 66 66 log_printf("r0 =%0#10" PRIx32 "\tr1 =%0#10" PRIx32 "\t" 67 67 "r2 =%0#10" PRIx32 "\n", istate->r0, istate->sp, istate->r2); 68 68 69 69 log_printf("r3 =%0#10" PRIx32 "\tr4 =%0#10" PRIx32 "\t" 70 70 "r5 =%0#10" PRIx32 "\n", istate->r3, istate->r4, istate->r5); 71 71 72 72 log_printf("r6 =%0#10" PRIx32 "\tr7 =%0#10" PRIx32 "\t" 73 73 "r8 =%0#10" PRIx32 "\n", istate->r6, istate->r7, istate->r8); 74 74 75 75 log_printf("r9 =%0#10" PRIx32 "\tr10=%0#10" PRIx32 "\t" 76 76 "r11=%0#10" PRIx32 "\n", istate->r9, istate->r10, istate->r11); 77 77 78 78 log_printf("r12=%0#10" PRIx32 "\tr13=%0#10" PRIx32 "\t" 79 79 "r14=%0#10" PRIx32 "\n", istate->r12, istate->r13, istate->r14); 80 80 81 81 log_printf("r15=%0#10" PRIx32 "\tr16=%0#10" PRIx32 "\t" 82 82 "r17=%0#10" PRIx32 "\n", istate->r15, istate->r16, istate->r17); 83 83 84 84 log_printf("r18=%0#10" PRIx32 "\tr19=%0#10" PRIx32 "\t" 85 85 "r20=%0#10" PRIx32 "\n", istate->r18, istate->r19, istate->r20); 86 86 87 87 log_printf("r21=%0#10" PRIx32 "\tr22=%0#10" PRIx32 "\t" 88 88 "r23=%0#10" PRIx32 "\n", istate->r21, istate->r22, istate->r23); 89 89 90 90 log_printf("r24=%0#10" PRIx32 "\tr25=%0#10" PRIx32 "\t" 91 91 "r26=%0#10" PRIx32 "\n", istate->r24, istate->r25, istate->r26); 92 92 93 93 log_printf("r27=%0#10" PRIx32 "\tr28=%0#10" PRIx32 "\t" 94 94 "r29=%0#10" PRIx32 "\n", istate->r27, istate->r28, istate->r29); 95 95 96 96 log_printf("r30=%0#10" PRIx32 "\tr31=%0#10" PRIx32 "\n", 97 97 istate->r30, istate->r31); 98 98 99 99 log_printf("cr =%0#10" PRIx32 "\tpc =%0#10" PRIx32 "\t" 100 100 "lr =%0#10" PRIx32 "\n", istate->cr, istate->pc, istate->lr); 101 101 102 102 log_printf("ctr=%0#10" PRIx32 "\txer=%0#10" PRIx32 "\t" 103 103 "dar=%0#10" PRIx32 "\n", istate->ctr, istate->xer, istate->dar); 104 104 105 105 log_printf("srr1=%0#10" PRIx32 "\n", istate->srr1); 106 106 } … … 119 119 * The IRQ handler was found. 120 120 */ 121 121 122 122 if (irq->preack) { 123 123 /* Acknowledge the interrupt before processing */ … … 125 125 irq->cir(irq->cir_arg, irq->inr); 126 126 } 127 127 128 128 irq->handler(irq); 129 129 130 130 if (!irq->preack) { 131 131 if (irq->cir) 132 132 irq->cir(irq->cir_arg, irq->inr); 133 133 } 134 134 135 135 irq_spinlock_unlock(&irq->lock, false); 136 136 } else { -
kernel/arch/ppc32/src/mm/as.c
r3061bc1 r8565a42 56 56 { 57 57 uint32_t sr; 58 58 59 59 /* Lower 2 GB, user and supervisor access */ 60 60 for (sr = 0; sr < 8; sr++) 61 61 sr_set(0x6000, as->asid, sr); 62 62 63 63 /* Upper 2 GB, only supervisor access */ 64 64 for (sr = 8; sr < 16; sr++) -
kernel/arch/ppc32/src/mm/frame.c
r3061bc1 r8565a42 45 45 { 46 46 printf("[base ] [size ]\n"); 47 47 48 48 size_t i; 49 49 for (i = 0; i < memmap.cnt; i++) { … … 57 57 pfn_t minconf = 2; 58 58 size_t i; 59 59 60 60 for (i = 0; i < memmap.cnt; i++) { 61 61 /* To be safe, make the available zone possibly smaller */ … … 64 64 size_t size = ALIGN_DOWN(memmap.zones[i].size - 65 65 (base - ((uintptr_t) memmap.zones[i].start)), FRAME_SIZE); 66 66 67 67 if (!frame_adjust_zone_bounds(low, &base, &size)) 68 68 return; … … 86 86 } 87 87 } 88 88 89 89 } 90 90 … … 92 92 { 93 93 frame_common_arch_init(true); 94 94 95 95 /* First is exception vector, second is 'implementation specific', 96 96 third and fourth is reserved, other contain real mode code */ 97 97 frame_mark_unavailable(0, 8); 98 98 99 99 /* Mark the Page Hash Table frames as unavailable */ 100 100 uint32_t sdr1 = sdr1_get(); 101 101 102 102 // FIXME: compute size of PHT exactly 103 103 frame_mark_unavailable(ADDR2PFN(sdr1 & 0xffff000), 16); -
kernel/arch/ppc32/src/mm/pht.c
r3061bc1 r8565a42 93 93 uint32_t page = (vaddr >> 12) & 0xffff; 94 94 uint32_t api = (vaddr >> 22) & 0x3f; 95 95 96 96 uint32_t vsid = sr_get(vaddr); 97 97 uint32_t sdr1 = sdr1_get(); 98 98 99 99 // FIXME: compute size of PHT exactly 100 100 phte_t *phte = (phte_t *) PA2KA(sdr1 & 0xffff0000); 101 101 102 102 /* Primary hash (xor) */ 103 103 uint32_t h = 0; … … 106 106 uint32_t i; 107 107 bool found = false; 108 108 109 109 /* Find colliding PTE in PTEG */ 110 110 for (i = 0; i < 8; i++) { … … 117 117 } 118 118 } 119 119 120 120 if (!found) { 121 121 /* Find unused PTE in PTEG */ … … 127 127 } 128 128 } 129 129 130 130 if (!found) { 131 131 /* Secondary hash (not) */ 132 132 uint32_t base2 = (~hash & 0x3ff) << 3; 133 133 134 134 /* Find colliding PTE in PTEG */ 135 135 for (i = 0; i < 8; i++) { … … 144 144 } 145 145 } 146 146 147 147 if (!found) { 148 148 /* Find unused PTE in PTEG */ … … 156 156 } 157 157 } 158 158 159 159 if (!found) 160 160 i = RANDI(seed) % 8; 161 161 } 162 162 163 163 phte[base + i].v = 1; 164 164 phte[base + i].vsid = vsid; … … 181 181 { 182 182 uintptr_t badvaddr; 183 183 184 184 if (n == VECTOR_DATA_STORAGE) 185 185 badvaddr = istate->dar; 186 186 else 187 187 badvaddr = istate->pc; 188 188 189 189 pte_t pte; 190 190 bool found = find_mapping_and_check(AS, badvaddr, 191 191 PF_ACCESS_READ /* FIXME */, istate, &pte); 192 192 193 193 if (found) { 194 194 /* Record access to PTE */ … … 201 201 { 202 202 uint32_t sdr1 = sdr1_get(); 203 203 204 204 // FIXME: compute size of PHT exactly 205 205 phte_t *phte = (phte_t *) PA2KA(sdr1 & 0xffff0000); 206 206 207 207 // FIXME: this invalidates all PHT entries, 208 208 // which is an overkill, invalidate only -
kernel/arch/ppc32/src/mm/tlb.c
r3061bc1 r8565a42 42 42 ptehi_t ptehi; 43 43 ptelo_t ptelo; 44 44 45 45 asm volatile ( 46 46 "mfspr %[tlbmiss], 980\n" … … 51 51 [ptelo] "=r" (ptelo) 52 52 ); 53 53 54 54 uint32_t badvaddr = tlbmiss & 0xfffffffc; 55 55 uint32_t physmem = physmem_top(); 56 56 57 57 if ((badvaddr < PA2KA(0)) || (badvaddr >= PA2KA(physmem))) 58 58 return; // FIXME 59 59 60 60 ptelo.rpn = KA2PA(badvaddr) >> 12; 61 61 ptelo.wimg = 0; 62 62 ptelo.pp = 2; // FIXME 63 63 64 64 uint32_t index = 0; 65 65 asm volatile ( … … 84 84 "sync\n" 85 85 ); 86 86 87 87 for (unsigned int i = 0; i < 0x00040000; i += 0x00001000) { 88 88 asm volatile ( … … 91 91 ); 92 92 } 93 93 94 94 asm volatile ( 95 95 "eieio\n" … … 143 143 { 144 144 uint32_t sr; 145 145 146 146 for (sr = 0; sr < 16; sr++) { 147 147 uint32_t vsid = sr_get(sr << 28); 148 148 149 149 printf("sr[%02" PRIu32 "]: vsid=%#0" PRIx32 " (asid=%" PRIu32 ")" 150 150 "%s%s\n", sr, vsid & UINT32_C(0x00ffffff), … … 153 153 ((vsid >> 29) & 1) ? " user" : ""); 154 154 } 155 155 156 156 uint32_t upper; 157 157 uint32_t lower; 158 158 uint32_t mask; 159 159 uint32_t length; 160 160 161 161 PRINT_BAT("ibat[0]", 528, 529); 162 162 PRINT_BAT("ibat[1]", 530, 531); 163 163 PRINT_BAT("ibat[2]", 532, 533); 164 164 PRINT_BAT("ibat[3]", 534, 535); 165 165 166 166 PRINT_BAT("dbat[0]", 536, 537); 167 167 PRINT_BAT("dbat[1]", 538, 539); -
kernel/arch/ppc32/src/ppc32.c
r3061bc1 r8565a42 91 91 bootinfo->taskmap.tasks[i].name); 92 92 } 93 93 94 94 /* Copy physical memory map. */ 95 95 memmap.total = bootinfo->memmap.total; … … 99 99 memmap.zones[i].size = bootinfo->memmap.zones[i].size; 100 100 } 101 101 102 102 /* Copy boot allocations info. */ 103 103 ballocs.base = bootinfo->ballocs.base; 104 104 ballocs.size = bootinfo->ballocs.size; 105 105 106 106 /* Copy OFW tree. */ 107 107 ofw_tree_init(bootinfo->ofw_root); … … 112 112 /* Initialize dispatch table */ 113 113 interrupt_init(); 114 114 115 115 ofw_tree_node_t *cpus_node; 116 116 ofw_tree_node_t *cpu_node; … … 144 144 uint32_t fb_scanline = 0; 145 145 unsigned int visual = VISUAL_UNKNOWN; 146 146 147 147 ofw_tree_property_t *prop = ofw_tree_getprop(node, "address"); 148 148 if ((prop) && (prop->value)) 149 149 fb_addr = *((uintptr_t *) prop->value); 150 150 151 151 prop = ofw_tree_getprop(node, "width"); 152 152 if ((prop) && (prop->value)) 153 153 fb_width = *((uint32_t *) prop->value); 154 154 155 155 prop = ofw_tree_getprop(node, "height"); 156 156 if ((prop) && (prop->value)) 157 157 fb_height = *((uint32_t *) prop->value); 158 158 159 159 prop = ofw_tree_getprop(node, "depth"); 160 160 if ((prop) && (prop->value)) { … … 180 180 } 181 181 } 182 182 183 183 prop = ofw_tree_getprop(node, "linebytes"); 184 184 if ((prop) && (prop->value)) 185 185 fb_scanline = *((uint32_t *) prop->value); 186 186 187 187 if ((fb_addr) && (fb_width > 0) && (fb_height > 0) 188 188 && (fb_scanline > 0) && (visual != VISUAL_UNKNOWN)) { … … 195 195 .visual = visual, 196 196 }; 197 197 198 198 outdev_t *fbdev = fb_init(&fb_prop); 199 199 if (fbdev) 200 200 stdout_wire(fbdev); 201 201 } 202 202 203 203 return true; 204 204 } … … 213 213 /* Map OFW information into sysinfo */ 214 214 ofw_sysinfo_map(); 215 215 216 216 /* Initialize IRQ routing */ 217 217 irq_init(IRQ_COUNT, IRQ_COUNT); 218 218 219 219 /* Merge all zones to 1 big zone */ 220 220 zone_merge_all(); … … 225 225 { 226 226 ofw_pci_reg_t *assigned_address = NULL; 227 227 228 228 ofw_tree_property_t *prop = ofw_tree_getprop(node, "assigned-addresses"); 229 229 if ((prop) && (prop->value)) 230 230 assigned_address = ((ofw_pci_reg_t *) prop->value); 231 231 232 232 if (assigned_address) { 233 233 /* Initialize PIC */ 234 234 pic_init(assigned_address[0].addr, PAGE_SIZE, &pic_cir, 235 235 &pic_cir_arg); 236 236 237 237 #ifdef CONFIG_MAC_KBD 238 238 uintptr_t pa = assigned_address[0].addr + 0x16000; … … 240 240 size_t offset = pa - aligned_addr; 241 241 size_t size = 2 * PAGE_SIZE; 242 242 243 243 cuda_t *cuda = (cuda_t *) (km_map(aligned_addr, offset + size, 244 244 PAGE_WRITE | PAGE_NOT_CACHEABLE) + offset); 245 245 246 246 /* Initialize I/O controller */ 247 247 cuda_instance_t *cuda_instance = … … 256 256 } 257 257 } 258 258 259 259 /* 260 260 * This is the necessary evil until the userspace driver is entirely … … 266 266 #endif 267 267 } 268 268 269 269 /* Consider only a single device for now */ 270 270 return false; … … 299 299 kernel_uarg->uspace_stack_size - SP_DELTA, 300 300 (uintptr_t) kernel_uarg->uspace_entry); 301 301 302 302 /* Unreachable */ 303 303 while (true); -
kernel/arch/ppc32/src/proc/scheduler.c
r3061bc1 r8565a42 52 52 { 53 53 tlb_invalidate_all(); 54 54 55 55 asm volatile ( 56 56 "mtsprg0 %[ksp]\n"
Note:
See TracChangeset
for help on using the changeset viewer.
