35,6 → 35,8 |
#include <ll/i386/x-dosmem.h> |
#include <ll/i386/cons.h> |
#include <ll/i386/error.h> |
#include <ll/i386/apic.h> |
#include <ll/i386/advtimer.h> |
|
FILE(VM-86); |
|
174,6 → 176,10 |
DWORD *IRQTable_entry; |
BYTE p1,p2; |
|
#ifdef __APIC__ |
DWORD msr1 = 0,msr2 = 0; |
#endif |
|
SYS_FLAGS f; |
|
if (service < 0x10 || in == NULL) return -1; |
218,10 → 224,22 |
outp(0x21,0xFF); |
outp(0xA1,0xFF); |
|
#ifdef __APIC__ |
rdmsr(APIC_BASE_MSR,msr1,msr2); |
disable_APIC_timer(); |
#endif |
|
vm86_TSS.t.back_link = ll_context_save(); |
VM86_ret_ctx = vm86_TSS.t.back_link |
sti(); |
ll_context_load(X_VM86_TSS); |
cli(); |
|
#ifdef __APIC__ |
wrmsr(APIC_BASE_MSR,msr1,msr2); |
enable_APIC_timer(); |
#endif |
|
outp(0x21,p1); |
outp(0xA1,p2); |
|
262,11 → 280,22 |
outp(0x21,0xFF); |
outp(0xA1,0xFF); |
|
#ifdef __APIC__ |
rdmsr(APIC_BASE_MSR,msr1,msr2); |
disable_APIC_timer(); |
#endif |
|
vm86_TSS.t.back_link = ll_context_save(); |
VM86_ret_ctx = vm86_TSS.t.back_link; |
sti(); |
ll_context_load(X_VM86_TSS); |
cli(); |
|
#ifdef __APIC__ |
wrmsr(APIC_BASE_MSR,msr1,msr2); |
enable_APIC_timer(); |
#endif |
|
outp(0x21,p1); |
outp(0xA1,p2); |
|