Add info about supported arches.
[v86d.git] / v86_x86emu.c
blob8663ab9a106a673d904243cf9e6a3fa240190c67
1 #include <stdarg.h>
2 #include <string.h>
3 #include <x86emu.h>
4 #include "v86.h"
5 #include "v86_x86emu.h"
7 u32 stack;
8 u32 halt;
10 __BUILDIO(b,b,u8);
11 __BUILDIO(w,w,u16);
12 __BUILDIO(l,,u32);
14 void printk(const char *fmt, ...)
16 va_list argptr;
17 va_start(argptr, fmt);
18 vsyslog(LOG_INFO, fmt, argptr);
19 va_end(argptr);
22 void pushw(u16 val)
24 X86_ESP -= 2;
25 v_wrw(((u32) X86_SS << 4) + X86_SP, val);
28 static void x86emu_do_int(int num)
30 u32 eflags;
32 eflags = X86_EFLAGS;
34 /* Return address and flags */
35 pushw(eflags);
36 pushw(X86_CS);
37 pushw(X86_IP);
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));
44 int v86_init()
46 X86EMU_intrFuncs intFuncs[256];
47 X86EMU_pioFuncs pioFuncs = {
48 .inb = &x_inb,
49 .inw = &x_inw,
50 .inl = &x_inl,
51 .outb = &x_outb,
52 .outw = &x_outw,
53 .outl = &x_outl,
56 X86EMU_memFuncs memFuncs = {
57 .rdb = &v_rdb,
58 .rdw = &v_rdw,
59 .rdl = &v_rdl,
60 .wrb = &v_wrb,
61 .wrw = &v_wrw,
62 .wrl = &v_wrl,
65 int i;
67 v86_mem_init();
69 stack = v86_mem_alloc(DEFAULT_STACK_SIZE);
70 X86_SS = stack >> 4;
71 X86_ESP = DEFAULT_STACK_SIZE;
73 halt = v86_mem_alloc(0x100);
74 v_wrb(halt, 0xF4);
76 X86EMU_setupPioFuncs(&pioFuncs);
77 X86EMU_setupMemFuncs(&memFuncs);
79 /* Setup interrupt handlers */
80 for (i = 0; i < 256; i++) {
81 intFuncs[i] = x86emu_do_int;
83 X86EMU_setupIntrFuncs(intFuncs);
85 /* Set the default flags */
86 X86_EFLAGS = X86_IF_MASK | X86_IOPL_MASK;
88 ioperm(0, 1024, 1);
89 iopl(3);
91 return 0;
94 void v86_cleanup()
96 v86_mem_cleanup();
99 void rconv_v86_to_x86emu(struct v86_regs *rs)
101 X86_EAX = rs->eax;
102 X86_EBX = rs->ebx;
103 X86_ECX = rs->ecx;
104 X86_EDX = rs->edx;
105 X86_EDI = rs->edi;
106 X86_ESI = rs->esi;
107 X86_EBP = rs->ebp;
108 X86_ESP = rs->esp;
109 X86_EFLAGS = rs->eflags;
110 X86_EIP = rs->eip;
111 X86_CS = rs->cs;
112 X86_DS = rs->ds;
113 X86_ES = rs->es;
114 X86_FS = rs->fs;
115 X86_GS = rs->gs;
118 void rconv_x86emu_to_v86(struct v86_regs *rd)
120 rd->eax = X86_EAX;
121 rd->ebx = X86_EBX;
122 rd->ecx = X86_ECX;
123 rd->edx = X86_EDX;
124 rd->edi = X86_EDI;
125 rd->esi = X86_ESI;
126 rd->ebp = X86_EBP;
127 rd->esp = X86_ESP;
128 rd->eflags = X86_EFLAGS;
129 rd->eip = X86_EIP;
130 rd->cs = X86_CS;
131 rd->ds = X86_DS;
132 rd->es = X86_ES;
133 rd->fs = X86_FS;
134 rd->gs = X86_GS;
138 * Perform a simulated interrupt call.
140 int v86_int(int num, struct v86_regs *regs)
142 rconv_v86_to_x86emu(regs);
144 X86_GS = 0;
145 X86_FS = 0;
146 X86_DS = 0x0040;
147 X86_CS = v_rdw((num << 2) + 2);
148 X86_EIP = v_rdw((num << 2));
149 X86_SS = stack >> 4;
150 X86_ESP = DEFAULT_STACK_SIZE;
151 X86_EFLAGS = X86_IF_MASK | X86_IOPL_MASK;
153 pushw(X86_EFLAGS);
154 pushw((halt >> 4));
155 pushw(0x0);
157 X86EMU_exec();
159 rconv_x86emu_to_v86(regs);
160 return 0;
163 void v86_dump_regs()
165 ulog(
166 "EAX=0x%8.8lx, EBX=0x%8.8lx, ECX=0x%8.8lx, EDX=0x%8.8lx\n",
167 (unsigned long)X86_EAX, (unsigned long)X86_EBX,
168 (unsigned long)X86_ECX, (unsigned long)X86_EDX);
169 ulog(
170 "ESP=0x%8.8lx, EBP=0x%8.8lx, ESI=0x%8.8lx, EDI=0x%8.8lx\n",
171 (unsigned long)X86_ESP, (unsigned long)X86_EBP,
172 (unsigned long)X86_ESI, (unsigned long)X86_EDI);
173 ulog(
174 "CS=0x%4.4x, SS=0x%4.4x,"
175 " DS=0x%4.4x, ES=0x%4.4x, FS=0x%4.4x, GS=0x%4.4x\n",
176 X86_CS, X86_SS, X86_DS, X86_ES, X86_FS, X86_GS);
177 ulog(
178 "EIP=0x%8.8lx, EFLAGS=0x%8.8lx\n",
179 (unsigned long)X86_EIP, (unsigned long)X86_EFLAGS);