arm64: Add __NR_* definitions for compat syscalls
[cascardo/linux.git] / arch / arm64 / kernel / signal32.c
index b3fc9f5..c5ee208 100644 (file)
 #include <linux/syscalls.h>
 #include <linux/ratelimit.h>
 
+#include <asm/esr.h>
 #include <asm/fpsimd.h>
 #include <asm/signal32.h>
 #include <asm/uaccess.h>
-#include <asm/unistd32.h>
+#include <asm/unistd.h>
 
 struct compat_sigcontext {
        /* We always set these two fields to 0 */
@@ -81,6 +82,8 @@ struct compat_vfp_sigframe {
 #define VFP_MAGIC              0x56465001
 #define VFP_STORAGE_SIZE       sizeof(struct compat_vfp_sigframe)
 
+#define FSR_WRITE_SHIFT                (11)
+
 struct compat_aux_sigframe {
        struct compat_vfp_sigframe      vfp;
 
@@ -219,7 +222,7 @@ static int compat_preserve_vfp_context(struct compat_vfp_sigframe __user *frame)
         * Note that this also saves V16-31, which aren't visible
         * in AArch32.
         */
-       fpsimd_save_state(fpsimd);
+       fpsimd_preserve_current_state();
 
        /* Place structure header on the stack */
        __put_user_error(magic, &frame->magic, err);
@@ -282,11 +285,8 @@ static int compat_restore_vfp_context(struct compat_vfp_sigframe __user *frame)
         * We don't need to touch the exception register, so
         * reload the hardware state.
         */
-       if (!err) {
-               preempt_disable();
-               fpsimd_load_state(&fpsimd);
-               preempt_enable();
-       }
+       if (!err)
+               fpsimd_update_current_state(&fpsimd);
 
        return err ? -EFAULT : 0;
 }
@@ -500,7 +500,9 @@ static int compat_setup_sigframe(struct compat_sigframe __user *sf,
        __put_user_error(regs->pstate, &sf->uc.uc_mcontext.arm_cpsr, err);
 
        __put_user_error((compat_ulong_t)0, &sf->uc.uc_mcontext.trap_no, err);
-       __put_user_error((compat_ulong_t)0, &sf->uc.uc_mcontext.error_code, err);
+       /* set the compat FSR WnR */
+       __put_user_error(!!(current->thread.fault_code & ESR_EL1_WRITE) <<
+                        FSR_WRITE_SHIFT, &sf->uc.uc_mcontext.error_code, err);
        __put_user_error(current->thread.fault_address, &sf->uc.uc_mcontext.fault_address, err);
        __put_user_error(set->sig[0], &sf->uc.uc_mcontext.oldmask, err);