From: Will Deacon <will.deacon@arm.com>
To: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: linux-alpha@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, linux-ia64@vger.kernel.org,
linux-s390@vger.kernel.org, x86@kernel.org, hpa@zytor.com,
mingo@redhat.com, heiko.carstens@de.ibm.com,
schwidefsky@de.ibm.com, mattst88@gmail.com,
ink@jurassic.park.msu.ru, rth@twiddle.net, tony.luck@intel.com,
fenghua.yu@intel.com, catalin.marinas@arm.com, arnd@arndb.de,
akpm@linux-foundation.org, mark.rutland@arm.com,
marc.zyngier@arm.com
Subject: Re: [PATCH 6/6] arm64: switch to relative exception tables
Date: Mon, 4 Jan 2016 14:46:43 +0000 [thread overview]
Message-ID: <20160104144643.GE1616@arm.com> (raw)
In-Reply-To: <1451837157-447-7-git-send-email-ard.biesheuvel@linaro.org>
On Sun, Jan 03, 2016 at 05:05:57PM +0100, Ard Biesheuvel wrote:
> Instead of using absolute addresses for both the exception location
> and the fixup, use offsets relative to the exception table entry values.
> Not only does this cut the size of the exception table in half, it is
> also a prerequisite for KASLR, since absolute exception table entries
> are subject to dynamic relocation, which is incompatible with the sorting
> of the exception table that occurs at build time.
>
> Cc: Catalin Marinas <catalin.marinas@arm.com>
> Cc: Will Deacon <will.deacon@arm.com>
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> ---
>
> Note that this patch supersedes the version I sent as part of the series that
> implements KASLR for arm64: http://thread.gmane.org/gmane.linux.kernel/2116531
>
> arch/arm64/include/asm/assembler.h | 2 +-
> arch/arm64/include/asm/futex.h | 4 ++--
> arch/arm64/include/asm/uaccess.h | 18 ++++++++++--------
> arch/arm64/kernel/armv8_deprecated.c | 4 ++--
> arch/arm64/mm/extable.c | 2 +-
> scripts/sortextable.c | 2 +-
> 6 files changed, 17 insertions(+), 15 deletions(-)
This looks good to me, so for the arm64 part (i.e. this patch):
Acked-by: Will Deacon <will.deacon@arm.com>
Will
> diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h
> index 12eff928ef8b..8094d50f05bc 100644
> --- a/arch/arm64/include/asm/assembler.h
> +++ b/arch/arm64/include/asm/assembler.h
> @@ -98,7 +98,7 @@
> 9999: x; \
> .section __ex_table,"a"; \
> .align 3; \
> - .quad 9999b,l; \
> + .long (9999b - .), (l - .); \
> .previous
>
> /*
> diff --git a/arch/arm64/include/asm/futex.h b/arch/arm64/include/asm/futex.h
> index 007a69fc4f40..35e73e255ad3 100644
> --- a/arch/arm64/include/asm/futex.h
> +++ b/arch/arm64/include/asm/futex.h
> @@ -44,7 +44,7 @@
> " .popsection\n" \
> " .pushsection __ex_table,\"a\"\n" \
> " .align 3\n" \
> -" .quad 1b, 4b, 2b, 4b\n" \
> +" .long (1b - .), (4b - .), (2b - .), (4b - .)\n" \
> " .popsection\n" \
> ALTERNATIVE("nop", SET_PSTATE_PAN(1), ARM64_HAS_PAN, \
> CONFIG_ARM64_PAN) \
> @@ -135,7 +135,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
> " .popsection\n"
> " .pushsection __ex_table,\"a\"\n"
> " .align 3\n"
> -" .quad 1b, 4b, 2b, 4b\n"
> +" .long (1b - .), (4b - .), (2b - .), (4b - .)\n"
> " .popsection\n"
> : "+r" (ret), "=&r" (val), "+Q" (*uaddr), "=&r" (tmp)
> : "r" (oldval), "r" (newval), "Ir" (-EFAULT)
> diff --git a/arch/arm64/include/asm/uaccess.h b/arch/arm64/include/asm/uaccess.h
> index b2ede967fe7d..ab627e6c06c9 100644
> --- a/arch/arm64/include/asm/uaccess.h
> +++ b/arch/arm64/include/asm/uaccess.h
> @@ -36,11 +36,11 @@
> #define VERIFY_WRITE 1
>
> /*
> - * The exception table consists of pairs of addresses: the first is the
> - * address of an instruction that is allowed to fault, and the second is
> - * the address at which the program should continue. No registers are
> - * modified, so it is entirely up to the continuation code to figure out
> - * what to do.
> + * The exception table consists of pairs of relative offsets: the first
> + * is the relative offset to an instruction that is allowed to fault,
> + * and the second is the relative offset at which the program should
> + * continue. No registers are modified, so it is entirely up to the
> + * continuation code to figure out what to do.
> *
> * All the routines below use bits of fixup code that are out of line
> * with the main instruction path. This means when everything is well,
> @@ -50,9 +50,11 @@
>
> struct exception_table_entry
> {
> - unsigned long insn, fixup;
> + int insn, fixup;
> };
>
> +#define ARCH_HAS_RELATIVE_EXTABLE
> +
> extern int fixup_exception(struct pt_regs *regs);
>
> #define KERNEL_DS (-1UL)
> @@ -125,7 +127,7 @@ static inline void set_fs(mm_segment_t fs)
> " .previous\n" \
> " .section __ex_table,\"a\"\n" \
> " .align 3\n" \
> - " .quad 1b, 3b\n" \
> + " .long (1b - .), (3b - .)\n" \
> " .previous" \
> : "+r" (err), "=&r" (x) \
> : "r" (addr), "i" (-EFAULT))
> @@ -192,7 +194,7 @@ do { \
> " .previous\n" \
> " .section __ex_table,\"a\"\n" \
> " .align 3\n" \
> - " .quad 1b, 3b\n" \
> + " .long (1b - .), (3b - .)\n" \
> " .previous" \
> : "+r" (err) \
> : "r" (x), "r" (addr), "i" (-EFAULT))
> diff --git a/arch/arm64/kernel/armv8_deprecated.c b/arch/arm64/kernel/armv8_deprecated.c
> index 937f5e58a4d3..8f21b1363387 100644
> --- a/arch/arm64/kernel/armv8_deprecated.c
> +++ b/arch/arm64/kernel/armv8_deprecated.c
> @@ -299,8 +299,8 @@ static void register_insn_emulation_sysctl(struct ctl_table *table)
> " .popsection" \
> " .pushsection __ex_table,\"a\"\n" \
> " .align 3\n" \
> - " .quad 0b, 4b\n" \
> - " .quad 1b, 4b\n" \
> + " .long (0b - .), (4b - .)\n" \
> + " .long (1b - .), (4b - .)\n" \
> " .popsection\n" \
> ALTERNATIVE("nop", SET_PSTATE_PAN(1), ARM64_HAS_PAN, \
> CONFIG_ARM64_PAN) \
> diff --git a/arch/arm64/mm/extable.c b/arch/arm64/mm/extable.c
> index 79444279ba8c..81acd4706878 100644
> --- a/arch/arm64/mm/extable.c
> +++ b/arch/arm64/mm/extable.c
> @@ -11,7 +11,7 @@ int fixup_exception(struct pt_regs *regs)
>
> fixup = search_exception_tables(instruction_pointer(regs));
> if (fixup)
> - regs->pc = fixup->fixup;
> + regs->pc = (unsigned long)&fixup->fixup + fixup->fixup;
>
> return fixup != NULL;
> }
> diff --git a/scripts/sortextable.c b/scripts/sortextable.c
> index c2423d913b46..af247c70fb66 100644
> --- a/scripts/sortextable.c
> +++ b/scripts/sortextable.c
> @@ -282,12 +282,12 @@ do_file(char const *const fname)
> case EM_386:
> case EM_X86_64:
> case EM_S390:
> + case EM_AARCH64:
> custom_sort = sort_relative_table;
> break;
> case EM_ARCOMPACT:
> case EM_ARCV2:
> case EM_ARM:
> - case EM_AARCH64:
> case EM_MICROBLAZE:
> case EM_MIPS:
> case EM_XTENSA:
> --
> 1.9.1
>
next prev parent reply other threads:[~2016-01-04 14:46 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-03 16:05 [PATCH 0/6] generic relative extable support Ard Biesheuvel
2016-01-03 16:05 ` [PATCH 1/6] extable: add support for relative extables to search and sort routines Ard Biesheuvel
2016-01-04 21:05 ` Helge Deller
2016-01-03 16:05 ` [PATCH 2/6] alpha/extable: use generic " Ard Biesheuvel
2016-01-03 16:05 ` [PATCH 3/6] s390/extable: " Ard Biesheuvel
2016-01-03 16:05 ` [PATCH 4/6] x86/extable: " Ard Biesheuvel
2016-01-03 16:05 ` [PATCH 5/6] ia64/extable: " Ard Biesheuvel
2016-01-03 16:05 ` [PATCH 6/6] arm64: switch to relative exception tables Ard Biesheuvel
2016-01-04 14:46 ` Will Deacon [this message]
2016-01-04 18:13 ` H. Peter Anvin
2016-01-04 18:20 ` Luck, Tony
2016-01-04 18:47 ` H. Peter Anvin
2016-01-04 19:21 ` H. Peter Anvin
2016-01-04 19:28 ` Ard Biesheuvel
2016-01-04 19:49 ` Luck, Tony
2016-01-04 11:20 ` [PATCH 0/6] generic relative extable support Heiko Carstens
2016-01-04 18:15 ` H. Peter Anvin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160104144643.GE1616@arm.com \
--to=will.deacon@arm.com \
--cc=akpm@linux-foundation.org \
--cc=ard.biesheuvel@linaro.org \
--cc=arnd@arndb.de \
--cc=catalin.marinas@arm.com \
--cc=fenghua.yu@intel.com \
--cc=heiko.carstens@de.ibm.com \
--cc=hpa@zytor.com \
--cc=ink@jurassic.park.msu.ru \
--cc=linux-alpha@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-ia64@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=marc.zyngier@arm.com \
--cc=mark.rutland@arm.com \
--cc=mattst88@gmail.com \
--cc=mingo@redhat.com \
--cc=rth@twiddle.net \
--cc=schwidefsky@de.ibm.com \
--cc=tony.luck@intel.com \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).