Bochs/bochs/disasm/disasm.h

194 lines
4.7 KiB
C
Raw Normal View History

/////////////////////////////////////////////////////////////////////////
2003-08-04 20:03:09 +04:00
// $Id: disasm.h,v 1.9 2003-08-04 16:03:09 akrisak Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001 MandrakeSoft S.A.
//
// MandrakeSoft S.A.
// 43, rue d'Aboukir
// 75002 Paris - France
// http://www.linux-mandrake.com/
// http://www.mandrakesoft.com/
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#define BX_SEGMENT_REG 10
#define BX_GENERAL_8BIT_REG 11
#define BX_GENERAL_16BIT_REG 12
#define BX_GENERAL_32BIT_REG 13
#define BX_NO_REG_TYPE 14
#define BX_DECODE_MODRM(mod_rm_byte, mod, opcode, rm) { \
mod = (mod_rm_byte >> 6) & 0x03; \
opcode = (mod_rm_byte >> 3) & 0x07; \
rm = mod_rm_byte & 0x07; \
}
class bx_disassemble_c : public logfunctions {
public:
bx_disassemble_c(void);
2003-08-04 20:03:09 +04:00
unsigned disasm(bx_bool is_32, Bit32u base, Bit32u ip, Bit8u *instr, char *disbuf);
private:
- Apply patch.replace-Boolean rev 1.3. Every "Boolean" is now changed to a "bx_bool" which is always defined as Bit32u on all platforms. In Carbon specific code, Boolean is still used because the Carbon header files define it to unsigned char. - this fixes bug [ 623152 ] MacOSX: Triple Exception Booting win95. The bug was that some code in Bochs depends on Boolean to be a 32 bit value. (This should be fixed, but I don't know all the places where it needs to be fixed yet.) Because Carbon defined Boolean as an unsigned char, Bochs just followed along and used the unsigned char definition to avoid compile problems. This exposed the dependency on 32 bit Boolean on MacOS X only and led to major simulation problems, that could only be reproduced and debugged on that platform. - On the mailing list we debated whether to make all Booleans into "bool" or our own type. I chose bx_bool for several reasons. 1. Unlike C++'s bool, we can guarantee that bx_bool is the same size on all platforms, which makes it much less likely to have more platform-specific simulation differences in the future. (I spent hours on a borrowed MacOSX machine chasing bug 618388 before discovering that different sized Booleans were the problem, and I don't want to repeat that.) 2. We still have at least one dependency on 32 bit Booleans which must be fixed some time, but I don't want to risk introducing new bugs into the simulation just before the 2.0 release. Modified Files: bochs.h config.h.in gdbstub.cc logio.cc main.cc pc_system.cc pc_system.h plugin.cc plugin.h bios/rombios.c cpu/apic.cc cpu/arith16.cc cpu/arith32.cc cpu/arith64.cc cpu/arith8.cc cpu/cpu.cc cpu/cpu.h cpu/ctrl_xfer16.cc cpu/ctrl_xfer32.cc cpu/ctrl_xfer64.cc cpu/data_xfer16.cc cpu/data_xfer32.cc cpu/data_xfer64.cc cpu/debugstuff.cc cpu/exception.cc cpu/fetchdecode.cc cpu/flag_ctrl_pro.cc cpu/init.cc cpu/io_pro.cc cpu/lazy_flags.cc cpu/lazy_flags.h cpu/mult16.cc cpu/mult32.cc cpu/mult64.cc cpu/mult8.cc cpu/paging.cc cpu/proc_ctrl.cc cpu/segment_ctrl_pro.cc cpu/stack_pro.cc cpu/tasking.cc debug/dbg_main.cc debug/debug.h debug/sim2.cc disasm/dis_decode.cc disasm/disasm.h doc/docbook/Makefile docs-html/cosimulation.html fpu/wmFPUemu_glue.cc gui/amigaos.cc gui/beos.cc gui/carbon.cc gui/gui.cc gui/gui.h gui/keymap.cc gui/keymap.h gui/macintosh.cc gui/nogui.cc gui/rfb.cc gui/sdl.cc gui/siminterface.cc gui/siminterface.h gui/term.cc gui/win32.cc gui/wx.cc gui/wxmain.cc gui/wxmain.h gui/x.cc instrument/example0/instrument.cc instrument/example0/instrument.h instrument/example1/instrument.cc instrument/example1/instrument.h instrument/stubs/instrument.cc instrument/stubs/instrument.h iodev/cdrom.cc iodev/cdrom.h iodev/cdrom_osx.cc iodev/cmos.cc iodev/devices.cc iodev/dma.cc iodev/dma.h iodev/eth_arpback.cc iodev/eth_packetmaker.cc iodev/eth_packetmaker.h iodev/floppy.cc iodev/floppy.h iodev/guest2host.h iodev/harddrv.cc iodev/harddrv.h iodev/ioapic.cc iodev/ioapic.h iodev/iodebug.cc iodev/iodev.h iodev/keyboard.cc iodev/keyboard.h iodev/ne2k.h iodev/parallel.h iodev/pci.cc iodev/pci.h iodev/pic.h iodev/pit.cc iodev/pit.h iodev/pit_wrap.cc iodev/pit_wrap.h iodev/sb16.cc iodev/sb16.h iodev/serial.cc iodev/serial.h iodev/vga.cc iodev/vga.h memory/memory.h memory/misc_mem.cc
2002-10-25 15:44:41 +04:00
bx_bool db_32bit_opsize;
bx_bool db_32bit_addrsize;
bx_bool db_rep_prefix;
bx_bool db_repne_prefix;
Bit32u db_eip;
2003-08-04 20:03:09 +04:00
Bit32u db_base;
Bit8u *instruction_begin; // keep track of where instruction starts
Bit8u *instruction; // for fetching of next byte of instruction
char *seg_override;
char *disbufptr;
char *sreg_mod01_rm32[8];
char *sreg_mod10_rm32[8];
char *sreg_mod00_base32[8];
char *sreg_mod01_base32[8];
char *sreg_mod10_base32[8];
char *sreg_mod00_rm16[8];
char *sreg_mod01_rm16[8];
char *sreg_mod10_rm16[8];
char *segment_name[8];
char *general_8bit_reg_name[8];
char *general_16bit_reg_name[8];
char *general_32bit_reg_name[8];
char *base_name16[8];
char *index_name16[8];
char *index_name32[8];
BX_CPP_INLINE Bit8u fetch_byte(void) {
db_eip++;
return(*instruction++);
};
BX_CPP_INLINE Bit8u peek_byte(void) {
return(*instruction);
};
BX_CPP_INLINE Bit16u fetch_word(void) {
Bit16u ret16;
Bit8u b1, b0;
b0 = * (Bit8u *) instruction++;
b1 = * (Bit8u *) instruction++;
ret16 = (b1<<8) | b0;
db_eip += 2;
return(ret16);
};
BX_CPP_INLINE Bit32u fetch_dword(void) {
Bit32u ret32;
Bit8u b3, b2, b1, b0;
b0 = * (Bit8u *) instruction++;
b1 = * (Bit8u *) instruction++;
b2 = * (Bit8u *) instruction++;
b3 = * (Bit8u *) instruction++;
ret32 = (b3<<24) | (b2<<16) | (b1<<8) | b0;
db_eip += 4;
return(ret32);
};
void invalid_opcode(void);
void dis_sprintf(char *fmt, ...);
void decode_exgx(unsigned modrm_reg_type, unsigned reg_type);
void decode_gxex(unsigned reg_type, unsigned modrm_reg_type);
void decode_ex(Bit8u modrm, unsigned modrm_reg_type);
void out_reg_name(int reg, int reg_type);
void out_16bit_base(int base);
void out_16bit_index(int index);
void EbGb(void);
void EvGv(void);
void GbEb(void);
void GvEv(void);
void Ew(void);
void Ms(void);
void GvEw(void);
void RdCd(void);
void RdDd(void);
void CdRd(void);
void DdRd(void);
void RdTd(void);
void TdRd(void);
void Jv(void);
void Eb(void);
void XBTS(void);
void IBTS(void);
void Mp(void);
2003-08-04 20:03:09 +04:00
void Mq(void);
void Mb(void);
void EvIb(void);
void GvEb(void);
void GvMa(void);
void EwRw(void);
void Iv(void);
void Ib(void);
void Jb(void);
void EbIb(void);
void EvIv(void);
void EwSw(void);
void GvM(void);
void SwEw(void);
void Ev(void);
void eAX(void);
void eCX(void);
void eDX(void);
void eBX(void);
void eSP(void);
void eBP(void);
void eSI(void);
void eDI(void);
void Ap(void);
void ALOb(void);
void eAXOv(void);
void ObAL(void);
void OveAX(void);
void XbYb(void);
void XvYv(void);
void YbAL(void);
void YveAX(void);
void ALXb(void);
void eAXXv(void);
void eSPIv(void);
void eBPIv(void);
void Iw(void);
void GvMp(void);
void Eb1(void);
void Ev1(void);
void Es(void);
void ST_STi(void);
void Ea(void);
void STi(void);
void Et(void);
void Ed(void);
void El(void);
void STi_ST(void);
void Eq(void);
void eAXEv(void);
void Ep(void);
};
extern bx_disassemble_c bx_disassemble;