This patch makes it an automatic variable instead therefore it
still increases the stack pressure by 512 bytes.
It results in the following size decrease:
tlbex.o~old => tlbex.o
text: 9812 9780 -32 0%
data: 1344 832 -512 -38%
bss: 1568 1568 0 0%
total: 12724 12180 -544 -4%
Signed-off-by: Franck Bui-Huu <fbuihuu@gmail.com>
---
arch/mips/mm/tlbex.c | 50 +++++++++++++++++++++++++++++---------------------
1 files changed, 29 insertions(+), 21 deletions(-)
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c
index ae1bf81..cbcb320 100644
--- a/arch/mips/mm/tlbex.c
+++ b/arch/mips/mm/tlbex.c
@@ -735,27 +735,23 @@ il_bgez(u32 **p, struct reloc **r, unsigned int reg, enum
label_id l)
# define GET_CONTEXT(buf, reg) i_MFC0(buf, reg, C0_CONTEXT)
#endif
-/* The worst case length of the handler is around 18 instructions for
- * R3000-style TLBs and up to 63 instructions for R4000-style TLBs.
- * Maximum space available is 32 instructions for R3000 and 64
- * instructions for R4000.
- *
- * We deliberately chose a buffer size of 128, so we won't scribble
- * over anything important on overflow before we panic.
- */
-static u32 tlb_handler[128] __initdata;
-
/*
* The R3000 TLB handler is simple.
+ *
+ * The worst case length of the handler is around 18 instructions for
+ * R3000-style TLBs and the maximum space available for it is 32
+ * instructions.
+ *
+ * We deliberately chose a buffer size of 64, so we won't scribble
+ * over anything important on overflow before we panic.
*/
static void __init build_r3000_tlb_refill_handler(void)
{
+ u32 tlb_handler[64], *p = tlb_handler;
long pgdc = (long)pgd_current;
- u32 *p;
int i;
memset(tlb_handler, 0, sizeof(tlb_handler));
- p = tlb_handler;
i_mfc0(&p, K0, C0_BADVADDR);
i_lui(&p, K1, rel_hi(pgdc)); /* cp0 delay */
@@ -787,17 +783,19 @@ static void __init build_r3000_tlb_refill_handler(void)
pr_debug("\t.word 0x%08x\n", tlb_handler[i]);
pr_debug("\t.set pop\n");
- memcpy((void *)ebase, tlb_handler, 0x80);
+ memcpy((void *)ebase, tlb_handler, 32);
}
/*
- * The R4000 TLB handler is much more complicated. We have two
- * consecutive handler areas with 32 instructions space each.
- * Since they aren't used at the same time, we can overflow in the
- * other one.To keep things simple, we first assume linear space,
- * then we relocate it to the final handler layout as needed.
+ * The R4000 TLB handler.
+ *
+ * The worst case length of the handler is up to 63 instructions for
+ * R4000-style TLBs and the maximum space available for it is 64
+ * instructions.
+ *
+ * We deliberately chose a buffer size of 128, so we won't scribble
+ * over anything important on overflow before we panic.
*/
-static u32 final_handler[64] __initdata;
/*
* Hazards
@@ -1243,9 +1241,19 @@ static void __init build_update_entries(u32 **p,
unsigned int tmp,
#endif
}
+/*
+ * The R4000 TLB handler is much more complicated. We have two
+ * consecutive handler areas with 32 instructions space each.
+ * Since they aren't used at the same time, we can overflow in the
+ * other one.To keep things simple, we first assume linear space,
+ * then we relocate it to the final handler layout as needed.
+ */
+static u32 final_handler[64] __initdata;
+
+
static void __init build_r4000_tlb_refill_handler(void)
{
- u32 *p = tlb_handler;
+ u32 tlb_handler[128], *p = tlb_handler;
struct label labels[128], *l = labels;
struct reloc relocs[128], *r = relocs;
u32 *f;
@@ -1365,7 +1373,7 @@ static void __init build_r4000_tlb_refill_handler(void)
pr_debug("\t.word 0x%08x\n", f[i]);
pr_debug("\t.set pop\n");
- memcpy((void *)ebase, final_handler, 0x100);
+ memcpy((void *)ebase, final_handler, 64);
}
/*
--
1.5.3.3
|