mirror of https://gitee.com/openkylin/linux.git
MIPS: Make declarations and definitions of tlbmiss_handler_setup_pgd match.
tlbmiss_handler_setup_pgd is run-time generated code and it was convenient to pretend the symbol was an array in the generator but a function for the users. LTO gcc won't tolerate this kind of lie anymore so solve the problem through a cast and function pointer instead. Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
86a1708a9d
commit
0bfbf6a256
|
@ -27,9 +27,14 @@
|
|||
#ifdef CONFIG_MIPS_PGD_C0_CONTEXT
|
||||
|
||||
#define TLBMISS_HANDLER_SETUP_PGD(pgd) \
|
||||
tlbmiss_handler_setup_pgd((unsigned long)(pgd))
|
||||
|
||||
extern void tlbmiss_handler_setup_pgd(unsigned long pgd);
|
||||
do { \
|
||||
void (*tlbmiss_handler_setup_pgd)(unsigned long); \
|
||||
extern u32 tlbmiss_handler_setup_pgd_array[16]; \
|
||||
\
|
||||
tlbmiss_handler_setup_pgd = \
|
||||
(__typeof__(tlbmiss_handler_setup_pgd)) tlbmiss_handler_setup_pgd_array; \
|
||||
tlbmiss_handler_setup_pgd((unsigned long)(pgd)); \
|
||||
} while (0)
|
||||
|
||||
#define TLBMISS_HANDLER_SETUP() \
|
||||
do { \
|
||||
|
|
|
@ -1458,17 +1458,17 @@ u32 handle_tlbl[FASTPATH_SIZE] __cacheline_aligned;
|
|||
u32 handle_tlbs[FASTPATH_SIZE] __cacheline_aligned;
|
||||
u32 handle_tlbm[FASTPATH_SIZE] __cacheline_aligned;
|
||||
#ifdef CONFIG_MIPS_PGD_C0_CONTEXT
|
||||
u32 tlbmiss_handler_setup_pgd[16] __cacheline_aligned;
|
||||
u32 tlbmiss_handler_setup_pgd_array[16] __cacheline_aligned;
|
||||
|
||||
static void __cpuinit build_r4000_setup_pgd(void)
|
||||
{
|
||||
const int a0 = 4;
|
||||
const int a1 = 5;
|
||||
u32 *p = tlbmiss_handler_setup_pgd;
|
||||
u32 *p = tlbmiss_handler_setup_pgd_array;
|
||||
struct uasm_label *l = labels;
|
||||
struct uasm_reloc *r = relocs;
|
||||
|
||||
memset(tlbmiss_handler_setup_pgd, 0, sizeof(tlbmiss_handler_setup_pgd));
|
||||
memset(tlbmiss_handler_setup_pgd_array, 0, sizeof(tlbmiss_handler_setup_pgd_array));
|
||||
memset(labels, 0, sizeof(labels));
|
||||
memset(relocs, 0, sizeof(relocs));
|
||||
|
||||
|
@ -1496,15 +1496,15 @@ static void __cpuinit build_r4000_setup_pgd(void)
|
|||
uasm_i_jr(&p, 31);
|
||||
UASM_i_MTC0(&p, a0, 31, pgd_reg);
|
||||
}
|
||||
if (p - tlbmiss_handler_setup_pgd > ARRAY_SIZE(tlbmiss_handler_setup_pgd))
|
||||
panic("tlbmiss_handler_setup_pgd space exceeded");
|
||||
if (p - tlbmiss_handler_setup_pgd_array > ARRAY_SIZE(tlbmiss_handler_setup_pgd_array))
|
||||
panic("tlbmiss_handler_setup_pgd_array space exceeded");
|
||||
uasm_resolve_relocs(relocs, labels);
|
||||
pr_debug("Wrote tlbmiss_handler_setup_pgd (%u instructions).\n",
|
||||
(unsigned int)(p - tlbmiss_handler_setup_pgd));
|
||||
pr_debug("Wrote tlbmiss_handler_setup_pgd_array (%u instructions).\n",
|
||||
(unsigned int)(p - tlbmiss_handler_setup_pgd_array));
|
||||
|
||||
dump_handler("tlbmiss_handler",
|
||||
tlbmiss_handler_setup_pgd,
|
||||
ARRAY_SIZE(tlbmiss_handler_setup_pgd));
|
||||
tlbmiss_handler_setup_pgd_array,
|
||||
ARRAY_SIZE(tlbmiss_handler_setup_pgd_array));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -2207,7 +2207,7 @@ void __cpuinit flush_tlb_handlers(void)
|
|||
local_flush_icache_range((unsigned long)handle_tlbm,
|
||||
(unsigned long)handle_tlbm + sizeof(handle_tlbm));
|
||||
#ifdef CONFIG_MIPS_PGD_C0_CONTEXT
|
||||
local_flush_icache_range((unsigned long)tlbmiss_handler_setup_pgd,
|
||||
(unsigned long)tlbmiss_handler_setup_pgd + sizeof(handle_tlbm));
|
||||
local_flush_icache_range((unsigned long)tlbmiss_handler_setup_pgd_array,
|
||||
(unsigned long)tlbmiss_handler_setup_pgd_array + sizeof(handle_tlbm));
|
||||
#endif
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue