diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2008-10-02 02:11:49 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2008-10-02 02:11:49 -0400 |
commit | c9b59da130b4430910e02a80816f317534cd5e53 (patch) | |
tree | 57746ca282cac8b398147807b7e107a5260015b1 /arch/powerpc/kernel | |
parent | 9f5494b797eb334f3aba5894a0b5b34d332a3149 (diff) | |
parent | 4ee7084eb11e00eb02dc8435fd18273a61ffa9bf (diff) |
Merge commit 'kumar/kumar-mmu'
Diffstat (limited to 'arch/powerpc/kernel')
-rw-r--r-- | arch/powerpc/kernel/asm-offsets.c | 1 | ||||
-rw-r--r-- | arch/powerpc/kernel/head_32.S | 4 | ||||
-rw-r--r-- | arch/powerpc/kernel/head_fsl_booke.S | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/misc_32.S | 54 | ||||
-rw-r--r-- | arch/powerpc/kernel/ppc_ksyms.c | 3 |
5 files changed, 60 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index e9c4044012bd..09febc582584 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c | |||
@@ -352,6 +352,7 @@ int main(void) | |||
352 | #endif | 352 | #endif |
353 | 353 | ||
354 | DEFINE(PGD_TABLE_SIZE, PGD_TABLE_SIZE); | 354 | DEFINE(PGD_TABLE_SIZE, PGD_TABLE_SIZE); |
355 | DEFINE(PTE_SIZE, sizeof(pte_t)); | ||
355 | 356 | ||
356 | #ifdef CONFIG_KVM | 357 | #ifdef CONFIG_KVM |
357 | DEFINE(TLBE_BYTES, sizeof(struct tlbe)); | 358 | DEFINE(TLBE_BYTES, sizeof(struct tlbe)); |
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S index 8bb657519299..a6de6dbc5ed8 100644 --- a/arch/powerpc/kernel/head_32.S +++ b/arch/powerpc/kernel/head_32.S | |||
@@ -369,13 +369,13 @@ i##n: \ | |||
369 | DataAccess: | 369 | DataAccess: |
370 | EXCEPTION_PROLOG | 370 | EXCEPTION_PROLOG |
371 | mfspr r10,SPRN_DSISR | 371 | mfspr r10,SPRN_DSISR |
372 | stw r10,_DSISR(r11) | ||
372 | andis. r0,r10,0xa470 /* weird error? */ | 373 | andis. r0,r10,0xa470 /* weird error? */ |
373 | bne 1f /* if not, try to put a PTE */ | 374 | bne 1f /* if not, try to put a PTE */ |
374 | mfspr r4,SPRN_DAR /* into the hash table */ | 375 | mfspr r4,SPRN_DAR /* into the hash table */ |
375 | rlwinm r3,r10,32-15,21,21 /* DSISR_STORE -> _PAGE_RW */ | 376 | rlwinm r3,r10,32-15,21,21 /* DSISR_STORE -> _PAGE_RW */ |
376 | bl hash_page | 377 | bl hash_page |
377 | 1: stw r10,_DSISR(r11) | 378 | 1: lwz r5,_DSISR(r11) /* get DSISR value */ |
378 | mr r5,r10 | ||
379 | mfspr r4,SPRN_DAR | 379 | mfspr r4,SPRN_DAR |
380 | EXC_XFER_EE_LITE(0x300, handle_page_fault) | 380 | EXC_XFER_EE_LITE(0x300, handle_page_fault) |
381 | 381 | ||
diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S index 377e0c155c95..18c0093f9323 100644 --- a/arch/powerpc/kernel/head_fsl_booke.S +++ b/arch/powerpc/kernel/head_fsl_booke.S | |||
@@ -422,7 +422,6 @@ skpinv: addi r6,r6,1 /* Increment */ | |||
422 | * r12 is pointer to the pte | 422 | * r12 is pointer to the pte |
423 | */ | 423 | */ |
424 | #ifdef CONFIG_PTE_64BIT | 424 | #ifdef CONFIG_PTE_64BIT |
425 | #define PTE_FLAGS_OFFSET 4 | ||
426 | #define FIND_PTE \ | 425 | #define FIND_PTE \ |
427 | rlwinm r12, r10, 13, 19, 29; /* Compute pgdir/pmd offset */ \ | 426 | rlwinm r12, r10, 13, 19, 29; /* Compute pgdir/pmd offset */ \ |
428 | lwzx r11, r12, r11; /* Get pgd/pmd entry */ \ | 427 | lwzx r11, r12, r11; /* Get pgd/pmd entry */ \ |
@@ -431,7 +430,6 @@ skpinv: addi r6,r6,1 /* Increment */ | |||
431 | rlwimi r12, r10, 23, 20, 28; /* Compute pte address */ \ | 430 | rlwimi r12, r10, 23, 20, 28; /* Compute pte address */ \ |
432 | lwz r11, 4(r12); /* Get pte entry */ | 431 | lwz r11, 4(r12); /* Get pte entry */ |
433 | #else | 432 | #else |
434 | #define PTE_FLAGS_OFFSET 0 | ||
435 | #define FIND_PTE \ | 433 | #define FIND_PTE \ |
436 | rlwimi r11, r10, 12, 20, 29; /* Create L1 (pgdir/pmd) address */ \ | 434 | rlwimi r11, r10, 12, 20, 29; /* Create L1 (pgdir/pmd) address */ \ |
437 | lwz r11, 0(r11); /* Get L1 entry */ \ | 435 | lwz r11, 0(r11); /* Get L1 entry */ \ |
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index 7a6dfbca7682..e9c8ab6eabfe 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S | |||
@@ -274,6 +274,10 @@ _GLOBAL(real_writeb) | |||
274 | /* | 274 | /* |
275 | * Flush MMU TLB | 275 | * Flush MMU TLB |
276 | */ | 276 | */ |
277 | #ifndef CONFIG_FSL_BOOKE | ||
278 | _GLOBAL(_tlbil_all) | ||
279 | _GLOBAL(_tlbil_pid) | ||
280 | #endif | ||
277 | _GLOBAL(_tlbia) | 281 | _GLOBAL(_tlbia) |
278 | #if defined(CONFIG_40x) | 282 | #if defined(CONFIG_40x) |
279 | sync /* Flush to memory before changing mapping */ | 283 | sync /* Flush to memory before changing mapping */ |
@@ -344,6 +348,9 @@ _GLOBAL(_tlbia) | |||
344 | /* | 348 | /* |
345 | * Flush MMU TLB for a particular address | 349 | * Flush MMU TLB for a particular address |
346 | */ | 350 | */ |
351 | #ifndef CONFIG_FSL_BOOKE | ||
352 | _GLOBAL(_tlbil_va) | ||
353 | #endif | ||
347 | _GLOBAL(_tlbie) | 354 | _GLOBAL(_tlbie) |
348 | #if defined(CONFIG_40x) | 355 | #if defined(CONFIG_40x) |
349 | /* We run the search with interrupts disabled because we have to change | 356 | /* We run the search with interrupts disabled because we have to change |
@@ -436,6 +443,53 @@ _GLOBAL(_tlbie) | |||
436 | #endif /* ! CONFIG_40x */ | 443 | #endif /* ! CONFIG_40x */ |
437 | blr | 444 | blr |
438 | 445 | ||
446 | #if defined(CONFIG_FSL_BOOKE) | ||
447 | /* | ||
448 | * Flush MMU TLB, but only on the local processor (no broadcast) | ||
449 | */ | ||
450 | _GLOBAL(_tlbil_all) | ||
451 | #define MMUCSR0_TLBFI (MMUCSR0_TLB0FI | MMUCSR0_TLB1FI | \ | ||
452 | MMUCSR0_TLB2FI | MMUCSR0_TLB3FI) | ||
453 | li r3,(MMUCSR0_TLBFI)@l | ||
454 | mtspr SPRN_MMUCSR0, r3 | ||
455 | 1: | ||
456 | mfspr r3,SPRN_MMUCSR0 | ||
457 | andi. r3,r3,MMUCSR0_TLBFI@l | ||
458 | bne 1b | ||
459 | blr | ||
460 | |||
461 | /* | ||
462 | * Flush MMU TLB for a particular process id, but only on the local processor | ||
463 | * (no broadcast) | ||
464 | */ | ||
465 | _GLOBAL(_tlbil_pid) | ||
466 | /* we currently do an invalidate all since we don't have per pid invalidate */ | ||
467 | li r3,(MMUCSR0_TLBFI)@l | ||
468 | mtspr SPRN_MMUCSR0, r3 | ||
469 | 1: | ||
470 | mfspr r3,SPRN_MMUCSR0 | ||
471 | andi. r3,r3,MMUCSR0_TLBFI@l | ||
472 | bne 1b | ||
473 | blr | ||
474 | |||
475 | /* | ||
476 | * Flush MMU TLB for a particular address, but only on the local processor | ||
477 | * (no broadcast) | ||
478 | */ | ||
479 | _GLOBAL(_tlbil_va) | ||
480 | slwi r4,r4,16 | ||
481 | mtspr SPRN_MAS6,r4 /* assume AS=0 for now */ | ||
482 | tlbsx 0,r3 | ||
483 | mfspr r4,SPRN_MAS1 /* check valid */ | ||
484 | andis. r3,r4,MAS1_VALID@h | ||
485 | beqlr | ||
486 | rlwinm r4,r4,0,1,31 | ||
487 | mtspr SPRN_MAS1,r4 | ||
488 | tlbwe | ||
489 | blr | ||
490 | #endif /* CONFIG_FSL_BOOKE */ | ||
491 | |||
492 | |||
439 | /* | 493 | /* |
440 | * Flush instruction cache. | 494 | * Flush instruction cache. |
441 | * This is a no-op on the 601. | 495 | * This is a no-op on the 601. |
diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c index e1ea4fe5cfbd..8edc2359c419 100644 --- a/arch/powerpc/kernel/ppc_ksyms.c +++ b/arch/powerpc/kernel/ppc_ksyms.c | |||
@@ -119,6 +119,9 @@ EXPORT_SYMBOL(flush_instruction_cache); | |||
119 | EXPORT_SYMBOL(flush_tlb_kernel_range); | 119 | EXPORT_SYMBOL(flush_tlb_kernel_range); |
120 | EXPORT_SYMBOL(flush_tlb_page); | 120 | EXPORT_SYMBOL(flush_tlb_page); |
121 | EXPORT_SYMBOL(_tlbie); | 121 | EXPORT_SYMBOL(_tlbie); |
122 | #if defined(CONFIG_4xx) || defined(CONFIG_8xx) || defined(CONFIG_FSL_BOOKE) | ||
123 | EXPORT_SYMBOL(_tlbil_va); | ||
124 | #endif | ||
122 | #endif | 125 | #endif |
123 | EXPORT_SYMBOL(__flush_icache_range); | 126 | EXPORT_SYMBOL(__flush_icache_range); |
124 | EXPORT_SYMBOL(flush_dcache_range); | 127 | EXPORT_SYMBOL(flush_dcache_range); |