[PATCH v8] arm64: Expose FAR_EL1 tag bits in siginfo
Eric W. Biederman
ebiederm at xmission.com
Tue Jun 23 08:54:59 EDT 2020
Peter Collingbourne <pcc at google.com> writes:
> diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
> index 47f651df781c..a8380a2b6361 100644
> --- a/arch/arm64/kernel/traps.c
> +++ b/arch/arm64/kernel/traps.c
> @@ -235,20 +235,41 @@ static void arm64_show_signal(int signo, const char *str)
> }
>
> void arm64_force_sig_fault(int signo, int code, void __user *addr,
> + unsigned long far, unsigned char far_tb_mask,
> const char *str)
> {
> arm64_show_signal(signo, str);
> - if (signo == SIGKILL)
> + if (signo == SIGKILL) {
> force_sig(SIGKILL);
> - else
> - force_sig_fault(signo, code, addr);
> + } else {
> + struct kernel_siginfo info;
> + clear_siginfo(&info);
> + info.si_signo = signo;
> + info.si_errno = 0;
> + info.si_code = code;
> + info.si_addr = addr;
> + info.si_addr_top_byte = (far >> 56) & far_tb_mask;
> + info.si_addr_top_byte_mask = far_tb_mask;
> + force_sig_info(&info);
> + }
> }
>
> void arm64_force_sig_mceerr(int code, void __user *addr, short lsb,
> - const char *str)
> + unsigned long far, const char *str)
> {
> + struct kernel_siginfo info;
> +
> arm64_show_signal(SIGBUS, str);
> - force_sig_mceerr(code, addr, lsb);
> +
> + clear_siginfo(&info);
> + info.si_signo = SIGBUS;
> + info.si_errno = 0;
> + info.si_code = code;
> + info.si_addr = addr;
> + info.si_addr_lsb = lsb;
> + info.si_addr_top_byte = far >> 56;
> + info.si_addr_top_byte_mask = 0xff;
> + force_sig_info(&info);
> }
I have a real problem with this construction. force_sig_info is not an
interface that should be used for anything except to define a wrapper
that takes it's parameters.
It is not clear to me that if you have adapted siginfo_layout.
> diff --git a/include/uapi/asm-generic/siginfo.h b/include/uapi/asm-generic/siginfo.h
> index cb3d6c267181..6dd82373eb2d 100644
> --- a/include/uapi/asm-generic/siginfo.h
> +++ b/include/uapi/asm-generic/siginfo.h
> @@ -91,6 +91,14 @@ union __sifields {
> char _dummy_pkey[__ADDR_BND_PKEY_PAD];
> __u32 _pkey;
> } _addr_pkey;
> +#ifdef __aarch64__
> + /* used with all si_codes */
> + struct {
> + short _dummy_top_byte;
> + unsigned char _top_byte;
> + unsigned char _top_byte_mask;
> + } _addr_top_byte;
> +#endif
> };
> } _sigfault;
>
Why the _dummy_top_byte? Oh I see it should be spelled "short _addr_lsb;".
Please remove the "#ifdef __aarch64__". If at all possible we want to
design this so any other architecture who has this challenge can use the
code. The kind of code does not get enough attention/maintenance if it
is built for a single architecture.
> @@ -148,6 +156,10 @@ typedef struct siginfo {
> #define si_int _sifields._rt._sigval.sival_int
> #define si_ptr _sifields._rt._sigval.sival_ptr
> #define si_addr _sifields._sigfault._addr
> +#ifdef __aarch64__
> +#define si_addr_top_byte _sifields._sigfault._addr_top_byte._top_byte
> +#define si_addr_top_byte_mask _sifields._sigfault._addr_top_byte._top_byte_mask
> +#endif
> #ifdef __ARCH_SI_TRAPNO
> #define si_trapno _sifields._sigfault._trapno
> #endif
The details asside I think this set of changes is making progress.
Eric
More information about the linux-arm-kernel
mailing list