}
 
 /**
- * copy_xstate_to_uabi_buf - Copy kernel saved xstate to a UABI buffer
+ * __copy_xstate_to_uabi_buf - Copy kernel saved xstate to a UABI buffer
  * @to:                membuf descriptor
- * @tsk:       The task from which to copy the saved xstate
+ * @xsave:     The xsave from which to copy
+ * @pkru_val:  The PKRU value to store in the PKRU component
  * @copy_mode: The requested copy mode
  *
  * Converts from kernel XSAVE or XSAVES compacted format to UABI conforming
  *
  * It supports partial copy but @to.pos always starts from zero.
  */
-void copy_xstate_to_uabi_buf(struct membuf to, struct task_struct *tsk,
-                            enum xstate_copy_mode copy_mode)
+void __copy_xstate_to_uabi_buf(struct membuf to, struct xregs_state *xsave,
+                              u32 pkru_val, enum xstate_copy_mode copy_mode)
 {
        const unsigned int off_mxcsr = offsetof(struct fxregs_state, mxcsr);
-       struct xregs_state *xsave = &tsk->thread.fpu.state.xsave;
        struct xregs_state *xinit = &init_fpstate.xsave;
        struct xstate_header header;
        unsigned int zerofrom;
                        struct pkru_state pkru = {0};
                        /*
                         * PKRU is not necessarily up to date in the
-                        * thread's XSAVE buffer.  Fill this part from the
-                        * per-thread storage.
+                        * XSAVE buffer. Use the provided value.
                         */
-                       pkru.pkru = tsk->thread.pkru;
+                       pkru.pkru = pkru_val;
                        membuf_write(&to, &pkru, sizeof(pkru));
                } else {
                        copy_feature(header.xfeatures & BIT_ULL(i), &to,
                membuf_zero(&to, to.left);
 }
 
+/**
+ * copy_xstate_to_uabi_buf - Copy kernel saved xstate to a UABI buffer
+ * @to:                membuf descriptor
+ * @tsk:       The task from which to copy the saved xstate
+ * @copy_mode: The requested copy mode
+ *
+ * Converts from kernel XSAVE or XSAVES compacted format to UABI conforming
+ * format, i.e. from the kernel internal hardware dependent storage format
+ * to the requested @mode. UABI XSTATE is always uncompacted!
+ *
+ * It supports partial copy but @to.pos always starts from zero.
+ */
+void copy_xstate_to_uabi_buf(struct membuf to, struct task_struct *tsk,
+                            enum xstate_copy_mode copy_mode)
+{
+       __copy_xstate_to_uabi_buf(to, &tsk->thread.fpu.state.xsave,
+                                 tsk->thread.pkru, copy_mode);
+}
+
 static int copy_from_buffer(void *dst, unsigned int offset, unsigned int size,
                            const void *kbuf, const void __user *ubuf)
 {