⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpu.h

📁 qemu虚拟机代码
💻 H
📖 第 1 页 / 共 2 页
字号:
    CC_OP_LOGICQ,    CC_OP_INCB, /* modify all flags except, CC_DST = res, CC_SRC = C */    CC_OP_INCW,    CC_OP_INCL,    CC_OP_INCQ,    CC_OP_DECB, /* modify all flags except, CC_DST = res, CC_SRC = C  */    CC_OP_DECW,    CC_OP_DECL,    CC_OP_DECQ,    CC_OP_SHLB, /* modify all flags, CC_DST = res, CC_SRC.msb = C */    CC_OP_SHLW,    CC_OP_SHLL,    CC_OP_SHLQ,    CC_OP_SARB, /* modify all flags, CC_DST = res, CC_SRC.lsb = C */    CC_OP_SARW,    CC_OP_SARL,    CC_OP_SARQ,    CC_OP_NB,};#ifdef FLOATX80#define USE_X86LDOUBLE#endif#ifdef USE_X86LDOUBLEtypedef floatx80 CPU86_LDouble;#elsetypedef float64 CPU86_LDouble;#endiftypedef struct SegmentCache {    uint32_t selector;    target_ulong base;    uint32_t limit;    uint32_t flags;} SegmentCache;typedef union {    uint8_t _b[16];    uint16_t _w[8];    uint32_t _l[4];    uint64_t _q[2];    float32 _s[4];    float64 _d[2];} XMMReg;typedef union {    uint8_t _b[8];    uint16_t _w[2];    uint32_t _l[1];    uint64_t q;} MMXReg;#ifdef WORDS_BIGENDIAN#define XMM_B(n) _b[15 - (n)]#define XMM_W(n) _w[7 - (n)]#define XMM_L(n) _l[3 - (n)]#define XMM_S(n) _s[3 - (n)]#define XMM_Q(n) _q[1 - (n)]#define XMM_D(n) _d[1 - (n)]#define MMX_B(n) _b[7 - (n)]#define MMX_W(n) _w[3 - (n)]#define MMX_L(n) _l[1 - (n)]#else#define XMM_B(n) _b[n]#define XMM_W(n) _w[n]#define XMM_L(n) _l[n]#define XMM_S(n) _s[n]#define XMM_Q(n) _q[n]#define XMM_D(n) _d[n]#define MMX_B(n) _b[n]#define MMX_W(n) _w[n]#define MMX_L(n) _l[n]#endif#define MMX_Q(n) q#ifdef TARGET_X86_64#define CPU_NB_REGS 16#else#define CPU_NB_REGS 8#endiftypedef struct CPUX86State {#if TARGET_LONG_BITS > HOST_LONG_BITS    /* temporaries if we cannot store them in host registers */    target_ulong t0, t1, t2;#endif    /* standard registers */    target_ulong regs[CPU_NB_REGS];    target_ulong eip;    target_ulong eflags; /* eflags register. During CPU emulation, CC                        flags and DF are set to zero because they are                        stored elsewhere */    /* emulator internal eflags handling */    target_ulong cc_src;    target_ulong cc_dst;    uint32_t cc_op;    int32_t df; /* D flag : 1 if D = 0, -1 if D = 1 */    uint32_t hflags; /* hidden flags, see HF_xxx constants */    /* segments */    SegmentCache segs[6]; /* selector values */    SegmentCache ldt;    SegmentCache tr;    SegmentCache gdt; /* only base and limit are used */    SegmentCache idt; /* only base and limit are used */    target_ulong cr[5]; /* NOTE: cr1 is unused */    uint32_t a20_mask;    /* FPU state */    unsigned int fpstt; /* top of stack index */    unsigned int fpus;    unsigned int fpuc;    uint8_t fptags[8];   /* 0 = valid, 1 = empty */    union {#ifdef USE_X86LDOUBLE        CPU86_LDouble d __attribute__((aligned(16)));#else        CPU86_LDouble d;#endif        MMXReg mmx;    } fpregs[8];    /* emulator internal variables */    float_status fp_status;    CPU86_LDouble ft0;    union {	float f;        double d;	int i32;        int64_t i64;    } fp_convert;        float_status sse_status;    uint32_t mxcsr;    XMMReg xmm_regs[CPU_NB_REGS];    XMMReg xmm_t0;    MMXReg mmx_t0;    /* sysenter registers */    uint32_t sysenter_cs;    uint32_t sysenter_esp;    uint32_t sysenter_eip;    uint64_t efer;    uint64_t star;#ifdef TARGET_X86_64    target_ulong lstar;    target_ulong cstar;    target_ulong fmask;    target_ulong kernelgsbase;#endif    uint64_t pat;    /* temporary data for USE_CODE_COPY mode */#ifdef USE_CODE_COPY    uint32_t tmp0;    uint32_t saved_esp;    int native_fp_regs; /* if true, the FPU state is in the native CPU regs */#endif        /* exception/interrupt handling */    jmp_buf jmp_env;    int exception_index;    int error_code;    int exception_is_int;    target_ulong exception_next_eip;    target_ulong dr[8]; /* debug registers */    int interrupt_request;     int user_mode_only; /* user mode only simulation */    CPU_COMMON    /* processor features (e.g. for CPUID insn) */    uint32_t cpuid_level;    uint32_t cpuid_vendor1;    uint32_t cpuid_vendor2;    uint32_t cpuid_vendor3;    uint32_t cpuid_version;    uint32_t cpuid_features;    uint32_t cpuid_ext_features;    uint32_t cpuid_xlevel;    uint32_t cpuid_model[12];    uint32_t cpuid_ext2_features;    #ifdef USE_KQEMU    int kqemu_enabled;    int last_io_time;#endif    /* in order to simplify APIC support, we leave this pointer to the       user */    struct APICState *apic_state;} CPUX86State;CPUX86State *cpu_x86_init(void);int cpu_x86_exec(CPUX86State *s);void cpu_x86_close(CPUX86State *s);int cpu_get_pic_interrupt(CPUX86State *s);/* MSDOS compatibility mode FPU exception support */void cpu_set_ferr(CPUX86State *s);/* this function must always be used to load data in the segment   cache: it synchronizes the hflags with the segment cache values */static inline void cpu_x86_load_seg_cache(CPUX86State *env,                                           int seg_reg, unsigned int selector,                                          uint32_t base, unsigned int limit,                                           unsigned int flags){    SegmentCache *sc;    unsigned int new_hflags;        sc = &env->segs[seg_reg];    sc->selector = selector;    sc->base = base;    sc->limit = limit;    sc->flags = flags;    /* update the hidden flags */    {        if (seg_reg == R_CS) {#ifdef TARGET_X86_64            if ((env->hflags & HF_LMA_MASK) && (flags & DESC_L_MASK)) {                /* long mode */                env->hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;                env->hflags &= ~(HF_ADDSEG_MASK);            } else #endif            {                /* legacy / compatibility case */                new_hflags = (env->segs[R_CS].flags & DESC_B_MASK)                    >> (DESC_B_SHIFT - HF_CS32_SHIFT);                env->hflags = (env->hflags & ~(HF_CS32_MASK | HF_CS64_MASK)) |                    new_hflags;            }        }        new_hflags = (env->segs[R_SS].flags & DESC_B_MASK)            >> (DESC_B_SHIFT - HF_SS32_SHIFT);        if (env->hflags & HF_CS64_MASK) {            /* zero base assumed for DS, ES and SS in long mode */        } else if (!(env->cr[0] & CR0_PE_MASK) ||                    (env->eflags & VM_MASK) ||                   !(env->hflags & HF_CS32_MASK)) {            /* XXX: try to avoid this test. The problem comes from the               fact that is real mode or vm86 mode we only modify the               'base' and 'selector' fields of the segment cache to go               faster. A solution may be to force addseg to one in               translate-i386.c. */            new_hflags |= HF_ADDSEG_MASK;        } else {            new_hflags |= ((env->segs[R_DS].base |                             env->segs[R_ES].base |                            env->segs[R_SS].base) != 0) <<                 HF_ADDSEG_SHIFT;        }        env->hflags = (env->hflags &                        ~(HF_SS32_MASK | HF_ADDSEG_MASK)) | new_hflags;    }}/* wrapper, just in case memory mappings must be changed */static inline void cpu_x86_set_cpl(CPUX86State *s, int cpl){#if HF_CPL_MASK == 3    s->hflags = (s->hflags & ~HF_CPL_MASK) | cpl;#else#error HF_CPL_MASK is hardcoded#endif}/* used for debug or cpu save/restore */void cpu_get_fp80(uint64_t *pmant, uint16_t *pexp, CPU86_LDouble f);CPU86_LDouble cpu_set_fp80(uint64_t mant, uint16_t upper);/* the following helpers are only usable in user mode simulation as   they can trigger unexpected exceptions */void cpu_x86_load_seg(CPUX86State *s, int seg_reg, int selector);void cpu_x86_fsave(CPUX86State *s, uint8_t *ptr, int data32);void cpu_x86_frstor(CPUX86State *s, uint8_t *ptr, int data32);/* you can call this signal handler from your SIGBUS and SIGSEGV   signal handlers to inform the virtual CPU of exceptions. non zero   is returned if the signal was handled by the virtual CPU.  */struct siginfo;int cpu_x86_signal_handler(int host_signum, struct siginfo *info,                            void *puc);void cpu_x86_set_a20(CPUX86State *env, int a20_state);uint64_t cpu_get_tsc(CPUX86State *env);void cpu_set_apic_base(CPUX86State *env, uint64_t val);uint64_t cpu_get_apic_base(CPUX86State *env);void cpu_set_apic_tpr(CPUX86State *env, uint8_t val);#ifndef NO_CPU_IO_DEFSuint8_t cpu_get_apic_tpr(CPUX86State *env);#endif/* will be suppressed */void cpu_x86_update_cr0(CPUX86State *env, uint32_t new_cr0);/* used to debug */#define X86_DUMP_FPU  0x0001 /* dump FPU state too */#define X86_DUMP_CCOP 0x0002 /* dump qemu flag cache */#ifdef USE_KQEMUstatic inline int cpu_get_time_fast(void){    int low, high;    asm volatile("rdtsc" : "=a" (low), "=d" (high));    return low;}#endif#define TARGET_PAGE_BITS 12#include "cpu-all.h"#endif /* CPU_I386_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -