[PATCH 4/6] x86, xsave: Track the offset, size of state in the xsave layout
leann.ogasawara at canonical.com
leann.ogasawara at canonical.com
Tue Aug 24 01:58:13 UTC 2010
BugLink: https://bugs.launchpad.net/bugs/485548
Subleaves of the cpuid vector 0xd provides the offset and size of different
feature state that are managed by the xsave/xrstor. Track this for the upcoming
usage during signal handling.
Signed-off-by: Suresh Siddha <suresh.b.siddha at intel.com>
LKML-Reference: <20100719230205.262987929 at sbs-t61.sc.intel.com>
Signed-off-by: H. Peter Anvin <hpa at linux.intel.com>
(cherry picked from commit a1488f8bf4d72ad724700f6e982469a1240e4264)
Signed-off-by: Leann Ogasawara <leann.ogasawara at canonical.com>
---
arch/x86/kernel/xsave.c | 29 +++++++++++++++++++++++++++++
1 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c
index 37e68fc..45d44ec 100644
--- a/arch/x86/kernel/xsave.c
+++ b/arch/x86/kernel/xsave.c
@@ -21,6 +21,8 @@ struct _fpx_sw_bytes fx_sw_reserved;
struct _fpx_sw_bytes fx_sw_reserved_ia32;
#endif
+static unsigned int *xstate_offsets, *xstate_sizes, xstate_features;
+
/*
* Check for the presence of extended state information in the
* user fpstate pointer in the sigcontext.
@@ -301,12 +303,39 @@ void __cpuinit xsave_init(void)
}
/*
+ * Record the offsets and sizes of different state managed by the xsave
+ * memory layout.
+ */
+static void setup_xstate_features(void)
+{
+ int eax, ebx, ecx, edx, leaf = 0x2;
+
+ xstate_features = fls64(pcntxt_mask);
+ xstate_offsets = alloc_bootmem(xstate_features * sizeof(int));
+ xstate_sizes = alloc_bootmem(xstate_features * sizeof(int));
+
+ do {
+ cpuid_count(0xd, leaf, &eax, &ebx, &ecx, &edx);
+
+ if (eax == 0)
+ break;
+
+ xstate_offsets[leaf] = ebx;
+ xstate_sizes[leaf] = eax;
+
+ leaf++;
+ } while (1);
+}
+
+/*
* setup the xstate image representing the init state
*/
static void __init setup_xstate_init(void)
{
init_xstate_buf = alloc_bootmem(xstate_size);
init_xstate_buf->i387.mxcsr = MXCSR_DEFAULT;
+
+ setup_xstate_features();
}
/*
--
1.7.0.4
More information about the kernel-team
mailing list