xref: /OK3568_Linux_fs/external/xserver/hw/xfree86/int10/xf86x86emu.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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