| version 1.10, 2004/01/23 16:32:36 | version 1.20, 2004/03/05 14:17:35 | 
| Line 32 | Line 32 | 
 |  |  | 
 | Copyright by Yui/Studio Milmake 1999-2000 | Copyright by Yui/Studio Milmake 1999-2000 | 
 | Copyright by Norio HATTORI 2000,2001 | Copyright by Norio HATTORI 2000,2001 | 
| Copyright by NONAKA Kimihiro 2002-2003 | Copyright by NONAKA Kimihiro 2002-2004 | 
 | */ | */ | 
 |  |  | 
 | #ifndef IA32_CPU_CPU_H__ | #ifndef IA32_CPU_CPU_H__ | 
| Line 47  extern "C" { | Line 47  extern "C" { | 
 | typedef union { | typedef union { | 
 | #if defined(BYTESEX_LITTLE) | #if defined(BYTESEX_LITTLE) | 
 | struct { | struct { | 
| BYTE    l; | UINT8   l; | 
| BYTE    h; | UINT8   h; | 
| BYTE    _hl; | UINT8   _hl; | 
| BYTE    _hh; | UINT8   _hh; | 
 | } b; | } b; | 
 | struct { | struct { | 
| WORD    w; | UINT16  w; | 
| WORD    _hw; | UINT16  _hw; | 
 | } w; | } w; | 
 | #elif defined(BYTESEX_BIG) | #elif defined(BYTESEX_BIG) | 
 | struct { | struct { | 
| BYTE    _hh; | UINT8   _hh; | 
| BYTE    _hl; | UINT8   _hl; | 
| BYTE    h; | UINT8   h; | 
| BYTE    l; | UINT8   l; | 
 | } b; | } b; | 
 | struct { | struct { | 
| WORD    _hw; | UINT16  _hw; | 
| WORD    w; | UINT16  w; | 
 | } w; | } w; | 
 | #endif | #endif | 
| DWORD   d; | UINT32  d; | 
 | } REG32; | } REG32; | 
 |  |  | 
 | #ifdef __cplusplus | #ifdef __cplusplus | 
 | } | } | 
 | #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 122  enum { | Line 116  enum { | 
 | MAX_PREFIX = 8 | MAX_PREFIX = 8 | 
 | }; | }; | 
 |  |  | 
 |  | enum { | 
 |  | CPU_PREFETCH_QUEUE_LENGTH = 16 | 
 |  | }; | 
 |  |  | 
 | typedef struct { | typedef struct { | 
 | REG32           reg[CPU_REG_NUM]; | REG32           reg[CPU_REG_NUM]; | 
| WORD            sreg[CPU_SEGREG_NUM]; | UINT16          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]; | UINT32          tr[CPU_TEST_REG_NUM]; | 
| DWORD           dr[CPU_DEBUG_REG_NUM]; | UINT32          dr[CPU_DEBUG_REG_NUM]; | 
 | } CPU_REGS; | } CPU_REGS; | 
 |  |  | 
 | typedef struct { | typedef struct { | 
| WORD            gdtr_limit; | UINT16          gdtr_limit; | 
| DWORD           gdtr_base; | UINT32          gdtr_base; | 
| WORD            idtr_limit; | UINT16          idtr_limit; | 
| DWORD           idtr_base; | UINT32          idtr_base; | 
|  |  | 
| WORD            ldtr; | UINT16          ldtr; | 
| WORD            tr; | UINT16          tr; | 
| descriptor_t    ldtr_desc; |  | 
| descriptor_t    tr_desc; | UINT32          cr0; | 
|  | UINT32          cr1; | 
| DWORD           cr0; | UINT32          cr2; | 
| DWORD           cr1; | UINT32          cr3; | 
| DWORD           cr2; | UINT32          cr4; | 
| DWORD           cr3; | UINT32          mxcsr; | 
| DWORD           cr4; |  | 
| DWORD           mxcsr; |  | 
 | } CPU_SYSREGS; | } CPU_SYSREGS; | 
 |  |  | 
 | typedef struct { | typedef struct { | 
 | descriptor_t    sreg[CPU_SEGREG_NUM]; | descriptor_t    sreg[CPU_SEGREG_NUM]; | 
 |  | descriptor_t    ldtr; | 
 |  | descriptor_t    tr; | 
 |  |  | 
 |  | BYTE            prefetch[CPU_PREFETCH_QUEUE_LENGTH]; | 
 |  | UINT32          prefetch_remain; | 
 |  |  | 
 | UINT32          adrsmask; | UINT32          adrsmask; | 
| DWORD           ovflag; | UINT32          ovflag; | 
|  |  | 
|  | UINT8           ss_32; | 
|  | UINT8           resetreq; | 
|  | UINT8           trap; | 
 |  |  | 
| BYTE            ss_32; | UINT8           page_wp; | 
| BYTE            resetreq; |  | 
| BYTE            trap; |  | 
| BYTE            _dummy; |  | 
|  |  | 
| BYTE            cpl; |  | 
| BYTE            protected_mode; |  | 
| BYTE            paging; |  | 
| BYTE            vm86; |  | 
 |  |  | 
| DWORD           ioaddr;         /* I/O bitmap linear address */ | UINT8           protected_mode; | 
| WORD            iolimit;        /* I/O bitmap count */ | UINT8           paging; | 
|  | UINT8           vm86; | 
|  | UINT8           user_mode; | 
 |  |  | 
| BYTE            nerror;         /* double fault/ triple fault */ | UINT8           hlt; | 
| BYTE            prev_exception; | UINT8           pad[3]; | 
|  |  | 
|  | UINT32          pde_base; | 
|  |  | 
|  | UINT32          ioaddr;         /* I/O bitmap linear address */ | 
|  | UINT16          iolimit;        /* I/O bitmap count */ | 
|  |  | 
|  | UINT8           nerror;         /* double fault/ triple fault */ | 
|  | UINT8           prev_exception; | 
 | } CPU_STAT; | } CPU_STAT; | 
 |  |  | 
 | typedef struct { | typedef struct { | 
| BYTE            op_32; | UINT8           op_32; | 
| BYTE            as_32; | UINT8           as_32; | 
| BYTE            rep_used; | UINT8           rep_used; | 
| BYTE            seg_used; | UINT8           seg_used; | 
| DWORD           seg_base; | UINT32          seg_base; | 
 | } CPU_INST; | } CPU_INST; | 
 |  |  | 
 | typedef struct { | typedef struct { | 
| Line 232  extern I386CORE  i386core; | Line 240  extern I386CORE  i386core; | 
 | #define CPU_EXTMEMSIZE  i386core.e.extsize | #define CPU_EXTMEMSIZE  i386core.e.extsize | 
 | #define CPU_INPADRS     i386core.e.inport | #define CPU_INPADRS     i386core.e.inport | 
 |  |  | 
 | extern BYTE             iflags[]; |  | 
 | extern sigjmp_buf       exec_1step_jmpbuf; | extern sigjmp_buf       exec_1step_jmpbuf; | 
 |  |  | 
 |  |  | 
| Line 246  extern sigjmp_buf exec_1step_jmpbuf; | Line 253  extern sigjmp_buf exec_1step_jmpbuf; | 
 |  |  | 
 | /* version */ | /* version */ | 
 | #define CPU_FAMILY      4 | #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 343  do { \ | Line 354  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 351  do { \ | Line 363  do { \ | 
 | #define CPU_FS          CPU_REGS_SREG(CPU_FS_INDEX) | #define CPU_FS          CPU_REGS_SREG(CPU_FS_INDEX) | 
 | #define CPU_GS          CPU_REGS_SREG(CPU_GS_INDEX) | #define CPU_GS          CPU_REGS_SREG(CPU_GS_INDEX) | 
 |  |  | 
| #define ES_BASE         CPU_STATSAVE.cpu_stat.sreg[CPU_ES_INDEX].u.seg.segbase | #define ES_BASE         CPU_STAT_SREGBASE(CPU_ES_INDEX) | 
| #define CS_BASE         CPU_STATSAVE.cpu_stat.sreg[CPU_CS_INDEX].u.seg.segbase | #define CS_BASE         CPU_STAT_SREGBASE(CPU_CS_INDEX) | 
| #define SS_BASE         CPU_STATSAVE.cpu_stat.sreg[CPU_SS_INDEX].u.seg.segbase | #define SS_BASE         CPU_STAT_SREGBASE(CPU_SS_INDEX) | 
| #define DS_BASE         CPU_STATSAVE.cpu_stat.sreg[CPU_DS_INDEX].u.seg.segbase | #define DS_BASE         CPU_STAT_SREGBASE(CPU_DS_INDEX) | 
| #define FS_BASE         CPU_STATSAVE.cpu_stat.sreg[CPU_FS_INDEX].u.seg.segbase | #define FS_BASE         CPU_STAT_SREGBASE(CPU_FS_INDEX) | 
| #define GS_BASE         CPU_STATSAVE.cpu_stat.sreg[CPU_GS_INDEX].u.seg.segbase | #define GS_BASE         CPU_STAT_SREGBASE(CPU_GS_INDEX) | 
 |  |  | 
 | #define CPU_EFLAG       CPU_STATSAVE.cpu_regs.eflags.d | #define CPU_EFLAG       CPU_STATSAVE.cpu_regs.eflags.d | 
 | #define CPU_FLAG        CPU_STATSAVE.cpu_regs.eflags.w.w | #define CPU_FLAG        CPU_STATSAVE.cpu_regs.eflags.w.w | 
 | #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 | 
| // #define CPU_INPORT   CPU_STATSAVE.cpu_stat.inport | #define CPU_INPORT      CPU_STATSAVE.cpu_stat.inport | 
 | #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 393  do { \ | Line 405  do { \ | 
 | #define REAL_FLAGREG    ((CPU_FLAG & 0xf7ff) | (CPU_OV ? O_FLAG : 0)) | #define REAL_FLAGREG    ((CPU_FLAG & 0xf7ff) | (CPU_OV ? O_FLAG : 0)) | 
 | #define REAL_EFLAGREG   ((CPU_EFLAG & 0xfffff7ff) | (CPU_OV ? O_FLAG : 0)) | #define REAL_EFLAGREG   ((CPU_EFLAG & 0xfffff7ff) | (CPU_OV ? O_FLAG : 0)) | 
 |  |  | 
| void set_flags(WORD new_flags, WORD mask); | void set_flags(UINT16 new_flags, UINT16 mask); | 
| void set_eflags(DWORD new_flags, DWORD mask); | void set_eflags(UINT32 new_flags, UINT32 mask); | 
 |  |  | 
 |  |  | 
 | #define CPU_INST_OP32           CPU_STATSAVE.cpu_inst.op_32 | #define CPU_INST_OP32           CPU_STATSAVE.cpu_inst.op_32 | 
| Line 405  void set_eflags(DWORD new_flags, DWORD m | Line 417  void set_eflags(DWORD new_flags, DWORD m | 
 | #define DS_FIX  (!CPU_INST_SEGUSE ? CPU_DS_INDEX : CPU_INST_SEGREG_INDEX) | #define DS_FIX  (!CPU_INST_SEGUSE ? CPU_DS_INDEX : CPU_INST_SEGREG_INDEX) | 
 | #define SS_FIX  (!CPU_INST_SEGUSE ? CPU_SS_INDEX : CPU_INST_SEGREG_INDEX) | #define SS_FIX  (!CPU_INST_SEGUSE ? CPU_SS_INDEX : CPU_INST_SEGREG_INDEX) | 
 |  |  | 
| #define CPU_STAT_CS_BASE        CPU_STATSAVE.cpu_stat.sreg[CPU_CS_INDEX].u.seg.limit | #define CPU_STAT_CS_BASE        CPU_STAT_SREGBASE(CPU_CS_INDEX) | 
| #define CPU_STAT_CS_LIMIT       CPU_STATSAVE.cpu_stat.sreg[CPU_CS_INDEX].u.seg.limit | #define CPU_STAT_CS_LIMIT       CPU_STAT_SREGLIMIT(CPU_CS_INDEX) | 
| #define CPU_STAT_CS_END         CPU_STATSAVE.cpu_stat.sreg[CPU_CS_INDEX].u.seg.segend | #define CPU_STAT_CS_END         CPU_STAT_SREGEND(CPU_CS_INDEX) | 
 |  |  | 
 | #define CPU_STAT_ADRSMASK       CPU_STATSAVE.cpu_stat.adrsmask | #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_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 426  void set_eflags(DWORD new_flags, DWORD m | Line 443  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_PREFETCHQ           CPU_STATSAVE.cpu_stat.prefetch | 
|  | #define CPU_PREFETCHQ_REMAIN    CPU_STATSAVE.cpu_stat.prefetch_remain | 
|  |  | 
|  | #if defined(IA32_SUPPORT_PREFETCH_QUEUE) | 
|  | #define CPU_PREFETCH_CLEAR()    CPU_PREFETCHQ_REMAIN = 0 | 
|  | #else   /* !IA32_SUPPORT_PREFETCH_QUEUE */ | 
|  | #define CPU_PREFETCH_CLEAR() | 
|  | #endif  /* IA32_SUPPORT_PREFETCH_QUEUE */ | 
|  |  | 
|  | #define CPU_MODE_SUPERVISER     0 | 
|  | #define CPU_MODE_USER           1 | 
|  | #define CPU_SET_CPL(cpl) \ | 
|  | do { \ | 
|  | UINT8 __t = (UINT8)((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; \ | 
|  | CPU_TRAP = 0; \ | 
|  | } while (/*CONSTCOND*/0) | 
 |  |  | 
| #define CPU_CLI         do { CPU_FLAG &= ~I_FLAG;       \ | #define CPU_STI \ | 
| CPU_TRAP = 0; } while (/*CONSTCOND*/ 0) | do { \ | 
| #define CPU_STI         do { CPU_FLAG |= I_FLAG;        \ | CPU_FLAG |= I_FLAG; \ | 
| CPU_TRAP = (CPU_FLAG >> 8) & 1; } while (/*CONSTCOND*/0) | CPU_TRAP = (CPU_FLAG >> 8) & 1; \ | 
|  | } while (/*CONSTCOND*/0) | 
 |  |  | 
 | #define CPU_GDTR_LIMIT  CPU_STATSAVE.cpu_sysregs.gdtr_limit | #define CPU_GDTR_LIMIT  CPU_STATSAVE.cpu_sysregs.gdtr_limit | 
 | #define CPU_GDTR_BASE   CPU_STATSAVE.cpu_sysregs.gdtr_base | #define CPU_GDTR_BASE   CPU_STATSAVE.cpu_sysregs.gdtr_base | 
 | #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 | 
| Line 492  void set_eflags(DWORD new_flags, DWORD m | Line 536  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 ia32shut(void); | 
| Line 500  void ia32withtrap(void); | Line 546  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(int vect); | 
| void CPUCALL ia32_exception(DWORD vect, DWORD p1, DWORD p2); | void CPUCALL ia32_exception(int vect, int p1, int p2); | 
 |  |  | 
 | void exec_1step(void); | void exec_1step(void); | 
 | #define INST_PREFIX     (1 << 0) | #define INST_PREFIX     (1 << 0) | 
 | #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); |  | 
 |  |  | 
 | void ia32_printf(const char *buf, ...); | void ia32_printf(const char *buf, ...); | 
 | void ia32_warning(const char *buf, ...); | void ia32_warning(const char *buf, ...); | 
 | void ia32_panic(const char *buf, ...); | void ia32_panic(const char *buf, ...); | 
| Line 518  void ia32_bioscall(void); | Line 562  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[]; | 
| extern BYTE szpflag_w[0x10000]; | #define szpcflag        iflags | 
|  | extern UINT8 szpflag_w[0x10000]; | 
| extern BYTE  *reg8_b20[0x100]; |  | 
| extern BYTE  *reg8_b53[0x100]; | extern UINT8 *reg8_b20[0x100]; | 
| extern WORD  *reg16_b20[0x100]; | extern UINT8 *reg8_b53[0x100]; | 
| extern WORD  *reg16_b53[0x100]; | extern UINT16 *reg16_b20[0x100]; | 
| extern DWORD *reg32_b20[0x100]; | extern UINT16 *reg16_b53[0x100]; | 
| extern DWORD *reg32_b53[0x100]; | extern UINT32 *reg32_b20[0x100]; | 
|  | extern UINT32 *reg32_b53[0x100]; | 
 |  |  | 
 | extern const char *reg8_str[8]; | extern const char *reg8_str[8]; | 
 | extern const char *reg16_str[8]; | extern const char *reg16_str[8]; | 
 | extern const char *reg32_str[8]; | extern const char *reg32_str[8]; | 
 |  |  | 
 |  | char *cpu_reg2str(void); | 
 |  | #if defined(USE_FPU) | 
 |  | char *fpu_reg2str(void); | 
 |  | #endif | 
 |  | void put_cpuinfo(void); | 
 |  | void dbg_printf(const char *str, ...); | 
 |  |  | 
 |  |  | 
 | /* | /* | 
 | * Misc. | * Misc. | 
 | */ | */ | 
| void gdtr_dump(DWORD base, DWORD limit); | void gdtr_dump(UINT32 base, UINT limit); | 
| void idtr_dump(DWORD base, DWORD limit); | void idtr_dump(UINT32 base, UINT limit); | 
| void ldtr_dump(DWORD base, DWORD limit); | void ldtr_dump(UINT32 base, UINT limit); | 
| void tr_dump(WORD selector, DWORD base, DWORD limit); | void tr_dump(UINT16 selector, UINT32 base, UINT limit); | 
|  |  | 
|  | /* | 
|  | * disasm | 
|  | */ | 
|  | /* context */ | 
|  | typedef struct { | 
|  | UINT32 val; | 
|  |  | 
|  | UINT32 eip; | 
|  | BOOL op32; | 
|  | BOOL as32; | 
|  |  | 
|  | UINT32 baseaddr; | 
|  | UINT8 opcode[3]; | 
|  | UINT8 modrm; | 
|  | UINT8 sib; | 
|  |  | 
|  | BOOL useseg; | 
|  | int seg; | 
|  |  | 
|  | UINT8 opbyte[32]; | 
|  | int nopbytes; | 
|  |  | 
|  | char str[256]; | 
|  | size_t remain; | 
|  |  | 
|  | char *next; | 
|  | char *prefix; | 
|  | char *op; | 
|  | char *arg[3]; | 
|  | int narg; | 
|  |  | 
|  | char pad; | 
|  | } disasm_context_t; | 
|  |  | 
|  | int disasm(UINT32 *eip, disasm_context_t *ctx); | 
|  |  | 
 |  |  | 
 | #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__ */ |