Commit d3e32b99 authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman
Browse files

powerpc: Use 'struct func_desc' instead of 'struct ppc64_opd_entry'



'struct ppc64_opd_entry' is somehow redundant with 'struct func_desc',
the later is more correct/complete as it includes the third
field which is unused.

So use 'struct func_desc' instead of 'struct ppc64_opd_entry'

Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Reviewed-by: default avatarKees Cook <keescook@chromium.org>
Reviewed-by: default avatarDaniel Axtens <dja@axtens.net>
Reviewed-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/34e76bac6cbe95a63ecd37df69fb7feb93b0ea7c.1644928018.git.christophe.leroy@csgroup.eu
parent 5b23cb8c
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -61,10 +61,10 @@ static inline int overlaps_kernel_text(unsigned long start, unsigned long end)
#undef dereference_function_descriptor
#undef dereference_function_descriptor
static inline void *dereference_function_descriptor(void *ptr)
static inline void *dereference_function_descriptor(void *ptr)
{
{
	struct ppc64_opd_entry *desc = ptr;
	struct func_desc *desc = ptr;
	void *p;
	void *p;


	if (!get_kernel_nofault(p, (void *)&desc->funcaddr))
	if (!get_kernel_nofault(p, (void *)&desc->addr))
		ptr = p;
		ptr = p;
	return ptr;
	return ptr;
}
}
+5 −5
Original line number Original line Diff line number Diff line
@@ -64,19 +64,19 @@ static unsigned int local_entry_offset(const Elf64_Sym *sym)
#else
#else


/* An address is address of the OPD entry, which contains address of fn. */
/* An address is address of the OPD entry, which contains address of fn. */
typedef struct ppc64_opd_entry func_desc_t;
typedef struct func_desc func_desc_t;


static func_desc_t func_desc(unsigned long addr)
static func_desc_t func_desc(unsigned long addr)
{
{
	return *(struct ppc64_opd_entry *)addr;
	return *(struct func_desc *)addr;
}
}
static unsigned long func_addr(unsigned long addr)
static unsigned long func_addr(unsigned long addr)
{
{
	return func_desc(addr).funcaddr;
	return func_desc(addr).addr;
}
}
static unsigned long stub_func_addr(func_desc_t func)
static unsigned long stub_func_addr(func_desc_t func)
{
{
	return func.funcaddr;
	return func.addr;
}
}
static unsigned int local_entry_offset(const Elf64_Sym *sym)
static unsigned int local_entry_offset(const Elf64_Sym *sym)
{
{
@@ -187,7 +187,7 @@ static int relacmp(const void *_x, const void *_y)
static unsigned long get_stubs_size(const Elf64_Ehdr *hdr,
static unsigned long get_stubs_size(const Elf64_Ehdr *hdr,
				    const Elf64_Shdr *sechdrs)
				    const Elf64_Shdr *sechdrs)
{
{
	/* One extra reloc so it's always 0-funcaddr terminated */
	/* One extra reloc so it's always 0-addr terminated */
	unsigned long relocs = 1;
	unsigned long relocs = 1;
	unsigned i;
	unsigned i;