Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+20 -15
+9 -4
arch/mips/include/asm/mmu_context.h
··· 26 26 27 27 #ifdef CONFIG_MIPS_PGD_C0_CONTEXT 28 28 29 - #define TLBMISS_HANDLER_SETUP_PGD(pgd) \ 30 - tlbmiss_handler_setup_pgd((unsigned long)(pgd)) 31 - 32 - extern void tlbmiss_handler_setup_pgd(unsigned long pgd); 29 + #define TLBMISS_HANDLER_SETUP_PGD(pgd) \ 30 + do { \ 31 + void (*tlbmiss_handler_setup_pgd)(unsigned long); \ 32 + extern u32 tlbmiss_handler_setup_pgd_array[16]; \ 33 + \ 34 + tlbmiss_handler_setup_pgd = \ 35 + (__typeof__(tlbmiss_handler_setup_pgd)) tlbmiss_handler_setup_pgd_array; \ 36 + tlbmiss_handler_setup_pgd((unsigned long)(pgd)); \ 37 + } while (0) 33 38 34 39 #define TLBMISS_HANDLER_SETUP() \ 35 40 do { \
+11 -11
arch/mips/mm/tlbex.c
··· 1458 1458 u32 handle_tlbs[FASTPATH_SIZE] __cacheline_aligned; 1459 1459 u32 handle_tlbm[FASTPATH_SIZE] __cacheline_aligned; 1460 1460 #ifdef CONFIG_MIPS_PGD_C0_CONTEXT 1461 - u32 tlbmiss_handler_setup_pgd[16] __cacheline_aligned; 1461 + u32 tlbmiss_handler_setup_pgd_array[16] __cacheline_aligned; 1462 1462 1463 1463 static void __cpuinit build_r4000_setup_pgd(void) 1464 1464 { 1465 1465 const int a0 = 4; 1466 1466 const int a1 = 5; 1467 - u32 *p = tlbmiss_handler_setup_pgd; 1467 + u32 *p = tlbmiss_handler_setup_pgd_array; 1468 1468 struct uasm_label *l = labels; 1469 1469 struct uasm_reloc *r = relocs; 1470 1470 1471 - memset(tlbmiss_handler_setup_pgd, 0, sizeof(tlbmiss_handler_setup_pgd)); 1471 + memset(tlbmiss_handler_setup_pgd_array, 0, sizeof(tlbmiss_handler_setup_pgd_array)); 1472 1472 memset(labels, 0, sizeof(labels)); 1473 1473 memset(relocs, 0, sizeof(relocs)); 1474 1474 ··· 1496 1496 uasm_i_jr(&p, 31); 1497 1497 UASM_i_MTC0(&p, a0, 31, pgd_reg); 1498 1498 } 1499 - if (p - tlbmiss_handler_setup_pgd > ARRAY_SIZE(tlbmiss_handler_setup_pgd)) 1500 - panic("tlbmiss_handler_setup_pgd space exceeded"); 1499 + if (p - tlbmiss_handler_setup_pgd_array > ARRAY_SIZE(tlbmiss_handler_setup_pgd_array)) 1500 + panic("tlbmiss_handler_setup_pgd_array space exceeded"); 1501 1501 uasm_resolve_relocs(relocs, labels); 1502 - pr_debug("Wrote tlbmiss_handler_setup_pgd (%u instructions).\n", 1503 - (unsigned int)(p - tlbmiss_handler_setup_pgd)); 1502 + pr_debug("Wrote tlbmiss_handler_setup_pgd_array (%u instructions).\n", 1503 + (unsigned int)(p - tlbmiss_handler_setup_pgd_array)); 1504 1504 1505 1505 dump_handler("tlbmiss_handler", 1506 - tlbmiss_handler_setup_pgd, 1507 - ARRAY_SIZE(tlbmiss_handler_setup_pgd)); 1506 + tlbmiss_handler_setup_pgd_array, 1507 + ARRAY_SIZE(tlbmiss_handler_setup_pgd_array)); 1508 1508 } 1509 1509 #endif 1510 1510 ··· 2207 2207 local_flush_icache_range((unsigned long)handle_tlbm, 2208 2208 (unsigned long)handle_tlbm + sizeof(handle_tlbm)); 2209 2209 #ifdef CONFIG_MIPS_PGD_C0_CONTEXT 2210 - local_flush_icache_range((unsigned long)tlbmiss_handler_setup_pgd, 2211 - (unsigned long)tlbmiss_handler_setup_pgd + sizeof(handle_tlbm)); 2210 + local_flush_icache_range((unsigned long)tlbmiss_handler_setup_pgd_array, 2211 + (unsigned long)tlbmiss_handler_setup_pgd_array + sizeof(handle_tlbm)); 2212 2212 #endif 2213 2213 }