summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/i386/i386.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/i386/i386.h')
-rw-r--r--src/devices/cpu/i386/i386.h152
1 files changed, 100 insertions, 52 deletions
diff --git a/src/devices/cpu/i386/i386.h b/src/devices/cpu/i386/i386.h
index 23128aaf45c..6a230365ff0 100644
--- a/src/devices/cpu/i386/i386.h
+++ b/src/devices/cpu/i386/i386.h
@@ -6,13 +6,12 @@
#pragma once
// SoftFloat 2 lacks an include guard
-#ifndef softfloat_h
-#define softfloat_h 1
+#ifndef softfloat2_h
+#define softfloat2_h 1
#include "softfloat/milieu.h"
#include "softfloat/softfloat.h"
#endif
-#include "debug/debugcpu.h"
#include "divtlb.h"
#include "i386dasm.h"
@@ -36,31 +35,30 @@ public:
auto smiact() { return m_smiact.bind(); }
auto ferr() { return m_ferr_handler.bind(); }
- uint64_t debug_segbase(symbol_table &table, int params, const uint64_t *param);
- uint64_t debug_seglimit(symbol_table &table, int params, const uint64_t *param);
- uint64_t debug_segofftovirt(symbol_table &table, int params, const uint64_t *param);
- uint64_t debug_virttophys(symbol_table &table, int params, const uint64_t *param);
- uint64_t debug_cacheflush(symbol_table &table, int params, const uint64_t *param);
+ uint64_t debug_segbase(int params, const uint64_t *param);
+ uint64_t debug_seglimit(int params, const uint64_t *param);
+ uint64_t debug_segofftovirt(int params, const uint64_t *param);
+ uint64_t debug_virttophys(int params, const uint64_t *param);
+ uint64_t debug_cacheflush(int params, const uint64_t *param);
protected:
i386_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int program_data_width, int program_addr_width, int io_data_width);
// device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
virtual void device_debug_setup() override;
// device_execute_interface overrides
- virtual uint32_t execute_min_cycles() const override { return 1; }
- virtual uint32_t execute_max_cycles() const override { return 40; }
- virtual uint32_t execute_input_lines() const override { return 32; }
- virtual bool execute_input_edge_triggered(int inputnum) const override { return inputnum == INPUT_LINE_NMI; }
+ virtual uint32_t execute_min_cycles() const noexcept override { return 1; }
+ virtual uint32_t execute_max_cycles() const noexcept override { return 40; }
+ virtual bool execute_input_edge_triggered(int inputnum) const noexcept override { return inputnum == INPUT_LINE_NMI; }
virtual void execute_run() override;
virtual void execute_set_input(int inputnum, int state) override;
// device_memory_interface overrides
virtual space_config_vector memory_space_config() const override;
- virtual bool memory_translate(int spacenum, int intention, offs_t &address) override;
+ virtual bool memory_translate(int spacenum, int intention, offs_t &address, address_space *&target_space) override;
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
@@ -90,9 +88,9 @@ protected:
virtual void cache_clean() {}
// routine to access memory
- virtual u8 mem_pr8(offs_t address) { return macache32->read_byte(address); }
- virtual u16 mem_pr16(offs_t address) { return macache32->read_word(address); }
- virtual u32 mem_pr32(offs_t address) { return macache32->read_dword(address); }
+ virtual u8 mem_pr8(offs_t address) { return macache32.read_byte(address); }
+ virtual u16 mem_pr16(offs_t address) { return macache32.read_word(address); }
+ virtual u32 mem_pr32(offs_t address) { return macache32.read_dword(address); }
address_space_config m_program_config;
address_space_config m_io_config;
@@ -228,6 +226,46 @@ protected:
FF_SSE3 = 1 << 0, // SSE3 Extensions
};
+ enum CR0_BITS : uint32_t {
+ CR0_PG = (u32)1 << 31, // Paging
+ CR0_CD = 1 << 30, // Cache disable
+ CR0_NW = 1 << 29, // Not writethrough
+ CR0_AM = 1 << 18, // Alignment mask
+ CR0_WP = 1 << 16, // Write protect
+ CR0_NE = 1 << 5, // Numeric error
+ CR0_ET = 1 << 4, // Extension type
+ CR0_TS = 1 << 3, // Task switched
+ CR0_EM = 1 << 2, // Emulation
+ CR0_MP = 1 << 1, // Monitor coprocessor
+ CR0_PE = 1 << 0, // Protection enabled
+ };
+
+ enum CR3_BITS : uint32_t {
+ CR3_PCD = 1 << 4,
+ CR3_PWT = 1 << 3,
+ };
+
+ enum CR4_BITS : uint32_t {
+ CR4_SMAP = 1 << 21,
+ CR4_SMEP = 1 << 20,
+ CR4_OSXSAVE = 1 << 18,
+ CR4_PCIDE = 1 << 17,
+ CR4_FSGSBASE = 1 << 16,
+ CR4_SMXE = 1 << 14,
+ CR4_VMXE = 1 << 13,
+ CR4_OSXMMEXCPT = 1 << 10,
+ CR4_OSFXSR = 1 << 9,
+ CR4_PCE = 1 << 8,
+ CR4_PGE = 1 << 7,
+ CR4_MCE = 1 << 6,
+ CR4_PAE = 1 << 5,
+ CR4_PSE = 1 << 4,
+ CR4_DE = 1 << 3,
+ CR4_TSD = 1 << 2,
+ CR4_PVI = 1 << 1,
+ CR4_VME = 1 << 0,
+ };
+
typedef void (i386_device::*i386_modrm_func)(uint8_t modrm);
typedef void (i386_device::*i386_op_func)();
struct X86_OPCODE {
@@ -275,8 +313,9 @@ protected:
uint32_t m_dr[8]; // Debug registers
uint32_t m_tr[8]; // Test registers
- memory_passthrough_handler* m_dr_breakpoints[4];
- int m_notifier;
+ memory_passthrough_handler m_dr_breakpoints[4];
+ util::notifier_subscription m_notifier;
+ bool m_dri_changed_active;
//386 Debug Register change handlers.
inline void dri_changed();
@@ -308,8 +347,8 @@ protected:
address_space *m_program;
address_space *m_io;
uint32_t m_a20_mask;
- memory_access_cache<1, 0, ENDIANNESS_LITTLE> *macache16;
- memory_access_cache<2, 0, ENDIANNESS_LITTLE> *macache32;
+ memory_access<32, 1, 0, ENDIANNESS_LITTLE>::cache macache16;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache macache32;
int m_cpuid_max_input_value_eax; // Highest CPUID standard function available
uint32_t m_cpuid_id0, m_cpuid_id1, m_cpuid_id2;
@@ -324,8 +363,10 @@ protected:
uint16_t m_x87_cw;
uint16_t m_x87_sw;
uint16_t m_x87_tw;
- uint64_t m_x87_data_ptr;
- uint64_t m_x87_inst_ptr;
+ uint16_t m_x87_ds;
+ uint32_t m_x87_data_ptr;
+ uint16_t m_x87_cs;
+ uint32_t m_x87_inst_ptr;
uint16_t m_x87_opcode;
i386_modrm_func m_opcode_table_x87_d8[256];
@@ -385,15 +426,17 @@ protected:
uint8_t m_opcode_bytes[16];
uint32_t m_opcode_pc;
int m_opcode_bytes_length;
+ offs_t m_opcode_addrs[16];
+ uint32_t m_opcode_addrs_index;
uint64_t m_debugger_temp;
void register_state_i386();
void register_state_i386_x87();
void register_state_i386_x87_xmm();
- uint32_t i386_translate(int segment, uint32_t ip, int rwn);
+ uint32_t i386_translate(int segment, uint32_t ip, int rwn, int size = 1);
inline vtlb_entry get_permissions(uint32_t pte, int wp);
- bool i386_translate_address(int intention, offs_t *address, vtlb_entry *entry);
+ bool i386_translate_address(int intention, bool debug, offs_t *address, vtlb_entry *entry);
bool translate_address(int pl, int type, uint32_t *address, uint32_t *error);
void CHANGE_PC(uint32_t pc);
inline void NEAR_BRANCH(int32_t offs);
@@ -466,8 +509,9 @@ protected:
void modrm_to_EA(uint8_t mod_rm, uint32_t* out_ea, uint8_t* out_segment);
uint32_t GetNonTranslatedEA(uint8_t modrm,uint8_t *seg);
uint32_t GetEA(uint8_t modrm, int rwn);
+ uint32_t Getx87EA(uint8_t modrm, int rwn);
void i386_check_sreg_validity(int reg);
- int i386_limit_check(int seg, uint32_t offset);
+ int i386_limit_check(int seg, uint32_t offset, int size = 1);
void i386_sreg_load(uint16_t selector, uint8_t reg, bool *fault);
void i386_trap(int irq, int irq_gate, int trap_level);
void i386_trap_with_error(int irq, int irq_gate, int trap_level, uint32_t error);
@@ -638,6 +682,7 @@ protected:
void i386_aam();
void i386_clts();
void i386_wait();
+ void i486_wait();
void i386_lock();
void i386_mov_r32_tr();
void i386_mov_tr_r32();
@@ -1016,7 +1061,8 @@ protected:
void i486_bswap_esi();
void i486_bswap_edi();
void i486_mov_cr_r32();
- inline void MMXPROLOG();
+ inline bool MMXPROLOG();
+ inline bool SSEPROLOG();
inline void READMMX(uint32_t ea,MMX_REG &r);
inline void WRITEMMX(uint32_t ea,MMX_REG &r);
inline void READXMM(uint32_t ea,XMM_REG &r);
@@ -1353,7 +1399,9 @@ protected:
inline void x87_set_stack_overflow();
int x87_inc_stack();
int x87_dec_stack();
- int x87_check_exceptions();
+ int x87_ck_over_stack();
+ int x87_check_exceptions(bool store = false);
+ int x87_mf_fault();
inline void x87_write_cw(uint16_t cw);
void x87_reset();
floatx80 x87_add(floatx80 a, floatx80 b);
@@ -1479,8 +1527,6 @@ protected:
void x87_fincstp(uint8_t modrm);
void x87_fclex(uint8_t modrm);
void x87_ffree(uint8_t modrm);
- void x87_fdisi(uint8_t modrm);
- void x87_feni(uint8_t modrm);
void x87_finit(uint8_t modrm);
void x87_fldcw(uint8_t modrm);
void x87_fstcw(uint8_t modrm);
@@ -1526,9 +1572,9 @@ public:
i386sx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
- virtual u8 mem_pr8(offs_t address) override { return macache16->read_byte(address); };
- virtual u16 mem_pr16(offs_t address) override { return macache16->read_word(address); };
- virtual u32 mem_pr32(offs_t address) override { return macache16->read_dword(address); };
+ virtual u8 mem_pr8(offs_t address) override { return macache16.read_byte(address); }
+ virtual u16 mem_pr16(offs_t address) override { return macache16.read_word(address); }
+ virtual u32 mem_pr32(offs_t address) override { return macache16.read_dword(address); }
virtual uint16_t READ16PL(uint32_t ea, uint8_t privilege) override;
virtual uint32_t READ32PL(uint32_t ea, uint8_t privilege) override;
@@ -1551,8 +1597,8 @@ public:
protected:
i486_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
};
class i486dx4_device : public i486_device
@@ -1562,7 +1608,7 @@ public:
i486dx4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
- virtual void device_reset() override;
+ virtual void device_reset() override ATTR_COLD;
};
@@ -1575,12 +1621,12 @@ public:
protected:
pentium_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
- virtual bool execute_input_edge_triggered(int inputnum) const override { return inputnum == INPUT_LINE_NMI || inputnum == INPUT_LINE_SMI; }
+ virtual bool execute_input_edge_triggered(int inputnum) const noexcept override { return inputnum == INPUT_LINE_NMI || inputnum == INPUT_LINE_SMI; }
virtual void execute_set_input(int inputnum, int state) override;
virtual uint64_t opcode_rdmsr(bool &valid_msr) override;
virtual void opcode_wrmsr(uint64_t data, bool &valid_msr) override;
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
};
@@ -1591,8 +1637,8 @@ public:
pentium_mmx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
};
@@ -1603,8 +1649,8 @@ public:
mediagx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
};
@@ -1619,8 +1665,8 @@ protected:
virtual uint64_t opcode_rdmsr(bool &valid_msr) override;
virtual void opcode_wrmsr(uint64_t data, bool &valid_msr) override;
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
};
@@ -1631,8 +1677,8 @@ public:
pentium2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
};
@@ -1643,8 +1689,10 @@ public:
pentium3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
+
+ virtual void opcode_cpuid() override;
};
@@ -1657,8 +1705,8 @@ public:
protected:
virtual uint64_t opcode_rdmsr(bool &valid_msr) override;
virtual void opcode_wrmsr(uint64_t data, bool &valid_msr) override;
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
};