void xf86ExecX86int10(xf86Int10InfoPtr pInt) { int sig = setup_int(pInt); if (int_handler(pInt)) while(do_vm86(pInt)) {}; finish_int(pInt, sig); }
void bioscall(unsigned char int_no, struct vm86_regs *regs, unsigned char *mem) { unsigned char call[] = {0xcd, int_no, 0xcd, 0x09}; struct vm86_struct vm; memset(&vm, 0, sizeof(vm)); memcpy(&vm.regs, regs, sizeof(vm.regs)); vm.regs.cs = BIOSCALL_START_SEG; vm.regs.eip = BIOSCALL_START_OFS; vm.regs.ss = BIOSCALL_START_SEG; vm.regs.esp = 0xfff0 - BIOSCALL_START_OFS; vm.regs.eflags = VM_MASK | IOPL_MASK; memcpy(&mem[BIOSCALL_START_SEG * 16 + BIOSCALL_START_OFS], call, sizeof(call)); do_vm86(&vm, mem, BIOSCALL_START_OFS + sizeof(call)); memcpy(regs, &vm.regs, sizeof(vm.regs)); }