From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25200 invoked by alias); 2 Feb 2010 02:30:56 -0000 Received: (qmail 25184 invoked by uid 22791); 2 Feb 2010 02:30:53 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL,BAYES_00,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail-ww0-f41.google.com (HELO mail-ww0-f41.google.com) (74.125.82.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 02 Feb 2010 02:30:44 +0000 Received: by wwb29 with SMTP id 29so688600wwb.0 for ; Mon, 01 Feb 2010 18:30:41 -0800 (PST) MIME-Version: 1.0 Received: by 10.216.88.136 with SMTP id a8mr3449150wef.77.1265077841216; Mon, 01 Feb 2010 18:30:41 -0800 (PST) Date: Tue, 02 Feb 2010 02:30:00 -0000 Message-ID: <6dc9ffc81002011830l20bd018aoae6971f633ed0a02@mail.gmail.com> Subject: PATCH [1/n]: Support AVX core dump From: "H.J. Lu" To: GDB , Binutils Content-Type: multipart/mixed; boundary=0016e6d64c2356cc34047e94e3ee X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-02/txt/msg00034.txt.bz2 --0016e6d64c2356cc34047e94e3ee Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 17558 Hi, Here is the first patch to support AVX core dump and debug. OK to install? Thanks. H.J. --- bfd/ 2010-01-27 H.J. Lu * elf-bfd.h (elfcore_write_xstatereg): New. * elf.c (elfcore_grok_xstatereg): New. (elfcore_write_xstatereg): Likewise. (elfcore_grok_note): Handle NT_X86_XSTATE. (elfcore_write_register_note): Handle .reg-xstate section. binutils/ 2010-01-27 H.J. Lu * readelf.c (get_note_type): Handle NT_X86_XSTATE. include/elf/ 2010-01-27 H.J. Lu * common.h (NT_386_XSTATE): New. ---------- Forwarded message ---------- From: Lu, Hongjiu Date: Mon, Feb 1, 2010 at 6:26 PM Subject: FW: [patch] x86: ptrace and core-dump extensions for xstate To: "hjl.tools@gmail.com" H.J. -----Original Message----- From: Siddha, Suresh B Sent: Monday, February 01, 2010 6:00 PM To: H. Peter Anvin; Ingo Molnar; Thomas Gleixner; Roland McGrath Cc: LKML; Lu, Hongjiu; Lachner, Peter Subject: [patch] x86: ptrace and core-dump extensions for xstate Kernel ptrace, core dump extensions to support AVX state etc. This interface (PTRACE_GETXSTATEREGS, PTRACE_SETXSTATEREGS, NT_X86_XSTATE) is designed to support all the future state that gets supported using xsave/xrstor infrastructure. Looking at the memory layout saved by "xsave", one can't say which state is represented in the memory layout. This is because if a particular state = is in init state, in the xsave hdr it can be represented by bit '0'. And hence we can't really say by the xsave header wether a state is in init state or the state is not saved in the memory layout. And hence the xsave memory layout available through the PTRACE_GETXSTATEREGS and the core dump(NT_X86_XSTATE) uses SW usable bytes [464..511] to convey what state is represented in the memory layout. First 8 bytes of the sw_usable_bytes[464..467] will be set to OS enabled xs= tate mask(which is same as the 64bit mask returned by the xgetbv's xCR0). For more information on how to use this API by users like debuggers and core dump, please refer to comments in arch/x86/include/asm/ptrace-abi.h Signed-off-by: Suresh Siddha Signed-off-by: Hongjiu Lu --- diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h index ebfb8a9..1cd5d43 100644 --- a/arch/x86/include/asm/i387.h +++ b/arch/x86/include/asm/i387.h @@ -32,9 +32,11 @@ extern void __math_state_restore(void); =A0extern void init_thread_xstate(void); =A0extern int dump_fpu(struct pt_regs *, struct user_i387_struct *); -extern user_regset_active_fn fpregs_active, xfpregs_active; -extern user_regset_get_fn fpregs_get, xfpregs_get, fpregs_soft_get; -extern user_regset_set_fn fpregs_set, xfpregs_set, fpregs_soft_set; +extern user_regset_active_fn fpregs_active, xfpregs_active, xstateregs_act= ive; +extern user_regset_get_fn fpregs_get, xfpregs_get, fpregs_soft_get, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 xstateregs_ge= t; +extern user_regset_set_fn fpregs_set, xfpregs_set, fpregs_soft_set, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0xstateregs= _set; =A0extern struct _fpx_sw_bytes fx_sw_reserved; =A0#ifdef CONFIG_IA32_EMULATION diff --git a/arch/x86/include/asm/ptrace-abi.h b/arch/x86/include/asm/ptrace-abi.h index 8672303..6fe60cb 100644 --- a/arch/x86/include/asm/ptrace-abi.h +++ b/arch/x86/include/asm/ptrace-abi.h @@ -80,6 +80,44 @@ =A0#define PTRACE_SINGLEBLOCK =A0 =A0 33 =A0 =A0 =A0/* resume execution unt= il next branch */ +/* + * Structure layout used in PTRACE_GETXSTATEREGS/PTRACE_SETXSTATEREGS is s= ame + * as the memory layout of xsave used by the processor (except for the byt= es + * 464..511 which can be used by the software). Size of the structure that users + * need to use for these two interfaces can be obtained by doing: + * =A0 =A0 cpuid_count(0xd, 0, &eax, &ptrace_xstateregs_struct_size, &ecx,= &edx); + * i.e., cpuid.(eax=3D0xd,ecx=3D0).ebx will be the size that user (debugge= rs etc) + * need to use. + * + * And format of this structure will be like: + * =A0 =A0 struct { + * =A0 =A0 =A0 =A0 =A0 =A0 fxsave_bytes[0..463] + * =A0 =A0 =A0 =A0 =A0 =A0 sw_usable_bytes[464..511] + * =A0 =A0 =A0 =A0 =A0 =A0 xsave_hdr_bytes[512..575] + * =A0 =A0 =A0 =A0 =A0 =A0 avx_bytes[576..831] + * =A0 =A0 =A0 =A0 =A0 =A0 future_state etc + * =A0 =A0 } + * + * Same memory layout will be used for the coredump NT_X86_XSTATE represen= ting + * the xstate registers. + * + * For now, only first 8 bytes of the sw_usable_bytes[464..467] will be used and + * will be set to OS enabled xstate mask(which is same as the 64bit mask + * returned by the xgetbv's xCR0). Users (analyzing core dump remotely etc) + * can use this mask aswell as the mask saved in the xstate_hdr bytes and + * interpret what states the processor/OS supports and what states are in + * modified/initialized conditions for the particular process/thread. + * + * Also when the user modifies certain state FP/SSE/etc through this + * PTRACE_SETXSTATEREGS, they must ensure that the xsave_hdr.xstate_bv + * bytes[512..519] of the above memory layout are updated correspondingly. + * i.e., for example when FP state is modified to a non-init state, + * xsave_hdr.xstate_bv's bit 0 must be set to '1', when SSE is modified to + * non-init state, xsave_hdr.xstate_bv's bit 1 must to be set to '1' etc.. + */ +#define PTRACE_GETXSTATEREGS =A0 =A0 =A034 +#define PTRACE_SETXSTATEREGS =A0 =A0 =A035 + =A0#ifndef __ASSEMBLY__ =A0#include diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h index 727acc1..9e26171 100644 --- a/arch/x86/include/asm/xsave.h +++ b/arch/x86/include/asm/xsave.h @@ -27,9 +27,11 @@ =A0extern unsigned int xstate_size; =A0extern u64 pcntxt_mask; =A0extern struct xsave_struct *init_xstate_buf; +extern u64 xstate_fx_sw_bytes[6]; =A0extern void xsave_cntxt_init(void); =A0extern void xsave_init(void); +extern void update_regset_xstate_info(unsigned int size, u64 xstate_mask); =A0extern int init_fpu(struct task_struct *child); =A0extern int check_for_xstate(struct i387_fxsave_struct __user *buf, =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0void __user *fpstate, diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c index f2f8540..dffdf91 100644 --- a/arch/x86/kernel/i387.c +++ b/arch/x86/kernel/i387.c @@ -224,6 +224,85 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset, =A0 =A0 =A0 =A0return ret; =A0} +int xstateregs_active(struct task_struct *target, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 const struct user_regset *regset) +{ + =A0 =A0 =A0 return (cpu_has_xsave && tsk_used_math(target)) ? xstate_size= : 0; +} + +int xstateregs_get(struct task_struct *target, const struct user_regset *regset, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 unsigned int pos, unsigned int count, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 void *kbuf, void __user *ubuf) +{ + =A0 =A0 =A0 int ret; + + =A0 =A0 =A0 if (!cpu_has_xsave) + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return -ENODEV; + + =A0 =A0 =A0 ret =3D init_fpu(target); + =A0 =A0 =A0 if (ret) + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return ret; + + =A0 =A0 =A0 /* + =A0 =A0 =A0 =A0* First copy the fxsave bytes 0..463 + =A0 =A0 =A0 =A0*/ + =A0 =A0 =A0 ret =3D user_regset_copyout(&pos, &count, &kbuf, &ubuf, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 &target->= thread.xstate->xsave, 0, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (sizeof(s= truct i387_fxsave_struct) - + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0sizeof= (xstate_fx_sw_bytes))); + =A0 =A0 =A0 /* + =A0 =A0 =A0 =A0* Copy the 48bytes defined by software + =A0 =A0 =A0 =A0*/ + =A0 =A0 =A0 ret |=3D user_regset_copyout(&pos, &count, &kbuf, &ubuf, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0xstate= _fx_sw_bytes, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0(sizeo= f(struct i387_fxsave_struct) - + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sizeo= f(xstate_fx_sw_bytes)), + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0sizeof= (struct i387_fxsave_struct)); + =A0 =A0 =A0 /* + =A0 =A0 =A0 =A0* Copy the rest of xstate memory layout + =A0 =A0 =A0 =A0*/ + =A0 =A0 =A0 ret |=3D user_regset_copyout(&pos, &count, &kbuf, &ubuf, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&targe= t->thread.xstate->xsave.xsave_hdr, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0sizeof= (struct i387_fxsave_struct), -1); + =A0 =A0 =A0 return ret; +} + +int xstateregs_set(struct task_struct *target, const struct user_regset *regset, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 unsigned int pos, unsigned int count, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 const void *kbuf, const void __user *ubuf) +{ + =A0 =A0 =A0 int ret; + =A0 =A0 =A0 struct xsave_hdr_struct *xsave_hdr =3D + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ¤t->thr= ead.xstate->xsave.xsave_hdr; + + + =A0 =A0 =A0 if (!cpu_has_xsave) + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return -ENODEV; + + =A0 =A0 =A0 ret =3D init_fpu(target); + =A0 =A0 =A0 if (ret) + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return ret; + + =A0 =A0 =A0 set_stopped_child_used_math(target); + + =A0 =A0 =A0 ret =3D user_regset_copyin(&pos, &count, &kbuf, &ubuf, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&target->t= hread.xstate->xsave, 0, -1); + + =A0 =A0 =A0 /* + =A0 =A0 =A0 =A0* mxcsr reserved bits must be masked to zero for security = reasons. + =A0 =A0 =A0 =A0*/ + =A0 =A0 =A0 target->thread.xstate->fxsave.mxcsr &=3D mxcsr_feature_mask; + + =A0 =A0 =A0 xsave_hdr->xstate_bv &=3D pcntxt_mask; + =A0 =A0 =A0 /* + =A0 =A0 =A0 =A0* These bits must be zero. + =A0 =A0 =A0 =A0*/ + =A0 =A0 =A0 xsave_hdr->reserved1[0] =3D xsave_hdr->reserved1[1] =3D 0; + + + =A0 =A0 =A0 return ret; +} + =A0#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION =A0/* diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index 73554a3..4bb5c1c 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c @@ -48,6 +48,7 @@ enum x86_regset { =A0 =A0 =A0 =A0REGSET_FP, =A0 =A0 =A0 =A0REGSET_XFP, =A0 =A0 =A0 =A0REGSET_IOPERM64 =3D REGSET_XFP, + =A0 =A0 =A0 REGSET_XSTATE, =A0 =A0 =A0 =A0REGSET_TLS, =A0 =A0 =A0 =A0REGSET_IOPERM32, =A0}; @@ -1208,6 +1209,20 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 0, sizeof(struct user_i387_struct), =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 datap); + =A0 =A0 =A0 case PTRACE_GETXSTATEREGS: =A0 =A0 =A0/* Get the child extend= ed state. */ + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return copy_regset_to_user(child, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0task_user_regset_view(current), + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0REGSET_XSTATE, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A00, xstate_size, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0datap); + + =A0 =A0 =A0 case PTRACE_SETXSTATEREGS: =A0 =A0 =A0/* Set the child extend= ed state. */ + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return copy_regset_from_user(child, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0task_user_regset_view(current), + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0REGSET_XSTATE, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A00, xstate_size, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0datap); + =A0#ifdef CONFIG_X86_32 =A0 =A0 =A0 =A0case PTRACE_GETFPXREGS: /* Get the child extended FPU state.= */ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return copy_regset_to_user(child, &user_x86_= 32_view, @@ -1537,6 +1552,16 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 sizeof(struct user32_fxsr_struct), =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 datap); + =A0 =A0 =A0 case PTRACE_GETXSTATEREGS: =A0 =A0 =A0/* Get the child extend= ed state. */ + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return copy_regset_to_user(child, &user_x86_3= 2_view, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0REGSET_XSTATE, 0, xstate_size, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0datap); + + =A0 =A0 =A0 case PTRACE_SETXSTATEREGS: =A0 =A0 =A0/* Set the child extend= ed state. */ + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return copy_regset_from_user(child, &user_x86= _32_view, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0REGSET_XSTATE, 0, xstate_size, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0datap); + =A0 =A0 =A0 =A0case PTRACE_GET_THREAD_AREA: =A0 =A0 =A0 =A0case PTRACE_SET_THREAD_AREA: =A0#ifdef CONFIG_X86_PTRACE_BTS @@ -1560,7 +1585,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, =A0#ifdef CONFIG_X86_64 -static const struct user_regset x86_64_regsets[] =3D { +static struct user_regset x86_64_regsets[] __read_mostly =3D { =A0 =A0 =A0 =A0[REGSET_GENERAL] =3D { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0.core_note_type =3D NT_PRSTATUS, =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0.n =3D sizeof(struct user_regs_struct) / siz= eof(long), @@ -1573,6 +1598,12 @@ static const struct user_regset x86_64_regsets[] =3D= { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0.size =3D sizeof(long), .align =3D sizeof(lo= ng), =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0.active =3D xfpregs_active, .get =3D xfpregs= _get, .set =3D xfpregs_set =A0 =A0 =A0 =A0}, + =A0 =A0 =A0 [REGSET_XSTATE] =3D { + =A0 =A0 =A0 =A0 =A0 =A0 =A0 .core_note_type =3D NT_X86_XSTATE, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 .size =3D sizeof(long), .align =3D sizeof(lon= g), + =A0 =A0 =A0 =A0 =A0 =A0 =A0 .active =3D xstateregs_active, .get =3D xstat= eregs_get, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 .set =3D xstateregs_set + =A0 =A0 =A0 }, =A0 =A0 =A0 =A0[REGSET_IOPERM64] =3D { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0.core_note_type =3D NT_386_IOPERM, =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0.n =3D IO_BITMAP_LONGS, @@ -1598,7 +1629,7 @@ static const struct user_regset_view user_x86_64_view= =3D { =A0#endif /* CONFIG_X86_64 */ =A0#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION -static const struct user_regset x86_32_regsets[] =3D { +static struct user_regset x86_32_regsets[] __read_mostly =3D { =A0 =A0 =A0 =A0[REGSET_GENERAL] =3D { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0.core_note_type =3D NT_PRSTATUS, =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0.n =3D sizeof(struct user_regs_struct32) / s= izeof(u32), @@ -1617,6 +1648,12 @@ static const struct user_regset x86_32_regsets[] =3D= { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0.size =3D sizeof(u32), .align =3D sizeof(u32= ), =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0.active =3D xfpregs_active, .get =3D xfpregs= _get, .set =3D xfpregs_set =A0 =A0 =A0 =A0}, + =A0 =A0 =A0 [REGSET_XSTATE] =3D { + =A0 =A0 =A0 =A0 =A0 =A0 =A0 .core_note_type =3D NT_X86_XSTATE, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 .size =3D sizeof(u32), .align =3D sizeof(u32), + =A0 =A0 =A0 =A0 =A0 =A0 =A0 .active =3D xstateregs_active, .get =3D xstat= eregs_get, + =A0 =A0 =A0 =A0 =A0 =A0 =A0 .set =3D xstateregs_set + =A0 =A0 =A0 }, =A0 =A0 =A0 =A0[REGSET_TLS] =3D { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0.core_note_type =3D NT_386_TLS, =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0.n =3D GDT_ENTRY_TLS_ENTRIES, .bias =3D GDT_= ENTRY_TLS_MIN, @@ -1639,6 +1676,18 @@ static const struct user_regset_view user_x86_32_vie= w =3D { =A0}; =A0#endif +u64 xstate_fx_sw_bytes[6]; +void update_regset_xstate_info(unsigned int size, u64 xstate_mask) +{ +#ifdef CONFIG_X86_64 + =A0 =A0 =A0 x86_64_regsets[REGSET_XSTATE].n =3D size / sizeof(long); +#endif +#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION + =A0 =A0 =A0 x86_32_regsets[REGSET_XSTATE].n =3D size / sizeof(u32); +#endif + =A0 =A0 =A0 xstate_fx_sw_bytes[0] =3D xstate_mask; +} + =A0const struct user_regset_view *task_user_regset_view(struct task_struct = *task) =A0{ =A0#ifdef CONFIG_IA32_EMULATION diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c index c5ee17e..782c3a3 100644 --- a/arch/x86/kernel/xsave.c +++ b/arch/x86/kernel/xsave.c @@ -337,6 +337,7 @@ void __ref xsave_cntxt_init(void) =A0 =A0 =A0 =A0cpuid_count(0xd, 0, &eax, &ebx, &ecx, &edx); =A0 =A0 =A0 =A0xstate_size =3D ebx; + =A0 =A0 =A0 update_regset_xstate_info(xstate_size, pcntxt_mask); =A0 =A0 =A0 =A0prepare_fx_sw_frame(); =A0 =A0 =A0 =A0setup_xstate_init(); diff --git a/include/linux/elf.h b/include/linux/elf.h index 0cc4d55..a8c4af0 100644 --- a/include/linux/elf.h +++ b/include/linux/elf.h @@ -361,6 +361,7 @@ typedef struct elf64_shdr { =A0#define NT_PPC_VSX =A0 =A0 0x102 =A0 =A0 =A0 =A0 =A0 /* PowerPC VSX regi= sters */ =A0#define NT_386_TLS =A0 =A0 0x200 =A0 =A0 =A0 =A0 =A0 /* i386 TLS slots (= struct user_desc) */ =A0#define NT_386_IOPERM =A00x201 =A0 =A0 =A0 =A0 =A0 /* x86 io permission = bitmap (1=3Ddeny) */ +#define NT_X86_XSTATE =A00x202 =A0 =A0 =A0 =A0 =A0 /* x86 extended state u= sing xsave */ =A0#define NT_S390_HIGH_GPRS =A0 =A0 =A00x300 =A0 /* s390 upper register ha= lves */ --=20 H.J. --0016e6d64c2356cc34047e94e3ee Content-Type: text/plain; charset=US-ASCII; name="binutils-xsave-1.patch" Content-Disposition: attachment; filename="binutils-xsave-1.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g562lx4o0 Content-length: 5405 YmZkLwoKMjAxMC0wMS0yNyAgSC5KLiBMdSAgPGhvbmdqaXUubHVAaW50ZWwu Y29tPgoKCSogZWxmLWJmZC5oIChlbGZjb3JlX3dyaXRlX3hzdGF0ZXJlZyk6 IE5ldy4KCgkqIGVsZi5jIChlbGZjb3JlX2dyb2tfeHN0YXRlcmVnKTogTmV3 LgoJKGVsZmNvcmVfd3JpdGVfeHN0YXRlcmVnKTogTGlrZXdpc2UuCgkoZWxm Y29yZV9ncm9rX25vdGUpOiBIYW5kbGUgTlRfWDg2X1hTVEFURS4KCShlbGZj b3JlX3dyaXRlX3JlZ2lzdGVyX25vdGUpOiBIYW5kbGUgLnJlZy14c3RhdGUg c2VjdGlvbi4KCmJpbnV0aWxzLwoKMjAxMC0wMS0yNyAgSC5KLiBMdSAgPGhv bmdqaXUubHVAaW50ZWwuY29tPgoKCSogcmVhZGVsZi5jIChnZXRfbm90ZV90 eXBlKTogSGFuZGxlIE5UX1g4Nl9YU1RBVEUuCgppbmNsdWRlL2VsZi8KCjIw MTAtMDEtMjcgIEguSi4gTHUgIDxob25naml1Lmx1QGludGVsLmNvbT4KCgkq IGNvbW1vbi5oIChOVF8zODZfWFNUQVRFKTogTmV3LgoKZGlmZiAtLWdpdCBh L2JmZC9lbGYtYmZkLmggYi9iZmQvZWxmLWJmZC5oCmluZGV4IGRhYTJiNjIu LjNjM2FjOWIgMTAwNjQ0Ci0tLSBhL2JmZC9lbGYtYmZkLmgKKysrIGIvYmZk L2VsZi1iZmQuaApAQCAtMjE0OSw2ICsyMTQ5LDggQEAgZXh0ZXJuIGNoYXIg KmVsZmNvcmVfd3JpdGVfcHJmcHJlZwogICAoYmZkICosIGNoYXIgKiwgaW50 ICosIGNvbnN0IHZvaWQgKiwgaW50KTsKIGV4dGVybiBjaGFyICplbGZjb3Jl X3dyaXRlX3ByeGZwcmVnCiAgIChiZmQgKiwgY2hhciAqLCBpbnQgKiwgY29u c3Qgdm9pZCAqLCBpbnQpOworZXh0ZXJuIGNoYXIgKmVsZmNvcmVfd3JpdGVf eHN0YXRlcmVnCisgIChiZmQgKiwgY2hhciAqLCBpbnQgKiwgY29uc3Qgdm9p ZCAqLCBpbnQpOwogZXh0ZXJuIGNoYXIgKmVsZmNvcmVfd3JpdGVfcHBjX3Zt eAogICAoYmZkICosIGNoYXIgKiwgaW50ICosIGNvbnN0IHZvaWQgKiwgaW50 KTsKIGV4dGVybiBjaGFyICplbGZjb3JlX3dyaXRlX3BwY192c3gKZGlmZiAt LWdpdCBhL2JmZC9lbGYuYyBiL2JmZC9lbGYuYwppbmRleCBhYWMzMzE0Li40 ZmZmNGE3IDEwMDY0NAotLS0gYS9iZmQvZWxmLmMKKysrIGIvYmZkL2VsZi5j CkBAIC03NjI4LDYgKzc2MjgsMTYgQEAgZWxmY29yZV9ncm9rX3ByeGZwcmVn IChiZmQgKmFiZmQsIEVsZl9JbnRlcm5hbF9Ob3RlICpub3RlKQogICByZXR1 cm4gZWxmY29yZV9tYWtlX25vdGVfcHNldWRvc2VjdGlvbiAoYWJmZCwgIi5y ZWcteGZwIiwgbm90ZSk7CiB9CiAKKy8qIExpbnV4IGR1bXBzIHRoZSBJbnRl bCBYU0FWRSBleHRlbmRlZCBzdGF0ZSBpbiBhIG5vdGUgbmFtZWQgIkxJTlVY IgorICAgd2l0aCBhIG5vdGUgdHlwZSBvZiBOVF9YODZfWFNUQVRFLiAgSnVz dCBpbmNsdWRlIHRoZSB3aG9sZSBub3RlJ3MKKyAgIGNvbnRlbnRzIGxpdGVy YWxseS4gICovCisKK3N0YXRpYyBiZmRfYm9vbGVhbgorZWxmY29yZV9ncm9r X3hzdGF0ZXJlZyAoYmZkICphYmZkLCBFbGZfSW50ZXJuYWxfTm90ZSAqbm90 ZSkKK3sKKyAgcmV0dXJuIGVsZmNvcmVfbWFrZV9ub3RlX3BzZXVkb3NlY3Rp b24gKGFiZmQsICIucmVnLXhzdGF0ZSIsIG5vdGUpOworfQorCiBzdGF0aWMg YmZkX2Jvb2xlYW4KIGVsZmNvcmVfZ3Jva19wcGNfdm14IChiZmQgKmFiZmQs IEVsZl9JbnRlcm5hbF9Ob3RlICpub3RlKQogewpAQCAtNzk5Myw2ICs4MDAz LDEzIEBAIGVsZmNvcmVfZ3Jva19ub3RlIChiZmQgKmFiZmQsIEVsZl9JbnRl cm5hbF9Ob3RlICpub3RlKQogICAgICAgZWxzZQogCXJldHVybiBUUlVFOwog CisgICAgY2FzZSBOVF9YODZfWFNUQVRFOgkJLyogTGludXggWFNBVkUgZXh0 ZW5zaW9uICovCisgICAgICBpZiAobm90ZS0+bmFtZXN6ID09IDYKKwkgICYm IHN0cmNtcCAobm90ZS0+bmFtZWRhdGEsICJMSU5VWCIpID09IDApCisJcmV0 dXJuIGVsZmNvcmVfZ3Jva194c3RhdGVyZWcgKGFiZmQsIG5vdGUpOworICAg ICAgZWxzZQorCXJldHVybiBUUlVFOworCiAgICAgY2FzZSBOVF9QUENfVk1Y OgogICAgICAgaWYgKG5vdGUtPm5hbWVzeiA9PSA2CiAJICAmJiBzdHJjbXAg KG5vdGUtPm5hbWVkYXRhLCAiTElOVVgiKSA9PSAwKQpAQCAtODYzMyw2ICs4 NjUwLDE1IEBAIGVsZmNvcmVfd3JpdGVfcHJ4ZnByZWcgKGJmZCAqYWJmZCwK IH0KIAogY2hhciAqCitlbGZjb3JlX3dyaXRlX3hzdGF0ZXJlZyAoYmZkICph YmZkLCBjaGFyICpidWYsIGludCAqYnVmc2l6LAorCQkJIGNvbnN0IHZvaWQg KnhmcHJlZ3MsIGludCBzaXplKQoreworICBjaGFyICpub3RlX25hbWUgPSAi TElOVVgiOworICByZXR1cm4gZWxmY29yZV93cml0ZV9ub3RlIChhYmZkLCBi dWYsIGJ1ZnNpeiwKKwkJCSAgICAgbm90ZV9uYW1lLCBOVF9YODZfWFNUQVRF LCB4ZnByZWdzLCBzaXplKTsKK30KKworY2hhciAqCiBlbGZjb3JlX3dyaXRl X3BwY192bXggKGJmZCAqYWJmZCwKIAkJICAgICAgIGNoYXIgKmJ1ZiwKIAkJ ICAgICAgIGludCAqYnVmc2l6LApAQCAtODY4MSw2ICs4NzA3LDggQEAgZWxm Y29yZV93cml0ZV9yZWdpc3Rlcl9ub3RlIChiZmQgKmFiZmQsCiAgICAgcmV0 dXJuIGVsZmNvcmVfd3JpdGVfcHJmcHJlZyAoYWJmZCwgYnVmLCBidWZzaXos IGRhdGEsIHNpemUpOwogICBpZiAoc3RyY21wIChzZWN0aW9uLCAiLnJlZy14 ZnAiKSA9PSAwKQogICAgIHJldHVybiBlbGZjb3JlX3dyaXRlX3ByeGZwcmVn IChhYmZkLCBidWYsIGJ1ZnNpeiwgZGF0YSwgc2l6ZSk7CisgIGlmIChzdHJj bXAgKHNlY3Rpb24sICIucmVnLXhzdGF0ZSIpID09IDApCisgICAgcmV0dXJu IGVsZmNvcmVfd3JpdGVfeHN0YXRlcmVnIChhYmZkLCBidWYsIGJ1ZnNpeiwg ZGF0YSwgc2l6ZSk7CiAgIGlmIChzdHJjbXAgKHNlY3Rpb24sICIucmVnLXBw Yy12bXgiKSA9PSAwKQogICAgIHJldHVybiBlbGZjb3JlX3dyaXRlX3BwY192 bXggKGFiZmQsIGJ1ZiwgYnVmc2l6LCBkYXRhLCBzaXplKTsKICAgaWYgKHN0 cmNtcCAoc2VjdGlvbiwgIi5yZWctcHBjLXZzeCIpID09IDApCmRpZmYgLS1n aXQgYS9iaW51dGlscy9yZWFkZWxmLmMgYi9iaW51dGlscy9yZWFkZWxmLmMK aW5kZXggYjlkZTczYS4uMzRkYmZhYyAxMDA2NDQKLS0tIGEvYmludXRpbHMv cmVhZGVsZi5jCisrKyBiL2JpbnV0aWxzL3JlYWRlbGYuYwpAQCAtMTA0MTUs NiArMTA0MTUsOCBAQCBnZXRfbm90ZV90eXBlICh1bnNpZ25lZCBlX3R5cGUp CiAJcmV0dXJuIF8oIk5UX1BQQ19WTVggKHBwYyBBbHRpdmVjIHJlZ2lzdGVy cykiKTsKICAgICAgIGNhc2UgTlRfUFBDX1ZTWDoKIAlyZXR1cm4gXygiTlRf UFBDX1ZTWCAocHBjIFZTWCByZWdpc3RlcnMpIik7CisgICAgICBjYXNlIE5U X1g4Nl9YU1RBVEU6CisJcmV0dXJuIF8oIk5UX1g4Nl9YU1RBVEUgKHg4NiBY U0FWRSBleHRlbmRlZCBzdGF0ZSkiKTsKICAgICAgIGNhc2UgTlRfUzM5MF9I SUdIX0dQUlM6CiAJcmV0dXJuIF8oIk5UX1MzOTBfSElHSF9HUFJTIChzMzkw IHVwcGVyIHJlZ2lzdGVyIGhhbHZlcykiKTsKICAgICAgIGNhc2UgTlRfUFNU QVRVUzoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2NvbW1vbi5oIGIvaW5j bHVkZS9lbGYvY29tbW9uLmgKaW5kZXggNzAzOTE2ZS4uYTc2MjkwMiAxMDA2 NDQKLS0tIGEvaW5jbHVkZS9lbGYvY29tbW9uLmgKKysrIGIvaW5jbHVkZS9l bGYvY29tbW9uLmgKQEAgLTUxMyw2ICs1MTMsOCBAQAogCQkJCQkvKiAgIG5v dGUgbmFtZSBtdXN0IGJlICJMSU5VWCIuICAqLwogI2RlZmluZSBOVF9QUENf VlNYCTB4MTAyCQkvKiBQb3dlclBDIFZTWCByZWdpc3RlcnMgKi8KIAkJCQkJ LyogICBub3RlIG5hbWUgbXVzdCBiZSAiTElOVVgiLiAgKi8KKyNkZWZpbmUg TlRfWDg2X1hTVEFURQkweDIwMgkJLyogeDg2IFhTQVZFIGV4dGVuZGVkIHN0 YXRlICovCisJCQkJCS8qICAgbm90ZSBuYW1lIG11c3QgYmUgIkxJTlVYIi4g ICovCiAjZGVmaW5lIE5UX1MzOTBfSElHSF9HUFJTIDB4MzAwCQkvKiBTLzM5 MCB1cHBlciBoYWx2ZXMgb2YgR1BScyAgKi8KIAkJCQkJLyogICBub3RlIG5h bWUgbXVzdCBiZSAiTElOVVgiLiAgKi8KIAo= --0016e6d64c2356cc34047e94e3ee--