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

📄 helper2.c.svn-base

📁 我们自己开发的一个OSEK操作系统!不知道可不可以?
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
}/***********************************************************//* x86 debug */static const char *cc_op_str[] = {    "DYNAMIC",    "EFLAGS",    "MULB",    "MULW",    "MULL",    "MULQ",    "ADDB",    "ADDW",    "ADDL",    "ADDQ",    "ADCB",    "ADCW",    "ADCL",    "ADCQ",    "SUBB",    "SUBW",    "SUBL",    "SUBQ",    "SBBB",    "SBBW",    "SBBL",    "SBBQ",    "LOGICB",    "LOGICW",    "LOGICL",    "LOGICQ",    "INCB",    "INCW",    "INCL",    "INCQ",    "DECB",    "DECW",    "DECL",    "DECQ",    "SHLB",    "SHLW",    "SHLL",    "SHLQ",    "SARB",    "SARW",    "SARL",    "SARQ",};void cpu_dump_state(CPUState *env, FILE *f,                    int (*cpu_fprintf)(FILE *f, const char *fmt, ...),                    int flags){    int eflags, i, nb;    char cc_op_name[32];    static const char *seg_name[6] = { "ES", "CS", "SS", "DS", "FS", "GS" };    eflags = env->eflags;#ifdef TARGET_X86_64    if (env->hflags & HF_CS64_MASK) {        cpu_fprintf(f,                    "RAX=%016" PRIx64 " RBX=%016" PRIx64 " RCX=%016" PRIx64 " RDX=%016" PRIx64 "\n"                    "RSI=%016" PRIx64 " RDI=%016" PRIx64 " RBP=%016" PRIx64 " RSP=%016" PRIx64 "\n"                    "R8 =%016" PRIx64 " R9 =%016" PRIx64 " R10=%016" PRIx64 " R11=%016" PRIx64 "\n"                    "R12=%016" PRIx64 " R13=%016" PRIx64 " R14=%016" PRIx64 " R15=%016" PRIx64 "\n"                    "RIP=%016" PRIx64 " RFL=%08x [%c%c%c%c%c%c%c] CPL=%d II=%d A20=%d SMM=%d HLT=%d\n",                    env->regs[R_EAX],                    env->regs[R_EBX],                    env->regs[R_ECX],                    env->regs[R_EDX],                    env->regs[R_ESI],                    env->regs[R_EDI],                    env->regs[R_EBP],                    env->regs[R_ESP],                    env->regs[8],                    env->regs[9],                    env->regs[10],                    env->regs[11],                    env->regs[12],                    env->regs[13],                    env->regs[14],                    env->regs[15],                    env->eip, eflags,                    eflags & DF_MASK ? 'D' : '-',                    eflags & CC_O ? 'O' : '-',                    eflags & CC_S ? 'S' : '-',                    eflags & CC_Z ? 'Z' : '-',                    eflags & CC_A ? 'A' : '-',                    eflags & CC_P ? 'P' : '-',                    eflags & CC_C ? 'C' : '-',                    env->hflags & HF_CPL_MASK,                    (env->hflags >> HF_INHIBIT_IRQ_SHIFT) & 1,                    (env->a20_mask >> 20) & 1,                    (env->hflags >> HF_SMM_SHIFT) & 1,                    (env->hflags >> HF_HALTED_SHIFT) & 1);    } else#endif    {        cpu_fprintf(f, "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n"                    "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n"                    "EIP=%08x EFL=%08x [%c%c%c%c%c%c%c] CPL=%d II=%d A20=%d SMM=%d HLT=%d\n",                    (uint32_t)env->regs[R_EAX],                    (uint32_t)env->regs[R_EBX],                    (uint32_t)env->regs[R_ECX],                    (uint32_t)env->regs[R_EDX],                    (uint32_t)env->regs[R_ESI],                    (uint32_t)env->regs[R_EDI],                    (uint32_t)env->regs[R_EBP],                    (uint32_t)env->regs[R_ESP],                    (uint32_t)env->eip, eflags,                    eflags & DF_MASK ? 'D' : '-',                    eflags & CC_O ? 'O' : '-',                    eflags & CC_S ? 'S' : '-',                    eflags & CC_Z ? 'Z' : '-',                    eflags & CC_A ? 'A' : '-',                    eflags & CC_P ? 'P' : '-',                    eflags & CC_C ? 'C' : '-',                    env->hflags & HF_CPL_MASK,                    (env->hflags >> HF_INHIBIT_IRQ_SHIFT) & 1,                    (env->a20_mask >> 20) & 1,                    (env->hflags >> HF_SMM_SHIFT) & 1,                    (env->hflags >> HF_HALTED_SHIFT) & 1);    }#ifdef TARGET_X86_64    if (env->hflags & HF_LMA_MASK) {        for(i = 0; i < 6; i++) {            SegmentCache *sc = &env->segs[i];            cpu_fprintf(f, "%s =%04x %016" PRIx64 " %08x %08x\n",                        seg_name[i],                        sc->selector,                        sc->base,                        sc->limit,                        sc->flags);        }        cpu_fprintf(f, "LDT=%04x %016" PRIx64 " %08x %08x\n",                    env->ldt.selector,                    env->ldt.base,                    env->ldt.limit,                    env->ldt.flags);        cpu_fprintf(f, "TR =%04x %016" PRIx64 " %08x %08x\n",                    env->tr.selector,                    env->tr.base,                    env->tr.limit,                    env->tr.flags);        cpu_fprintf(f, "GDT=     %016" PRIx64 " %08x\n",                    env->gdt.base, env->gdt.limit);        cpu_fprintf(f, "IDT=     %016" PRIx64 " %08x\n",                    env->idt.base, env->idt.limit);        cpu_fprintf(f, "CR0=%08x CR2=%016" PRIx64 " CR3=%016" PRIx64 " CR4=%08x\n",                    (uint32_t)env->cr[0],                    env->cr[2],                    env->cr[3],                    (uint32_t)env->cr[4]);    } else#endif    {        for(i = 0; i < 6; i++) {            SegmentCache *sc = &env->segs[i];            cpu_fprintf(f, "%s =%04x %08x %08x %08x\n",                        seg_name[i],                        sc->selector,                        (uint32_t)sc->base,                        sc->limit,                        sc->flags);        }        cpu_fprintf(f, "LDT=%04x %08x %08x %08x\n",                    env->ldt.selector,                    (uint32_t)env->ldt.base,                    env->ldt.limit,                    env->ldt.flags);        cpu_fprintf(f, "TR =%04x %08x %08x %08x\n",                    env->tr.selector,                    (uint32_t)env->tr.base,                    env->tr.limit,                    env->tr.flags);        cpu_fprintf(f, "GDT=     %08x %08x\n",                    (uint32_t)env->gdt.base, env->gdt.limit);        cpu_fprintf(f, "IDT=     %08x %08x\n",                    (uint32_t)env->idt.base, env->idt.limit);        cpu_fprintf(f, "CR0=%08x CR2=%08x CR3=%08x CR4=%08x\n",                    (uint32_t)env->cr[0],                    (uint32_t)env->cr[2],                    (uint32_t)env->cr[3],                    (uint32_t)env->cr[4]);    }    if (flags & X86_DUMP_CCOP) {        if ((unsigned)env->cc_op < CC_OP_NB)            snprintf(cc_op_name, sizeof(cc_op_name), "%s", cc_op_str[env->cc_op]);        else            snprintf(cc_op_name, sizeof(cc_op_name), "[%d]", env->cc_op);#ifdef TARGET_X86_64        if (env->hflags & HF_CS64_MASK) {            cpu_fprintf(f, "CCS=%016" PRIx64 " CCD=%016" PRIx64 " CCO=%-8s\n",                        env->cc_src, env->cc_dst,                        cc_op_name);        } else#endif        {            cpu_fprintf(f, "CCS=%08x CCD=%08x CCO=%-8s\n",                        (uint32_t)env->cc_src, (uint32_t)env->cc_dst,                        cc_op_name);        }    }    if (flags & X86_DUMP_FPU) {        int fptag;        fptag = 0;        for(i = 0; i < 8; i++) {            fptag |= ((!env->fptags[i]) << i);        }        cpu_fprintf(f, "FCW=%04x FSW=%04x [ST=%d] FTW=%02x MXCSR=%08x\n",                    env->fpuc,                    (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11,                    env->fpstt,                    fptag,                    env->mxcsr);        for(i=0;i<8;i++) {#if defined(USE_X86LDOUBLE)            union {                long double d;                struct {                    uint64_t lower;                    uint16_t upper;                } l;            } tmp;            tmp.d = env->fpregs[i].d;            cpu_fprintf(f, "FPR%d=%016" PRIx64 " %04x",                        i, tmp.l.lower, tmp.l.upper);#else            cpu_fprintf(f, "FPR%d=%016" PRIx64,                        i, env->fpregs[i].mmx.q);#endif            if ((i & 1) == 1)                cpu_fprintf(f, "\n");            else                cpu_fprintf(f, " ");        }        if (env->hflags & HF_CS64_MASK)            nb = 16;        else            nb = 8;        for(i=0;i<nb;i++) {            cpu_fprintf(f, "XMM%02d=%08x%08x%08x%08x",                        i,                        env->xmm_regs[i].XMM_L(3),                        env->xmm_regs[i].XMM_L(2),                        env->xmm_regs[i].XMM_L(1),                        env->xmm_regs[i].XMM_L(0));            if ((i & 1) == 1)                cpu_fprintf(f, "\n");            else                cpu_fprintf(f, " ");        }    }}/***********************************************************//* x86 mmu *//* XXX: add PGE support */void cpu_x86_set_a20(CPUX86State *env, int a20_state){    a20_state = (a20_state != 0);    if (a20_state != ((env->a20_mask >> 20) & 1)) {#if defined(DEBUG_MMU)        printf("A20 update: a20=%d\n", a20_state);#endif        /* if the cpu is currently executing code, we must unlink it and           all the potentially executing TB */        cpu_interrupt(env, CPU_INTERRUPT_EXITTB);        /* when a20 is changed, all the MMU mappings are invalid, so           we must flush everything */        tlb_flush(env, 1);        env->a20_mask = 0xffefffff | (a20_state << 20);    }}void cpu_x86_update_cr0(CPUX86State *env, uint32_t new_cr0){    int pe_state;#if defined(DEBUG_MMU)    printf("CR0 update: CR0=0x%08x\n", new_cr0);#endif    if ((new_cr0 & (CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK)) !=        (env->cr[0] & (CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK))) {        tlb_flush(env, 1);    }#ifdef TARGET_X86_64    if (!(env->cr[0] & CR0_PG_MASK) && (new_cr0 & CR0_PG_MASK) &&        (env->efer & MSR_EFER_LME)) {        /* enter in long mode */        /* XXX: generate an exception */        if (!(env->cr[4] & CR4_PAE_MASK))            return;        env->efer |= MSR_EFER_LMA;        env->hflags |= HF_LMA_MASK;    } else if ((env->cr[0] & CR0_PG_MASK) && !(new_cr0 & CR0_PG_MASK) &&               (env->efer & MSR_EFER_LMA)) {        /* exit long mode */        env->efer &= ~MSR_EFER_LMA;        env->hflags &= ~(HF_LMA_MASK | HF_CS64_MASK);        env->eip &= 0xffffffff;    }#endif    env->cr[0] = new_cr0 | CR0_ET_MASK;    /* update PE flag in hidden flags */    pe_state = (env->cr[0] & CR0_PE_MASK);    env->hflags = (env->hflags & ~HF_PE_MASK) | (pe_state << HF_PE_SHIFT);    /* ensure that ADDSEG is always set in real mode */    env->hflags |= ((pe_state ^ 1) << HF_ADDSEG_SHIFT);    /* update FPU flags */    env->hflags = (env->hflags & ~(HF_MP_MASK | HF_EM_MASK | HF_TS_MASK)) |        ((new_cr0 << (HF_MP_SHIFT - 1)) & (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK));}/* XXX: in legacy PAE mode, generate a GPF if reserved bits are set in   the PDPT */void cpu_x86_update_cr3(CPUX86State *env, target_ulong new_cr3){    env->cr[3] = new_cr3;    if (env->cr[0] & CR0_PG_MASK) {#if defined(DEBUG_MMU)        printf("CR3 update: CR3=" TARGET_FMT_lx "\n", new_cr3);#endif        tlb_flush(env, 0);    }}void cpu_x86_update_cr4(CPUX86State *env, uint32_t new_cr4){#if defined(DEBUG_MMU)    printf("CR4 update: CR4=%08x\n", (uint32_t)env->cr[4]);#endif    if ((new_cr4 & (CR4_PGE_MASK | CR4_PAE_MASK | CR4_PSE_MASK)) !=        (env->cr[4] & (CR4_PGE_MASK | CR4_PAE_MASK | CR4_PSE_MASK))) {        tlb_flush(env, 1);    }    /* SSE handling */    if (!(env->cpuid_features & CPUID_SSE))        new_cr4 &= ~CR4_OSFXSR_MASK;    if (new_cr4 & CR4_OSFXSR_MASK)        env->hflags |= HF_OSFXSR_MASK;    else        env->hflags &= ~HF_OSFXSR_MASK;    env->cr[4] = new_cr4;}/* XXX: also flush 4MB pages */void cpu_x86_flush_tlb(CPUX86State *env, target_ulong addr){    tlb_flush_page(env, addr);}#if defined(CONFIG_USER_ONLY)int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr,                             int is_write, int mmu_idx, int is_softmmu){    /* user mode only emulation */    is_write &= 1;    env->cr[2] = addr;    env->error_code = (is_write << PG_ERROR_W_BIT);    env->error_code |= PG_ERROR_U_MASK;    env->exception_index = EXCP0E_PAGE;    return 1;}target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr){    return addr;}#else

⌨️ 快捷键说明

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