Messages in this thread | | | From | "Lu, Hongjiu" <> | Date | Wed, 3 Feb 2010 21:01:32 -0800 | Subject | RE: [patch] x86: ptrace and core-dump extensions for xstate |
| |
> > To support XSAVE, gdb needs to know XCR0 as well as XSTATE size. > > We can get those info from kernel via system call or cpuid. I > > prefer cpuid over system call. > > Suresh's patch puts this value in the xsave block, in what Suresh calls > "sw_usable_bytes". See the asm/ptrace-abi.h comment in the patch you > signed off on. > > How is that not sufficient? If it is indeed not sufficient to usefully > interpret the xsave block, then how could an xsave block in a core dump > file ever possibly be examined if it might not have been generated on the > same system and kernel where the debugger is doing the examination? If > the NT_X86_XSTATE note as implemented in Suresh's patch is indeed not > entirely self-contained in this way, then NAK on that new note format. >
I use it when reading core dump, which doesn't involve a system call. I can analyze it on a totally different machine.
FWIW, there is the header file I have in gdb
--- /* XSAVE extended state information. */
/* The extended state status. */ enum xstate_status { XSTATE_UNKNOWN = 0, XSTATE_UNSUPPORTED, XSTATE_INITIALIZED };
/* The extended state feature bits. */ #define bit_XSTATE_X87 (1ULL << 0) #define bit_XSTATE_SSE (1ULL << 1) #define bit_XSTATE_AVX (1ULL << 2)
/* Supported mask and size of the extended state. Used for qSupport. */ #define XSTATE_SSE_MASK 0x3 #define XSTATE_AVX_MASK 0x7 #define XSTATE_MAX_MASK 0x7
#define XSTATE_SSE_MASK_STRING "0x3" #define XSTATE_AVX_MASK_STRING "0x7" #define XSTATE_MAX_MASK_STRING "0x7"
#define XSTATE_SSE_SIZE 576 #define XSTATE_AVX_SIZE 832 #define XSTATE_MAX_SIZE 832
#define XSTATE_SSE_SIZE_STRING "576" #define XSTATE_AVX_SIZE_STRING "832" #define XSTATE_MAX_SIZE_STRING "832"
struct i386_xstate_type { /* The extended state status. */ enum xstate_status status; /* The extended control register 0 (the XFEATURE_ENABLED_MASK register). */ unsigned long long xcr0; /* The extended state size in bytes. */ unsigned int size; /* The extended state size in unit of int64. We use array of int64 for better alignment. */ unsigned int n_of_int64; };
extern struct i386_xstate_type i386_xstate;
extern void i386_xstate_init (void); ---
I don't need a system call to tell me xcr0 and size. If you really want, you can put it in glibc and doesn't involve kernel. We can use __cpu_features for it.
H.J.
| |