1 /*
2 * XFree86 int10 module
3 * execute BIOS int 10h calls in x86 real mode environment
4 * Copyright 1999 Egbert Eich
5 */
6 #ifdef HAVE_XORG_CONFIG_H
7 #include <xorg-config.h>
8 #endif
9
10 #include "xf86.h"
11 #include "xf86_OSproc.h"
12 #include "xf86Pci.h"
13 #define _INT10_PRIVATE
14 #include "xf86int10.h"
15 #include "int10Defines.h"
16 #include <x86emu.h>
17
18 #define M _X86EMU_env
19
20 static void
x86emu_do_int(int num)21 x86emu_do_int(int num)
22 {
23 Int10Current->num = num;
24
25 if (!int_handler(Int10Current)) {
26 X86EMU_halt_sys();
27 }
28 }
29
30 void
xf86ExecX86int10(xf86Int10InfoPtr pInt)31 xf86ExecX86int10(xf86Int10InfoPtr pInt)
32 {
33 int sig = setup_int(pInt);
34
35 if (sig < 0)
36 return;
37
38 if (int_handler(pInt)) {
39 X86EMU_exec();
40 }
41
42 finish_int(pInt, sig);
43 }
44
45 Bool
xf86Int10ExecSetup(xf86Int10InfoPtr pInt)46 xf86Int10ExecSetup(xf86Int10InfoPtr pInt)
47 {
48 int i;
49 X86EMU_intrFuncs intFuncs[256];
50
51 X86EMU_pioFuncs pioFuncs = {
52 .inb = x_inb,
53 .inw = x_inw,
54 .inl = x_inl,
55 .outb = x_outb,
56 .outw = x_outw,
57 .outl = x_outl
58 };
59
60 X86EMU_memFuncs memFuncs = {
61 (&Mem_rb),
62 (&Mem_rw),
63 (&Mem_rl),
64 (&Mem_wb),
65 (&Mem_ww),
66 (&Mem_wl)
67 };
68
69 X86EMU_setupMemFuncs(&memFuncs);
70
71 pInt->cpuRegs = &M;
72 M.mem_base = 0;
73 M.mem_size = 1024 * 1024 + 1024;
74 X86EMU_setupPioFuncs(&pioFuncs);
75
76 for (i = 0; i < 256; i++)
77 intFuncs[i] = x86emu_do_int;
78 X86EMU_setupIntrFuncs(intFuncs);
79 return TRUE;
80 }
81
82 void
printk(const char * fmt,...)83 printk(const char *fmt, ...)
84 {
85 va_list argptr;
86
87 va_start(argptr, fmt);
88 VErrorF(fmt, argptr);
89 va_end(argptr);
90 }
91