Cleanup tlbex.c
cover Cleanup tlbex.c
Ralf,
This patchset does some trivial clean up in tlbex.c only. It doesn't optimize the code size, that should be done later after sorting out the .init.bss stuff.
Please consider,
Franck
---
arch/mips/mm/tlbex.c | 197 ++++++++++++++++++++------------------------------ 1 files changed, 77 insertions(+), 120 deletions(-)
PATCH 1/4 tlbex.c: Cleanup __init usages.
--- arch/mips/mm/tlbex.c | 96 +++++++++++++++++++++++++------------------------- 1 files changed, 48 insertions(+), 48 deletions(-)
arch/mips/mm/tlbex.c +48 -48
@@ -66,7 +66,7 @@ static inline int __maybe_unused r10000_llsc_war(void)* why; it's not an issue caused by the core RTL. * */ -static __init int __attribute__((unused))m4kc_tlbp_war (void ) +static int __init m4kc_tlbp_war (void ) {return (current_cpu_data.processor_id &0xffff00 ) == (PRID_COMP_MIPS |PRID_IMP_4KC );
@@ -140,7 +140,7 @@ struct insn { | (e) << RE_SH \ | (f) << FUNC_SH) -static __initdata struct insn insn_table[] = { +static struct insn insn_table[]__initdata = { { insn_addiu,M (addiu_op,0 ,0 ,0 ,0 ,0 ),RS |RT |SIMM }, { insn_addu,M (spec_op,0 ,0 ,0 ,0 , addu_op),RS |RT |RD }, { insn_and,M (spec_op,0 ,0 ,0 ,0 , and_op),RS |RT |RD },
@@ -193,7 +193,7 @@ static __initdata struct insn insn_table[] = {#undef M -static __init u32 build_rs (u32 arg) +static u32 __init build_rs (u32 arg) {if (arg & ~RS_MASK )printk (KERN_WARNING "TLB synthesizer field overflow\n" );
@@ -201,7 +201,7 @@ static __init u32 build_rs(u32 arg)return (arg &RS_MASK ) <<RS_SH ; } -static __init u32 build_rt (u32 arg) +static u32 __init build_rt (u32 arg) {if (arg & ~RT_MASK )printk (KERN_WARNING "TLB synthesizer field overflow\n" );
@@ -209,7 +209,7 @@ static __init u32 build_rt(u32 arg)return (arg &RT_MASK ) <<RT_SH ; } -static __init u32 build_rd (u32 arg) +static u32 __init build_rd (u32 arg) {if (arg & ~RD_MASK )printk (KERN_WARNING "TLB synthesizer field overflow\n" );
@@ -217,7 +217,7 @@ static __init u32 build_rd(u32 arg)return (arg &RD_MASK ) <<RD_SH ; } -static __init u32 build_re (u32 arg) +static u32 __init build_re (u32 arg) {if (arg & ~RE_MASK )printk (KERN_WARNING "TLB synthesizer field overflow\n" );
@@ -225,7 +225,7 @@ static __init u32 build_re(u32 arg)return (arg &RE_MASK ) <<RE_SH ; } -static __init u32 build_simm (s32 arg) +static u32 __init build_simm (s32 arg) {if (arg >0x7fff || arg <-0x8000 )printk (KERN_WARNING "TLB synthesizer field overflow\n" );
@@ -233,7 +233,7 @@ static __init u32 build_simm(s32 arg)return arg &0xffff ; } -static __init u32 build_uimm (u32 arg) +static u32 __init build_uimm (u32 arg) {if (arg & ~IMM_MASK )printk (KERN_WARNING "TLB synthesizer field overflow\n" );
@@ -241,7 +241,7 @@ static __init u32 build_uimm(u32 arg)return arg &IMM_MASK ; } -static __init u32 build_bimm (s32 arg) +static u32 __init build_bimm (s32 arg) {if (arg >0x1ffff || arg <-0x20000 )printk (KERN_WARNING "TLB synthesizer field overflow\n" );
@@ -252,7 +252,7 @@ static __init u32 build_bimm(s32 arg)return ((arg <0 ) ? (1 <<15 ) :0 ) | ((arg >>2 ) &0x7fff ); } -static __init u32 build_jimm (u32 arg) +static u32 __init build_jimm (u32 arg) {if (arg & ~((JIMM_MASK ) <<2 ))printk (KERN_WARNING "TLB synthesizer field overflow\n" );
@@ -260,7 +260,7 @@ static __init u32 build_jimm(u32 arg)return (arg >>2 ) &JIMM_MASK ; } -static __init u32 build_func (u32 arg) +static u32 __init build_func (u32 arg) {if (arg & ~FUNC_MASK )printk (KERN_WARNING "TLB synthesizer field overflow\n" );
@@ -268,7 +268,7 @@ static __init u32 build_func(u32 arg)return arg &FUNC_MASK ; } -static __init u32 build_set (u32 arg) +static u32 __init build_set (u32 arg) {if (arg & ~SET_MASK )printk (KERN_WARNING "TLB synthesizer field overflow\n" );
@@ -315,69 +315,69 @@ static void __init build_insn(u32 **buf, enum opcode opc, ...) }#define I_u1u2u3 (op) \ - static inline void __init i##op(u32 **buf, unsigned int a, \ + static inline void i##op(u32 **buf, unsigned int a, \ unsigned int b, unsigned int c) \ { \ build_insn(buf, insn##op, a, b, c); \ }#define I_u2u1u3 (op) \ - static inline void __init i##op(u32 **buf, unsigned int a, \ + static inline void i##op(u32 **buf, unsigned int a, \ unsigned int b, unsigned int c) \ { \ build_insn(buf, insn##op, b, a, c); \ }#define I_u3u1u2 (op) \ - static inline void __init i##op(u32 **buf, unsigned int a, \ + static inline void i##op(u32 **buf, unsigned int a, \ unsigned int b, unsigned int c) \ { \ build_insn(buf, insn##op, b, c, a); \ }#define I_u1u2s3 (op) \ - static inline void __init i##op(u32 **buf, unsigned int a, \ + static inline void i##op(u32 **buf, unsigned int a, \ unsigned int b, signed int c) \ { \ build_insn(buf, insn##op, a, b, c); \ }#define I_u2s3u1 (op) \ - static inline void __init i##op(u32 **buf, unsigned int a, \ + static inline void i##op(u32 **buf, unsigned int a, \ signed int b, unsigned int c) \ { \ build_insn(buf, insn##op, c, a, b); \ }#define I_u2u1s3 (op) \ - static inline void __init i##op(u32 **buf, unsigned int a, \ + static inline void i##op(u32 **buf, unsigned int a, \ unsigned int b, signed int c) \ { \ build_insn(buf, insn##op, b, a, c); \ }#define I_u1u2 (op) \ - static inline void __init i##op(u32 **buf, unsigned int a, \ + static inline void i##op(u32 **buf, unsigned int a, \ unsigned int b) \ { \ build_insn(buf, insn##op, a, b); \ }#define I_u1s2 (op) \ - static inline void __init i##op(u32 **buf, unsigned int a, \ + static inline void i##op(u32 **buf, unsigned int a, \ signed int b) \ { \ build_insn(buf, insn##op, a, b); \ }#define I_u1 (op) \ - static inline void __init i##op(u32 **buf, unsigned int a) \ + static inline void i##op(u32 **buf, unsigned int a) \ { \ build_insn(buf, insn##op, a); \ }#define I_0 (op) \ - static inline void __init i##op(u32 **buf) \ + static inline void i##op(u32 **buf) \ { \ build_insn(buf, insn##op); \ }
@@ -457,7 +457,7 @@ struct label {enum label_id lab; }; -static __init void build_label (struct label **lab,u32 *addr, +static void __init build_label (struct label **lab,u32 *addr,enum label_id l) { (*lab)->addr = addr;
@@ -526,34 +526,34 @@ L_LA(_r3000_write_probe_fail)#define i_ehb (buf) i_sll(buf, 0, 0, 3)#ifdef CONFIG_64BIT -static __init int __maybe_unused in_compat_space_p (long addr) +static int __init __maybe_unused in_compat_space_p (long addr) {/* Is this address in 32bit compat space? */ return (((addr) &0xffffffff00000000L ) ==0xffffffff00000000L ); } -static __init int __maybe_unused rel_highest (long val) +static int __init __maybe_unused rel_highest (long val) {return ((((val +0x800080008000L ) >>48 ) &0xffff ) ^0x8000 ) -0x8000 ; } -static __init int __maybe_unused rel_higher (long val) +static int __init __maybe_unused rel_higher (long val) {return ((((val +0x80008000L ) >>32 ) &0xffff ) ^0x8000 ) -0x8000 ; }#endif -static __init int rel_hi (long val) +static int __init rel_hi (long val) {return ((((val +0x8000L ) >>16 ) &0xffff ) ^0x8000 ) -0x8000 ; } -static __init int rel_lo (long val) +static int __init rel_lo (long val) {return ((val &0xffff ) ^0x8000 ) -0x8000 ; } -static __init void i_LA_mostly (u32 **buf,unsigned int rs,long addr) +static void __init i_LA_mostly (u32 **buf,unsigned int rs,long addr) {#ifdef CONFIG_64BIT if (!in_compat_space_p (addr)) {
@@ -571,7 +571,7 @@ static __init void i_LA_mostly(u32 **buf, unsigned int rs, long addr)i_lui (buf, rs,rel_hi (addr)); } -static __init void __maybe_unused i_LA (u32 **buf,unsigned int rs, +static void __init __maybe_unused i_LA (u32 **buf,unsigned int rs,long addr) {i_LA_mostly (buf, rs, addr);
@@ -589,7 +589,7 @@ struct reloc {enum label_id lab; }; -static __init void r_mips_pc16 (struct reloc **rel,u32 *addr, +static void __init r_mips_pc16 (struct reloc **rel,u32 *addr,enum label_id l) { (*rel)->addr = addr;
@@ -614,7 +614,7 @@ static inline void __resolve_relocs(struct reloc *rel, struct label *lab) } } -static __init void resolve_relocs (struct reloc *rel,struct label *lab) +static void __init resolve_relocs (struct reloc *rel,struct label *lab) {struct label *l;
@@ -624,7 +624,7 @@ static __init void resolve_relocs(struct reloc *rel, struct label *lab)__resolve_relocs (rel, l); } -static __init void move_relocs (struct reloc *rel,u32 *first,u32 *end, +static void __init move_relocs (struct reloc *rel,u32 *first,u32 *end,long off) {for (; rel->lab != label_invalid; rel++)
@@ -632,7 +632,7 @@ static __init void move_relocs(struct reloc *rel, u32 *first, u32 *end, rel->addr += off; } -static __init void move_labels (struct label *lab,u32 *first,u32 *end, +static void __init move_labels (struct label *lab,u32 *first,u32 *end,long off) {for (; lab->lab != label_invalid; lab++)
@@ -640,7 +640,7 @@ static __init void move_labels(struct label *lab, u32 *first, u32 *end, lab->addr += off; } -static __init void copy_handler (struct reloc *rel,struct label *lab, +static void __init copy_handler (struct reloc *rel,struct label *lab,u32 *first,u32 *end,u32 *target) {long off = (long )(target - first);
@@ -651,7 +651,7 @@ static __init void copy_handler(struct reloc *rel, struct label *lab,move_labels (lab, first, end, off); } -static __init int __maybe_unused insn_has_bdelay (struct reloc *rel, +static int __init __maybe_unused insn_has_bdelay (struct reloc *rel,u32 *addr) {for (; rel->lab != label_invalid; rel++) {
@@ -743,11 +743,11 @@ il_bgez(u32 **p, struct reloc **r, unsigned int reg, enum label_id l)* We deliberately chose a buffer size of 128, so we won't scribble * over anything important on overflow before we panic. */ -static __initdata u32 tlb_handler[128 ]; +static u32 tlb_handler[128 ]__initdata ;/* simply assume worst case size for labels and relocs */ -static __initdata struct label labels[128 ]; -static __initdata struct reloc relocs[128 ]; +static struct label labels[128 ]__initdata ; +static struct reloc relocs[128 ]__initdata ;/* * The R3000 TLB handler is simple.
@@ -801,7 +801,7 @@ static void __init build_r3000_tlb_refill_handler(void)* other one.To keep things simple, we first assume linear space, * then we relocate it to the final handler layout as needed. */ -static __initdata u32 final_handler[64 ]; +static u32 final_handler[64 ]__initdata ;/* * Hazards
@@ -825,7 +825,7 @@ static __initdata u32 final_handler[64];* * As if we MIPS hackers wouldn't know how to nop pipelines happy ... */ -static __init void __maybe_unused build_tlb_probe_entry (u32 **p) +static void __init __maybe_unused build_tlb_probe_entry (u32 **p) {switch (current_cpu_type ()) {/* Found by experiment: R4600 v2.0 needs this, too. */
@@ -849,7 +849,7 @@ static __init void __maybe_unused build_tlb_probe_entry(u32 **p)*/ enum tlb_write_entry { tlb_random, tlb_indexed }; -static __init void build_tlb_write_entry (u32 **p,struct label **l, +static void __init build_tlb_write_entry (u32 **p,struct label **l,struct reloc **r,enum tlb_write_entry wmode) {
@@ -993,7 +993,7 @@ static __init void build_tlb_write_entry(u32 **p, struct label **l,* TMP and PTR are scratch. * TMP will be clobbered, PTR will hold the pmd entry. */ -static __init void +static void __init build_get_pmde64 (u32 **p,struct label **l,struct reloc **r,unsigned int tmp,unsigned int ptr) {
@@ -1054,7 +1054,7 @@ build_get_pmde64(u32 **p, struct label **l, struct reloc **r,* BVADDR is the faulting address, PTR is scratch. * PTR will hold the pgd for vmalloc. */ -static __init void +static void __init build_get_pgd_vmalloc64 (u32 **p,struct label **l,struct reloc **r,unsigned int bvaddr,unsigned int ptr) {
@@ -1118,7 +1118,7 @@ build_get_pgd_vmalloc64(u32 **p, struct label **l, struct reloc **r,* TMP and PTR are scratch. * TMP will be clobbered, PTR will hold the pgd entry. */ -static __init void __maybe_unused +static void __init __maybe_unused build_get_pgde32 (u32 **p,unsigned int tmp,unsigned int ptr) {long pgdc = (long )pgd_current;
@@ -1153,7 +1153,7 @@ build_get_pgde32(u32 **p, unsigned int tmp, unsigned int ptr)#endif /* !CONFIG_64BIT */ -static __init void build_adjust_context (u32 **p,unsigned int ctx) +static void __init build_adjust_context (u32 **p,unsigned int ctx) {unsigned int shift =4 - (PTE_T_LOG2 +1 ) +PAGE_SHIFT -12 ;unsigned int mask = (PTRS_PER_PTE /2 -1 ) << (PTE_T_LOG2 +1 );
@@ -1179,7 +1179,7 @@ static __init void build_adjust_context(u32 **p, unsigned int ctx)i_andi (p, ctx, ctx, mask); } -static __init void build_get_ptep (u32 **p,unsigned int tmp,unsigned int ptr) +static void __init build_get_ptep (u32 **p,unsigned int tmp,unsigned int ptr) {/* * Bug workaround for the Nevada. It seems as if under certain
@@ -1204,7 +1204,7 @@ static __init void build_get_ptep(u32 **p, unsigned int tmp, unsigned int ptr)i_ADDU (p, ptr, ptr, tmp);/* add in offset */ } -static __init void build_update_entries (u32 **p,unsigned int tmp, +static void __init build_update_entries (u32 **p,unsigned int tmp,unsigned int ptep) {/*
Signature · 1 line
1.5.3.3
Re: [PATCH 1/4] tlbex.c: Cleanup __init usages.
arch/mips/mm/tlbex.c static void __init build_insn(u32 **buf, enum opcode opc, ...) · line 383
Quoted 6 lines · Franck Bui-Huu
#define
I_0(op)\arch/mips/mm/tlbex.c +1
-1- static inline void __init i##op(u32 **buf) \ + static inline void i##op(u32 **buf) \ { \ build_insn(buf, insn##op); \ }
This causes section mismatches, since i_tlbwr and i_tlbwi can not be inlined (see head of build_tlb_write_entry()).
Maybe __init __maybe_unused is preferred?
---
Atsushi Nemoto
Re: [PATCH 1/4] tlbex.c: Cleanup __init usages.
Quoted 11 lines · Atsushi Nemoto
arch/mips/mm/tlbex.c static void __init build_insn(u32 **buf, enum opcode opc, ...) · line 383
Quoted 6 lines · Franck Bui-Huu
#define
I_0(op)\arch/mips/mm/tlbex.c +1
-1- static inline void __init i##op(u32 **buf) \ + static inline void i##op(u32 **buf) \ { \ build_insn(buf, insn##op); \ }This causes section mismatches, since
i_tlbwrandi_tlbwican not be inlined (see head ofbuild_tlb_write_entry()).
Quoted 5 lines
Maybe
__init__maybe_unusedis preferred?---
Atsushi Nemoto
Hi
I got the error too.
If build_tlb_write_entry() is inlined it doesent happen.
But as it is already reverted maybe it is not so importent.
bye tanzy
Re: [PATCH 1/4] tlbex.c: Cleanup __init usages.
In reply to Atsushi NemotoQuoted 11 lines · Atsushi Nemoto
arch/mips/mm/tlbex.c static void __init build_insn(u32 **buf, enum opcode opc, ...) · line 383
Quoted 6 lines · Franck Bui-Huu
#define
I_0(op)\arch/mips/mm/tlbex.c +1
-1- static inline void __init i##op(u32 **buf) \ + static inline void i##op(u32 **buf) \ { \ build_insn(buf, insn##op); \ }This causes section mismatches, since
i_tlbwrandi_tlbwican not be inlined (see head ofbuild_tlb_write_entry()).
You're right. I compiled tlbex.o alone and missed that.
Quoted 2 lines
Maybe
__init__maybe_unusedis preferred?
Yes I'll do that.
Thanks,
Franck
PATCH 2/4 tlbex.c: cleanup include files
In reply to Franck Bui-Huu--- arch/mips/mm/tlbex.c | 9 --------- 1 files changed, 0 insertions(+), 9 deletions(-)
arch/mips/mm/tlbex.c +0 -9
@@ -19,20 +19,11 @@* (Condolences to Napoleon XIV) */ -#include <stdarg.h> - -#include <linux/mm.h> #include <linux/kernel.h> -#include <linux/types.h> -#include <linux/string.h> -#include <linux/init.h> -#include <asm/pgtable.h> -#include <asm/cacheflush.h> #include <asm/mmu_context.h> #include <asm/inst.h> #include <asm/elf.h> -#include <asm/smp.h> #include <asm/war.h> static inline int r45k_bvahwbug (void )
Signature · 1 line
1.5.3.3
PATCH 3/4 tlbex.c: cleanup debug code
In reply to Franck Bui-Huu--- arch/mips/mm/tlbex.c | 83 +++++++++++++++---------------------------------- 1 files changed, 26 insertions(+), 57 deletions(-)
arch/mips/mm/tlbex.c +26 -57
@@ -705,6 +705,22 @@ il_bgez(u32 **p, struct reloc **r, unsigned int reg, enum label_id l)i_bgez (p, reg,0 ); } +/* +* For debug purposes. +*/ +static inline void dump_handler (const u32 *handler,int count) +{ +int i; + +pr_debug ("\t.set push\n" ); +pr_debug ("\t.set noreorder\n" ); + +for (i =0 ; i < count; i++) +pr_debug ("\t%p\t.word 0x%08x\n" , &handler[i], handler[i]); + +pr_debug ("\t.set pop\n" ); +} +/* The only general purpose registers allowed in TLB handlers. */ #define K0 26#define K1 27
@@ -747,7 +763,6 @@ static void __init build_r3000_tlb_refill_handler(void) {long pgdc = (long )pgd_current;u32 *p; -int i;memset (tlb_handler,0 ,sizeof (tlb_handler)); p = tlb_handler;
@@ -776,13 +791,9 @@ static void __init build_r3000_tlb_refill_handler(void)pr_info ("Synthesized TLB refill handler (%u instructions).\n" , (unsigned int )(p - tlb_handler)); -pr_debug ("\t.set push\n" ); -pr_debug ("\t.set noreorder\n" ); -for (i =0 ; i < (p - tlb_handler); i++) -pr_debug ("\t.word 0x%08x\n" , tlb_handler[i]); -pr_debug ("\t.set pop\n" ); -memcpy ((void *)ebase, tlb_handler,0x80 ); + +dump_handler ((u32 *)ebase,32 ); }/*
@@ -1245,7 +1256,6 @@ static void __init build_r4000_tlb_refill_handler(void)struct reloc *r = relocs;u32 *f;unsigned int final_len; -int i;memset (tlb_handler,0 ,sizeof (tlb_handler));memset (labels,0 ,sizeof (labels));
@@ -1347,20 +1357,9 @@ static void __init build_r4000_tlb_refill_handler(void)pr_info ("Synthesized TLB refill handler (%u instructions).\n" , final_len); - f = final_handler; -#if defined(CONFIG_64BIT ) && !defined(CONFIG_CPU_LOONGSON2 ) -if (final_len >32 ) - final_len =64 ; -else - f = final_handler +32 ; -#endif /* CONFIG_64BIT */ -pr_debug ("\t.set push\n" ); -pr_debug ("\t.set noreorder\n" ); -for (i =0 ; i < final_len; i++) -pr_debug ("\t.word 0x%08x\n" , f[i]); -pr_debug ("\t.set pop\n" ); -memcpy ((void *)ebase, final_handler,0x100 ); + +dump_handler ((u32 *)ebase,64 ); }/*
@@ -1591,7 +1590,6 @@ static void __init build_r3000_tlb_load_handler(void)u32 *p = handle_tlbl;struct label *l = labels;struct reloc *r = relocs; -int i;memset (handle_tlbl,0 ,sizeof (handle_tlbl));memset (labels,0 ,sizeof (labels));
@@ -1614,11 +1612,7 @@ static void __init build_r3000_tlb_load_handler(void)pr_info ("Synthesized TLB load handler fastpath (%u instructions).\n" , (unsigned int )(p - handle_tlbl)); -pr_debug ("\t.set push\n" ); -pr_debug ("\t.set noreorder\n" ); -for (i =0 ; i < (p - handle_tlbl); i++) -pr_debug ("\t.word 0x%08x\n" , handle_tlbl[i]); -pr_debug ("\t.set pop\n" ); +dump_handler (handle_tlbl,ARRAY_SIZE (handle_tlbl)); }static void __init build_r3000_tlb_store_handler (void )
@@ -1626,7 +1620,6 @@ static void __init build_r3000_tlb_store_handler(void)u32 *p = handle_tlbs;struct label *l = labels;struct reloc *r = relocs; -int i;memset (handle_tlbs,0 ,sizeof (handle_tlbs));memset (labels,0 ,sizeof (labels));
@@ -1649,11 +1642,7 @@ static void __init build_r3000_tlb_store_handler(void)pr_info ("Synthesized TLB store handler fastpath (%u instructions).\n" , (unsigned int )(p - handle_tlbs)); -pr_debug ("\t.set push\n" ); -pr_debug ("\t.set noreorder\n" ); -for (i =0 ; i < (p - handle_tlbs); i++) -pr_debug ("\t.word 0x%08x\n" , handle_tlbs[i]); -pr_debug ("\t.set pop\n" ); +dump_handler (handle_tlbs,ARRAY_SIZE (handle_tlbs)); }static void __init build_r3000_tlb_modify_handler (void )
@@ -1661,7 +1650,6 @@ static void __init build_r3000_tlb_modify_handler(void)u32 *p = handle_tlbm;struct label *l = labels;struct reloc *r = relocs; -int i;memset (handle_tlbm,0 ,sizeof (handle_tlbm));memset (labels,0 ,sizeof (labels));
@@ -1684,11 +1672,7 @@ static void __init build_r3000_tlb_modify_handler(void)pr_info ("Synthesized TLB modify handler fastpath (%u instructions).\n" , (unsigned int )(p - handle_tlbm)); -pr_debug ("\t.set push\n" ); -pr_debug ("\t.set noreorder\n" ); -for (i =0 ; i < (p - handle_tlbm); i++) -pr_debug ("\t.word 0x%08x\n" , handle_tlbm[i]); -pr_debug ("\t.set pop\n" ); +dump_handler (handle_tlbm,ARRAY_SIZE (handle_tlbm)); }/*
@@ -1741,7 +1725,6 @@ static void __init build_r4000_tlb_load_handler(void)u32 *p = handle_tlbl;struct label *l = labels;struct reloc *r = relocs; -int i;memset (handle_tlbl,0 ,sizeof (handle_tlbl));memset (labels,0 ,sizeof (labels));
@@ -1774,11 +1757,7 @@ static void __init build_r4000_tlb_load_handler(void)pr_info ("Synthesized TLB load handler fastpath (%u instructions).\n" , (unsigned int )(p - handle_tlbl)); -pr_debug ("\t.set push\n" ); -pr_debug ("\t.set noreorder\n" ); -for (i =0 ; i < (p - handle_tlbl); i++) -pr_debug ("\t.word 0x%08x\n" , handle_tlbl[i]); -pr_debug ("\t.set pop\n" ); +dump_handler (handle_tlbl,ARRAY_SIZE (handle_tlbl)); }static void __init build_r4000_tlb_store_handler (void )
@@ -1786,7 +1765,6 @@ static void __init build_r4000_tlb_store_handler(void)u32 *p = handle_tlbs;struct label *l = labels;struct reloc *r = relocs; -int i;memset (handle_tlbs,0 ,sizeof (handle_tlbs));memset (labels,0 ,sizeof (labels));
@@ -1810,11 +1788,7 @@ static void __init build_r4000_tlb_store_handler(void)pr_info ("Synthesized TLB store handler fastpath (%u instructions).\n" , (unsigned int )(p - handle_tlbs)); -pr_debug ("\t.set push\n" ); -pr_debug ("\t.set noreorder\n" ); -for (i =0 ; i < (p - handle_tlbs); i++) -pr_debug ("\t.word 0x%08x\n" , handle_tlbs[i]); -pr_debug ("\t.set pop\n" ); +dump_handler (handle_tlbs,ARRAY_SIZE (handle_tlbs)); }static void __init build_r4000_tlb_modify_handler (void )
@@ -1822,7 +1796,6 @@ static void __init build_r4000_tlb_modify_handler(void)u32 *p = handle_tlbm;struct label *l = labels;struct reloc *r = relocs; -int i;memset (handle_tlbm,0 ,sizeof (handle_tlbm));memset (labels,0 ,sizeof (labels));
@@ -1847,11 +1820,7 @@ static void __init build_r4000_tlb_modify_handler(void)pr_info ("Synthesized TLB modify handler fastpath (%u instructions).\n" , (unsigned int )(p - handle_tlbm)); -pr_debug ("\t.set push\n" ); -pr_debug ("\t.set noreorder\n" ); -for (i =0 ; i < (p - handle_tlbm); i++) -pr_debug ("\t.word 0x%08x\n" , handle_tlbm[i]); -pr_debug ("\t.set pop\n" ); +dump_handler (handle_tlbm,ARRAY_SIZE (handle_tlbm)); }void __init build_tlb_refill_handler (void )
Signature · 1 line
1.5.3.3
Re: [PATCH 3/4] tlbex.c: cleanup debug code
Quoted 19 lines · Franck Bui-Huu
Signed-off-by Franck Bui-Huu <[email protected]>--- arch/mips/mm/tlbex.c | 83 +++++++++++++++---------------------------------- 1 files changed, 26 insertions(+), 57 deletions(-)arch/mips/mm/tlbex.c +5
-0@@ -705,6 +705,22 @@ il_bgez(u32 **p, struct reloc **r, unsigned int reg, enum label_id l)i_bgez (p, reg,0 ); } +/* +* For debug purposes. +*/ +static inline void dump_handler (const u32 *handler,int count) +{
arch/mips/mm/tlbex.c il_bgez(u32 **p, struct reloc **r, unsigned int reg, enum label_id l) · line 722
Quoted 10 lines
arch/mips/mm/tlbex.c +10
-0+int i; + +pr_debug ("\t.set push\n" ); +pr_debug ("\t.set noreorder\n" ); + +for (i =0 ; i < count; i++) +pr_debug ("\t%p\t.word 0x%08x\n" , &handler[i], handler[i]); + +pr_debug ("\t.set pop\n" ); +}
I don't like this patch. I wrote the code to
a) print the handler before the (potentially fatal) memcpy. Touching EBASE for the first time is a place where things like to go wrong.
b) avoid printing leading nops which are never executed. The trailing nops have less potential for confusion.
Thiemo
Re: [PATCH 3/4] tlbex.c: cleanup debug code
Quoted 3 lines · Thiemo Seufer
I don't like this patch. I wrote the code to
a) print the handler before the (potentially fatal) memcpy. Touching EBASE for the first time is a place where things like to go wrong.
Sorry I don't see what you mean...
Do you mean ebase (BTW this name sounds very local...) can be set to an incorrect value and therefore the memcpy can get mad ?
If so I would say that with this patch applied you can easily guess that an issue happen in this place because the log would be:
Synthesized TLB refill handler (x instructions) <nothing>
and there would be no dump of the handler.
Whereas currently we would have:
Synthesized TLB refill handler (x instructions) <handler dump>
<nothing>
and now you don't know if the crash happen in the memcpy or later...
And it seems better to dump the code which is going to be _executed_ instead of a temporary buffer.
Quoted 2 lines
b) avoid printing leading nops which are never executed. The trailing nops have less potential for confusion.
Well, I disagree for 2 reasons:
1/ By printing the leading nops you can detect a bug which would
wrongly write in this unused part of the handler. That's one of the reason I added the handler instruction addresses BTW: to skip easily this part when reading the dump.
2/ This is just debug code and it should not make the real code
harder to read. Take a look at the end of build_r4000_tlb_refill_handler() function. It's not really obvious that this part is only for debug except the memcpy.
But you're the maintainer of this file so if you still think I should drop this patch then I will.
Thanks.
Franck
PATCH 4/4 tlbex.c: use __cacheline_aligned instead of __tlb_handler_align attribute
In reply to Franck Bui-Huu--- arch/mips/mm/tlbex.c | 9 +++------ 1 files changed, 3 insertions(+), 6 deletions(-)
arch/mips/mm/tlbex.c +3 -6
@@ -1371,18 +1371,15 @@ static void __init build_r4000_tlb_refill_handler(void)extern void tlb_do_page_fault_0 (void );extern void tlb_do_page_fault_1 (void ); -#define __tlb_handler_align \ - __attribute__((__aligned__(1 << CONFIG_MIPS_L1_CACHE_SHIFT))) -/* * 128 instructions for the fastpath handler is generous and should * never be exceeded. */ #define FASTPATH_SIZE 128 -u32 __tlb_handler_align handle_tlbl[FASTPATH_SIZE]; -u32 __tlb_handler_align handle_tlbs[FASTPATH_SIZE]; -u32 __tlb_handler_align handle_tlbm[FASTPATH_SIZE]; +u32 handle_tlbl[FASTPATH_SIZE] __cacheline_aligned; +u32 handle_tlbs[FASTPATH_SIZE] __cacheline_aligned; +u32 handle_tlbm[FASTPATH_SIZE] __cacheline_aligned;static void __init iPTE_LW (u32 **p,struct label **l,unsigned int pte,unsigned int ptr)