|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v4 02/28] x86/xstate: drop xstate_offsets[] and xstate_sizes[]
They're redundant with respective fields from the raw CPUID policy; no
need to keep two copies of the same data.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
---
v4: Re-base.
--- a/xen/arch/x86/include/asm/xstate.h
+++ b/xen/arch/x86/include/asm/xstate.h
@@ -45,8 +45,9 @@ extern uint32_t mxcsr_mask;
extern u64 xfeature_mask;
extern u64 xstate_align;
-extern unsigned int *xstate_offsets;
-extern unsigned int *xstate_sizes;
+
+#define xstate_offset(n) (raw_cpu_policy.xstate.comp[n].offset)
+#define xstate_size(n) (raw_cpu_policy.xstate.comp[n].size)
/* extended state save area */
struct __attribute__((aligned (64))) xsave_struct
--- a/xen/arch/x86/xstate.c
+++ b/xen/arch/x86/xstate.c
@@ -28,8 +28,6 @@ static u32 __read_mostly xsave_cntxt_siz
/* A 64-bit bitmask of the XSAVE/XRSTOR features supported by processor. */
u64 __read_mostly xfeature_mask;
-unsigned int *__read_mostly xstate_offsets;
-unsigned int *__read_mostly xstate_sizes;
u64 __read_mostly xstate_align;
static unsigned int __read_mostly xstate_features;
@@ -103,34 +101,18 @@ static int setup_xstate_features(bool bs
unsigned int leaf, eax, ebx, ecx, edx;
if ( bsp )
- {
xstate_features = flsl(xfeature_mask);
- xstate_offsets = xzalloc_array(unsigned int, xstate_features);
- if ( !xstate_offsets )
- return -ENOMEM;
-
- xstate_sizes = xzalloc_array(unsigned int, xstate_features);
- if ( !xstate_sizes )
- return -ENOMEM;
- }
for ( leaf = 2; leaf < xstate_features; leaf++ )
{
- if ( bsp )
- {
- cpuid_count(XSTATE_CPUID, leaf, &xstate_sizes[leaf],
- &xstate_offsets[leaf], &ecx, &edx);
- if ( ecx & XSTATE_ALIGN64 )
- __set_bit(leaf, &xstate_align);
- }
+ cpuid_count(0xd, leaf, &eax, &ebx, &ecx, &edx);
+ BUG_ON(eax != xstate_size(leaf));
+ BUG_ON(ebx != xstate_offset(leaf));
+
+ if ( bsp && (ecx & XSTATE_ALIGN64) )
+ __set_bit(leaf, &xstate_align);
else
- {
- cpuid_count(XSTATE_CPUID, leaf, &eax,
- &ebx, &ecx, &edx);
- BUG_ON(eax != xstate_sizes[leaf]);
- BUG_ON(ebx != xstate_offsets[leaf]);
BUG_ON(!(ecx & XSTATE_ALIGN64) != !test_bit(leaf, &xstate_align));
- }
}
return 0;
@@ -160,7 +142,7 @@ static void setup_xstate_comp(uint16_t *
if ( test_bit(i, &xstate_align) )
offset = ROUNDUP(offset, 64);
comp_offsets[i] = offset;
- offset += xstate_sizes[i];
+ offset += xstate_size(i);
}
}
ASSERT(offset <= xsave_cntxt_size);
@@ -223,10 +205,10 @@ void expand_xsave_states(const struct vc
* comp_offsets[] information, something is very broken.
*/
BUG_ON(!comp_offsets[index]);
- BUG_ON((xstate_offsets[index] + xstate_sizes[index]) > size);
+ BUG_ON((xstate_offset(index) + xstate_size(index)) > size);
- memcpy(dest + xstate_offsets[index], src + comp_offsets[index],
- xstate_sizes[index]);
+ memcpy(dest + xstate_offset(index), src + comp_offsets[index],
+ xstate_size(index));
valid &= ~feature;
}
@@ -292,10 +274,10 @@ void compress_xsave_states(struct vcpu *
* comp_offset[] information, something is very broken.
*/
BUG_ON(!comp_offsets[index]);
- BUG_ON((xstate_offsets[index] + xstate_sizes[index]) > size);
+ BUG_ON((xstate_offset(index) + xstate_size(index)) > size);
- memcpy(dest + comp_offsets[index], src + xstate_offsets[index],
- xstate_sizes[index]);
+ memcpy(dest + comp_offsets[index], src + xstate_offset(index),
+ xstate_size(index));
valid &= ~feature;
}
@@ -538,8 +520,8 @@ int xstate_alloc_save_area(struct vcpu *
unsigned int i;
for ( size = 0, i = 2; i < xstate_features; ++i )
- if ( size < xstate_sizes[i] )
- size = xstate_sizes[i];
+ if ( size < xstate_size(i) )
+ size = xstate_size(i);
size += XSTATE_AREA_MIN_SIZE;
}
@@ -592,9 +574,9 @@ int xstate_update_save_area(struct vcpu
for ( size = old = XSTATE_AREA_MIN_SIZE, i = 2; i < xstate_features; ++i )
{
if ( xcr0_max & (1ul << i) )
- size = max(size, xstate_offsets[i] + xstate_sizes[i]);
+ size = max(size, xstate_offset(i) + xstate_size(i));
if ( v->arch.xcr0_accum & (1ul << i) )
- old = max(old, xstate_offsets[i] + xstate_sizes[i]);
+ old = max(old, xstate_offset(i) + xstate_size(i));
}
save_area = _xvrealloc(v->arch.xsave_area, size, __alignof(*save_area));
@@ -1082,7 +1064,7 @@ uint64_t read_bndcfgu(void)
: "=m" (*xstate)
: "a" (X86_XCR0_BNDCSR), "d" (0), "D" (xstate) );
- bndcsr = (void *)xstate + xstate_offsets[ilog2(X86_XCR0_BNDCSR)];
+ bndcsr = (void *)xstate + xstate_offset(ilog2(X86_XCR0_BNDCSR));
}
if ( cr0 & X86_CR0_TS )
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |