lkml.org 
[lkml]   [2018]   [Jun]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRESEND [PATCH] arm64: compat: Expose offset to registers in sigframes
    Date
    From: Kevin Brodsky <kevin.brodsky@arm.com>

    This will be needed to provide unwinding information in compat
    sigreturn trampolines, part of the future compat vDSO. There is no
    obvious header the compat_sig* struct's should be moved to, so let's
    put them in signal32.h.

    Also fix minor style issues reported by checkpatch.

    Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
    Signed-off-by: Mark Salyzyn <salyzyn@android.com>
    Cc: James Morse <james.morse@arm.com>
    Cc: Russell King <linux@armlinux.org.uk>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Dmitry Safonov <dsafonov@virtuozzo.com>
    Cc: John Stultz <john.stultz@linaro.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Laura Abbott <labbott@redhat.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Andy Gross <andy.gross@linaro.org>
    Cc: Kevin Brodsky <kevin.brodsky@arm.com>
    Cc: Andrew Pinski <apinski@cavium.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-kernel@vger.kernel.org
    Cc: linux-arm-kernel@lists.infradead.org
    Cc: Dave Martin <Dave.Martin@arm.com>
    Cc: Eric W. Biederman <ebiederm@xmission.com>
    Cc: Jeremy Linton <Jeremy.Linton@arm.com>

    NB:
    Basically unchanged as part of a vDSO32 effort through 4 revisions,
    Resubmitted as a standalone change for quciker approval.
    ---
    arch/arm64/include/asm/signal32.h | 46 +++++++++++++++++++++++++++++++
    arch/arm64/kernel/asm-offsets.c | 13 +++++++++
    arch/arm64/kernel/signal32.c | 46 -------------------------------
    3 files changed, 59 insertions(+), 46 deletions(-)

    diff --git a/arch/arm64/include/asm/signal32.h b/arch/arm64/include/asm/signal32.h
    index 58e288aaf0ba..bcd0e139ee4a 100644
    --- a/arch/arm64/include/asm/signal32.h
    +++ b/arch/arm64/include/asm/signal32.h
    @@ -20,6 +20,52 @@
    #ifdef CONFIG_COMPAT
    #include <linux/compat.h>

    +struct compat_sigcontext {
    + /* We always set these two fields to 0 */
    + compat_ulong_t trap_no;
    + compat_ulong_t error_code;
    +
    + compat_ulong_t oldmask;
    + compat_ulong_t arm_r0;
    + compat_ulong_t arm_r1;
    + compat_ulong_t arm_r2;
    + compat_ulong_t arm_r3;
    + compat_ulong_t arm_r4;
    + compat_ulong_t arm_r5;
    + compat_ulong_t arm_r6;
    + compat_ulong_t arm_r7;
    + compat_ulong_t arm_r8;
    + compat_ulong_t arm_r9;
    + compat_ulong_t arm_r10;
    + compat_ulong_t arm_fp;
    + compat_ulong_t arm_ip;
    + compat_ulong_t arm_sp;
    + compat_ulong_t arm_lr;
    + compat_ulong_t arm_pc;
    + compat_ulong_t arm_cpsr;
    + compat_ulong_t fault_address;
    +};
    +
    +struct compat_ucontext {
    + compat_ulong_t uc_flags;
    + compat_uptr_t uc_link;
    + compat_stack_t uc_stack;
    + struct compat_sigcontext uc_mcontext;
    + compat_sigset_t uc_sigmask;
    + int __unused[32 - (sizeof(compat_sigset_t) / sizeof(int))];
    + compat_ulong_t uc_regspace[128] __aligned(8);
    +};
    +
    +struct compat_sigframe {
    + struct compat_ucontext uc;
    + compat_ulong_t retcode[2];
    +};
    +
    +struct compat_rt_sigframe {
    + struct compat_siginfo info;
    + struct compat_sigframe sig;
    +};
    +
    int compat_setup_frame(int usig, struct ksignal *ksig, sigset_t *set,
    struct pt_regs *regs);
    int compat_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set,
    diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c
    index 8938a4223690..a79507c5d845 100644
    --- a/arch/arm64/kernel/asm-offsets.c
    +++ b/arch/arm64/kernel/asm-offsets.c
    @@ -29,6 +29,7 @@
    #include <asm/fixmap.h>
    #include <asm/thread_info.h>
    #include <asm/memory.h>
    +#include <asm/signal32.h>
    #include <asm/smp_plat.h>
    #include <asm/suspend.h>
    #include <asm/vdso_datapage.h>
    @@ -81,6 +82,18 @@ int main(void)
    DEFINE(S_STACKFRAME, offsetof(struct pt_regs, stackframe));
    DEFINE(S_FRAME_SIZE, sizeof(struct pt_regs));
    BLANK();
    +#ifdef CONFIG_COMPAT
    + DEFINE(COMPAT_SIGFRAME_REGS_OFFSET,
    + offsetof(struct compat_sigframe, uc) +
    + offsetof(struct compat_ucontext, uc_mcontext) +
    + offsetof(struct compat_sigcontext, arm_r0));
    + DEFINE(COMPAT_RT_SIGFRAME_REGS_OFFSET,
    + offsetof(struct compat_rt_sigframe, sig) +
    + offsetof(struct compat_sigframe, uc) +
    + offsetof(struct compat_ucontext, uc_mcontext) +
    + offsetof(struct compat_sigcontext, arm_r0));
    + BLANK();
    +#endif
    DEFINE(MM_CONTEXT_ID, offsetof(struct mm_struct, context.id.counter));
    BLANK();
    DEFINE(VMA_VM_MM, offsetof(struct vm_area_struct, vm_mm));
    diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c
    index 9c018878056b..096c88731c56 100644
    --- a/arch/arm64/kernel/signal32.c
    +++ b/arch/arm64/kernel/signal32.c
    @@ -30,42 +30,6 @@
    #include <linux/uaccess.h>
    #include <asm/unistd.h>

    -struct compat_sigcontext {
    - /* We always set these two fields to 0 */
    - compat_ulong_t trap_no;
    - compat_ulong_t error_code;
    -
    - compat_ulong_t oldmask;
    - compat_ulong_t arm_r0;
    - compat_ulong_t arm_r1;
    - compat_ulong_t arm_r2;
    - compat_ulong_t arm_r3;
    - compat_ulong_t arm_r4;
    - compat_ulong_t arm_r5;
    - compat_ulong_t arm_r6;
    - compat_ulong_t arm_r7;
    - compat_ulong_t arm_r8;
    - compat_ulong_t arm_r9;
    - compat_ulong_t arm_r10;
    - compat_ulong_t arm_fp;
    - compat_ulong_t arm_ip;
    - compat_ulong_t arm_sp;
    - compat_ulong_t arm_lr;
    - compat_ulong_t arm_pc;
    - compat_ulong_t arm_cpsr;
    - compat_ulong_t fault_address;
    -};
    -
    -struct compat_ucontext {
    - compat_ulong_t uc_flags;
    - compat_uptr_t uc_link;
    - compat_stack_t uc_stack;
    - struct compat_sigcontext uc_mcontext;
    - compat_sigset_t uc_sigmask;
    - int __unused[32 - (sizeof (compat_sigset_t) / sizeof (int))];
    - compat_ulong_t uc_regspace[128] __attribute__((__aligned__(8)));
    -};
    -
    struct compat_vfp_sigframe {
    compat_ulong_t magic;
    compat_ulong_t size;
    @@ -92,16 +56,6 @@ struct compat_aux_sigframe {
    unsigned long end_magic;
    } __attribute__((__aligned__(8)));

    -struct compat_sigframe {
    - struct compat_ucontext uc;
    - compat_ulong_t retcode[2];
    -};
    -
    -struct compat_rt_sigframe {
    - struct compat_siginfo info;
    - struct compat_sigframe sig;
    -};
    -
    #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))

    static inline int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set)
    --
    2.18.0.rc1.244.gcf134e6275-goog
    \
     
     \ /
      Last update: 2018-06-18 17:12    [W:4.534 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site