diff options
author | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2005-02-24 11:11:57 +0000 |
---|---|---|
committer | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2005-02-24 11:11:57 +0000 |
commit | 6a329a59de41a0b47b42d4db57b7ed9ec14811e5 (patch) | |
tree | 665b2774e2538bfd8d54a980e9306152f93f8b0b /netbsd-2.0-xen-sparse | |
parent | e61f0e7f910eaa81737a26b0a9e0709d34a63f9d (diff) | |
download | xen-6a329a59de41a0b47b42d4db57b7ed9ec14811e5.tar.gz xen-6a329a59de41a0b47b42d4db57b7ed9ec14811e5.tar.bz2 xen-6a329a59de41a0b47b42d4db57b7ed9ec14811e5.zip |
bitkeeper revision 1.1236.1.16 (421db67dL0mXatHebAtt9KpMqkCIBQ)
More FPU fixes. Extend taskswitch hypercall to allow TS bit to be
cleared as well as set.
Diffstat (limited to 'netbsd-2.0-xen-sparse')
-rw-r--r-- | netbsd-2.0-xen-sparse/sys/arch/xen/i386/machdep.c | 4 | ||||
-rw-r--r-- | netbsd-2.0-xen-sparse/sys/arch/xen/include/hypervisor.h | 8 |
2 files changed, 8 insertions, 4 deletions
diff --git a/netbsd-2.0-xen-sparse/sys/arch/xen/i386/machdep.c b/netbsd-2.0-xen-sparse/sys/arch/xen/i386/machdep.c index 5ec2d45271..ded4538782 100644 --- a/netbsd-2.0-xen-sparse/sys/arch/xen/i386/machdep.c +++ b/netbsd-2.0-xen-sparse/sys/arch/xen/i386/machdep.c @@ -412,7 +412,7 @@ i386_proc0_tss_ldt_init() ltr(lwp0.l_md.md_tss_sel); lldt(pcb->pcb_ldt_sel); #else - HYPERVISOR_fpu_taskswitch(); + HYPERVISOR_fpu_taskswitch(1); XENPRINTF(("lwp tss sp %p ss %04x/%04x\n", (void *)pcb->pcb_tss.tss_esp0, pcb->pcb_tss.tss_ss0, IDXSEL(pcb->pcb_tss.tss_ss0))); @@ -455,7 +455,7 @@ i386_switch_context(struct pcb *new) ci = curcpu(); if (ci->ci_fpused) { - HYPERVISOR_fpu_taskswitch(); + HYPERVISOR_fpu_taskswitch(1); ci->ci_fpused = 0; } diff --git a/netbsd-2.0-xen-sparse/sys/arch/xen/include/hypervisor.h b/netbsd-2.0-xen-sparse/sys/arch/xen/include/hypervisor.h index eb91c2a980..2ac01b4d25 100644 --- a/netbsd-2.0-xen-sparse/sys/arch/xen/include/hypervisor.h +++ b/netbsd-2.0-xen-sparse/sys/arch/xen/include/hypervisor.h @@ -180,12 +180,16 @@ HYPERVISOR_set_callbacks( } static inline int -HYPERVISOR_fpu_taskswitch(void) +HYPERVISOR_fpu_taskswitch(int set) { int ret; + unsigned long ign; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_fpu_taskswitch) : "memory" ); + : "=a" (ret), "=b" (ign) + : "0" (__HYPERVISOR_fpu_taskswitch), "1" (set) + : "memory" ); return ret; } |