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