kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 2/4] Fix FPU interface changes
@ 2010-05-26  3:34 Zachary Amsden
  2010-05-26  7:33 ` Jan Kiszka
  0 siblings, 1 reply; 4+ messages in thread
From: Zachary Amsden @ 2010-05-26  3:34 UTC (permalink / raw)
  To: kvm, Jan Kiszka, Avi Kivity, Gleb Natapov

[-- Attachment #1: Type: text/plain, Size: 136 bytes --]

The FPU interface changed to dynamic allocation; redefine the missing 
struct fpu to be a static structure and add back the old macros.

[-- Attachment #2: 0002-Extend-module-compatability-to-FPU-code.patch --]
[-- Type: text/plain, Size: 2747 bytes --]

>From 95be2b1ac41a40f2f3d581f0674b25ca4b70a025 Mon Sep 17 00:00:00 2001
From: Zachary Amsden <zamsden@redhat.com>
Date: Tue, 25 May 2010 16:32:14 -1000
Subject: [PATCH 2/5] Extend module compatability to FPU code

Signed-off-by: Zachary Amsden <zamsden@redhat.com>
---
 x86/external-module-compat.h |   84 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 84 insertions(+), 0 deletions(-)

diff --git a/x86/external-module-compat.h b/x86/external-module-compat.h
index 09bf232..316f7ff 100644
--- a/x86/external-module-compat.h
+++ b/x86/external-module-compat.h
@@ -788,3 +788,87 @@ struct kvm_pvclock_vcpu_time_info {
 #else
 #define kvm_pvclock_vcpu_time_info	pvclock_vcpu_time_info
 #endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)
+#include <asm/processor.h>
+#include <asm/i387.h>
+struct _fpu {
+	struct i387_fxsave_struct fxsave;
+	struct i387_fxsave_struct host_fx_image;
+};
+
+struct fpu {
+	struct _fpu *state;
+	struct _fpu state_static;
+};
+
+static inline bool fpu_allocated(struct fpu *fpu)
+{
+	fpu->state = &fpu->state_static;
+        return true;
+}
+
+static inline int fpu_alloc(struct fpu *fpu)
+{
+	fpu->state = &fpu->state_static;
+	return 0;
+}
+
+static inline void fpu_free(struct fpu *fpu)
+{
+}
+
+static inline void kvm_fx_finit(void)
+{
+        asm("finit");
+}
+
+static inline void kvm_fx_save(struct i387_fxsave_struct *image)
+{
+        asm("fxsave (%0)":: "r" (image));
+}
+
+static inline void kvm_fx_restore(struct i387_fxsave_struct *image)
+{
+        asm("fxrstor (%0)":: "r" (image));
+}
+
+static inline void fpu_finit(struct fpu *fpu)
+{
+	unsigned after_mxcsr_mask;
+
+	/*
+  	 * Touch the fpu the first time in non atomic context as if
+   	 * this is the first fpu instruction the exception handler
+   	 * will fire before the instruction returns and it'll have to
+  	 * allocate ram with GFP_KERNEL.
+  	 */
+	if (!used_math())
+		kvm_fx_save(&fpu->state->host_fx_image);
+
+	/* Initialize guest FPU by resetting ours and saving into guest's */
+	preempt_disable();
+	kvm_fx_save(&fpu->state->host_fx_image);
+	kvm_fx_finit();
+	kvm_fx_save(&fpu->state->fxsave);
+	kvm_fx_restore(&fpu->state->host_fx_image);
+	preempt_enable();
+
+	after_mxcsr_mask = offsetof(struct i387_fxsave_struct, st_space);
+	fpu->state->fxsave.mxcsr = 0x1f80;
+	memset((void *)&fpu->state->fxsave + after_mxcsr_mask,
+	       0, sizeof(struct i387_fxsave_struct) - after_mxcsr_mask);
+}
+
+static inline void fpu_restore_checking(struct fpu *fpu)
+{
+	kvm_fx_save(&fpu->state->host_fx_image);
+	kvm_fx_restore(&fpu->state->fxsave);
+}
+
+static inline void fpu_save_init(struct fpu *fpu)
+{
+	kvm_fx_save(&fpu->state->fxsave);
+	kvm_fx_restore(&fpu->state->host_fx_image);
+}
+#endif
-- 
1.7.0.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-05-26 19:26 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-26  3:34 [PATCH 2/4] Fix FPU interface changes Zachary Amsden
2010-05-26  7:33 ` Jan Kiszka
2010-05-26 18:16   ` Zachary Amsden
2010-05-26 19:26     ` Jan Kiszka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).