80 printf(
"%s, raising exception %x\n", __func__, intrnum);
82 M.x86.intno = intrnum;
107 DB(
if (
M.x86.R_SP != 0) {
113 printf(
"Service completed successfully\n");
117 if (((
M.x86.intr &
INTR_SYNCH) && (
M.x86.intno == 0 ||
M.x86.intno == 2)) ||
122 op1 = (*sys_rdb)(((
u32)
M.x86.R_CS << 4) + (
M.x86.R_IP++));
161 fetched = (*sys_rdb)(((
u32)
M.x86.R_CS << 4) + (
M.x86.R_IP++));
163 *mod = (fetched >> 6) & 0x03;
164 *regh = (fetched >> 3) & 0x07;
165 *regl = (fetched >> 0) & 0x07;
184 fetched = (*sys_rdb)(((
u32)
M.x86.R_CS << 4) + (
M.x86.R_IP++));
205 fetched = (*sys_rdw)(((
u32)
M.x86.R_CS << 4) + (
M.x86.R_IP));
227 fetched = (*sys_rdl)(((
u32)
M.x86.R_CS << 4) + (
M.x86.R_IP));
264 #define GET_SEGMENT(segment)
289 printf(
"error: should not happen: multiple overrides.\n");
371 return (*sys_rdb)(((
u32)segment << 4) +
offset);
392 return (*sys_rdw)(((
u32)segment << 4) +
offset);
413 return (*sys_rdl)(((
u32)segment << 4) +
offset);
751 return M.x86.R_EAX * index;
754 return M.x86.R_ECX * index;
757 return M.x86.R_EDX * index;
760 return M.x86.R_EBX * index;
766 return M.x86.R_EBP * index;
769 return M.x86.R_ESI * index;
772 return M.x86.R_EDI * index;
792 int ss = (sib >> 6) & 0x03;
793 int index = (sib >> 3) & 0x07;
794 int base = sib & 0x07;
829 offset =
M.x86.R_EBP + displacement;
834 offset =
M.x86.R_EBP + displacement;
915 return (
M.x86.R_BX +
M.x86.R_SI) & 0xffff;
918 return (
M.x86.R_BX +
M.x86.R_DI) & 0xffff;
922 return (
M.x86.R_BP +
M.x86.R_SI) & 0xffff;
926 return (
M.x86.R_BP +
M.x86.R_DI) & 0xffff;
972 return M.x86.R_EAX + displacement;
975 return M.x86.R_ECX + displacement;
978 return M.x86.R_EDX + displacement;
981 return M.x86.R_EBX + displacement;
986 return offset + displacement;
990 return M.x86.R_EBP + displacement;
993 return M.x86.R_ESI + displacement;
996 return M.x86.R_EDI + displacement;
1004 return (
M.x86.R_BX +
M.x86.R_SI + displacement) & 0xffff;
1007 return (
M.x86.R_BX +
M.x86.R_DI + displacement) & 0xffff;
1011 return (
M.x86.R_BP +
M.x86.R_SI + displacement) & 0xffff;
1015 return (
M.x86.R_BP +
M.x86.R_DI + displacement) & 0xffff;
1018 return (
M.x86.R_SI + displacement) & 0xffff;
1021 return (
M.x86.R_DI + displacement) & 0xffff;
1025 return (
M.x86.R_BP + displacement) & 0xffff;
1028 return (
M.x86.R_BX + displacement) & 0xffff;
1061 return M.x86.R_EAX + displacement;
1064 return M.x86.R_ECX + displacement;
1067 return M.x86.R_EDX + displacement;
1070 return M.x86.R_EBX + displacement;
1075 return offset + displacement;
1079 return M.x86.R_EBP + displacement;
1082 return M.x86.R_ESI + displacement;
1085 return M.x86.R_EDI + displacement;
1094 return (
M.x86.R_BX +
M.x86.R_SI + displacement) & 0xffff;
1097 return (
M.x86.R_BX +
M.x86.R_DI + displacement) & 0xffff;
1101 return (
M.x86.R_BP +
M.x86.R_SI + displacement) & 0xffff;
1105 return (
M.x86.R_BP +
M.x86.R_DI + displacement) & 0xffff;
1108 return (
M.x86.R_SI + displacement) & 0xffff;
1111 return (
M.x86.R_DI + displacement) & 0xffff;
1115 return (
M.x86.R_BP + displacement) & 0xffff;
1118 return (
M.x86.R_BX + displacement) & 0xffff;
unsigned int decode_rm01_address(int rm)
unsigned int decode_rmXX_address(int mod, int rm)
u16 fetch_data_word_abs(uint segment, uint offset)
u16 fetch_data_word(uint offset)
u8 fetch_data_byte_abs(uint segment, uint offset)
void store_data_byte(uint offset, u8 val)
unsigned int decode_rm10_address(int rm)
void fetch_decode_modrm(int *mod, int *regh, int *regl)
void store_data_word_abs(uint segment, uint offset, u16 val)
static unsigned int decode_sib_address(int mod)
void X86EMU_halt_sys(void)
u16 * decode_rm_seg_register(int reg)
void x86emu_intr_raise(u8 intrnum)
_INLINE u32 get_data_segment(void)
void store_data_byte_abs(uint segment, uint offset, u8 val)
void store_data_long_abs(uint segment, uint offset, u32 val)
u16 * decode_rm_word_register(int reg)
u8 fetch_data_byte(uint offset)
unsigned int decode_rm00_address(int rm)
u8 * decode_rm_byte_register(int reg)
void store_data_long(uint offset, u32 val)
u32 fetch_data_long_abs(uint segment, uint offset)
u32 * decode_rm_long_register(int reg)
void store_data_word(uint offset, u16 val)
static unsigned int decode_sib_si(int scale, int index)
static void x86emu_intr_handle(void)
u32 fetch_data_long(uint offset)
void x86emu_dump_regs(void)
void x86emu_end_instr(void)
void x86emu_check_data_access(uint s, uint o)
#define CHECK_DATA_ACCESS()
#define INC_DECODED_INST_LEN(x)
void x86emu_check_ip_access(void)
#define DECODE_PRINTF2(x, y)
void(* x86emu_optab[256])(u8)
u16 mem_access_word(int addr)
#define SYSMODE_SEG_DS_SS
#define SYSMODE_SEGOVR_GS
#define SYSMODE_SEGOVR_ES
#define SYSMODE_SEGOVR_DS
#define SYSMODE_SEGOVR_SS
#define SYSMODE_SEGOVR_CS
#define SYSMODE_PREFIX_ADDR
#define SYSMODE_SEGOVR_FS
#define ACCESS_FLAG(flag)
X86EMU_intrFuncs _X86EMU_intrTab[256]