summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorGordon Willem Klok <gwk@cvs.openbsd.org>2006-11-27 16:00:20 +0000
committerGordon Willem Klok <gwk@cvs.openbsd.org>2006-11-27 16:00:20 +0000
commitba059880d05cb8a122f8415dee2b92cb3ac6ad80 (patch)
treed96f2c826727705891b7cc99e99e05bb58902fab /sys
parent7e5ef1a9e4d90599ccbb10ee903711ed28ef40ad (diff)
First attempt at making kvm86 MP safe, place mutex lock around calls
to kvm86_bioscall at IPL_IPI this might be incorrect, seems to fix some issues with vt switching, however X still bombs on the second attempt with disappointing frequency. ok deraadt@
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/i386/i386/kvm86.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/sys/arch/i386/i386/kvm86.c b/sys/arch/i386/i386/kvm86.c
index 7cf1df582a0..2ccea3bcd8b 100644
--- a/sys/arch/i386/i386/kvm86.c
+++ b/sys/arch/i386/i386/kvm86.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kvm86.c,v 1.1 2006/06/13 03:01:04 gwk Exp $ */
+/* $OpenBSD: kvm86.c,v 1.2 2006/11/27 16:00:19 gwk Exp $ */
/* $NetBSD: kvm86.c,v 1.10 2005/12/26 19:23:59 perry Exp $ */
/*
* Copyright (c) 2002
@@ -32,6 +32,8 @@
#include <sys/proc.h>
#include <sys/user.h>
#include <sys/malloc.h>
+#include <sys/mutex.h>
+#include <sys/simplelock.h>
#include <uvm/uvm_extern.h>
#include <uvm/uvm.h>
#include <machine/pcb.h>
@@ -72,6 +74,8 @@ void *bioscallscratchpage;
/* a virtual page to map in vm86 memory temporarily */
vaddr_t bioscalltmpva;
+struct mutex kvm86_mp_mutex;
+
#define KVM86_IOPL3 /* not strictly necessary, saves a lot of traps */
void
@@ -122,6 +126,7 @@ kvm86_init()
kvm86_map(vmd, pa, BIOSCALLSCRATCHPAGE_VMVA);
bioscallvmd = vmd;
bioscalltmpva = uvm_km_alloc(kernel_map, PAGE_SIZE);
+ mtx_init(&kvm86_mp_mutex, IPL_IPI);
}
/*
@@ -260,8 +265,10 @@ kvm86_simplecall(int no, struct kvm86regs *regs)
tf.tf_edi = regs->edi;
tf.tf_vm86_es = regs->es;
+ mtx_enter(&kvm86_mp_mutex);
res = kvm86_bioscall(no, &tf);
-
+ mtx_leave(&kvm86_mp_mutex);
+
regs->eax = tf.tf_eax;
regs->ebx = tf.tf_ebx;
regs->ecx = tf.tf_ecx;