use Paulo's reduced version
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1853 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
parent
3678ad8e38
commit
8b0356c2c9
|
@ -50,8 +50,8 @@ int run_bios_int(int num)
|
|||
X86_CS = MEM_RW((num << 2) + 2);
|
||||
X86_IP = MEM_RW(num << 2);
|
||||
|
||||
//printf("%s: INT %x CS:IP = %x:%x\n", __FUNCTION__,
|
||||
// num, MEM_RW((num << 2) + 2), MEM_RW(num << 2));
|
||||
printf("%s: INT %x CS:IP = %x:%x\n", __FUNCTION__,
|
||||
num, MEM_RW((num << 2) + 2), MEM_RW(num << 2));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -128,7 +128,7 @@ u8 x_inb(u16 port)
|
|||
|
||||
val = inb(port);
|
||||
|
||||
//printf("inb(0x%04x) = 0x%02x\n", port, val);
|
||||
printf("inb(0x%04x) = 0x%02x\n", port, val);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
@ -139,7 +139,7 @@ u16 x_inw(u16 port)
|
|||
|
||||
val = inw(port);
|
||||
|
||||
//printf("inw(0x%04x) = 0x%04x\n", port, val);
|
||||
printf("inw(0x%04x) = 0x%04x\n", port, val);
|
||||
return val;
|
||||
}
|
||||
|
||||
|
@ -149,25 +149,26 @@ u32 x_inl(u16 port)
|
|||
|
||||
val = inl(port);
|
||||
|
||||
//printf("inl(0x%04x) = 0x%08x\n", port, val);
|
||||
printf("inl(0x%04x) = 0x%08x\n", port, val);
|
||||
return val;
|
||||
}
|
||||
|
||||
void x_outb(u16 port, u8 val)
|
||||
{
|
||||
//printf("outb(0x%02x, 0x%04x)\n", val, port);
|
||||
printf("outb(0x%02x, 0x%04x)\n",
|
||||
val, port);
|
||||
outb(val, port);
|
||||
}
|
||||
|
||||
void x_outw(u16 port, u16 val)
|
||||
{
|
||||
//printf("outw(0x%04x, 0x%04x)\n", val, port);
|
||||
printf("outw(0x%04x, 0x%04x)\n", val, port);
|
||||
outw(val, port);
|
||||
}
|
||||
|
||||
void x_outl(u16 port, u32 val)
|
||||
{
|
||||
//printf("outl(0x%08x, 0x%04x)\n", val, port);
|
||||
printf("outl(0x%08x, 0x%04x)\n", val, port);
|
||||
outl(val, port);
|
||||
}
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ extern int verbose;
|
|||
*/
|
||||
int int42_handler()
|
||||
{
|
||||
|
||||
#if 0
|
||||
if (verbose && X86_AH != 0x0e) {
|
||||
printf("int%x\n", current->num);
|
||||
x86emu_dump_xregs();
|
||||
|
@ -472,7 +472,7 @@ int int42_handler()
|
|||
/* Ignored */
|
||||
break;
|
||||
}
|
||||
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -6,7 +6,7 @@ void x86emu_dump_xregs();
|
|||
int int15_handler(void)
|
||||
{
|
||||
printf("\nint15 encountered.\n");
|
||||
x86emu_dump_xregs();
|
||||
//x86emu_dump_xregs();
|
||||
X86_EAX = 0;
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ int int1A_handler()
|
|||
|
||||
if (verbose) {
|
||||
printf("\nint1a encountered.\n");
|
||||
x86emu_dump_xregs();
|
||||
//x86emu_dump_xregs();
|
||||
}
|
||||
|
||||
switch (X86_AX) {
|
||||
|
|
|
@ -44,7 +44,7 @@ PCITAG findPci(unsigned short bx)
|
|||
tag->slot = slot;
|
||||
tag->func = func;
|
||||
|
||||
if (pci_get_dev(pacc, bus, slot, func))
|
||||
if (pci_get_dev(pacc, 0, bus, slot, func))
|
||||
return tag;
|
||||
|
||||
return NULL;
|
||||
|
@ -58,7 +58,7 @@ u32 pciSlotBX(PCITAG tag)
|
|||
u8 pciReadByte(PCITAG tag, u32 idx)
|
||||
{
|
||||
struct pci_dev *d;
|
||||
if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func)))
|
||||
if ((d = pci_get_dev(pacc, 0, tag->bus, tag->slot, tag->func)))
|
||||
return pci_read_byte(d, idx);
|
||||
#ifdef DEBUG_PCI
|
||||
printf("PCI: device not found while read byte (%x:%x.%x)\n",
|
||||
|
@ -70,7 +70,7 @@ u8 pciReadByte(PCITAG tag, u32 idx)
|
|||
u16 pciReadWord(PCITAG tag, u32 idx)
|
||||
{
|
||||
struct pci_dev *d;
|
||||
if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func)))
|
||||
if ((d = pci_get_dev(pacc, 0, tag->bus, tag->slot, tag->func)))
|
||||
return pci_read_word(d, idx);
|
||||
#ifdef DEBUG_PCI
|
||||
printf("PCI: device not found while read word (%x:%x.%x)\n",
|
||||
|
@ -82,7 +82,7 @@ u16 pciReadWord(PCITAG tag, u32 idx)
|
|||
u32 pciReadLong(PCITAG tag, u32 idx)
|
||||
{
|
||||
struct pci_dev *d;
|
||||
if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func)))
|
||||
if ((d = pci_get_dev(pacc, 0, tag->bus, tag->slot, tag->func)))
|
||||
return pci_read_long(d, idx);
|
||||
#ifdef DEBUG_PCI
|
||||
printf("PCI: device not found while read long (%x:%x.%x)\n",
|
||||
|
@ -95,7 +95,7 @@ u32 pciReadLong(PCITAG tag, u32 idx)
|
|||
void pciWriteLong(PCITAG tag, u32 idx, u32 data)
|
||||
{
|
||||
struct pci_dev *d;
|
||||
if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func)))
|
||||
if ((d = pci_get_dev(pacc, 0, tag->bus, tag->slot, tag->func)))
|
||||
pci_write_long(d, idx, data);
|
||||
#ifdef DEBUG_PCI
|
||||
else
|
||||
|
@ -107,7 +107,7 @@ void pciWriteLong(PCITAG tag, u32 idx, u32 data)
|
|||
void pciWriteWord(PCITAG tag, u32 idx, u16 data)
|
||||
{
|
||||
struct pci_dev *d;
|
||||
if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func)))
|
||||
if ((d = pci_get_dev(pacc, 0, tag->bus, tag->slot, tag->func)))
|
||||
pci_write_word(d, idx, data);
|
||||
#ifdef DEBUG_PCI
|
||||
else
|
||||
|
@ -120,7 +120,7 @@ void pciWriteWord(PCITAG tag, u32 idx, u16 data)
|
|||
void pciWriteByte(PCITAG tag, u32 idx, u8 data)
|
||||
{
|
||||
struct pci_dev *d;
|
||||
if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func)))
|
||||
if ((d = pci_get_dev(pacc, 0, tag->bus, tag->slot, tag->func)))
|
||||
pci_write_long(d, idx, data);
|
||||
#ifdef DEBUG_PCI
|
||||
else
|
||||
|
|
|
@ -76,7 +76,7 @@ void do_int(int num)
|
|||
|
||||
if (!ret) {
|
||||
printf("\nint%x: not implemented\n", num);
|
||||
x86emu_dump_xregs();
|
||||
//x86emu_dump_xregs();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -317,10 +317,10 @@ int main(int argc, char **argv)
|
|||
|
||||
if (trace) {
|
||||
printf("Switching to single step mode.\n");
|
||||
X86EMU_trace_on();
|
||||
//X86EMU_trace_on();
|
||||
}
|
||||
if (debugflag) {
|
||||
X86EMU_set_debug(debugflag);
|
||||
//X86EMU_set_debug(debugflag);
|
||||
}
|
||||
X86EMU_exec();
|
||||
/* Cleaning up */
|
||||
|
|
|
@ -181,6 +181,8 @@ void X86EMU_halt_sys(void);
|
|||
#define DEBUG_TRACECALL_REGS_F 0x004000
|
||||
#define DEBUG_DECODE_NOPRINT_F 0x008000
|
||||
#define DEBUG_SAVE_IP_CS_F 0x010000
|
||||
#define DEBUG_EXIT 0x020000
|
||||
#define DEBUG_SAVE_CS_IP 0x040000
|
||||
#define DEBUG_SYS_F (DEBUG_SVC_F|DEBUG_FS_F|DEBUG_PROC_F)
|
||||
|
||||
void X86EMU_trace_regs(void);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* Realmode X86 Emulator Library
|
||||
*
|
||||
* Copyright (C) 1996-1999 SciTech Software, Inc.
|
||||
* Copyright (C) 1991-2004 SciTech Software, Inc.
|
||||
* Copyright (C) David Mosberger-Tang
|
||||
* Copyright (C) 1999 Egbert Eich
|
||||
*
|
||||
|
@ -36,15 +36,9 @@
|
|||
* emulator.
|
||||
*
|
||||
****************************************************************************/
|
||||
/* $XFree86: xc/extras/x86emu/src/x86emu/debug.c,v 1.4 2000/04/17 16:29:45 eich Exp $ */
|
||||
|
||||
#include "x86emu/x86emui.h"
|
||||
#ifdef IN_MODULE
|
||||
#include "xf86_ansic.h"
|
||||
#else
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
/*----------------------------- Implementation ----------------------------*/
|
||||
|
||||
|
@ -203,8 +197,7 @@ void x86emu_print_int_vect(u16 iv)
|
|||
{
|
||||
u16 seg,off;
|
||||
|
||||
if (iv > 256)
|
||||
return;
|
||||
if (iv > 256) return;
|
||||
seg = fetch_data_word_abs(0,iv*4);
|
||||
off = fetch_data_word_abs(0,iv*4+2);
|
||||
printk("%04x:%04x ", seg, off);
|
||||
|
@ -258,7 +251,7 @@ void x86emu_single_step(void)
|
|||
done=0;
|
||||
offset = M.x86.saved_ip;
|
||||
while (!done) {
|
||||
printk("%x:%x -", M.x86.saved_cs, offset);
|
||||
printk("-");
|
||||
p = fgets(s, 1023, stdin);
|
||||
cmd = parse_line(s, ps, &ntok);
|
||||
switch(cmd) {
|
||||
|
@ -308,7 +301,8 @@ void x86emu_single_step(void)
|
|||
}
|
||||
break;
|
||||
case 'q':
|
||||
exit(1);
|
||||
M.x86.debug |= DEBUG_EXIT;
|
||||
return;
|
||||
case 'P':
|
||||
noDecode = (noDecode)?0:1;
|
||||
printk("Toggled decoding to %s\n",(noDecode)?"FALSE":"TRUE");
|
||||
|
@ -323,7 +317,7 @@ void x86emu_single_step(void)
|
|||
|
||||
int X86EMU_trace_on(void)
|
||||
{
|
||||
return M.x86.debug |= /*DEBUG_STEP_F | */ DEBUG_DECODE_F | DEBUG_TRACE_F;
|
||||
return M.x86.debug |= DEBUG_STEP_F | DEBUG_DECODE_F | DEBUG_TRACE_F;
|
||||
}
|
||||
|
||||
int X86EMU_trace_off(void)
|
||||
|
@ -331,18 +325,12 @@ int X86EMU_trace_off(void)
|
|||
return M.x86.debug &= ~(DEBUG_STEP_F | DEBUG_DECODE_F | DEBUG_TRACE_F);
|
||||
}
|
||||
|
||||
int X86EMU_set_debug(int debug)
|
||||
{
|
||||
return M.x86.debug = debug;
|
||||
}
|
||||
|
||||
static int parse_line (char *s, int *ps, int *n)
|
||||
{
|
||||
int cmd;
|
||||
|
||||
*n = 0;
|
||||
while (*s == ' ' || *s == '\t')
|
||||
s++;
|
||||
while(*s == ' ' || *s == '\t') s++;
|
||||
ps[*n] = *s;
|
||||
switch (*s) {
|
||||
case '\n':
|
||||
|
@ -354,14 +342,12 @@ static int parse_line(char *s, int *ps, int *n)
|
|||
}
|
||||
|
||||
while (1) {
|
||||
while (*s != ' ' && *s != '\t' && *s != '\n')
|
||||
s++;
|
||||
while (*s != ' ' && *s != '\t' && *s != '\n') s++;
|
||||
|
||||
if (*s == '\n')
|
||||
return cmd;
|
||||
|
||||
while (*s == ' ' || *s == '\t')
|
||||
s++;
|
||||
while(*s == ' ' || *s == '\t') s++;
|
||||
|
||||
sscanf(s,"%x",&ps[*n]);
|
||||
*n += 1;
|
||||
|
@ -385,38 +371,22 @@ void x86emu_dump_regs(void)
|
|||
printk("SS=%04x ", M.x86.R_SS );
|
||||
printk("CS=%04x ", M.x86.R_CS );
|
||||
printk("IP=%04x ", M.x86.R_IP );
|
||||
if (ACCESS_FLAG(F_OF))
|
||||
printk("OV "); /* CHECKED... */
|
||||
else
|
||||
printk("NV ");
|
||||
if (ACCESS_FLAG(F_DF))
|
||||
printk("DN ");
|
||||
else
|
||||
printk("UP ");
|
||||
if (ACCESS_FLAG(F_IF))
|
||||
printk("EI ");
|
||||
else
|
||||
printk("DI ");
|
||||
if (ACCESS_FLAG(F_SF))
|
||||
printk("NG ");
|
||||
else
|
||||
printk("PL ");
|
||||
if (ACCESS_FLAG(F_ZF))
|
||||
printk("ZR ");
|
||||
else
|
||||
printk("NZ ");
|
||||
if (ACCESS_FLAG(F_AF))
|
||||
printk("AC ");
|
||||
else
|
||||
printk("NA ");
|
||||
if (ACCESS_FLAG(F_PF))
|
||||
printk("PE ");
|
||||
else
|
||||
printk("PO ");
|
||||
if (ACCESS_FLAG(F_CF))
|
||||
printk("CY ");
|
||||
else
|
||||
printk("NC ");
|
||||
if (ACCESS_FLAG(F_OF)) printk("OV "); /* CHECKED... */
|
||||
else printk("NV ");
|
||||
if (ACCESS_FLAG(F_DF)) printk("DN ");
|
||||
else printk("UP ");
|
||||
if (ACCESS_FLAG(F_IF)) printk("EI ");
|
||||
else printk("DI ");
|
||||
if (ACCESS_FLAG(F_SF)) printk("NG ");
|
||||
else printk("PL ");
|
||||
if (ACCESS_FLAG(F_ZF)) printk("ZR ");
|
||||
else printk("NZ ");
|
||||
if (ACCESS_FLAG(F_AF)) printk("AC ");
|
||||
else printk("NA ");
|
||||
if (ACCESS_FLAG(F_PF)) printk("PE ");
|
||||
else printk("PO ");
|
||||
if (ACCESS_FLAG(F_CF)) printk("CY ");
|
||||
else printk("NC ");
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
|
@ -435,37 +405,21 @@ void x86emu_dump_xregs(void)
|
|||
printk("SS=%04x ", M.x86.R_SS );
|
||||
printk("CS=%04x ", M.x86.R_CS );
|
||||
printk("EIP=%08x\n\t", M.x86.R_EIP );
|
||||
if (ACCESS_FLAG(F_OF))
|
||||
printk("OV "); /* CHECKED... */
|
||||
else
|
||||
printk("NV ");
|
||||
if (ACCESS_FLAG(F_DF))
|
||||
printk("DN ");
|
||||
else
|
||||
printk("UP ");
|
||||
if (ACCESS_FLAG(F_IF))
|
||||
printk("EI ");
|
||||
else
|
||||
printk("DI ");
|
||||
if (ACCESS_FLAG(F_SF))
|
||||
printk("NG ");
|
||||
else
|
||||
printk("PL ");
|
||||
if (ACCESS_FLAG(F_ZF))
|
||||
printk("ZR ");
|
||||
else
|
||||
printk("NZ ");
|
||||
if (ACCESS_FLAG(F_AF))
|
||||
printk("AC ");
|
||||
else
|
||||
printk("NA ");
|
||||
if (ACCESS_FLAG(F_PF))
|
||||
printk("PE ");
|
||||
else
|
||||
printk("PO ");
|
||||
if (ACCESS_FLAG(F_CF))
|
||||
printk("CY ");
|
||||
else
|
||||
printk("NC ");
|
||||
if (ACCESS_FLAG(F_OF)) printk("OV "); /* CHECKED... */
|
||||
else printk("NV ");
|
||||
if (ACCESS_FLAG(F_DF)) printk("DN ");
|
||||
else printk("UP ");
|
||||
if (ACCESS_FLAG(F_IF)) printk("EI ");
|
||||
else printk("DI ");
|
||||
if (ACCESS_FLAG(F_SF)) printk("NG ");
|
||||
else printk("PL ");
|
||||
if (ACCESS_FLAG(F_ZF)) printk("ZR ");
|
||||
else printk("NZ ");
|
||||
if (ACCESS_FLAG(F_AF)) printk("AC ");
|
||||
else printk("NA ");
|
||||
if (ACCESS_FLAG(F_PF)) printk("PE ");
|
||||
else printk("PO ");
|
||||
if (ACCESS_FLAG(F_CF)) printk("CY ");
|
||||
else printk("NC ");
|
||||
printk("\n");
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* Realmode X86 Emulator Library
|
||||
*
|
||||
* Copyright (C) 1996-1999 SciTech Software, Inc.
|
||||
* Copyright (C) 1991-2004 SciTech Software, Inc.
|
||||
* Copyright (C) David Mosberger-Tang
|
||||
* Copyright (C) 1999 Egbert Eich
|
||||
*
|
||||
|
@ -37,8 +37,6 @@
|
|||
*
|
||||
****************************************************************************/
|
||||
|
||||
/* $XFree86: xc/extras/x86emu/src/x86emu/decode.c,v 1.9 2001/01/06 20:19:03 tsi Exp $ */
|
||||
|
||||
#include "x86emu/x86emui.h"
|
||||
|
||||
/*----------------------------- Implementation ----------------------------*/
|
||||
|
@ -76,7 +74,8 @@ REMARKS:
|
|||
Raise the specified interrupt to be handled before the execution of the
|
||||
next instruction.
|
||||
****************************************************************************/
|
||||
void x86emu_intr_raise(u8 intrnum)
|
||||
void x86emu_intr_raise(
|
||||
u8 intrnum)
|
||||
{
|
||||
M.x86.intno = intrnum;
|
||||
M.x86.intr |= INTR_SYNCH;
|
||||
|
@ -93,8 +92,7 @@ void X86EMU_exec(void)
|
|||
u8 op1;
|
||||
|
||||
M.x86.intr = 0;
|
||||
DB(x86emu_end_instr();
|
||||
)
|
||||
DB(x86emu_end_instr();)
|
||||
|
||||
for (;;) {
|
||||
DB( if (CHECK_IP_FETCH())
|
||||
|
@ -104,18 +102,27 @@ void X86EMU_exec(void)
|
|||
INC_DECODED_INST_LEN(1);
|
||||
if (M.x86.intr) {
|
||||
if (M.x86.intr & INTR_HALTED) {
|
||||
DB(printk("halted\n"); X86EMU_trace_regs();
|
||||
)
|
||||
DB( if (M.x86.R_SP != 0) {
|
||||
printk("halted\n");
|
||||
X86EMU_trace_regs();
|
||||
}
|
||||
else {
|
||||
if (M.x86.debug)
|
||||
printk("Service completed successfully\n");
|
||||
})
|
||||
return;
|
||||
}
|
||||
if (((M.x86.intr & INTR_SYNCH)
|
||||
&& (M.x86.intno == 0 || M.x86.intno == 2))
|
||||
|| !ACCESS_FLAG(F_IF)) {
|
||||
if (((M.x86.intr & INTR_SYNCH) && (M.x86.intno == 0 || M.x86.intno == 2)) ||
|
||||
!ACCESS_FLAG(F_IF)) {
|
||||
x86emu_intr_handle();
|
||||
}
|
||||
}
|
||||
op1 = (*sys_rdb)(((u32)M.x86.R_CS << 4) + (M.x86.R_IP++));
|
||||
(*x86emu_optab[op1])(op1);
|
||||
if (M.x86.debug & DEBUG_EXIT) {
|
||||
M.x86.debug &= ~DEBUG_EXIT;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -140,7 +147,10 @@ next instruction.
|
|||
|
||||
NOTE: Do not inline this function, as (*sys_rdb) is already inline!
|
||||
****************************************************************************/
|
||||
void fetch_decode_modrm(int *mod, int *regh, int *regl)
|
||||
void fetch_decode_modrm(
|
||||
int *mod,
|
||||
int *regh,
|
||||
int *regl)
|
||||
{
|
||||
int fetched;
|
||||
|
||||
|
@ -290,7 +300,8 @@ Byte value read from the absolute memory location.
|
|||
|
||||
NOTE: Do not inline this function as (*sys_rdX) is already inline!
|
||||
****************************************************************************/
|
||||
u8 fetch_data_byte(uint offset)
|
||||
u8 fetch_data_byte(
|
||||
uint offset)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (CHECK_DATA_ACCESS())
|
||||
|
@ -308,7 +319,8 @@ Word value read from the absolute memory location.
|
|||
|
||||
NOTE: Do not inline this function as (*sys_rdX) is already inline!
|
||||
****************************************************************************/
|
||||
u16 fetch_data_word(uint offset)
|
||||
u16 fetch_data_word(
|
||||
uint offset)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (CHECK_DATA_ACCESS())
|
||||
|
@ -326,7 +338,8 @@ Long value read from the absolute memory location.
|
|||
|
||||
NOTE: Do not inline this function as (*sys_rdX) is already inline!
|
||||
****************************************************************************/
|
||||
u32 fetch_data_long(uint offset)
|
||||
u32 fetch_data_long(
|
||||
uint offset)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (CHECK_DATA_ACCESS())
|
||||
|
@ -345,7 +358,9 @@ Byte value read from the absolute memory location.
|
|||
|
||||
NOTE: Do not inline this function as (*sys_rdX) is already inline!
|
||||
****************************************************************************/
|
||||
u8 fetch_data_byte_abs(uint segment, uint offset)
|
||||
u8 fetch_data_byte_abs(
|
||||
uint segment,
|
||||
uint offset)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (CHECK_DATA_ACCESS())
|
||||
|
@ -364,7 +379,9 @@ Word value read from the absolute memory location.
|
|||
|
||||
NOTE: Do not inline this function as (*sys_rdX) is already inline!
|
||||
****************************************************************************/
|
||||
u16 fetch_data_word_abs(uint segment, uint offset)
|
||||
u16 fetch_data_word_abs(
|
||||
uint segment,
|
||||
uint offset)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (CHECK_DATA_ACCESS())
|
||||
|
@ -383,7 +400,9 @@ Long value read from the absolute memory location.
|
|||
|
||||
NOTE: Do not inline this function as (*sys_rdX) is already inline!
|
||||
****************************************************************************/
|
||||
u32 fetch_data_long_abs(uint segment, uint offset)
|
||||
u32 fetch_data_long_abs(
|
||||
uint segment,
|
||||
uint offset)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (CHECK_DATA_ACCESS())
|
||||
|
@ -403,7 +422,9 @@ the current 'default' segment, which may have been overridden.
|
|||
|
||||
NOTE: Do not inline this function as (*sys_wrX) is already inline!
|
||||
****************************************************************************/
|
||||
void store_data_byte(uint offset, u8 val)
|
||||
void store_data_byte(
|
||||
uint offset,
|
||||
u8 val)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (CHECK_DATA_ACCESS())
|
||||
|
@ -423,7 +444,9 @@ the current 'default' segment, which may have been overridden.
|
|||
|
||||
NOTE: Do not inline this function as (*sys_wrX) is already inline!
|
||||
****************************************************************************/
|
||||
void store_data_word(uint offset, u16 val)
|
||||
void store_data_word(
|
||||
uint offset,
|
||||
u16 val)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (CHECK_DATA_ACCESS())
|
||||
|
@ -443,7 +466,9 @@ the current 'default' segment, which may have been overridden.
|
|||
|
||||
NOTE: Do not inline this function as (*sys_wrX) is already inline!
|
||||
****************************************************************************/
|
||||
void store_data_long(uint offset, u32 val)
|
||||
void store_data_long(
|
||||
uint offset,
|
||||
u32 val)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (CHECK_DATA_ACCESS())
|
||||
|
@ -463,7 +488,10 @@ Writes a byte value to an absolute memory location.
|
|||
|
||||
NOTE: Do not inline this function as (*sys_wrX) is already inline!
|
||||
****************************************************************************/
|
||||
void store_data_byte_abs(uint segment, uint offset, u8 val)
|
||||
void store_data_byte_abs(
|
||||
uint segment,
|
||||
uint offset,
|
||||
u8 val)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (CHECK_DATA_ACCESS())
|
||||
|
@ -483,7 +511,10 @@ Writes a word value to an absolute memory location.
|
|||
|
||||
NOTE: Do not inline this function as (*sys_wrX) is already inline!
|
||||
****************************************************************************/
|
||||
void store_data_word_abs(uint segment, uint offset, u16 val)
|
||||
void store_data_word_abs(
|
||||
uint segment,
|
||||
uint offset,
|
||||
u16 val)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (CHECK_DATA_ACCESS())
|
||||
|
@ -503,7 +534,10 @@ Writes a long value to an absolute memory location.
|
|||
|
||||
NOTE: Do not inline this function as (*sys_wrX) is already inline!
|
||||
****************************************************************************/
|
||||
void store_data_long_abs(uint segment, uint offset, u32 val)
|
||||
void store_data_long_abs(
|
||||
uint segment,
|
||||
uint offset,
|
||||
u32 val)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
if (CHECK_DATA_ACCESS())
|
||||
|
@ -523,7 +557,8 @@ REMARKS:
|
|||
Return a pointer to the register given by the R/RM field of the
|
||||
modrm byte, for byte operands. Also enables the decoding of instructions.
|
||||
****************************************************************************/
|
||||
u8 *decode_rm_byte_register(int reg)
|
||||
u8* decode_rm_byte_register(
|
||||
int reg)
|
||||
{
|
||||
switch (reg) {
|
||||
case 0:
|
||||
|
@ -566,7 +601,8 @@ REMARKS:
|
|||
Return a pointer to the register given by the R/RM field of the
|
||||
modrm byte, for word operands. Also enables the decoding of instructions.
|
||||
****************************************************************************/
|
||||
u16 *decode_rm_word_register(int reg)
|
||||
u16* decode_rm_word_register(
|
||||
int reg)
|
||||
{
|
||||
switch (reg) {
|
||||
case 0:
|
||||
|
@ -609,7 +645,8 @@ REMARKS:
|
|||
Return a pointer to the register given by the R/RM field of the
|
||||
modrm byte, for dword operands. Also enables the decoding of instructions.
|
||||
****************************************************************************/
|
||||
u32 *decode_rm_long_register(int reg)
|
||||
u32* decode_rm_long_register(
|
||||
int reg)
|
||||
{
|
||||
switch (reg) {
|
||||
case 0:
|
||||
|
@ -653,7 +690,8 @@ Return a pointer to the register given by the R/RM field of the
|
|||
modrm byte, for word operands, modified from above for the weirdo
|
||||
special case of segreg operands. Also enables the decoding of instructions.
|
||||
****************************************************************************/
|
||||
u16 *decode_rm_seg_register(int reg)
|
||||
u16* decode_rm_seg_register(
|
||||
int reg)
|
||||
{
|
||||
switch (reg) {
|
||||
case 0:
|
||||
|
@ -674,7 +712,6 @@ u16 *decode_rm_seg_register(int reg)
|
|||
case 5:
|
||||
DECODE_PRINTF("GS");
|
||||
return &M.x86.R_GS;
|
||||
|
||||
case 6:
|
||||
case 7:
|
||||
DECODE_PRINTF("ILLEGAL SEGREG");
|
||||
|
@ -684,6 +721,138 @@ u16 *decode_rm_seg_register(int reg)
|
|||
return NULL; /* NOT REACHED OR REACHED ON ERROR */
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
PARAMETERS:
|
||||
scale - scale value of SIB byte
|
||||
index - index value of SIB byte
|
||||
|
||||
RETURNS:
|
||||
Value of scale * index
|
||||
|
||||
REMARKS:
|
||||
Decodes scale/index of SIB byte and returns relevant offset part of
|
||||
effective address.
|
||||
****************************************************************************/
|
||||
unsigned decode_sib_si(
|
||||
int scale,
|
||||
int index)
|
||||
{
|
||||
scale = 1 << scale;
|
||||
if (scale > 1) {
|
||||
DECODE_PRINTF2("[%d*", scale);
|
||||
} else {
|
||||
DECODE_PRINTF("[");
|
||||
}
|
||||
switch (index) {
|
||||
case 0:
|
||||
DECODE_PRINTF("EAX]");
|
||||
return M.x86.R_EAX * index;
|
||||
case 1:
|
||||
DECODE_PRINTF("ECX]");
|
||||
return M.x86.R_ECX * index;
|
||||
case 2:
|
||||
DECODE_PRINTF("EDX]");
|
||||
return M.x86.R_EDX * index;
|
||||
case 3:
|
||||
DECODE_PRINTF("EBX]");
|
||||
return M.x86.R_EBX * index;
|
||||
case 4:
|
||||
DECODE_PRINTF("0]");
|
||||
return 0;
|
||||
case 5:
|
||||
DECODE_PRINTF("EBP]");
|
||||
return M.x86.R_EBP * index;
|
||||
case 6:
|
||||
DECODE_PRINTF("ESI]");
|
||||
return M.x86.R_ESI * index;
|
||||
case 7:
|
||||
DECODE_PRINTF("EDI]");
|
||||
return M.x86.R_EDI * index;
|
||||
}
|
||||
HALT_SYS();
|
||||
return 0; /* NOT REACHED OR REACHED ON ERROR */
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
PARAMETERS:
|
||||
mod - MOD value of preceding ModR/M byte
|
||||
|
||||
RETURNS:
|
||||
Offset in memory for the address decoding
|
||||
|
||||
REMARKS:
|
||||
Decodes SIB addressing byte and returns calculated effective address.
|
||||
****************************************************************************/
|
||||
unsigned decode_sib_address(
|
||||
int mod)
|
||||
{
|
||||
int sib = fetch_byte_imm();
|
||||
int ss = (sib >> 6) & 0x03;
|
||||
int index = (sib >> 3) & 0x07;
|
||||
int base = sib & 0x07;
|
||||
int offset = 0;
|
||||
int displacement;
|
||||
|
||||
switch (base) {
|
||||
case 0:
|
||||
DECODE_PRINTF("[EAX]");
|
||||
offset = M.x86.R_EAX;
|
||||
break;
|
||||
case 1:
|
||||
DECODE_PRINTF("[ECX]");
|
||||
offset = M.x86.R_ECX;
|
||||
break;
|
||||
case 2:
|
||||
DECODE_PRINTF("[EDX]");
|
||||
offset = M.x86.R_EDX;
|
||||
break;
|
||||
case 3:
|
||||
DECODE_PRINTF("[EBX]");
|
||||
offset = M.x86.R_EBX;
|
||||
break;
|
||||
case 4:
|
||||
DECODE_PRINTF("[ESP]");
|
||||
offset = M.x86.R_ESP;
|
||||
break;
|
||||
case 5:
|
||||
switch (mod) {
|
||||
case 0:
|
||||
displacement = (s32)fetch_long_imm();
|
||||
DECODE_PRINTF2("[%d]", displacement);
|
||||
offset = displacement;
|
||||
break;
|
||||
case 1:
|
||||
displacement = (s8)fetch_byte_imm();
|
||||
DECODE_PRINTF2("[%d][EBP]", displacement);
|
||||
offset = M.x86.R_EBP + displacement;
|
||||
break;
|
||||
case 2:
|
||||
displacement = (s32)fetch_long_imm();
|
||||
DECODE_PRINTF2("[%d][EBP]", displacement);
|
||||
offset = M.x86.R_EBP + displacement;
|
||||
break;
|
||||
default:
|
||||
HALT_SYS();
|
||||
}
|
||||
DECODE_PRINTF("[EAX]");
|
||||
offset = M.x86.R_EAX;
|
||||
break;
|
||||
case 6:
|
||||
DECODE_PRINTF("[ESI]");
|
||||
offset = M.x86.R_ESI;
|
||||
break;
|
||||
case 7:
|
||||
DECODE_PRINTF("[EDI]");
|
||||
offset = M.x86.R_EDI;
|
||||
break;
|
||||
default:
|
||||
HALT_SYS();
|
||||
}
|
||||
offset += decode_sib_si(ss, index);
|
||||
return offset;
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
PARAMETERS:
|
||||
rm - RM value to decode
|
||||
|
@ -704,25 +873,56 @@ NOTE: The code which specifies the corresponding segment (ds vs ss)
|
|||
if a SS access is needed, set this bit. Otherwise, DS access
|
||||
occurs (unless any of the segment override bits are set).
|
||||
****************************************************************************/
|
||||
unsigned decode_rm00_address(int rm)
|
||||
unsigned decode_rm00_address(
|
||||
int rm)
|
||||
{
|
||||
unsigned offset;
|
||||
|
||||
if (M.x86.mode & SYSMODE_PREFIX_ADDR) {
|
||||
/* 32-bit addressing */
|
||||
switch (rm) {
|
||||
case 0:
|
||||
DECODE_PRINTF("[EAX]");
|
||||
return M.x86.R_EAX;
|
||||
case 1:
|
||||
DECODE_PRINTF("[ECX]");
|
||||
return M.x86.R_ECX;
|
||||
case 2:
|
||||
DECODE_PRINTF("[EDX]");
|
||||
return M.x86.R_EDX;
|
||||
case 3:
|
||||
DECODE_PRINTF("[EBX]");
|
||||
return M.x86.R_EBX;
|
||||
case 4:
|
||||
return decode_sib_address(0);
|
||||
case 5:
|
||||
offset = fetch_long_imm();
|
||||
DECODE_PRINTF2("[%08x]", offset);
|
||||
return offset;
|
||||
case 6:
|
||||
DECODE_PRINTF("[ESI]");
|
||||
return M.x86.R_ESI;
|
||||
case 7:
|
||||
DECODE_PRINTF("[EDI]");
|
||||
return M.x86.R_EDI;
|
||||
}
|
||||
} else {
|
||||
/* 16-bit addressing */
|
||||
switch (rm) {
|
||||
case 0:
|
||||
DECODE_PRINTF("[BX+SI]");
|
||||
return M.x86.R_BX + M.x86.R_SI;
|
||||
return (M.x86.R_BX + M.x86.R_SI) & 0xffff;
|
||||
case 1:
|
||||
DECODE_PRINTF("[BX+DI]");
|
||||
return M.x86.R_BX + M.x86.R_DI;
|
||||
return (M.x86.R_BX + M.x86.R_DI) & 0xffff;
|
||||
case 2:
|
||||
DECODE_PRINTF("[BP+SI]");
|
||||
M.x86.mode |= SYSMODE_SEG_DS_SS;
|
||||
return M.x86.R_BP + M.x86.R_SI;
|
||||
return (M.x86.R_BP + M.x86.R_SI) & 0xffff;
|
||||
case 3:
|
||||
DECODE_PRINTF("[BP+DI]");
|
||||
M.x86.mode |= SYSMODE_SEG_DS_SS;
|
||||
return M.x86.R_BP + M.x86.R_DI;
|
||||
return (M.x86.R_BP + M.x86.R_DI) & 0xffff;
|
||||
case 4:
|
||||
DECODE_PRINTF("[SI]");
|
||||
return M.x86.R_SI;
|
||||
|
@ -737,6 +937,7 @@ unsigned decode_rm00_address(int rm)
|
|||
DECODE_PRINTF("[BX]");
|
||||
return M.x86.R_BX;
|
||||
}
|
||||
}
|
||||
HALT_SYS();
|
||||
return 0;
|
||||
}
|
||||
|
@ -752,37 +953,79 @@ REMARKS:
|
|||
Return the offset given by mod=01 addressing. Also enables the
|
||||
decoding of instructions.
|
||||
****************************************************************************/
|
||||
unsigned decode_rm01_address(int rm)
|
||||
unsigned decode_rm01_address(
|
||||
int rm)
|
||||
{
|
||||
int displacement = (s8) fetch_byte_imm();
|
||||
int displacement;
|
||||
|
||||
if (M.x86.mode & SYSMODE_PREFIX_ADDR) {
|
||||
/* 32-bit addressing */
|
||||
if (rm != 4)
|
||||
displacement = (s8)fetch_byte_imm();
|
||||
else
|
||||
displacement = 0;
|
||||
|
||||
switch (rm) {
|
||||
case 0:
|
||||
DECODE_PRINTF2("%d[EAX]", displacement);
|
||||
return M.x86.R_EAX + displacement;
|
||||
case 1:
|
||||
DECODE_PRINTF2("%d[ECX]", displacement);
|
||||
return M.x86.R_ECX + displacement;
|
||||
case 2:
|
||||
DECODE_PRINTF2("%d[EDX]", displacement);
|
||||
return M.x86.R_EDX + displacement;
|
||||
case 3:
|
||||
DECODE_PRINTF2("%d[EBX]", displacement);
|
||||
return M.x86.R_EBX + displacement;
|
||||
case 4: {
|
||||
int offset = decode_sib_address(1);
|
||||
displacement = (s8)fetch_byte_imm();
|
||||
DECODE_PRINTF2("[%d]", displacement);
|
||||
return offset + displacement;
|
||||
}
|
||||
case 5:
|
||||
DECODE_PRINTF2("%d[EBP]", displacement);
|
||||
return M.x86.R_EBP + displacement;
|
||||
case 6:
|
||||
DECODE_PRINTF2("%d[ESI]", displacement);
|
||||
return M.x86.R_ESI + displacement;
|
||||
case 7:
|
||||
DECODE_PRINTF2("%d[EDI]", displacement);
|
||||
return M.x86.R_EDI + displacement;
|
||||
}
|
||||
} else {
|
||||
/* 16-bit addressing */
|
||||
displacement = (s8)fetch_byte_imm();
|
||||
switch (rm) {
|
||||
case 0:
|
||||
DECODE_PRINTF2("%d[BX+SI]", displacement);
|
||||
return M.x86.R_BX + M.x86.R_SI + displacement;
|
||||
return (M.x86.R_BX + M.x86.R_SI + displacement) & 0xffff;
|
||||
case 1:
|
||||
DECODE_PRINTF2("%d[BX+DI]", displacement);
|
||||
return M.x86.R_BX + M.x86.R_DI + displacement;
|
||||
return (M.x86.R_BX + M.x86.R_DI + displacement) & 0xffff;
|
||||
case 2:
|
||||
DECODE_PRINTF2("%d[BP+SI]", displacement);
|
||||
M.x86.mode |= SYSMODE_SEG_DS_SS;
|
||||
return M.x86.R_BP + M.x86.R_SI + displacement;
|
||||
return (M.x86.R_BP + M.x86.R_SI + displacement) & 0xffff;
|
||||
case 3:
|
||||
DECODE_PRINTF2("%d[BP+DI]", displacement);
|
||||
M.x86.mode |= SYSMODE_SEG_DS_SS;
|
||||
return M.x86.R_BP + M.x86.R_DI + displacement;
|
||||
return (M.x86.R_BP + M.x86.R_DI + displacement) & 0xffff;
|
||||
case 4:
|
||||
DECODE_PRINTF2("%d[SI]", displacement);
|
||||
return M.x86.R_SI + displacement;
|
||||
return (M.x86.R_SI + displacement) & 0xffff;
|
||||
case 5:
|
||||
DECODE_PRINTF2("%d[DI]", displacement);
|
||||
return M.x86.R_DI + displacement;
|
||||
return (M.x86.R_DI + displacement) & 0xffff;
|
||||
case 6:
|
||||
DECODE_PRINTF2("%d[BP]", displacement);
|
||||
M.x86.mode |= SYSMODE_SEG_DS_SS;
|
||||
return M.x86.R_BP + displacement;
|
||||
return (M.x86.R_BP + displacement) & 0xffff;
|
||||
case 7:
|
||||
DECODE_PRINTF2("%d[BX]", displacement);
|
||||
return M.x86.R_BX + displacement;
|
||||
return (M.x86.R_BX + displacement) & 0xffff;
|
||||
}
|
||||
}
|
||||
HALT_SYS();
|
||||
return 0; /* SHOULD NOT HAPPEN */
|
||||
|
@ -799,39 +1042,107 @@ REMARKS:
|
|||
Return the offset given by mod=10 addressing. Also enables the
|
||||
decoding of instructions.
|
||||
****************************************************************************/
|
||||
unsigned decode_rm10_address(int rm)
|
||||
unsigned decode_rm10_address(
|
||||
int rm)
|
||||
{
|
||||
unsigned displacement = (u16) fetch_word_imm();
|
||||
if (M.x86.mode & SYSMODE_PREFIX_ADDR) {
|
||||
int displacement;
|
||||
|
||||
/* 32-bit addressing */
|
||||
if (rm != 4)
|
||||
displacement = (s32)fetch_long_imm();
|
||||
else
|
||||
displacement = 0;
|
||||
|
||||
switch (rm) {
|
||||
case 0:
|
||||
DECODE_PRINTF2("%04x[BX+SI]", displacement);
|
||||
return M.x86.R_BX + M.x86.R_SI + displacement;
|
||||
DECODE_PRINTF2("%d[EAX]", displacement);
|
||||
return M.x86.R_EAX + displacement;
|
||||
case 1:
|
||||
DECODE_PRINTF2("%04x[BX+DI]", displacement);
|
||||
return M.x86.R_BX + M.x86.R_DI + displacement;
|
||||
DECODE_PRINTF2("%d[ECX]", displacement);
|
||||
return M.x86.R_ECX + displacement;
|
||||
case 2:
|
||||
DECODE_PRINTF2("%04x[BP+SI]", displacement);
|
||||
M.x86.mode |= SYSMODE_SEG_DS_SS;
|
||||
return M.x86.R_BP + M.x86.R_SI + displacement;
|
||||
DECODE_PRINTF2("%d[EDX]", displacement);
|
||||
return M.x86.R_EDX + displacement;
|
||||
case 3:
|
||||
DECODE_PRINTF2("%04x[BP+DI]", displacement);
|
||||
M.x86.mode |= SYSMODE_SEG_DS_SS;
|
||||
return M.x86.R_BP + M.x86.R_DI + displacement;
|
||||
case 4:
|
||||
DECODE_PRINTF2("%04x[SI]", displacement);
|
||||
return M.x86.R_SI + displacement;
|
||||
DECODE_PRINTF2("%d[EBX]", displacement);
|
||||
return M.x86.R_EBX + displacement;
|
||||
case 4: {
|
||||
int offset = decode_sib_address(2);
|
||||
displacement = (s32)fetch_long_imm();
|
||||
DECODE_PRINTF2("[%d]", displacement);
|
||||
return offset + displacement;
|
||||
}
|
||||
case 5:
|
||||
DECODE_PRINTF2("%04x[DI]", displacement);
|
||||
return M.x86.R_DI + displacement;
|
||||
DECODE_PRINTF2("%d[EBP]", displacement);
|
||||
return M.x86.R_EBP + displacement;
|
||||
case 6:
|
||||
DECODE_PRINTF2("%04x[BP]", displacement);
|
||||
M.x86.mode |= SYSMODE_SEG_DS_SS;
|
||||
return M.x86.R_BP + displacement;
|
||||
DECODE_PRINTF2("%d[ESI]", displacement);
|
||||
return M.x86.R_ESI + displacement;
|
||||
case 7:
|
||||
DECODE_PRINTF2("%04x[BX]", displacement);
|
||||
return M.x86.R_BX + displacement;
|
||||
DECODE_PRINTF2("%d[EDI]", displacement);
|
||||
return M.x86.R_EDI + displacement;
|
||||
}
|
||||
} else {
|
||||
int displacement = (s16)fetch_word_imm();
|
||||
|
||||
/* 16-bit addressing */
|
||||
switch (rm) {
|
||||
case 0:
|
||||
DECODE_PRINTF2("%d[BX+SI]", displacement);
|
||||
return (M.x86.R_BX + M.x86.R_SI + displacement) & 0xffff;
|
||||
case 1:
|
||||
DECODE_PRINTF2("%d[BX+DI]", displacement);
|
||||
return (M.x86.R_BX + M.x86.R_DI + displacement) & 0xffff;
|
||||
case 2:
|
||||
DECODE_PRINTF2("%d[BP+SI]", displacement);
|
||||
M.x86.mode |= SYSMODE_SEG_DS_SS;
|
||||
return (M.x86.R_BP + M.x86.R_SI + displacement) & 0xffff;
|
||||
case 3:
|
||||
DECODE_PRINTF2("%d[BP+DI]", displacement);
|
||||
M.x86.mode |= SYSMODE_SEG_DS_SS;
|
||||
return (M.x86.R_BP + M.x86.R_DI + displacement) & 0xffff;
|
||||
case 4:
|
||||
DECODE_PRINTF2("%d[SI]", displacement);
|
||||
return (M.x86.R_SI + displacement) & 0xffff;
|
||||
case 5:
|
||||
DECODE_PRINTF2("%d[DI]", displacement);
|
||||
return (M.x86.R_DI + displacement) & 0xffff;
|
||||
case 6:
|
||||
DECODE_PRINTF2("%d[BP]", displacement);
|
||||
M.x86.mode |= SYSMODE_SEG_DS_SS;
|
||||
return (M.x86.R_BP + displacement) & 0xffff;
|
||||
case 7:
|
||||
DECODE_PRINTF2("%d[BX]", displacement);
|
||||
return (M.x86.R_BX + displacement) & 0xffff;
|
||||
}
|
||||
}
|
||||
HALT_SYS();
|
||||
return 0;
|
||||
/*NOTREACHED */
|
||||
return 0; /* SHOULD NOT HAPPEN */
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
PARAMETERS:
|
||||
mod - modifier
|
||||
rm - RM value to decode
|
||||
|
||||
RETURNS:
|
||||
Offset in memory for the address decoding, multiplexing calls to
|
||||
the decode_rmXX_address functions
|
||||
|
||||
REMARKS:
|
||||
Return the offset given by "mod" addressing.
|
||||
****************************************************************************/
|
||||
|
||||
unsigned decode_rmXX_address(int mod, int rm)
|
||||
{
|
||||
if(mod == 0)
|
||||
return decode_rm00_address(rm);
|
||||
if(mod == 1)
|
||||
return decode_rm01_address(rm);
|
||||
return decode_rm10_address(rm);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* Realmode X86 Emulator Library
|
||||
*
|
||||
* Copyright (C) 1996-1999 SciTech Software, Inc.
|
||||
* Copyright (C) 1991-2004 SciTech Software, Inc.
|
||||
* Copyright (C) David Mosberger-Tang
|
||||
* Copyright (C) 1999 Egbert Eich
|
||||
*
|
||||
|
@ -720,7 +720,8 @@ void x86emuOp_esc_coprocess_dd(u8 X86EMU_UNUSED(op1))
|
|||
|
||||
#ifdef DEBUG
|
||||
|
||||
static char *x86emu_fpu_op_de_tab[] = {
|
||||
static char *x86emu_fpu_op_de_tab[] =
|
||||
{
|
||||
"FIADD\tWORD PTR ", "FIMUL\tWORD PTR ", "FICOM\tWORD PTR ",
|
||||
"FICOMP\tWORD PTR ",
|
||||
"FISUB\tWORD PTR ", "FISUBR\tWORD PTR ", "FIDIV\tWORD PTR ",
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
#
|
||||
# Realmode X86 Emulator Library
|
||||
#
|
||||
# Copyright (C) 1996-1999 SciTech Software, Inc.
|
||||
# Copyright (C) 1991-2004 SciTech Software, Inc.
|
||||
#
|
||||
# ========================================================================
|
||||
#
|
||||
|
|
|
@ -31,9 +31,9 @@
|
|||
#############################################################################
|
||||
|
||||
TARGETLIB = libx86emu.a
|
||||
TARGETDEBUGLIB =libx86emud.a
|
||||
|
||||
OBJS=\
|
||||
debug.o \
|
||||
decode.o \
|
||||
fpu.o \
|
||||
ops.o \
|
||||
|
@ -41,20 +41,40 @@ ops2.o \
|
|||
prim_ops.o \
|
||||
sys.o
|
||||
|
||||
DEBUGOBJS=debug.d \
|
||||
decode.d \
|
||||
fpu.d \
|
||||
ops.d \
|
||||
ops2.d \
|
||||
prim_ops.d \
|
||||
sys.d
|
||||
|
||||
.SUFFIXES: .d
|
||||
|
||||
all: $(TARGETLIB) $(TARGETDEBUGLIB)
|
||||
|
||||
$(TARGETLIB): $(OBJS)
|
||||
ar rv $(TARGETLIB) $(OBJS)
|
||||
|
||||
INCS = -I. -Ix86emu -I../../include
|
||||
CFLAGS = -D__DRIVER__ -DFORCE_POST -D_CEXPORT= -DNO_LONG_LONG -DDEBUG
|
||||
$(TARGETDEBUGLIB): $(DEBUGOBJS)
|
||||
ar rv $(TARGETDEBUGLIB) $(DEBUGOBJS)
|
||||
|
||||
INCS = -I. -I../../include -I../../include/x86emu
|
||||
#CFLAGS = -D__DRIVER__ -DFORCE_POST -D_CEXPORT= -DNO_LONG_LONG
|
||||
CFLAGS = -D__DRIVER__ -DFORCE_POST
|
||||
CDEBUGFLAGS = -DDEBUG
|
||||
|
||||
.c.o:
|
||||
gcc -g -O -Wall -c $(CFLAGS) $(INCS) $*.c
|
||||
gcc -g -Os -Wall -c $(CFLAGS) $(INCS) $*.c
|
||||
|
||||
.c.d:
|
||||
gcc -g -O -Wall -c -o$*.d $(CFLAGS) $(CDEBUGFLAGS) $(INCS) $*.c
|
||||
|
||||
.cpp.o:
|
||||
gcc -c $(CFLAGS) $(INCS) $*.cpp
|
||||
|
||||
clean:
|
||||
rm -f *.a *.o
|
||||
rm -f *.a *.o *.d
|
||||
|
||||
validate: validate.o libx86emu.a
|
||||
gcc -o validate validate.o -lx86emu -L.
|
||||
validate: validate.c libx86emu.a x86emu/prim_asm.h
|
||||
gcc $(CFLAGS) $(INCS) -Wall -O2 -o validate validate.c -lx86emu -L.
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -198,7 +198,7 @@ u8 *mem_ptr(u32 addr, int size)
|
|||
retaddr = (u8 *) (M.abseg + addr);
|
||||
//printk("retaddr now 0x%p\n", retaddr);
|
||||
} else if (addr < 0x200) {
|
||||
//printk("updating int vector 0x%x\n", addr >> 2);
|
||||
printk("updating int vector 0x%x\n", addr >> 2);
|
||||
retaddr = (u8 *) (M.mem_base + addr);
|
||||
} else {
|
||||
retaddr = (u8 *) (M.mem_base + addr);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* Realmode X86 Emulator Library
|
||||
*
|
||||
* Copyright (C) 1996-1999 SciTech Software, Inc.
|
||||
* Copyright (C) 1991-2004 SciTech Software, Inc.
|
||||
* Copyright (C) David Mosberger-Tang
|
||||
* Copyright (C) 1999 Egbert Eich
|
||||
*
|
||||
|
@ -47,19 +47,27 @@
|
|||
#include <stdarg.h>
|
||||
#include "x86emu.h"
|
||||
#include "x86emu/prim_asm.h"
|
||||
#include "x86emu/prim_ops.h"
|
||||
|
||||
/*-------------------------- Implementation -------------------------------*/
|
||||
|
||||
#define true 1
|
||||
#define false 0
|
||||
|
||||
u32 cur_flags_mask = 0;
|
||||
|
||||
int flags_are_different(u32 flags1, u32 flags2)
|
||||
{
|
||||
return (flags1&cur_flags_mask) != (flags2&cur_flags_mask);
|
||||
}
|
||||
|
||||
#define ALL_FLAGS (F_CF | F_PF | F_AF | F_ZF | F_SF | F_OF)
|
||||
|
||||
#define VAL_START_BINARY(parm_type,res_type,dmax,smax,dincr,sincr) \
|
||||
{ \
|
||||
parm_type d,s; \
|
||||
res_type r,r_asm; \
|
||||
ulong flags,inflags; \
|
||||
u32 flags,inflags; \
|
||||
int f,failed = false; \
|
||||
char buf1[80],buf2[80]; \
|
||||
for (d = 0; d < dmax; d += dincr) { \
|
||||
|
@ -70,7 +78,7 @@
|
|||
#define VAL_TEST_BINARY(name) \
|
||||
r_asm = name##_asm(&flags,d,s); \
|
||||
r = name(d,s); \
|
||||
if (r != r_asm || M.x86.R_EFLG != flags) \
|
||||
if (r != r_asm || flags_are_different(M.x86.R_EFLG, flags)) \
|
||||
failed = true; \
|
||||
if (failed || trace) {
|
||||
|
||||
|
@ -78,7 +86,7 @@
|
|||
name##_asm(&flags,d,s); \
|
||||
name(d,s); \
|
||||
r = r_asm = 0; \
|
||||
if (M.x86.R_EFLG != flags) \
|
||||
if (flags_are_different(M.x86.R_EFLG, flags)) \
|
||||
failed = true; \
|
||||
if (failed || trace) {
|
||||
|
||||
|
@ -202,7 +210,7 @@
|
|||
#define VAL_TEST_TERNARY(name) \
|
||||
r_asm = name##_asm(&flags,d,s,shift); \
|
||||
r = name(d,s,shift); \
|
||||
if (r != r_asm || M.x86.R_EFLG != flags) \
|
||||
if (r != r_asm || flags_are_different(M.x86.R_EFLG, flags)) \
|
||||
failed = true; \
|
||||
if (failed || trace) {
|
||||
|
||||
|
@ -268,7 +276,7 @@
|
|||
#define VAL_TEST_UNARY(name) \
|
||||
r_asm = name##_asm(&flags,d); \
|
||||
r = name(d); \
|
||||
if (r != r_asm || M.x86.R_EFLG != flags) { \
|
||||
if (r != r_asm || flags_are_different(M.x86.R_EFLG, flags)) { \
|
||||
failed = true;
|
||||
|
||||
#define VAL_FAIL_BYTE_UNARY(name) \
|
||||
|
@ -349,7 +357,7 @@
|
|||
M.x86.R_AL = d; \
|
||||
name(s); \
|
||||
r = M.x86.R_AX; \
|
||||
if (r != r_asm || M.x86.R_EFLG != flags) \
|
||||
if (r != r_asm || flags_are_different(M.x86.R_EFLG, flags)) \
|
||||
failed = true; \
|
||||
if (failed || trace) { \
|
||||
if (failed) \
|
||||
|
@ -391,7 +399,7 @@
|
|||
name(s); \
|
||||
r_lo = M.x86.R_AX; \
|
||||
r_hi = M.x86.R_DX; \
|
||||
if (r_lo != r_asm_lo || r_hi != r_asm_hi || M.x86.R_EFLG != flags)\
|
||||
if (r_lo != r_asm_lo || r_hi != r_asm_hi || flags_are_different(M.x86.R_EFLG, flags))\
|
||||
failed = true; \
|
||||
if (failed || trace) { \
|
||||
if (failed) \
|
||||
|
@ -433,7 +441,7 @@
|
|||
name(s); \
|
||||
r_lo = M.x86.R_EAX; \
|
||||
r_hi = M.x86.R_EDX; \
|
||||
if (r_lo != r_asm_lo || r_hi != r_asm_hi || M.x86.R_EFLG != flags)\
|
||||
if (r_lo != r_asm_lo || r_hi != r_asm_hi || flags_are_different(M.x86.R_EFLG, flags))\
|
||||
failed = true; \
|
||||
if (failed || trace) { \
|
||||
if (failed) \
|
||||
|
@ -477,7 +485,7 @@
|
|||
if (M.x86.intr & INTR_SYNCH) \
|
||||
continue; \
|
||||
name##_asm(&flags,&r_asm_quot,&r_asm_rem,d,s); \
|
||||
if (r_quot != r_asm_quot || r_rem != r_asm_rem || M.x86.R_EFLG != flags) \
|
||||
if (r_quot != r_asm_quot || r_rem != r_asm_rem || flags_are_different(M.x86.R_EFLG, flags)) \
|
||||
failed = true; \
|
||||
if (failed || trace) { \
|
||||
if (failed) \
|
||||
|
@ -522,7 +530,7 @@
|
|||
if (M.x86.intr & INTR_SYNCH) \
|
||||
continue; \
|
||||
name##_asm(&flags,&r_asm_quot,&r_asm_rem,d & 0xFFFF,d >> 16,s);\
|
||||
if (r_quot != r_asm_quot || r_rem != r_asm_rem || M.x86.R_EFLG != flags) \
|
||||
if (r_quot != r_asm_quot || r_rem != r_asm_rem || flags_are_different(M.x86.R_EFLG, flags)) \
|
||||
failed = true; \
|
||||
if (failed || trace) { \
|
||||
if (failed) \
|
||||
|
@ -567,7 +575,7 @@
|
|||
if (M.x86.intr & INTR_SYNCH) \
|
||||
continue; \
|
||||
name##_asm(&flags,&r_asm_quot,&r_asm_rem,d,0,s); \
|
||||
if (r_quot != r_asm_quot || r_rem != r_asm_rem || M.x86.R_EFLG != flags) \
|
||||
if (r_quot != r_asm_quot || r_rem != r_asm_rem || flags_are_different(M.x86.R_EFLG, flags)) \
|
||||
failed = true; \
|
||||
if (failed || trace) { \
|
||||
if (failed) \
|
||||
|
@ -640,9 +648,9 @@ char *print_flags(char *buf, ulong flags)
|
|||
return buf;
|
||||
}
|
||||
|
||||
int main(int argc)
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
ulong def_flags;
|
||||
u32 def_flags;
|
||||
int trace = false;
|
||||
|
||||
if (argc > 1)
|
||||
|
@ -650,12 +658,15 @@ int main(int argc)
|
|||
memset(&M, 0, sizeof(M));
|
||||
def_flags = get_flags_asm() & ~ALL_FLAGS;
|
||||
|
||||
cur_flags_mask = F_AF | F_CF;
|
||||
VAL_WORD_UNARY(aaa_word);
|
||||
VAL_WORD_UNARY(aas_word);
|
||||
|
||||
cur_flags_mask = F_SF | F_ZF | F_PF;
|
||||
VAL_WORD_UNARY(aad_word);
|
||||
VAL_WORD_UNARY(aam_word);
|
||||
|
||||
cur_flags_mask = ALL_FLAGS;
|
||||
VAL_BYTE_BYTE_BINARY(adc_byte);
|
||||
VAL_WORD_WORD_BINARY(adc_word);
|
||||
VAL_LONG_LONG_BINARY(adc_long);
|
||||
|
@ -664,17 +675,21 @@ int main(int argc)
|
|||
VAL_WORD_WORD_BINARY(add_word);
|
||||
VAL_LONG_LONG_BINARY(add_long);
|
||||
|
||||
cur_flags_mask = ALL_FLAGS & (~F_AF);
|
||||
VAL_BYTE_BYTE_BINARY(and_byte);
|
||||
VAL_WORD_WORD_BINARY(and_word);
|
||||
VAL_LONG_LONG_BINARY(and_long);
|
||||
|
||||
cur_flags_mask = ALL_FLAGS;
|
||||
VAL_BYTE_BYTE_BINARY(cmp_byte);
|
||||
VAL_WORD_WORD_BINARY(cmp_word);
|
||||
VAL_LONG_LONG_BINARY(cmp_long);
|
||||
|
||||
cur_flags_mask = ALL_FLAGS & (~F_OF);
|
||||
VAL_BYTE_UNARY(daa_byte);
|
||||
VAL_BYTE_UNARY(das_byte); // Fails for 0x9A (out of range anyway)
|
||||
|
||||
cur_flags_mask = ALL_FLAGS;
|
||||
VAL_BYTE_UNARY(dec_byte);
|
||||
VAL_WORD_UNARY(dec_word);
|
||||
VAL_LONG_UNARY(dec_long);
|
||||
|
@ -683,10 +698,12 @@ int main(int argc)
|
|||
VAL_WORD_UNARY(inc_word);
|
||||
VAL_LONG_UNARY(inc_long);
|
||||
|
||||
cur_flags_mask = ALL_FLAGS & (~F_AF);
|
||||
VAL_BYTE_BYTE_BINARY(or_byte);
|
||||
VAL_WORD_WORD_BINARY(or_word);
|
||||
VAL_LONG_LONG_BINARY(or_long);
|
||||
|
||||
cur_flags_mask = ALL_FLAGS;
|
||||
VAL_BYTE_UNARY(neg_byte);
|
||||
VAL_WORD_UNARY(neg_word);
|
||||
VAL_LONG_UNARY(neg_long);
|
||||
|
@ -695,6 +712,7 @@ int main(int argc)
|
|||
VAL_WORD_UNARY(not_word);
|
||||
VAL_LONG_UNARY(not_long);
|
||||
|
||||
cur_flags_mask = ALL_FLAGS & (~F_OF);
|
||||
VAL_BYTE_ROTATE(rcl_byte);
|
||||
VAL_WORD_ROTATE(rcl_word);
|
||||
VAL_LONG_ROTATE(rcl_long);
|
||||
|
@ -711,6 +729,7 @@ int main(int argc)
|
|||
VAL_WORD_ROTATE(ror_word);
|
||||
VAL_LONG_ROTATE(ror_long);
|
||||
|
||||
cur_flags_mask = ALL_FLAGS & (~(F_AF | F_OF));
|
||||
VAL_BYTE_ROTATE(shl_byte);
|
||||
VAL_WORD_ROTATE(shl_word);
|
||||
VAL_LONG_ROTATE(shl_long);
|
||||
|
@ -723,12 +742,14 @@ int main(int argc)
|
|||
VAL_WORD_ROTATE(sar_word);
|
||||
VAL_LONG_ROTATE(sar_long);
|
||||
|
||||
cur_flags_mask = ALL_FLAGS & (~(F_AF | F_OF));
|
||||
VAL_WORD_ROTATE_DBL(shld_word);
|
||||
VAL_LONG_ROTATE_DBL(shld_long);
|
||||
|
||||
VAL_WORD_ROTATE_DBL(shrd_word);
|
||||
VAL_LONG_ROTATE_DBL(shrd_long);
|
||||
|
||||
cur_flags_mask = ALL_FLAGS;
|
||||
VAL_BYTE_BYTE_BINARY(sbb_byte);
|
||||
VAL_WORD_WORD_BINARY(sbb_word);
|
||||
VAL_LONG_LONG_BINARY(sbb_long);
|
||||
|
@ -737,6 +758,7 @@ int main(int argc)
|
|||
VAL_WORD_WORD_BINARY(sub_word);
|
||||
VAL_LONG_LONG_BINARY(sub_long);
|
||||
|
||||
cur_flags_mask = ALL_FLAGS & (~F_AF);
|
||||
VAL_BYTE_BYTE_BINARY(xor_byte);
|
||||
VAL_WORD_WORD_BINARY(xor_word);
|
||||
VAL_LONG_LONG_BINARY(xor_long);
|
||||
|
@ -745,6 +767,7 @@ int main(int argc)
|
|||
VAL_VOID_WORD_BINARY(test_word);
|
||||
VAL_VOID_LONG_BINARY(test_long);
|
||||
|
||||
cur_flags_mask = F_CF | F_OF;
|
||||
VAL_BYTE_MUL(imul_byte);
|
||||
VAL_WORD_MUL(imul_word);
|
||||
VAL_LONG_MUL(imul_long);
|
||||
|
@ -753,6 +776,7 @@ int main(int argc)
|
|||
VAL_WORD_MUL(mul_word);
|
||||
VAL_LONG_MUL(mul_long);
|
||||
|
||||
cur_flags_mask = 0;
|
||||
VAL_BYTE_DIV(idiv_byte);
|
||||
VAL_WORD_DIV(idiv_word);
|
||||
VAL_LONG_DIV(idiv_long);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* Realmode X86 Emulator Library
|
||||
*
|
||||
* Copyright (C) 1996-1999 SciTech Software, Inc.
|
||||
* Copyright (C) 1991-2004 SciTech Software, Inc.
|
||||
* Copyright (C) David Mosberger-Tang
|
||||
* Copyright (C) 1999 Egbert Eich
|
||||
*
|
||||
|
@ -35,7 +35,6 @@
|
|||
* Description: Header file for debug definitions.
|
||||
*
|
||||
****************************************************************************/
|
||||
/* $XFree86: xc/extras/x86emu/src/x86emu/x86emu/debug.h,v 1.4 2000/11/21 23:10:27 tsi Exp $ */
|
||||
|
||||
#ifndef __X86EMU_DEBUG_H
|
||||
#define __X86EMU_DEBUG_H
|
||||
|
@ -69,7 +68,7 @@
|
|||
# define DEBUG_DISASSEMBLE() (M.x86.debug & DEBUG_DISASSEMBLE_F)
|
||||
# define DEBUG_BREAK() (M.x86.debug & DEBUG_BREAK_F)
|
||||
# define DEBUG_SVC() (M.x86.debug & DEBUG_SVC_F)
|
||||
# define DEBUG_SAVE_IP_CS() (M.x86.debug & DEBUG_SAVE_IP_CS_F)
|
||||
# define DEBUG_SAVE_IP_CS() (M.x86.debug & DEBUG_SAVE_CS_IP)
|
||||
|
||||
# define DEBUG_FS() (M.x86.debug & DEBUG_FS_F)
|
||||
# define DEBUG_PROC() (M.x86.debug & DEBUG_PROC_F)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* Realmode X86 Emulator Library
|
||||
*
|
||||
* Copyright (C) 1996-1999 SciTech Software, Inc.
|
||||
* Copyright (C) 1991-2004 SciTech Software, Inc.
|
||||
* Copyright (C) David Mosberger-Tang
|
||||
* Copyright (C) 1999 Egbert Eich
|
||||
*
|
||||
|
@ -79,6 +79,7 @@ u16* decode_rm_seg_register(int reg);
|
|||
unsigned decode_rm00_address(int rm);
|
||||
unsigned decode_rm01_address(int rm);
|
||||
unsigned decode_rm10_address(int rm);
|
||||
unsigned decode_rmXX_address(int mod, int rm);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of "C" linkage for C++ */
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* Realmode X86 Emulator Library
|
||||
*
|
||||
* Copyright (C) 1996-1999 SciTech Software, Inc.
|
||||
* Copyright (C) 1991-2004 SciTech Software, Inc.
|
||||
* Copyright (C) David Mosberger-Tang
|
||||
* Copyright (C) 1999 Egbert Eich
|
||||
*
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* Realmode X86 Emulator Library
|
||||
*
|
||||
* Copyright (C) 1996-1999 SciTech Software, Inc.
|
||||
* Copyright (C) 1991-2004 SciTech Software, Inc.
|
||||
* Copyright (C) David Mosberger-Tang
|
||||
* Copyright (C) 1999 Egbert Eich
|
||||
*
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* Realmode X86 Emulator Library
|
||||
*
|
||||
* Copyright (C) 1996-1999 SciTech Software, Inc.
|
||||
* Copyright (C) 1991-2004 SciTech Software, Inc.
|
||||
* Copyright (C) David Mosberger-Tang
|
||||
* Copyright (C) 1999 Egbert Eich
|
||||
*
|
||||
|
@ -39,8 +39,6 @@
|
|||
#ifndef __X86EMU_PRIM_OPS_H
|
||||
#define __X86EMU_PRIM_OPS_H
|
||||
|
||||
#include "x86emu/prim_asm.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Use "C" linkage when in C++ mode */
|
||||
#endif
|
||||
|
@ -136,96 +134,9 @@ void push_long (u32 w);
|
|||
u16 pop_word (void);
|
||||
u32 pop_long (void);
|
||||
|
||||
#if defined(__HAVE_INLINE_ASSEMBLER__) && !defined(PRIM_OPS_NO_REDEFINE_ASM)
|
||||
|
||||
#define aaa_word(d) aaa_word_asm(&M.x86.R_EFLG,d)
|
||||
#define aas_word(d) aas_word_asm(&M.x86.R_EFLG,d)
|
||||
#define aad_word(d) aad_word_asm(&M.x86.R_EFLG,d)
|
||||
#define aam_word(d) aam_word_asm(&M.x86.R_EFLG,d)
|
||||
#define adc_byte(d,s) adc_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define adc_word(d,s) adc_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define adc_long(d,s) adc_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define add_byte(d,s) add_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define add_word(d,s) add_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define add_long(d,s) add_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define and_byte(d,s) and_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define and_word(d,s) and_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define and_long(d,s) and_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define cmp_byte(d,s) cmp_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define cmp_word(d,s) cmp_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define cmp_long(d,s) cmp_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define daa_byte(d) daa_byte_asm(&M.x86.R_EFLG,d)
|
||||
#define das_byte(d) das_byte_asm(&M.x86.R_EFLG,d)
|
||||
#define dec_byte(d) dec_byte_asm(&M.x86.R_EFLG,d)
|
||||
#define dec_word(d) dec_word_asm(&M.x86.R_EFLG,d)
|
||||
#define dec_long(d) dec_long_asm(&M.x86.R_EFLG,d)
|
||||
#define inc_byte(d) inc_byte_asm(&M.x86.R_EFLG,d)
|
||||
#define inc_word(d) inc_word_asm(&M.x86.R_EFLG,d)
|
||||
#define inc_long(d) inc_long_asm(&M.x86.R_EFLG,d)
|
||||
#define or_byte(d,s) or_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define or_word(d,s) or_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define or_long(d,s) or_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define neg_byte(s) neg_byte_asm(&M.x86.R_EFLG,s)
|
||||
#define neg_word(s) neg_word_asm(&M.x86.R_EFLG,s)
|
||||
#define neg_long(s) neg_long_asm(&M.x86.R_EFLG,s)
|
||||
#define not_byte(s) not_byte_asm(&M.x86.R_EFLG,s)
|
||||
#define not_word(s) not_word_asm(&M.x86.R_EFLG,s)
|
||||
#define not_long(s) not_long_asm(&M.x86.R_EFLG,s)
|
||||
#define rcl_byte(d,s) rcl_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define rcl_word(d,s) rcl_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define rcl_long(d,s) rcl_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define rcr_byte(d,s) rcr_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define rcr_word(d,s) rcr_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define rcr_long(d,s) rcr_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define rol_byte(d,s) rol_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define rol_word(d,s) rol_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define rol_long(d,s) rol_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define ror_byte(d,s) ror_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define ror_word(d,s) ror_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define ror_long(d,s) ror_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define shl_byte(d,s) shl_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define shl_word(d,s) shl_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define shl_long(d,s) shl_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define shr_byte(d,s) shr_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define shr_word(d,s) shr_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define shr_long(d,s) shr_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define sar_byte(d,s) sar_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define sar_word(d,s) sar_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define sar_long(d,s) sar_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define shld_word(d,fill,s) shld_word_asm(&M.x86.R_EFLG,d,fill,s)
|
||||
#define shld_long(d,fill,s) shld_long_asm(&M.x86.R_EFLG,d,fill,s)
|
||||
#define shrd_word(d,fill,s) shrd_word_asm(&M.x86.R_EFLG,d,fill,s)
|
||||
#define shrd_long(d,fill,s) shrd_long_asm(&M.x86.R_EFLG,d,fill,s)
|
||||
#define sbb_byte(d,s) sbb_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define sbb_word(d,s) sbb_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define sbb_long(d,s) sbb_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define sub_byte(d,s) sub_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define sub_word(d,s) sub_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define sub_long(d,s) sub_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define test_byte(d,s) test_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define test_word(d,s) test_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define test_long(d,s) test_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define xor_byte(d,s) xor_byte_asm(&M.x86.R_EFLG,d,s)
|
||||
#define xor_word(d,s) xor_word_asm(&M.x86.R_EFLG,d,s)
|
||||
#define xor_long(d,s) xor_long_asm(&M.x86.R_EFLG,d,s)
|
||||
#define imul_byte(s) imul_byte_asm(&M.x86.R_EFLG,&M.x86.R_AX,M.x86.R_AL,s)
|
||||
#define imul_word(s) imul_word_asm(&M.x86.R_EFLG,&M.x86.R_AX,&M.x86.R_DX,M.x86.R_AX,s)
|
||||
#define imul_long(s) imul_long_asm(&M.x86.R_EFLG,&M.x86.R_EAX,&M.x86.R_EDX,M.x86.R_EAX,s)
|
||||
#define imul_long_direct(res_lo,res_hi,d,s) imul_long_asm(&M.x86.R_EFLG,res_lo,res_hi,d,s)
|
||||
#define mul_byte(s) mul_byte_asm(&M.x86.R_EFLG,&M.x86.R_AX,M.x86.R_AL,s)
|
||||
#define mul_word(s) mul_word_asm(&M.x86.R_EFLG,&M.x86.R_AX,&M.x86.R_DX,M.x86.R_AX,s)
|
||||
#define mul_long(s) mul_long_asm(&M.x86.R_EFLG,&M.x86.R_EAX,&M.x86.R_EDX,M.x86.R_EAX,s)
|
||||
#define idiv_byte(s) idiv_byte_asm(&M.x86.R_EFLG,&M.x86.R_AL,&M.x86.R_AH,M.x86.R_AX,s)
|
||||
#define idiv_word(s) idiv_word_asm(&M.x86.R_EFLG,&M.x86.R_AX,&M.x86.R_DX,M.x86.R_AX,M.x86.R_DX,s)
|
||||
#define idiv_long(s) idiv_long_asm(&M.x86.R_EFLG,&M.x86.R_EAX,&M.x86.R_EDX,M.x86.R_EAX,M.x86.R_EDX,s)
|
||||
#define div_byte(s) div_byte_asm(&M.x86.R_EFLG,&M.x86.R_AL,&M.x86.R_AH,M.x86.R_AX,s)
|
||||
#define div_word(s) div_word_asm(&M.x86.R_EFLG,&M.x86.R_AX,&M.x86.R_DX,M.x86.R_AX,M.x86.R_DX,s)
|
||||
#define div_long(s) div_long_asm(&M.x86.R_EFLG,&M.x86.R_EAX,&M.x86.R_EDX,M.x86.R_EAX,M.x86.R_EDX,s)
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of "C" linkage for C++ */
|
||||
#endif
|
||||
|
||||
#endif /* __X86EMU_PRIM_OPS_H */
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* Realmode X86 Emulator Library
|
||||
*
|
||||
* Copyright (C) 1996-1999 SciTech Software, Inc.
|
||||
* Copyright (C) 1991-2004 SciTech Software, Inc.
|
||||
* Copyright (C) David Mosberger-Tang
|
||||
* Copyright (C) 1999 Egbert Eich
|
||||
*
|
||||
|
@ -38,8 +38,6 @@
|
|||
*
|
||||
****************************************************************************/
|
||||
|
||||
/* $XFree86: xc/extras/x86emu/src/x86emu/x86emu/x86emui.h,v 1.4 2001/04/01 13:59:58 tsi Exp $ */
|
||||
|
||||
#ifndef __X86EMU_X86EMUI_H
|
||||
#define __X86EMU_X86EMUI_H
|
||||
|
||||
|
@ -70,14 +68,12 @@
|
|||
#include "x86emu/prim_ops.h"
|
||||
#include "x86emu/fpu.h"
|
||||
#include "x86emu/fpu_regs.h"
|
||||
|
||||
#ifdef IN_MODULE
|
||||
#include <xf86_ansic.h>
|
||||
#else
|
||||
#ifndef __KERNEL__
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#endif
|
||||
|
||||
/*--------------------------- Inline Functions ----------------------------*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
Loading…
Reference in New Issue