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