From eb703737be5c91c1a0817351db8ec152c523c85d Mon Sep 17 00:00:00 2001 From: Alberto Milone Date: Thu, 17 Sep 2015 15:49:46 +0200 Subject: [PATCH] Use a local copy of copy_xregs_to_kernel This is needed for Linux 4.2. Thanks to Tim Gardner for the patch. Signed-off-by: Romain Perier --- common/lib/modules/fglrx/build_mod/firegl_public.c | 44 +++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/common/lib/modules/fglrx/build_mod/firegl_public.c b/common/lib/modules/fglrx/build_mod/firegl_public.c index 4c1f9a5..bb67bba 100755 --- a/common/lib/modules/fglrx/build_mod/firegl_public.c +++ b/common/lib/modules/fglrx/build_mod/firegl_public.c @@ -6443,6 +6443,48 @@ int ATI_API_CALL kcl_sscanf(const char * buf, const char * fmt, ...) return i; } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,2,0) +/* + * Save processor xstate to xsave area. + */ +static void _copy_xregs_to_kernel(struct xregs_state *xstate) +{ + u64 mask = -1; + u32 lmask = mask; + u32 hmask = mask >> 32; + int err = 0; + + /*WARN_ON(!alternatives_patched);*/ + + /* + * If xsaves is enabled, xsaves replaces xsaveopt because + * it supports compact format and supervisor states in addition to + * modified optimization in xsaveopt. + * + * Otherwise, if xsaveopt is enabled, xsaveopt replaces xsave + * because xsaveopt supports modified optimization which is not + * supported by xsave. + * + * If none of xsaves and xsaveopt is enabled, use xsave. + */ + alternative_input_2( + "1:"XSAVE, + XSAVEOPT, + X86_FEATURE_XSAVEOPT, + XSAVES, + X86_FEATURE_XSAVES, + [xstate] "D" (xstate), "a" (lmask), "d" (hmask) : + "memory"); + asm volatile("2:\n\t" + xstate_fault(err) + : "0" (err) + : "memory"); + + /* We should never fault when copying to a kernel buffer: */ + WARN_ON_FPU(err); +} +#endif + /** \brief Generate UUID * \param buf pointer to the generated UUID * \return None @@ -6462,7 +6504,7 @@ static int KCL_fpu_save_init(struct task_struct *tsk) fpu_xsave(fpu); if (!(fpu->state->xsave.xsave_hdr.xstate_bv & XSTATE_FP)) #else - copy_xregs_to_kernel(&fpu->state.xsave); + _copy_xregs_to_kernel(&fpu->state.xsave); if (!(fpu->state.xsave.header.xfeatures & XSTATE_FP)) #endif return 1; -- 2.8.1