]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/pkeys: Change caller of update_pkru_in_sigframe()
authorAruna Ramakrishna <aruna.ramakrishna@oracle.com>
Tue, 19 Nov 2024 17:45:19 +0000 (17:45 +0000)
committerDave Hansen <dave.hansen@linux.intel.com>
Mon, 2 Dec 2024 23:25:21 +0000 (15:25 -0800)
update_pkru_in_sigframe() will shortly need some information which
is only available inside xsave_to_user_sigframe(). Move
update_pkru_in_sigframe() inside the other function to make it
easier to provide it that information.

No functional changes.

Signed-off-by: Aruna Ramakrishna <aruna.ramakrishna@oracle.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Link: https://lore.kernel.org/all/20241119174520.3987538-2-aruna.ramakrishna%40oracle.com
arch/x86/kernel/fpu/signal.c
arch/x86/kernel/fpu/xstate.h

index 1065ab995305cd14f4d9d46b4fc52f22d00cd19a..8f62e0666dea51c949a7b32085b20227df04700d 100644 (file)
@@ -63,16 +63,6 @@ setfx:
        return true;
 }
 
-/*
- * Update the value of PKRU register that was already pushed onto the signal frame.
- */
-static inline int update_pkru_in_sigframe(struct xregs_state __user *buf, u32 pkru)
-{
-       if (unlikely(!cpu_feature_enabled(X86_FEATURE_OSPKE)))
-               return 0;
-       return __put_user(pkru, (unsigned int __user *)get_xsave_addr_user(buf, XFEATURE_PKRU));
-}
-
 /*
  * Signal frame handlers.
  */
@@ -168,14 +158,8 @@ static inline bool save_xstate_epilog(void __user *buf, int ia32_frame,
 
 static inline int copy_fpregs_to_sigframe(struct xregs_state __user *buf, u32 pkru)
 {
-       int err = 0;
-
-       if (use_xsave()) {
-               err = xsave_to_user_sigframe(buf);
-               if (!err)
-                       err = update_pkru_in_sigframe(buf, pkru);
-               return err;
-       }
+       if (use_xsave())
+               return xsave_to_user_sigframe(buf, pkru);
 
        if (use_fxsr())
                return fxsave_to_user_sigframe((struct fxregs_state __user *) buf);
index 0b86a5002c846d5e564c771fd0b6fc3ae56fc6d6..6b2924fbe5b8d0755740c518e59c48c99a40193b 100644 (file)
@@ -69,6 +69,16 @@ static inline u64 xfeatures_mask_independent(void)
        return fpu_kernel_cfg.independent_features;
 }
 
+/*
+ * Update the value of PKRU register that was already pushed onto the signal frame.
+ */
+static inline int update_pkru_in_sigframe(struct xregs_state __user *buf, u32 pkru)
+{
+       if (unlikely(!cpu_feature_enabled(X86_FEATURE_OSPKE)))
+               return 0;
+       return __put_user(pkru, (unsigned int __user *)get_xsave_addr_user(buf, XFEATURE_PKRU));
+}
+
 /* XSAVE/XRSTOR wrapper functions */
 
 #ifdef CONFIG_X86_64
@@ -256,7 +266,7 @@ static inline u64 xfeatures_need_sigframe_write(void)
  * The caller has to zero buf::header before calling this because XSAVE*
  * does not touch the reserved fields in the header.
  */
-static inline int xsave_to_user_sigframe(struct xregs_state __user *buf)
+static inline int xsave_to_user_sigframe(struct xregs_state __user *buf, u32 pkru)
 {
        /*
         * Include the features which are not xsaved/rstored by the kernel
@@ -281,6 +291,9 @@ static inline int xsave_to_user_sigframe(struct xregs_state __user *buf)
        XSTATE_OP(XSAVE, buf, lmask, hmask, err);
        clac();
 
+       if (!err)
+               err = update_pkru_in_sigframe(buf, pkru);
+
        return err;
 }