Commit 6c16816b authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman

powerpc/44x: use patch_sites for TLB handlers patching

Use patch sites and associated helpers to manage TLB handlers
patching instead of hardcoding.
Signed-off-by: default avatarChristophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent d16952a6
...@@ -111,6 +111,9 @@ typedef struct { ...@@ -111,6 +111,9 @@ typedef struct {
unsigned long vdso_base; unsigned long vdso_base;
} mm_context_t; } mm_context_t;
/* patch sites */
extern s32 patch__tlb_44x_hwater_D, patch__tlb_44x_hwater_I;
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */
#ifndef CONFIG_PPC_EARLY_DEBUG_44x #ifndef CONFIG_PPC_EARLY_DEBUG_44x
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/synch.h> #include <asm/synch.h>
#include <asm/export.h> #include <asm/export.h>
#include <asm/code-patching-asm.h>
#include "head_booke.h" #include "head_booke.h"
...@@ -382,10 +383,9 @@ interrupt_base: ...@@ -382,10 +383,9 @@ interrupt_base:
/* Increment, rollover, and store TLB index */ /* Increment, rollover, and store TLB index */
addi r13,r13,1 addi r13,r13,1
patch_site 0f, patch__tlb_44x_hwater_D
/* Compare with watermark (instruction gets patched) */ /* Compare with watermark (instruction gets patched) */
.globl tlb_44x_patch_hwater_D 0: cmpwi 0,r13,1 /* reserve entries */
tlb_44x_patch_hwater_D:
cmpwi 0,r13,1 /* reserve entries */
ble 5f ble 5f
li r13,0 li r13,0
5: 5:
...@@ -478,10 +478,9 @@ tlb_44x_patch_hwater_D: ...@@ -478,10 +478,9 @@ tlb_44x_patch_hwater_D:
/* Increment, rollover, and store TLB index */ /* Increment, rollover, and store TLB index */
addi r13,r13,1 addi r13,r13,1
patch_site 0f, patch__tlb_44x_hwater_I
/* Compare with watermark (instruction gets patched) */ /* Compare with watermark (instruction gets patched) */
.globl tlb_44x_patch_hwater_I 0: cmpwi 0,r13,1 /* reserve entries */
tlb_44x_patch_hwater_I:
cmpwi 0,r13,1 /* reserve entries */
ble 5f ble 5f
li r13,0 li r13,0
5: 5:
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <asm/mmu.h> #include <asm/mmu.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/code-patching.h>
#include "mmu_decl.h" #include "mmu_decl.h"
...@@ -43,22 +44,13 @@ unsigned long tlb_47x_boltmap[1024/8]; ...@@ -43,22 +44,13 @@ unsigned long tlb_47x_boltmap[1024/8];
static void ppc44x_update_tlb_hwater(void) static void ppc44x_update_tlb_hwater(void)
{ {
extern unsigned int tlb_44x_patch_hwater_D[];
extern unsigned int tlb_44x_patch_hwater_I[];
/* The TLB miss handlers hard codes the watermark in a cmpli /* The TLB miss handlers hard codes the watermark in a cmpli
* instruction to improve performances rather than loading it * instruction to improve performances rather than loading it
* from the global variable. Thus, we patch the instructions * from the global variable. Thus, we patch the instructions
* in the 2 TLB miss handlers when updating the value * in the 2 TLB miss handlers when updating the value
*/ */
tlb_44x_patch_hwater_D[0] = (tlb_44x_patch_hwater_D[0] & 0xffff0000) | modify_instruction_site(&patch__tlb_44x_hwater_D, 0xffff, tlb_44x_hwater);
tlb_44x_hwater; modify_instruction_site(&patch__tlb_44x_hwater_I, 0xffff, tlb_44x_hwater);
flush_icache_range((unsigned long)&tlb_44x_patch_hwater_D[0],
(unsigned long)&tlb_44x_patch_hwater_D[1]);
tlb_44x_patch_hwater_I[0] = (tlb_44x_patch_hwater_I[0] & 0xffff0000) |
tlb_44x_hwater;
flush_icache_range((unsigned long)&tlb_44x_patch_hwater_I[0],
(unsigned long)&tlb_44x_patch_hwater_I[1]);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment