mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-28 16:56:26 +00:00
LoongArch: extable: Add type
and data
fields
This is a LoongArch port of commit d6e2cc5647
("arm64: extable: add
`type` and `data` fields").
Subsequent patches will add specialized handlers for fixups, in addition
to the simple PC fixup we have today. In preparation, this patch adds a
new `type` field to struct exception_table_entry, and uses this to
distinguish the fixup and other cases. A `data` field is also added so
that subsequent patches can associate data specific to each exception
site (e.g. register numbers).
Handlers are named ex_handler_*() for consistency, following the example
of x86. At the same time, get_ex_fixup() is split out into a helper so
that it can be used by other ex_handler_*() functions in the subsequent
patches.
Signed-off-by: Youling Tang <tangyouling@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
This commit is contained in:
parent
3d36f4298b
commit
26bc824412
@ -2,17 +2,22 @@
|
|||||||
#ifndef __ASM_ASM_EXTABLE_H
|
#ifndef __ASM_ASM_EXTABLE_H
|
||||||
#define __ASM_ASM_EXTABLE_H
|
#define __ASM_ASM_EXTABLE_H
|
||||||
|
|
||||||
|
#define EX_TYPE_NONE 0
|
||||||
|
#define EX_TYPE_FIXUP 1
|
||||||
|
|
||||||
#ifdef __ASSEMBLY__
|
#ifdef __ASSEMBLY__
|
||||||
|
|
||||||
#define __ASM_EXTABLE_RAW(insn, fixup) \
|
#define __ASM_EXTABLE_RAW(insn, fixup, type, data) \
|
||||||
.pushsection __ex_table, "a"; \
|
.pushsection __ex_table, "a"; \
|
||||||
.balign 4; \
|
.balign 4; \
|
||||||
.long ((insn) - .); \
|
.long ((insn) - .); \
|
||||||
.long ((fixup) - .); \
|
.long ((fixup) - .); \
|
||||||
|
.short (type); \
|
||||||
|
.short (data); \
|
||||||
.popsection;
|
.popsection;
|
||||||
|
|
||||||
.macro _asm_extable, insn, fixup
|
.macro _asm_extable, insn, fixup
|
||||||
__ASM_EXTABLE_RAW(\insn, \fixup)
|
__ASM_EXTABLE_RAW(\insn, \fixup, EX_TYPE_FIXUP, 0)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
#else /* __ASSEMBLY__ */
|
#else /* __ASSEMBLY__ */
|
||||||
@ -20,15 +25,17 @@
|
|||||||
#include <linux/bits.h>
|
#include <linux/bits.h>
|
||||||
#include <linux/stringify.h>
|
#include <linux/stringify.h>
|
||||||
|
|
||||||
#define __ASM_EXTABLE_RAW(insn, fixup) \
|
#define __ASM_EXTABLE_RAW(insn, fixup, type, data) \
|
||||||
".pushsection __ex_table, \"a\"\n" \
|
".pushsection __ex_table, \"a\"\n" \
|
||||||
".balign 4\n" \
|
".balign 4\n" \
|
||||||
".long ((" insn ") - .)\n" \
|
".long ((" insn ") - .)\n" \
|
||||||
".long ((" fixup ") - .)\n" \
|
".long ((" fixup ") - .)\n" \
|
||||||
|
".short (" type ")\n" \
|
||||||
|
".short (" data ")\n" \
|
||||||
".popsection\n"
|
".popsection\n"
|
||||||
|
|
||||||
#define _ASM_EXTABLE(insn, fixup) \
|
#define _ASM_EXTABLE(insn, fixup) \
|
||||||
__ASM_EXTABLE_RAW(#insn, #fixup)
|
__ASM_EXTABLE_RAW(#insn, #fixup, __stringify(EX_TYPE_FIXUP), "0")
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
|
@ -17,10 +17,21 @@
|
|||||||
|
|
||||||
struct exception_table_entry {
|
struct exception_table_entry {
|
||||||
int insn, fixup;
|
int insn, fixup;
|
||||||
|
short type, data;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ARCH_HAS_RELATIVE_EXTABLE
|
#define ARCH_HAS_RELATIVE_EXTABLE
|
||||||
|
|
||||||
|
#define swap_ex_entry_fixup(a, b, tmp, delta) \
|
||||||
|
do { \
|
||||||
|
(a)->fixup = (b)->fixup + (delta); \
|
||||||
|
(b)->fixup = (tmp).fixup - (delta); \
|
||||||
|
(a)->type = (b)->type; \
|
||||||
|
(b)->type = (tmp).type; \
|
||||||
|
(a)->data = (b)->data; \
|
||||||
|
(b)->data = (tmp).data; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
bool fixup_exception(struct pt_regs *regs);
|
bool fixup_exception(struct pt_regs *regs);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <asm/thread_info.h>
|
#include <asm/thread_info.h>
|
||||||
|
|
||||||
#define PAGE_SIZE _PAGE_SIZE
|
#define PAGE_SIZE _PAGE_SIZE
|
||||||
|
#define RO_EXCEPTION_TABLE_ALIGN 4
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Put .bss..swapper_pg_dir as the first thing in .bss. This will
|
* Put .bss..swapper_pg_dir as the first thing in .bss. This will
|
||||||
@ -53,8 +54,6 @@ SECTIONS
|
|||||||
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
||||||
_etext = .;
|
_etext = .;
|
||||||
|
|
||||||
EXCEPTION_TABLE(16)
|
|
||||||
|
|
||||||
.got : ALIGN(16) { *(.got) }
|
.got : ALIGN(16) { *(.got) }
|
||||||
.plt : ALIGN(16) { *(.plt) }
|
.plt : ALIGN(16) { *(.plt) }
|
||||||
.got.plt : ALIGN(16) { *(.got.plt) }
|
.got.plt : ALIGN(16) { *(.got.plt) }
|
||||||
|
@ -30,5 +30,10 @@ bool fixup_exception(struct pt_regs *regs)
|
|||||||
if (!ex)
|
if (!ex)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return ex_handler_fixup(ex, regs);
|
switch (ex->type) {
|
||||||
|
case EX_TYPE_FIXUP:
|
||||||
|
return ex_handler_fixup(ex, regs);
|
||||||
|
}
|
||||||
|
|
||||||
|
BUG();
|
||||||
}
|
}
|
||||||
|
@ -304,6 +304,7 @@ static int do_file(char const *const fname, void *addr)
|
|||||||
switch (r2(&ehdr->e_machine)) {
|
switch (r2(&ehdr->e_machine)) {
|
||||||
case EM_386:
|
case EM_386:
|
||||||
case EM_AARCH64:
|
case EM_AARCH64:
|
||||||
|
case EM_LOONGARCH:
|
||||||
case EM_RISCV:
|
case EM_RISCV:
|
||||||
case EM_S390:
|
case EM_S390:
|
||||||
case EM_X86_64:
|
case EM_X86_64:
|
||||||
@ -312,7 +313,6 @@ static int do_file(char const *const fname, void *addr)
|
|||||||
case EM_PARISC:
|
case EM_PARISC:
|
||||||
case EM_PPC:
|
case EM_PPC:
|
||||||
case EM_PPC64:
|
case EM_PPC64:
|
||||||
case EM_LOONGARCH:
|
|
||||||
custom_sort = sort_relative_table;
|
custom_sort = sort_relative_table;
|
||||||
break;
|
break;
|
||||||
case EM_ARCOMPACT:
|
case EM_ARCOMPACT:
|
||||||
|
Loading…
Reference in New Issue
Block a user