5 #include "v86_x86emu.h"
14 void printk(const char *fmt
, ...)
17 va_start(argptr
, fmt
);
18 vsyslog(LOG_INFO
, fmt
, argptr
);
25 v_wrw(((u32
) X86_SS
<< 4) + X86_SP
, val
);
28 static void x86emu_do_int(int num
)
34 /* Return address and flags */
39 X86_EFLAGS
= X86_EFLAGS
& ~(X86_VIF_MASK
| X86_TF_MASK
);
40 X86_CS
= v_rdw((num
<< 2) + 2);
41 X86_IP
= v_rdw((num
<< 2));
46 X86EMU_intrFuncs intFuncs
[256];
47 X86EMU_pioFuncs pioFuncs
= {
56 X86EMU_memFuncs memFuncs
= {
68 ulog(LOG_ERR
, "v86 memory initialization failed.");
72 stack
= v86_mem_alloc(DEFAULT_STACK_SIZE
);
74 ulog(LOG_ERR
, "v86 memory allocation failed.");
79 X86_ESP
= DEFAULT_STACK_SIZE
;
81 halt
= v86_mem_alloc(0x100);
83 ulog(LOG_ERR
, "v86 memory alocation failed.");
88 X86EMU_setupPioFuncs(&pioFuncs
);
89 X86EMU_setupMemFuncs(&memFuncs
);
91 /* Setup interrupt handlers */
92 for (i
= 0; i
< 256; i
++) {
93 intFuncs
[i
] = x86emu_do_int
;
95 X86EMU_setupIntrFuncs(intFuncs
);
97 /* Set the default flags */
98 X86_EFLAGS
= X86_IF_MASK
| X86_IOPL_MASK
;
111 void rconv_v86_to_x86emu(struct v86_regs
*rs
)
121 X86_EFLAGS
= rs
->eflags
;
130 void rconv_x86emu_to_v86(struct v86_regs
*rd
)
140 rd
->eflags
= X86_EFLAGS
;
150 * Perform a simulated interrupt call.
152 int v86_int(int num
, struct v86_regs
*regs
)
154 rconv_v86_to_x86emu(regs
);
159 X86_CS
= v_rdw((num
<< 2) + 2);
160 X86_EIP
= v_rdw((num
<< 2));
162 X86_ESP
= DEFAULT_STACK_SIZE
;
163 X86_EFLAGS
= X86_IF_MASK
| X86_IOPL_MASK
;
171 rconv_x86emu_to_v86(regs
);
178 "EAX=0x%8.8lx, EBX=0x%8.8lx, ECX=0x%8.8lx, EDX=0x%8.8lx\n",
179 (unsigned long)X86_EAX
, (unsigned long)X86_EBX
,
180 (unsigned long)X86_ECX
, (unsigned long)X86_EDX
);
182 "ESP=0x%8.8lx, EBP=0x%8.8lx, ESI=0x%8.8lx, EDI=0x%8.8lx\n",
183 (unsigned long)X86_ESP
, (unsigned long)X86_EBP
,
184 (unsigned long)X86_ESI
, (unsigned long)X86_EDI
);
186 "CS=0x%4.4x, SS=0x%4.4x,"
187 " DS=0x%4.4x, ES=0x%4.4x, FS=0x%4.4x, GS=0x%4.4x\n",
188 X86_CS
, X86_SS
, X86_DS
, X86_ES
, X86_FS
, X86_GS
);
190 "EIP=0x%8.8lx, EFLAGS=0x%8.8lx\n",
191 (unsigned long)X86_EIP
, (unsigned long)X86_EFLAGS
);