summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2000-10-05 20:27:45 +0000
committerjhb <jhb@FreeBSD.org>2000-10-05 20:27:45 +0000
commit8bcff28992a84b6a5f889b4a8f919cd42c059e2b (patch)
tree70c127482242e7f3c12b9ee958d91547db5c8c11 /sys
parent29eccaf7cdb9e97d1c9aca62c59e399ef968ecd2 (diff)
downloadFreeBSD-src-8bcff28992a84b6a5f889b4a8f919cd42c059e2b.zip
FreeBSD-src-8bcff28992a84b6a5f889b4a8f919cd42c059e2b.tar.gz
- Remove somewhat bogus handling of the Giant mutex in the vm86 code.
- Add a vm86pcb_lock mutex that is used to lock the vm86pcb used when making a vm86 call.
Diffstat (limited to 'sys')
-rw-r--r--sys/i386/i386/vm86.c14
-rw-r--r--sys/i386/i386/vm86bios.s5
2 files changed, 13 insertions, 6 deletions
diff --git a/sys/i386/i386/vm86.c b/sys/i386/i386/vm86.c
index a4547c8..5439e23 100644
--- a/sys/i386/i386/vm86.c
+++ b/sys/i386/i386/vm86.c
@@ -40,6 +40,7 @@
#include <sys/user.h>
#include <machine/md_var.h>
+#include <machine/mutex.h>
#include <machine/pcb_ext.h> /* pcb.h included via sys/user.h */
#include <machine/psl.h>
#include <machine/specialreg.h>
@@ -49,6 +50,8 @@ extern int i386_extend_pcb __P((struct proc *));
extern int vm86pa;
extern struct pcb *vm86pcb;
+static struct mtx vm86pcb_lock;
+
extern int vm86_bioscall(struct vm86frame *);
extern void vm86_biosret(struct vm86frame *);
@@ -423,6 +426,8 @@ vm86_initialize(void)
pcb = &vml->vml_pcb;
ext = &vml->vml_ext;
+ mtx_init(&vm86pcb_lock, "vm86pcb lock", MTX_DEF);
+
bzero(pcb, sizeof(struct pcb));
pcb->new_ptd = vm86pa | PG_V | PG_RW | PG_U;
pcb->vm86_frame = vm86paddr - sizeof(struct vm86frame);
@@ -565,11 +570,16 @@ vm86_trap(struct vm86frame *vmf)
int
vm86_intcall(int intnum, struct vm86frame *vmf)
{
+ int retval;
+
if (intnum < 0 || intnum > 0xff)
return (EINVAL);
vmf->vmf_trapno = intnum;
- return (vm86_bioscall(vmf));
+ mtx_enter(&vm86pcb_lock, MTX_DEF);
+ retval = vm86_bioscall(vmf);
+ mtx_exit(&vm86pcb_lock, MTX_DEF);
+ return (retval);
}
/*
@@ -596,7 +606,9 @@ vm86_datacall(intnum, vmf, vmc)
}
vmf->vmf_trapno = intnum;
+ mtx_enter(&vm86pcb_lock, MTX_DEF);
retval = vm86_bioscall(vmf);
+ mtx_exit(&vm86pcb_lock, MTX_DEF);
for (i = 0; i < vmc->npages; i++) {
entry = vmc->pmap[i].pte_num;
diff --git a/sys/i386/i386/vm86bios.s b/sys/i386/i386/vm86bios.s
index 14b4259..4b61b6c 100644
--- a/sys/i386/i386/vm86bios.s
+++ b/sys/i386/i386/vm86bios.s
@@ -62,10 +62,6 @@ ENTRY(vm86_bioscall)
pushl %edi
pushl %gs
- pushl %edx
- call __mtx_enter_giant_def /* Get global lock */
- popl %edx
-
#if NNPX > 0
movl _curproc,%ecx
cmpl %ecx,_npxproc /* do we need to save fp? */
@@ -135,7 +131,6 @@ ENTRY(vm86_bioscall)
*/
subl $4,%esp /* dummy unit */
incb _intr_nesting_level
- call __mtx_exit_giant_def
MEXITCOUNT
jmp _doreti
OpenPOWER on IntegriCloud