cec9135e9f
"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
55 lines
2.2 KiB
C++
55 lines
2.2 KiB
C++
/////////////////////////////////////////////////////////////////////////
|
|
// $Id: ioapic.h,v 1.5 2002-10-25 11:44:40 bdenney Exp $
|
|
/////////////////////////////////////////////////////////////////////////
|
|
//
|
|
extern class bx_ioapic_c bx_ioapic;
|
|
|
|
#define BX_IOAPIC_VERSION_ID 0x00170011 // same version as 82093 IOAPIC
|
|
#define BX_IOAPIC_NUM_PINS 0x18
|
|
|
|
class bx_io_redirect_entry_t {
|
|
Bit64u value;
|
|
public:
|
|
Bit32u get_even_word () { return value & 0xffffffff; }
|
|
Bit32u get_odd_word () { return (value>>32) & 0xffffffff; }
|
|
void set_even_word (Bit32u even) {
|
|
// keep high 32 bits of value, replace low 32
|
|
value = ((value >> 32) << 32) | (even & 0xffffffff);
|
|
parse_value ();
|
|
}
|
|
void set_odd_word (Bit32u odd) {
|
|
// keep low 32 bits of value, replace high 32
|
|
value = (((Bit64u)odd & 0xffffffff) << 32) | (value & 0xffffffff);
|
|
parse_value ();
|
|
}
|
|
void parse_value ();
|
|
// parse_value sets the value and all the fields below. Do not change
|
|
// these fields except by calling parse_value.
|
|
Bit8u dest, masked, trig_mode, remote_irr, polarity, delivery_status, dest_mode, delivery_mode, vector;
|
|
void sprintf_self (char *buf);
|
|
};
|
|
|
|
class bx_ioapic_c : public bx_generic_apic_c {
|
|
Bit32u ioregsel; // selects between various registers
|
|
// interrupt request bitmask, not visible from the outside. Bits in the
|
|
// irr are set when trigger_irq is called, and cleared when the interrupt
|
|
// is delivered to the processor. If an interrupt is masked, the irr
|
|
// will still be set but delivery will not occur until it is unmasked.
|
|
// It's not clear if this is how the real device works.
|
|
Bit32u irr;
|
|
public:
|
|
bx_io_redirect_entry_t ioredtbl[BX_IOAPIC_NUM_PINS]; // table of redirections
|
|
bx_ioapic_c ();
|
|
~bx_ioapic_c ();
|
|
virtual void init ();
|
|
virtual void reset (unsigned type);
|
|
virtual void read_aligned(Bit32u address, Bit32u *data, unsigned len);
|
|
virtual void write(Bit32u address, Bit32u *value, unsigned len);
|
|
void trigger_irq (unsigned num, unsigned from);
|
|
void untrigger_irq (unsigned num, unsigned from);
|
|
void service_ioapic ();
|
|
virtual bx_bool match_logical_addr (Bit8u address) { return false; }
|
|
virtual bx_bool is_local_apic () { return false; }
|
|
virtual bx_apic_type_t get_type () { return APIC_TYPE_IOAPIC; }
|
|
};
|