[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