Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0bfbf6a2 authored by Ralf Baechle's avatar Ralf Baechle
Browse files

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: default avatarRalf Baechle <ralf@linux-mips.org>
parent 86a1708a
Loading
Loading
Loading
Loading
+9 −4
Original line number Original line Diff line number Diff line
@@ -27,9 +27,14 @@
#ifdef CONFIG_MIPS_PGD_C0_CONTEXT
#ifdef CONFIG_MIPS_PGD_C0_CONTEXT


#define TLBMISS_HANDLER_SETUP_PGD(pgd)					\
#define TLBMISS_HANDLER_SETUP_PGD(pgd)					\
	tlbmiss_handler_setup_pgd((unsigned long)(pgd))
do {									\

	void (*tlbmiss_handler_setup_pgd)(unsigned long);		\
extern void tlbmiss_handler_setup_pgd(unsigned long pgd);
	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()						\
#define TLBMISS_HANDLER_SETUP()						\
	do {								\
	do {								\
+11 −11
Original line number Original line Diff line number Diff line
@@ -1458,17 +1458,17 @@ u32 handle_tlbl[FASTPATH_SIZE] __cacheline_aligned;
u32 handle_tlbs[FASTPATH_SIZE] __cacheline_aligned;
u32 handle_tlbs[FASTPATH_SIZE] __cacheline_aligned;
u32 handle_tlbm[FASTPATH_SIZE] __cacheline_aligned;
u32 handle_tlbm[FASTPATH_SIZE] __cacheline_aligned;
#ifdef CONFIG_MIPS_PGD_C0_CONTEXT
#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)
static void __cpuinit build_r4000_setup_pgd(void)
{
{
	const int a0 = 4;
	const int a0 = 4;
	const int a1 = 5;
	const int a1 = 5;
	u32 *p = tlbmiss_handler_setup_pgd;
	u32 *p = tlbmiss_handler_setup_pgd_array;
	struct uasm_label *l = labels;
	struct uasm_label *l = labels;
	struct uasm_reloc *r = relocs;
	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(labels, 0, sizeof(labels));
	memset(relocs, 0, sizeof(relocs));
	memset(relocs, 0, sizeof(relocs));


@@ -1496,15 +1496,15 @@ static void __cpuinit build_r4000_setup_pgd(void)
		uasm_i_jr(&p, 31);
		uasm_i_jr(&p, 31);
		UASM_i_MTC0(&p, a0, 31, pgd_reg);
		UASM_i_MTC0(&p, a0, 31, pgd_reg);
	}
	}
	if (p - tlbmiss_handler_setup_pgd > ARRAY_SIZE(tlbmiss_handler_setup_pgd))
	if (p - tlbmiss_handler_setup_pgd_array > ARRAY_SIZE(tlbmiss_handler_setup_pgd_array))
		panic("tlbmiss_handler_setup_pgd space exceeded");
		panic("tlbmiss_handler_setup_pgd_array space exceeded");
	uasm_resolve_relocs(relocs, labels);
	uasm_resolve_relocs(relocs, labels);
	pr_debug("Wrote tlbmiss_handler_setup_pgd (%u instructions).\n",
	pr_debug("Wrote tlbmiss_handler_setup_pgd_array (%u instructions).\n",
		 (unsigned int)(p - tlbmiss_handler_setup_pgd));
		 (unsigned int)(p - tlbmiss_handler_setup_pgd_array));


	dump_handler("tlbmiss_handler",
	dump_handler("tlbmiss_handler",
		     tlbmiss_handler_setup_pgd,
		     tlbmiss_handler_setup_pgd_array,
		     ARRAY_SIZE(tlbmiss_handler_setup_pgd));
		     ARRAY_SIZE(tlbmiss_handler_setup_pgd_array));
}
}
#endif
#endif


@@ -2207,7 +2207,7 @@ void __cpuinit flush_tlb_handlers(void)
	local_flush_icache_range((unsigned long)handle_tlbm,
	local_flush_icache_range((unsigned long)handle_tlbm,
			   (unsigned long)handle_tlbm + sizeof(handle_tlbm));
			   (unsigned long)handle_tlbm + sizeof(handle_tlbm));
#ifdef CONFIG_MIPS_PGD_C0_CONTEXT
#ifdef CONFIG_MIPS_PGD_C0_CONTEXT
	local_flush_icache_range((unsigned long)tlbmiss_handler_setup_pgd,
	local_flush_icache_range((unsigned long)tlbmiss_handler_setup_pgd_array,
			   (unsigned long)tlbmiss_handler_setup_pgd + sizeof(handle_tlbm));
			   (unsigned long)tlbmiss_handler_setup_pgd_array + sizeof(handle_tlbm));
#endif
#endif
}
}