Diff for /np2/i386c/ia32/cpu.h between versions 1.3 and 1.18

version 1.3, 2003/12/22 18:00:31 version 1.18, 2004/02/19 03:04:01
Line 75  typedef union { Line 75  typedef union {
 }  }
 #endif  #endif
   
 #include "cpu_io.h"  
 #include "cpu_mem.h"  
 #include "exception.h"  
 #include "paging.h"  
 #include "resolve.h"  
 #include "segments.h"  #include "segments.h"
 #include "task.h"  
   
 #ifdef __cplusplus  #ifdef __cplusplus
 extern "C" {  extern "C" {
Line 110  enum { Line 104  enum {
         CPU_SEGREG_NUM          CPU_SEGREG_NUM
 };  };
   
   enum {
           CPU_TEST_REG_NUM = 8
   };
   
   enum {
           CPU_DEBUG_REG_NUM = 8
   };
   
   enum {
           MAX_PREFIX = 8
   };
   
 typedef struct {  typedef struct {
         REG32           reg[CPU_REG_NUM];          REG32           reg[CPU_REG_NUM];
         WORD            sreg[CPU_SEGREG_NUM];          WORD            sreg[CPU_SEGREG_NUM];
   
         REG32           eflags;          REG32           eflags;
   
         REG32           eip;          REG32           eip;
   
         REG32           prev_eip;          REG32           prev_eip;
           REG32           prev_esp;
   
           DWORD           tr[CPU_TEST_REG_NUM];
           DWORD           dr[CPU_DEBUG_REG_NUM];
 } CPU_REGS;  } CPU_REGS;
   
 typedef struct {  typedef struct {
Line 128  typedef struct { Line 138  typedef struct {
   
         WORD            ldtr;          WORD            ldtr;
         WORD            tr;          WORD            tr;
         descriptor_t    ldtr_desc;  
         descriptor_t    tr_desc;  
   
         DWORD           cr0;          DWORD           cr0;
         DWORD           cr1;          DWORD           cr1;
Line 141  typedef struct { Line 149  typedef struct {
   
 typedef struct {  typedef struct {
         descriptor_t    sreg[CPU_SEGREG_NUM];          descriptor_t    sreg[CPU_SEGREG_NUM];
           descriptor_t    ldtr;
           descriptor_t    tr;
   
         DWORD           inport;          UINT32          adrsmask;
         DWORD           ovflag;          DWORD           ovflag;
   
         BYTE            ss_32;          BYTE            ss_32;
           BYTE            resetreq;
         BYTE            trap;          BYTE            trap;
         BYTE            cpu_type;  
         BYTE            _dummy;  
   
         BYTE            cpl;          BYTE            page_wp;
   
         BYTE            protected_mode;          BYTE            protected_mode;
         BYTE            paging;          BYTE            paging;
         BYTE            vm86;          BYTE            vm86;
           BYTE            user_mode;
   
           BYTE            hlt;
           BYTE            pad[3];
   
           DWORD           pde_base;
   
         DWORD           ioaddr;         /* I/O bitmap linear address */          DWORD           ioaddr;         /* I/O bitmap linear address */
         WORD            iolimit;        /* I/O bitmap count */          WORD            iolimit;        /* I/O bitmap count */
Line 177  typedef struct { Line 193  typedef struct {
         CPU_INST        cpu_inst;          CPU_INST        cpu_inst;
         CPU_INST        cpu_inst_default;          CPU_INST        cpu_inst_default;
   
           /* protected by cpu shut */
           UINT8           cpu_type;
           UINT8           itfbank;
           UINT16          ram_d0;
         SINT32          remainclock;          SINT32          remainclock;
         SINT32          baseclock;          SINT32          baseclock;
         UINT32          clock;          UINT32          clock;
   
         UINT32          adrsmask;                       /* ? */  
         UINT32          inport;                         /* ? */  
         UINT8           resetreq;  
         UINT8           itfbank;  
 } I386STAT;  } I386STAT;
   
 typedef struct {                                        /* for ver0.73 */  typedef struct {                                        /* for ver0.73 */
         BYTE    *ext;          BYTE            *ext;
         UINT32  extsize;          UINT32          extsize;
           UINT32          inport;
 } I386EXT;  } I386EXT;
   
 typedef struct {  typedef struct {
Line 201  extern I386CORE  i386core; Line 217  extern I386CORE  i386core;
   
 #define CPU_STATSAVE    i386core.s  #define CPU_STATSAVE    i386core.s
   
   #define CPU_ADRSMASK    i386core.s.cpu_stat.adrsmask
   #define CPU_RESETREQ    i386core.s.cpu_stat.resetreq
   
 #define CPU_REMCLOCK    i386core.s.remainclock  #define CPU_REMCLOCK    i386core.s.remainclock
 #define CPU_BASECLOCK   i386core.s.baseclock  #define CPU_BASECLOCK   i386core.s.baseclock
 #define CPU_CLOCK       i386core.s.clock  #define CPU_CLOCK       i386core.s.clock
 #define CPU_ADRSMASK    i386core.s.adrsmask  
 #define CPU_RESETREQ    i386core.s.resetreq  
 #define CPU_ITFBANK     i386core.s.itfbank  #define CPU_ITFBANK     i386core.s.itfbank
 #define CPU_INPADRS     i386core.s.inport  #define CPU_RAM_D000    i386core.s.ram_d0
   
   #define CPU_TYPE        i386core.s.cpu_type
   #define CPUTYPE_V30     0x01
   
 #define CPU_EXTMEM      i386core.e.ext  #define CPU_EXTMEM      i386core.e.ext
 #define CPU_EXTMEMSIZE  i386core.e.extsize  #define CPU_EXTMEMSIZE  i386core.e.extsize
   #define CPU_INPADRS     i386core.e.inport
   
 extern BYTE             iflags[];  extern sigjmp_buf       exec_1step_jmpbuf;
 extern jmp_buf          exec_1step_jmpbuf;  
   
   
 /*  /*
Line 225  extern jmp_buf  exec_1step_jmpbuf; Line 245  extern jmp_buf  exec_1step_jmpbuf;
 #define CPU_VENDOR_3    0x6c65746e      /* "ntel" */  #define CPU_VENDOR_3    0x6c65746e      /* "ntel" */
   
 /* version */  /* version */
 #define CPU_FAMILY      6  #define CPU_FAMILY      4
 #define CPU_MODEL       1  #if defined(USE_FPU)
   #define CPU_MODEL       1       /* 486DX */
   #else
   #define CPU_MODEL       2       /* 486SX */
   #endif
 #define CPU_STEPPING    3  #define CPU_STEPPING    3
   
 /* feature */  /* feature */
Line 286  do { \ Line 310  do { \
 #define CPU_STAT_SREG_INIT(n) \  #define CPU_STAT_SREG_INIT(n) \
 do { \  do { \
         descriptor_t sd; \          descriptor_t sd; \
         memset(&CPU_STAT_SREG(n), 0, sizeof(CPU_STAT_SREG(n))); \  \
         memset(&sd, 0, sizeof(sd)); \          memset(&sd, 0, sizeof(sd)); \
         sd.u.seg.limit = 0xffff; \          sd.u.seg.limit = 0xffff; \
         CPU_SET_SEGDESC_DEFAULT(&sd, (n), 0); \          CPU_SET_SEGDESC_DEFAULT(&sd, (n), 0); \
Line 323  do { \ Line 347  do { \
 #define CPU_EDI         CPU_REGS_DWORD(CPU_EDI_INDEX)  #define CPU_EDI         CPU_REGS_DWORD(CPU_EDI_INDEX)
 #define CPU_EIP         CPU_STATSAVE.cpu_regs.eip.d  #define CPU_EIP         CPU_STATSAVE.cpu_regs.eip.d
 #define CPU_PREV_EIP    CPU_STATSAVE.cpu_regs.prev_eip.d  #define CPU_PREV_EIP    CPU_STATSAVE.cpu_regs.prev_eip.d
   #define CPU_PREV_ESP    CPU_STATSAVE.cpu_regs.prev_esp.d
   
 #define CPU_ES          CPU_REGS_SREG(CPU_ES_INDEX)  #define CPU_ES          CPU_REGS_SREG(CPU_ES_INDEX)
 #define CPU_CS          CPU_REGS_SREG(CPU_CS_INDEX)  #define CPU_CS          CPU_REGS_SREG(CPU_CS_INDEX)
Line 343  do { \ Line 368  do { \
 #define CPU_FLAGL       CPU_STATSAVE.cpu_regs.eflags.b.l  #define CPU_FLAGL       CPU_STATSAVE.cpu_regs.eflags.b.l
 #define CPU_FLAGH       CPU_STATSAVE.cpu_regs.eflags.b.h  #define CPU_FLAGH       CPU_STATSAVE.cpu_regs.eflags.b.h
 #define CPU_TRAP        CPU_STATSAVE.cpu_stat.trap  #define CPU_TRAP        CPU_STATSAVE.cpu_stat.trap
   #if 0
 #define CPU_INPORT      CPU_STATSAVE.cpu_stat.inport  #define CPU_INPORT      CPU_STATSAVE.cpu_stat.inport
   #endif
 #define CPU_OV          CPU_STATSAVE.cpu_stat.ovflag  #define CPU_OV          CPU_STATSAVE.cpu_stat.ovflag
   
 #define C_FLAG          (1 << 0)  #define C_FLAG          (1 << 0)
Line 377  void set_flags(WORD new_flags, WORD mask Line 404  void set_flags(WORD new_flags, WORD mask
 void set_eflags(DWORD new_flags, DWORD mask);  void set_eflags(DWORD new_flags, DWORD mask);
   
   
 #define CPU_TYPE                CPU_STATSAVE.cpu_stat.cpu_type  
 #define CPUTYPE_V30             0x01  
   
 #define CPU_INST_OP32           CPU_STATSAVE.cpu_inst.op_32  #define CPU_INST_OP32           CPU_STATSAVE.cpu_inst.op_32
 #define CPU_INST_AS32           CPU_STATSAVE.cpu_inst.as_32  #define CPU_INST_AS32           CPU_STATSAVE.cpu_inst.as_32
 #define CPU_INST_REPUSE         CPU_STATSAVE.cpu_inst.rep_used  #define CPU_INST_REPUSE         CPU_STATSAVE.cpu_inst.rep_used
Line 392  void set_eflags(DWORD new_flags, DWORD m Line 416  void set_eflags(DWORD new_flags, DWORD m
 #define CPU_STAT_CS_LIMIT       CPU_STATSAVE.cpu_stat.sreg[CPU_CS_INDEX].u.seg.limit  #define CPU_STAT_CS_LIMIT       CPU_STATSAVE.cpu_stat.sreg[CPU_CS_INDEX].u.seg.limit
 #define CPU_STAT_CS_END         CPU_STATSAVE.cpu_stat.sreg[CPU_CS_INDEX].u.seg.segend  #define CPU_STAT_CS_END         CPU_STATSAVE.cpu_stat.sreg[CPU_CS_INDEX].u.seg.segend
   
   #define CPU_STAT_ADRSMASK       CPU_STATSAVE.cpu_stat.adrsmask
 #define CPU_STAT_SS32           CPU_STATSAVE.cpu_stat.ss_32  #define CPU_STAT_SS32           CPU_STATSAVE.cpu_stat.ss_32
   #define CPU_STAT_RESETREQ       CPU_STATSAVE.cpu_stat.resetreq
 #define CPU_STAT_PM             CPU_STATSAVE.cpu_stat.protected_mode  #define CPU_STAT_PM             CPU_STATSAVE.cpu_stat.protected_mode
 #define CPU_STAT_VM86           CPU_STATSAVE.cpu_stat.vm86  
 #define CPU_STAT_PAGING         CPU_STATSAVE.cpu_stat.paging  #define CPU_STAT_PAGING         CPU_STATSAVE.cpu_stat.paging
 #define CPU_STAT_CPL            CPU_STATSAVE.cpu_stat.cpl  #define CPU_STAT_VM86           CPU_STATSAVE.cpu_stat.vm86
   #define CPU_STAT_WP             CPU_STATSAVE.cpu_stat.page_wp
   #define CPU_STAT_CPL            CPU_STAT_SREG(CPU_CS_INDEX).rpl
   #define CPU_STAT_USER_MODE      CPU_STATSAVE.cpu_stat.user_mode
   #define CPU_STAT_PDE_BASE       CPU_STATSAVE.cpu_stat.pde_base
   
   #define CPU_STAT_HLT            CPU_STATSAVE.cpu_stat.hlt
   
 #define CPU_STAT_IOPL           ((CPU_EFLAG & IOPL_FLAG) >> 12)  #define CPU_STAT_IOPL           ((CPU_EFLAG & IOPL_FLAG) >> 12)
 #define CPU_IOPL0               0  #define CPU_IOPL0               0
Line 407  void set_eflags(DWORD new_flags, DWORD m Line 438  void set_eflags(DWORD new_flags, DWORD m
 #define CPU_STAT_IOADDR         CPU_STATSAVE.cpu_stat.ioaddr  #define CPU_STAT_IOADDR         CPU_STATSAVE.cpu_stat.ioaddr
 #define CPU_STAT_IOLIMIT        CPU_STATSAVE.cpu_stat.iolimit  #define CPU_STAT_IOLIMIT        CPU_STATSAVE.cpu_stat.iolimit
   
 #define CPU_STAT_NERROR         CPU_STATSAVE.cpu_stat.nerror  #define CPU_STAT_PREV_EXCEPTION         CPU_STATSAVE.cpu_stat.prev_exception
 #define CPU_STAT_PREV_EXCEPTION CPU_STATSAVE.cpu_stat.prev_exception  #define CPU_STAT_EXCEPTION_COUNTER              CPU_STATSAVE.cpu_stat.nerror
   #define CPU_STAT_EXCEPTION_COUNTER_INC()        CPU_STATSAVE.cpu_stat.nerror++
   #define CPU_STAT_EXCEPTION_COUNTER_CLEAR()      CPU_STATSAVE.cpu_stat.nerror = 0
   
   #define CPU_MODE_SUPERVISER     0
   #define CPU_MODE_USER           1
   #define CPU_SET_CPL(cpl) \
   do { \
           BYTE __t = (BYTE)((cpl) & 3); \
           CPU_STAT_CPL = __t; \
           CPU_STAT_USER_MODE = (__t == 3) ? CPU_MODE_USER : CPU_MODE_SUPERVISER; \
   } while (/*CONSTCOND*/ 0)
   
 #define CPU_CLI         do { CPU_FLAG &= ~I_FLAG;       \  #define CPU_CLI         do { CPU_FLAG &= ~I_FLAG;       \
                                         CPU_TRAP = 0; } while (/*CONSTCOND*/ 0)                                          CPU_TRAP = 0; } while (/*CONSTCOND*/ 0)
Line 420  void set_eflags(DWORD new_flags, DWORD m Line 462  void set_eflags(DWORD new_flags, DWORD m
 #define CPU_IDTR_LIMIT  CPU_STATSAVE.cpu_sysregs.idtr_limit  #define CPU_IDTR_LIMIT  CPU_STATSAVE.cpu_sysregs.idtr_limit
 #define CPU_IDTR_BASE   CPU_STATSAVE.cpu_sysregs.idtr_base  #define CPU_IDTR_BASE   CPU_STATSAVE.cpu_sysregs.idtr_base
 #define CPU_LDTR        CPU_STATSAVE.cpu_sysregs.ldtr  #define CPU_LDTR        CPU_STATSAVE.cpu_sysregs.ldtr
 #define CPU_LDTR_DESC   CPU_STATSAVE.cpu_sysregs.ldtr_desc  #define CPU_LDTR_DESC   CPU_STATSAVE.cpu_stat.ldtr
 #define CPU_LDTR_BASE   CPU_STATSAVE.cpu_sysregs.ldtr_desc.u.seg.segbase  #define CPU_LDTR_BASE   CPU_STATSAVE.cpu_stat.ldtr.u.seg.segbase
 #define CPU_LDTR_END    CPU_STATSAVE.cpu_sysregs.ldtr_desc.u.seg.segend  #define CPU_LDTR_END    CPU_STATSAVE.cpu_stat.ldtr.u.seg.segend
 #define CPU_LDTR_LIMIT  CPU_STATSAVE.cpu_sysregs.ldtr_desc.u.seg.limit  #define CPU_LDTR_LIMIT  CPU_STATSAVE.cpu_stat.ldtr.u.seg.limit
 #define CPU_TR          CPU_STATSAVE.cpu_sysregs.tr  #define CPU_TR          CPU_STATSAVE.cpu_sysregs.tr
 #define CPU_TR_DESC     CPU_STATSAVE.cpu_sysregs.tr_desc  #define CPU_TR_DESC     CPU_STATSAVE.cpu_stat.tr
 #define CPU_TR_BASE     CPU_STATSAVE.cpu_sysregs.tr_desc.u.seg.segbase  #define CPU_TR_BASE     CPU_STATSAVE.cpu_stat.tr.u.seg.segbase
 #define CPU_TR_END      CPU_STATSAVE.cpu_sysregs.tr_desc.u.seg.segend  #define CPU_TR_END      CPU_STATSAVE.cpu_stat.tr.u.seg.segend
 #define CPU_TR_LIMIT    CPU_STATSAVE.cpu_sysregs.tr_desc.u.seg.limit  #define CPU_TR_LIMIT    CPU_STATSAVE.cpu_stat.tr.u.seg.limit
   
 /*  /*
  * control register   * control register
  */   */
   #define CPU_MSW                 CPU_STATSAVE.cpu_sysregs.cr0
   
 #define CPU_CR0                 CPU_STATSAVE.cpu_sysregs.cr0  #define CPU_CR0                 CPU_STATSAVE.cpu_sysregs.cr0
 #define CPU_CR1                 CPU_STATSAVE.cpu_sysregs.cr1  #define CPU_CR1                 CPU_STATSAVE.cpu_sysregs.cr1
 #define CPU_CR2                 CPU_STATSAVE.cpu_sysregs.cr2  #define CPU_CR2                 CPU_STATSAVE.cpu_sysregs.cr2
Line 455  void set_eflags(DWORD new_flags, DWORD m Line 499  void set_eflags(DWORD new_flags, DWORD m
 #define CPU_CR3_PD_MASK         0xfffff000  #define CPU_CR3_PD_MASK         0xfffff000
 #define CPU_CR3_PWT             (1 << 3)  #define CPU_CR3_PWT             (1 << 3)
 #define CPU_CR3_PCD             (1 << 4)  #define CPU_CR3_PCD             (1 << 4)
   #define CPU_CR3_MASK            (CPU_CR3_PD_MASK|CPU_CR3_PWT|CPU_CR3_PCD)
   
 #define CPU_CR4_VME             (1 << 0)  #define CPU_CR4_VME             (1 << 0)
 #define CPU_CR4_PVI             (1 << 1)  #define CPU_CR4_PVI             (1 << 1)
Line 470  void set_eflags(DWORD new_flags, DWORD m Line 515  void set_eflags(DWORD new_flags, DWORD m
   
   
 void ia32_init(void);  void ia32_init(void);
   void ia32_initreg(void);
   void ia32_setextsize(UINT32 size);
   
 void ia32reset(void);  void ia32reset(void);
   void ia32shut(void);
 void ia32(void);  void ia32(void);
 void ia32withtrap(void);  void ia32withtrap(void);
 void ia32withdma(void);  void ia32withdma(void);
   
 void ia32_step(void);  void ia32_step(void);
 void CPUCALL ia32_interrupt(BYTE vect);  void CPUCALL ia32_interrupt(REG8 vect);
 void CPUCALL ia32_exception(DWORD vect, DWORD p1, DWORD p2);  void CPUCALL ia32_exception(DWORD vect, DWORD p1, DWORD p2);
   
 void exec_1step(void);  void exec_1step(void);
Line 485  void exec_1step(void); Line 533  void exec_1step(void);
 #define INST_STRING     (1 << 1)  #define INST_STRING     (1 << 1)
 #define REP_CHECKZF     (1 << 7)  #define REP_CHECKZF     (1 << 7)
   
 void disasm(WORD cs, DWORD maddr);  int disasm(DWORD *eip, char *buf, size_t size);
   
 void ia32_printf(const char *buf, ...);  void ia32_printf(const char *buf, ...);
 void ia32_warning(const char *buf, ...);  void ia32_warning(const char *buf, ...);
Line 495  void ia32_bioscall(void); Line 543  void ia32_bioscall(void);
   
 void FASTCALL change_pm(BOOL onoff);  void FASTCALL change_pm(BOOL onoff);
 void FASTCALL change_vm(BOOL onoff);  void FASTCALL change_vm(BOOL onoff);
   void FASTCALL change_pg(BOOL onoff);
   
 extern BYTE szpcflag[0x200];  extern const UINT8 iflags[];
   #define szpcflag        iflags
 extern BYTE szpflag_w[0x10000];  extern BYTE szpflag_w[0x10000];
   
 extern BYTE  *reg8_b20[0x100];  extern BYTE  *reg8_b20[0x100];
Line 506  extern WORD  *reg16_b53[0x100]; Line 556  extern WORD  *reg16_b53[0x100];
 extern DWORD *reg32_b20[0x100];  extern DWORD *reg32_b20[0x100];
 extern DWORD *reg32_b53[0x100];  extern DWORD *reg32_b53[0x100];
   
   extern const char *reg8_str[8];
   extern const char *reg16_str[8];
   extern const char *reg32_str[8];
   
   char *cpu_reg2str(void);
   #if defined(USE_FPU)
   char *fpu_reg2str(void);
   #endif
   void dbg_printf(const char *str, ...);
   
   
 /*  /*
  * Profile   * Misc.
  */   */
 #if defined(IA32_PROFILE_INSTRUCTION)  void gdtr_dump(DWORD base, DWORD limit);
 extern UINT32   inst_1byte_count[2][256];  void idtr_dump(DWORD base, DWORD limit);
 extern UINT32   inst_2byte_count[2][256];  void ldtr_dump(DWORD base, DWORD limit);
 extern UINT32   ea16_count[24];  void tr_dump(WORD selector, DWORD base, DWORD limit);
 extern UINT32   ea32_count[24];  
 extern UINT32   sib0_count[256];  
 extern UINT32   sib1_count[256];  
 extern UINT32   sib2_count[256];  
   
 #define PROFILE_INC_INST_1BYTE(op)      inst_1byte_count[CPU_INST_OP32][op]++  
 #define PROFILE_INC_INST_2BYTE(op)      inst_2byte_count[CPU_INST_OP32][op]++  
 #define PROFILE_INC_EA16(idx)           ea16_count[idx]++  
 #define PROFILE_INC_EA32(idx)           ea32_count[idx]++  
 #define PROFILE_INC_SIB0(op)            sib0_count[op]++  
 #define PROFILE_INC_SIB1(op)            sib1_count[op]++  
 #define PROFILE_INC_SIB2(op)            sib2_count[op]++  
 #else  
 #define PROFILE_INC_INST_1BYTE(op)  
 #define PROFILE_INC_INST_2BYTE(op)  
 #define PROFILE_INC_EA16(idx)  
 #define PROFILE_INC_EA32(idx)  
 #define PROFILE_INC_SIB0(op)  
 #define PROFILE_INC_SIB1(op)  
 #define PROFILE_INC_SIB2(op)  
 #endif  
   
 #ifdef __cplusplus  #ifdef __cplusplus
 }  }
 #endif  #endif
   
   #include "cpu_io.h"
   #include "cpu_mem.h"
   #include "exception.h"
   #include "paging.h"
   #include "resolve.h"
   #include "task.h"
   
 #endif  /* !IA32_CPU_CPU_H__ */  #endif  /* !IA32_CPU_CPU_H__ */

Removed from v.1.3  
changed lines
  Added in v.1.18


RetroPC.NET-CVS <cvs@retropc.net>