diff options
| author | 项小羽 <[email protected]> | 2022-05-19 04:42:04 +0000 |
|---|---|---|
| committer | 项小羽 <[email protected]> | 2022-05-19 04:42:04 +0000 |
| commit | 65a5c03f574c2bbc58faed2d1eca45d3dde875e9 (patch) | |
| tree | 542152ed688e6fdc5d1f668a5f75e8a538348856 | |
| parent | 79c5b9201507e268f98429aa17a7cb341f82371d (diff) | |
now muti thread could work partly
| -rw-r--r-- | accel/tcg/cpu-exec.c | 11 | ||||
| -rw-r--r-- | target/i386/tcg/misc_helper.c | 10 | ||||
| -rw-r--r-- | target/i386/tcg/seg_helper.c | 25 | ||||
| -rw-r--r-- | target/i386/tcg/sysemu/misc_helper.c | 29 | ||||
| -rw-r--r-- | target/i386/tcg/translate.c | 8 |
5 files changed, 47 insertions, 36 deletions
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c index a5cfeb5e02..adfe45153f 100644 --- a/accel/tcg/cpu-exec.c +++ b/accel/tcg/cpu-exec.c @@ -345,6 +345,7 @@ const void *HELPER(lookup_tb_ptr)(CPUArchState *env) */ extern bool uiret_called; // extern bool senduipi_called; +extern bool in_uiret_called; static inline TranslationBlock * QEMU_DISABLE_CFI cpu_tb_exec(CPUState *cpu, TranslationBlock *itb, int *tb_exit) { @@ -1008,9 +1009,17 @@ int cpu_exec(CPUState *cpu) } // if (block_id > 10000)qemu_log("BLOCK: %d size:%d icont:%d \n", block_id,tb->size,tb->icount); // block_id ++; + if (in_uiret_called){ + qemu_log("xxxx in uiret called before exec tb;\n"); + in_uiret_called = false; + } cpu_loop_exec_tb(cpu, tb, &last_tb, &tb_exit); + if (in_uiret_called){ + qemu_log("xxxx in uiret called after exec tb;\n"); + in_uiret_called = false; + } if (uiret_called) { - helper_uiret(cpu->env_ptr); + // helper_uiret(cpu->env_ptr); uiret_called = false; } diff --git a/target/i386/tcg/misc_helper.c b/target/i386/tcg/misc_helper.c index da3ddb3770..888879d32d 100644 --- a/target/i386/tcg/misc_helper.c +++ b/target/i386/tcg/misc_helper.c @@ -80,10 +80,10 @@ void helper_rdtsc(CPUX86State *env) // ??? 读取时间相关的函数 #define UPID_ON 1 -void helper_senduipi(CPUX86State *env ,int reg_index){ // 改 +void helper_senduipi(CPUX86State *env ,int reg_index){ // CPUState *cs = env_cpu(env); int uitte_index = env->regs[R_EAX]; - if(Debug)printf("qemu:helper senduipi called receive regidx:%d, uipiindex: %d\n",reg_index,uitte_index); + if(Debug)printf("--------\nqemu:helper senduipi called receive regidx:%d, uipiindex: %d\n",reg_index,uitte_index); int prot; CPUState *cs = env_cpu(env); @@ -91,13 +91,13 @@ void helper_senduipi(CPUX86State *env ,int reg_index){ // 改 uint64_t uitt_phyaddress = get_hphys2(cs, (env->uintr_tt>>3)<<3 , MMU_DATA_LOAD, &prot); struct uintr_uitt_entry uitte; cpu_physical_memory_rw(uitt_phyaddress + (uitte_index<<4), &uitte, 16,false); - if(Debug)printf("qemu: data of uitt valid:%d user_vec:%d UPID address 0x%016lx \n",uitte.valid, uitte.user_vec,uitte.target_upid_addr); + if(Debug)printf("qemu: data of uitt \n| valid:%d | user_vec:%d | UPID address 0x%016lx \n",uitte.valid, uitte.user_vec,uitte.target_upid_addr); // read tempUPID from 16 bytes at tempUITTE.UPIDADDR;// under lock uint64_t upid_phyaddress = get_hphys2(cs, uitte.target_upid_addr, MMU_DATA_LOAD, &prot); struct uintr_upid upid; cpu_physical_memory_rw(upid_phyaddress, &upid, 16, false); - if(Debug)printf("qemu: content of upid: status:0x%x nv:0x%x ndst:0x%x 0x%016lx\n", upid.nc.status, upid.nc.nv, upid.nc.ndst, upid.puir); + if(Debug)printf("qemu: content of upid:\n | status:0x%x | nv:0x%x | ndst:0x%x | 0x%016lx\n", upid.nc.status, upid.nc.nv, upid.nc.ndst, upid.puir); // tempUPID.PIR[tempUITTE.UV] := 1; upid.puir |= 1<<uitte.user_vec; @@ -113,7 +113,7 @@ void helper_senduipi(CPUX86State *env ,int reg_index){ // 改 cpu_physical_memory_rw(upid_phyaddress, &upid, 16, true); cpu_physical_memory_rw(upid_phyaddress, &upid, 16, false); - if(Debug)printf("qemu: data write back in upid: status:0x%x nv:0x%x ndst:0x%x 0x%016lx\n", upid.nc.status, upid.nc.nv, upid.nc.ndst, upid.puir); + if(Debug)printf("qemu: data write back in upid:\n | status:0x%x | nv:0x%x | ndst:0x%x | puir 0x%016lx\n---------\n\n", upid.nc.status, upid.nc.nv, upid.nc.ndst, upid.puir); diff --git a/target/i386/tcg/seg_helper.c b/target/i386/tcg/seg_helper.c index 413024c497..f3649e38b0 100644 --- a/target/i386/tcg/seg_helper.c +++ b/target/i386/tcg/seg_helper.c @@ -864,19 +864,19 @@ static inline target_ulong get_rsp_from_tss(CPUX86State *env, int level) static bool Debug = true; void helper_rrnzero(CPUX86State *env){ // 改 - if(Debug)qemu_log("rrnzero called handler: 0x%lx rr: 0x%lx\n", env->uintr_handler,env->uintr_rr); + if(Debug)qemu_log("------\nrrnzero called handler: 0x%lx rr: 0x%lx\n", env->uintr_handler,env->uintr_rr); target_ulong temprsp = env->regs[R_ESP]; - qemu_log("qemu:origin exp 0x%lx eip 0x%lx eflags: 0x%lx\n",env->regs[R_ESP], env->eip, env->eflags); + qemu_log("origin |esp 0x%lx | eip 0x%lx | eflags: 0x%lx\n",env->regs[R_ESP], env->eip, env->eflags); if(env->uintr_stackadjust &1){ // adjust[0] = 1 env->regs[R_ESP] = env->uintr_stackadjust; - qemu_log("qemu:set statck 0x%lx\n",env->regs[R_ESP]); + qemu_log("set statck 0x%lx\n",env->regs[R_ESP]); }else{ env->regs[R_ESP] -= env->uintr_stackadjust; - qemu_log("qemu:move statck 0x%lx\n",env->regs[R_ESP]); + qemu_log("move statck 0x%lx\n",env->regs[R_ESP]); } env->regs[R_ESP] &= ~0xfLL; /* align stack */ target_ulong esp = env->regs[R_ESP]; - qemu_log("qemu:after align statck 0x%lx\n",env->regs[R_ESP]); + qemu_log("align statck 0x%lx\n",env->regs[R_ESP]); PUSHQ(esp, temprsp); // qemu_log("qemu: pushed rsp\n"); PUSHQ(esp, env->eflags); // PUSHQ(esp, cpu_compute_eflags(env)); @@ -884,26 +884,27 @@ void helper_rrnzero(CPUX86State *env){ // 改 PUSHQ(esp, env->eip); // qemu_log("the uirr is 0x%016lx \n", env->uintr_rr); PUSHQ(esp, env->uintr_rr & 0x3f); // // 64-bit push; upper 58 bits pushed as 0 - qemu_log("qemu:push finish now esp is: 0x%lx",esp); + qemu_log("push finish now esp is: 0x%lx |",esp); env->uintr_rr = 0; // clear rr env->regs[R_ESP] = esp; env->eflags &= ~(TF_MASK | RF_MASK); env->eip = env->uintr_handler; env->uintr_uif = 0; - qemu_log("qemu: eip: 0x%lx\n",env->eip); + qemu_log("qemu: eip: 0x%lx\n--------\n",env->eip); } +bool in_uiret_called = false; void helper_uiret(CPUX86State *env){ - if(Debug)qemu_log("helper uiret called, now eip: 0x%lx\n", env->eip); - qemu_log("qemu: now esp is: 0x%lx\n",env->regs[R_ESP]); + if(Debug)qemu_log("\n\n---------\nhelper uiret called,\neip: 0x%lx | sp: 0x%lx\n", env->eip,env->regs[R_ESP]); + in_uiret_called = true; target_ulong temprip, temprfalgs, temprsp, uirrv; - env->regs[R_ESP] &= ~0xfLL; /* align stack */ - target_ulong esp = env->regs[R_ESP]; + // env->regs[R_ESP] &= ~0xfLL; /* align stack */ + target_ulong esp = env->regs[R_ESP] -8; POPQ(esp, uirrv); POPQ(esp, temprip); POPQ(esp, temprfalgs); POPQ(esp, temprsp); - qemu_log("qemu:poped values:uirrv:0x%lx rip:0x%lx eflags:0x%lx rsp:0x%lx \n",uirrv,temprip, temprfalgs, temprsp); + qemu_log("qemu:poped values:uirrv:0x%lx | rip:0x%lx | eflags:0x%lx | sp:0x%lx \n--------\n\n",uirrv,temprip, temprfalgs, temprsp); env->eip = temprip; env->regs[R_ESP] = temprsp; env->eflags = (env->eflags & ~0x254dd5) |(temprfalgs & 0x254dd5); diff --git a/target/i386/tcg/sysemu/misc_helper.c b/target/i386/tcg/sysemu/misc_helper.c index 3007ee14e7..a330681263 100644 --- a/target/i386/tcg/sysemu/misc_helper.c +++ b/target/i386/tcg/sysemu/misc_helper.c @@ -25,6 +25,7 @@ #include "exec/address-spaces.h" #include "exec/exec-all.h" #include "tcg/helper-tcg.h" +#include "exec/log.h" #include <stdio.h> static bool Debug = true; @@ -141,7 +142,7 @@ void helper_write_crN(CPUX86State *env, int reg, target_ulong t0) void helper_wrmsr(CPUX86State *env) { - // if(Debug)printf("wrmsr %hx \n",(uint32_t)env->regs[R_ECX]); + // if(Debug)qemu_log("wrmsr %hx \n",(uint32_t)env->regs[R_ECX]); uint64_t val; CPUState *cs = env_cpu(env); @@ -228,31 +229,31 @@ void helper_wrmsr(CPUX86State *env) #endif // ??? 改wrmsr case MSR_IA32_UINTR_RR: - printf("qemu:wrmsr RR 0x%lx\n",val); + qemu_log("qemu:wrmsr RR 0x%lx\n",val); env->uintr_rr = val; if(val!= 0){ - if(Debug)printf("getting rr not zero get into helper rr:%ld\n",val); + if(Debug)qemu_log("getting rr not zero get into helper rr:%ld\n",val); helper_rrnzero(env); } break; case MSR_IA32_UINTR_HANDLER: - printf("qemu:wrmsr handler 0x%016lx\n",val); + qemu_log("qemu:wrmsr handler 0x%016lx\n",val); env->uintr_handler = val; break; case MSR_IA32_UINTR_STACKADJUST: - printf("qemu:wrmsr stackadjust 0x%lx\n",val); + qemu_log("qemu:wrmsr stackadjust 0x%lx\n",val); env->uintr_stackadjust = val; break; case MSR_IA32_UINTR_MISC: - printf("qemu:wrmsr misc 0x%016lx\n",val); + qemu_log("qemu:wrmsr misc 0x%016lx\n",val); env->uintr_misc = val; break; case MSR_IA32_UINTR_PD: - printf("qemu:wrmsr pd 0x%016lx\n",val); + qemu_log("qemu:wrmsr pd 0x%016lx\n",val); env->uintr_pd = val; break; case MSR_IA32_UINTR_TT: - printf("qemu:wrmsr tt 0x%016lx\n",val); + qemu_log("qemu:wrmsr tt 0x%016lx\n",val); env->uintr_tt = val; break; case MSR_MTRRphysBase(0): @@ -408,29 +409,29 @@ void helper_rdmsr(CPUX86State *env) //改 rdmsr case MSR_IA32_UINTR_RR: val = env->uintr_rr; - if(Debug)printf("qemu:rdmsr RR 0x%016lx\n",val); + if(Debug)qemu_log("qemu:rdmsr RR 0x%016lx\n",val); break; case MSR_IA32_UINTR_HANDLER: val = env->uintr_handler; - printf("qemu:rdmsr handler 0x%016lx\n",val); + qemu_log("qemu:rdmsr handler 0x%016lx\n",val); break; case MSR_IA32_UINTR_STACKADJUST: val = env->uintr_stackadjust; - printf("qemu:rdmsr stackadjust 0x%016lx\n",val); + qemu_log("qemu:rdmsr stackadjust 0x%016lx\n",val); break; case MSR_IA32_UINTR_MISC: val = env->uintr_misc; rdcount ++; - // printf("qemu:rdmsr misc 0x%016lx eip: 0x%016lx\n",val,env->eip); + // qemu_log("qemu:rdmsr misc 0x%016lx eip: 0x%016lx\n",val,env->eip); if(rdcount > 200) exit(2); break; case MSR_IA32_UINTR_PD: val = env->uintr_pd; - printf("qemu:rdmsr pd 0x%016lx\n",val); + qemu_log("qemu:rdmsr pd 0x%016lx\n",val); break; case MSR_IA32_UINTR_TT: val = env->uintr_tt; - printf("qemu:rdmsr tt 0x%016lx\n",val); + qemu_log("qemu:rdmsr tt 0x%016lx\n",val); break; case MSR_SMI_COUNT: val = env->msr_smi_count; diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 1bde133fd6..1619d97e96 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -7762,11 +7762,11 @@ static inline void gen_op_ld_v(DisasContext *s, int idx, TCGv t0, TCGv a0) case 0xec: if (prefixes & PREFIX_REPZ){ qemu_log("\n\n\n--------------\n"); - qemu_log("qemu:caught 0xf30f01ec UIRET\n"); // 改 + qemu_log("qemu:caught 0xf30f01ec UIRET when translate\n"); // 改 qemu_log("before: pc_start: 0x%lx sc_base:%lx pc: 0x%lx pc.next:0x%lx rip:0x%lx\n",s->pc_start,s->cs_base, s->pc, s->base.pc_next, env->eip); - // helper_uiret(env); + gen_helper_uiret(cpu_env); uiret_called = true; // gen_jmp_im(s, env->eip); // gen_jmp(s, env->eip); @@ -7776,7 +7776,7 @@ static inline void gen_op_ld_v(DisasContext *s, int idx, TCGv t0, TCGv a0) // tcg_gen_exit_tb(NULL, 0); // helper_ret_protected(env, shift, 1, 0, GETPC()); // set_cc_op(s, CC_OP_EFLAGS); - // gen_eob(s); + gen_eob(s); // s->base.is_jmp = DISAS_NORETURN; qemu_log("-------------\n\n\n"); // exit(12); @@ -7789,7 +7789,7 @@ static inline void gen_op_ld_v(DisasContext *s, int idx, TCGv t0, TCGv a0) break; case 0xef: /* wrpkru */ if(prefixes & PREFIX_REPZ){ - qemu_log("--------------\n\n\n"); + qemu_log("--------------\n"); qemu_log("qemu:caught 0xf30f01ef STUI\n"); // 改 env->uintr_uif = 1; qemu_log("--------------\n\n\n"); |
