[Midnightbsd-cvs] src [8572] trunk/sys/amd64: implment an API to allow a hypervisor to save/restore guest floating point state.
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Mon Sep 19 12:11:40 EDT 2016
Revision: 8572
http://svnweb.midnightbsd.org/src/?rev=8572
Author: laffer1
Date: 2016-09-19 12:11:40 -0400 (Mon, 19 Sep 2016)
Log Message:
-----------
implment an API to allow a hypervisor to save/restore guest floating point state.
Modified Paths:
--------------
trunk/sys/amd64/amd64/fpu.c
trunk/sys/amd64/include/fpu.h
Modified: trunk/sys/amd64/amd64/fpu.c
===================================================================
--- trunk/sys/amd64/amd64/fpu.c 2016-09-19 16:11:05 UTC (rev 8571)
+++ trunk/sys/amd64/amd64/fpu.c 2016-09-19 16:11:40 UTC (rev 8572)
@@ -47,6 +47,7 @@
#include <machine/bus.h>
#include <sys/rman.h>
#include <sys/signalvar.h>
+#include <vm/uma.h>
#include <machine/cputypes.h>
#include <machine/frame.h>
@@ -134,6 +135,7 @@
static int use_xsaveopt;
int use_xsave; /* non-static for cpu_switch.S */
uint64_t xsave_mask; /* the same */
+static uma_zone_t fpu_save_area_zone;
static struct savefpu *fpu_initialstate;
struct xsave_area_elm_descr {
@@ -151,7 +153,7 @@
fxsave((char *)addr);
}
-static void
+void
fpurestore(void *addr)
{
@@ -312,6 +314,10 @@
}
}
+ fpu_save_area_zone = uma_zcreate("FPU_save_area",
+ cpu_max_ext_state_size, NULL, NULL, NULL, NULL,
+ XSAVE_AREA_ALIGN - 1, 0);
+
start_emulating();
intr_restore(saveintr);
}
@@ -980,3 +986,27 @@
return (0);
return ((curpcb->pcb_flags & PCB_KERNFPU) != 0);
}
+
+/*
+ * FPU save area alloc/free/init utility routines
+ */
+struct savefpu *
+fpu_save_area_alloc(void)
+{
+
+ return (uma_zalloc(fpu_save_area_zone, 0));
+}
+
+void
+fpu_save_area_free(struct savefpu *fsa)
+{
+
+ uma_zfree(fpu_save_area_zone, fsa);
+}
+
+void
+fpu_save_area_reset(struct savefpu *fsa)
+{
+
+ bcopy(fpu_initialstate, fsa, cpu_max_ext_state_size);
+}
Modified: trunk/sys/amd64/include/fpu.h
===================================================================
--- trunk/sys/amd64/include/fpu.h 2016-09-19 16:11:05 UTC (rev 8571)
+++ trunk/sys/amd64/include/fpu.h 2016-09-19 16:11:40 UTC (rev 8572)
@@ -140,6 +140,7 @@
int fpuformat(void);
int fpugetregs(struct thread *td);
void fpuinit(void);
+void fpurestore(void *addr);
void fpusave(void *addr);
int fpusetregs(struct thread *td, struct savefpu *addr,
char *xfpustate, size_t xfpustate_size);
@@ -156,6 +157,10 @@
int fpu_kern_thread(u_int flags);
int is_fpu_kern_thread(u_int flags);
+struct savefpu *fpu_save_area_alloc(void);
+void fpu_save_area_free(struct savefpu *fsa);
+void fpu_save_area_reset(struct savefpu *fsa);
+
/*
* Flags for fpu_kern_alloc_ctx(), fpu_kern_enter() and fpu_kern_thread().
*/
More information about the Midnightbsd-cvs
mailing list