Adds an UNMAP primitive to make use of vcpu_unmap_xsave_area() when
linked into xen. unmap is a no-op during tests.
Signed-off-by: Alejandro Vallejo <alejandro.vallejo@cloud.com>
---
v2:
* Added comments highlighting fastpath on `current`
---
xen/arch/x86/x86_emulate/blk.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/xen/arch/x86/x86_emulate/blk.c b/xen/arch/x86/x86_emulate/blk.c
index 08a05f8453f7..76fd497ed8a3 100644
--- a/xen/arch/x86/x86_emulate/blk.c
+++ b/xen/arch/x86/x86_emulate/blk.c
@@ -11,9 +11,12 @@
!defined(X86EMUL_NO_SIMD)
# ifdef __XEN__
# include <asm/xstate.h>
-# define FXSAVE_AREA ((void *)¤t->arch.xsave_area->fpu_sse)
+/* has a fastpath for `current`, so there's no actual map */
+# define FXSAVE_AREA ((void *)VCPU_MAP_XSAVE_AREA(current))
+# define UNMAP_FXSAVE_AREA(x) VCPU_UNMAP_XSAVE_AREA(currt ent, x)
# else
# define FXSAVE_AREA get_fpu_save_area()
+# define UNMAP_FXSAVE_AREA(x) ((void)x)
# endif
#endif
@@ -292,6 +295,9 @@ int x86_emul_blk(
}
else
asm volatile ( "fxrstor %0" :: "m" (*fxsr) );
+
+ UNMAP_FXSAVE_AREA(fxsr);
+
break;
}
@@ -320,6 +326,9 @@ int x86_emul_blk(
if ( fxsr != ptr ) /* i.e. s->op_bytes < sizeof(*fxsr) */
memcpy(ptr, fxsr, s->op_bytes);
+
+ UNMAP_FXSAVE_AREA(fxsr);
+
break;
}
--
2.47.0