Skip to content

Commit

Permalink
parisc: Use generic extable search and sort routines
Browse files Browse the repository at this point in the history
Switch to the generic extable search and sort routines which were introduced
with commit a272858 from Ard Biesheuvel. This saves quite some memory in the
vmlinux binary with the 64bit kernel.

Signed-off-by: Helge Deller <deller@gmx.de>
  • Loading branch information
Helge Deller committed Mar 23, 2016
1 parent c95a23d commit 0de7985
Show file tree
Hide file tree
Showing 5 changed files with 9 additions and 11 deletions.
1 change: 1 addition & 0 deletions arch/parisc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ config PARISC
select RTC_DRV_GENERIC
select INIT_ALL_POSSIBLE
select BUG
select BUILDTIME_EXTABLE_SORT
select HAVE_PERF_EVENTS
select GENERIC_ATOMIC64 if !64BIT
select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
Expand Down
2 changes: 1 addition & 1 deletion arch/parisc/include/asm/assembly.h
Original file line number Diff line number Diff line change
Expand Up @@ -523,7 +523,7 @@
*/
#define ASM_EXCEPTIONTABLE_ENTRY(fault_addr, except_addr) \
.section __ex_table,"aw" ! \
ASM_ULONG_INSN fault_addr, except_addr ! \
.word (fault_addr - .), (except_addr - .) ! \
.previous


Expand Down
7 changes: 4 additions & 3 deletions arch/parisc/include/asm/uaccess.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,14 +60,15 @@ static inline long access_ok(int type, const void __user * addr,
* use a 32bit (unsigned int) address here.
*/

#define ARCH_HAS_RELATIVE_EXTABLE
struct exception_table_entry {
unsigned long insn; /* address of insn that is allowed to fault. */
unsigned long fixup; /* fixup routine */
int insn; /* relative address of insn that is allowed to fault. */
int fixup; /* relative address of fixup routine */
};

#define ASM_EXCEPTIONTABLE_ENTRY( fault_addr, except_addr )\
".section __ex_table,\"aw\"\n" \
ASM_WORD_INSN #fault_addr ", " #except_addr "\n\t" \
".word (" #fault_addr " - .), (" #except_addr " - .)\n\t" \
".previous\n"

/*
Expand Down
9 changes: 2 additions & 7 deletions arch/parisc/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,12 +140,6 @@ int fixup_exception(struct pt_regs *regs)
{
const struct exception_table_entry *fix;

/* If we only stored 32bit addresses in the exception table we can drop
* out if we faulted on a 64bit address. */
if ((sizeof(regs->iaoq[0]) > sizeof(fix->insn))
&& (regs->iaoq[0] >> 32))
return 0;

fix = search_exception_tables(regs->iaoq[0]);
if (fix) {
struct exception_data *d;
Expand All @@ -154,7 +148,8 @@ int fixup_exception(struct pt_regs *regs)
d->fault_space = regs->isr;
d->fault_addr = regs->ior;

regs->iaoq[0] = ((fix->fixup) & ~3);
regs->iaoq[0] = (unsigned long)&fix->fixup + fix->fixup;
regs->iaoq[0] &= ~3;
/*
* NOTE: In some cases the faulting instruction
* may be in the delay slot of a branch. We
Expand Down
1 change: 1 addition & 0 deletions scripts/sortextable.c
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,7 @@ do_file(char const *const fname)

case EM_S390:
case EM_AARCH64:
case EM_PARISC:
custom_sort = sort_relative_table;
break;
case EM_ARCOMPACT:
Expand Down

0 comments on commit 0de7985

Please sign in to comment.