1706f2543Smrg/*
2706f2543Smrg *                   XFree86 int10 module
3706f2543Smrg *   execute BIOS int 10h calls in x86 real mode environment
4706f2543Smrg *                 Copyright 1999 Egbert Eich
5706f2543Smrg */
6706f2543Smrg#ifdef HAVE_XORG_CONFIG_H
7706f2543Smrg#include <xorg-config.h>
8706f2543Smrg#endif
9706f2543Smrg
10706f2543Smrg#include <x86emu.h>
11706f2543Smrg#include "xf86.h"
12706f2543Smrg#include "compiler.h"
13706f2543Smrg#include "xf86_OSproc.h"
14706f2543Smrg#include "xf86Pci.h"
15706f2543Smrg#define _INT10_PRIVATE
16706f2543Smrg#include "xf86int10.h"
17706f2543Smrg#include "int10Defines.h"
18706f2543Smrg
19706f2543Smrg#define M _X86EMU_env
20706f2543Smrg
21706f2543Smrgstatic void
22706f2543Smrgx86emu_do_int(int num)
23706f2543Smrg{
24706f2543Smrg    Int10Current->num = num;
25706f2543Smrg
26706f2543Smrg    if (!int_handler(Int10Current)) {
27706f2543Smrg	X86EMU_halt_sys();
28706f2543Smrg    }
29706f2543Smrg}
30706f2543Smrg
31706f2543Smrgvoid
32706f2543Smrgxf86ExecX86int10(xf86Int10InfoPtr pInt)
33706f2543Smrg{
34706f2543Smrg    int sig = setup_int(pInt);
35706f2543Smrg
36706f2543Smrg    if (sig < 0)
37706f2543Smrg	return;
38706f2543Smrg
39706f2543Smrg    if (int_handler(pInt)) {
40706f2543Smrg	X86EMU_exec();
41706f2543Smrg    }
42706f2543Smrg
43706f2543Smrg    finish_int(pInt, sig);
44706f2543Smrg}
45706f2543Smrg
46706f2543SmrgBool
47706f2543Smrgxf86Int10ExecSetup(xf86Int10InfoPtr pInt)
48706f2543Smrg{
49706f2543Smrg    int i;
50706f2543Smrg    X86EMU_intrFuncs intFuncs[256];
51706f2543Smrg    X86EMU_pioFuncs pioFuncs = {
52706f2543Smrg	(&x_inb),
53706f2543Smrg	(&x_inw),
54706f2543Smrg	(&x_inl),
55706f2543Smrg	(&x_outb),
56706f2543Smrg	(&x_outw),
57706f2543Smrg	(&x_outl)
58706f2543Smrg    };
59706f2543Smrg
60706f2543Smrg    X86EMU_memFuncs memFuncs = {
61706f2543Smrg	(&Mem_rb),
62706f2543Smrg	(&Mem_rw),
63706f2543Smrg	(&Mem_rl),
64706f2543Smrg	(&Mem_wb),
65706f2543Smrg	(&Mem_ww),
66706f2543Smrg	(&Mem_wl)
67706f2543Smrg    };
68706f2543Smrg
69706f2543Smrg    X86EMU_setupMemFuncs(&memFuncs);
70706f2543Smrg
71706f2543Smrg    pInt->cpuRegs = &M;
72706f2543Smrg    M.mem_base = 0;
73706f2543Smrg    M.mem_size = 1024*1024 + 1024;
74706f2543Smrg    X86EMU_setupPioFuncs(&pioFuncs);
75706f2543Smrg
76706f2543Smrg    for (i=0;i<256;i++)
77706f2543Smrg	intFuncs[i] = x86emu_do_int;
78706f2543Smrg    X86EMU_setupIntrFuncs(intFuncs);
79706f2543Smrg    return TRUE;
80706f2543Smrg}
81706f2543Smrg
82706f2543Smrgvoid
83706f2543Smrgprintk(const char *fmt, ...)
84706f2543Smrg{
85706f2543Smrg    va_list argptr;
86706f2543Smrg    va_start(argptr, fmt);
87706f2543Smrg    VErrorF(fmt, argptr);
88706f2543Smrg    va_end(argptr);
89706f2543Smrg}
90