summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author项小羽 <[email protected]>2022-05-19 04:42:04 +0000
committer项小羽 <[email protected]>2022-05-19 04:42:04 +0000
commit65a5c03f574c2bbc58faed2d1eca45d3dde875e9 (patch)
tree542152ed688e6fdc5d1f668a5f75e8a538348856
parent79c5b9201507e268f98429aa17a7cb341f82371d (diff)
now muti thread could work partly
-rw-r--r--accel/tcg/cpu-exec.c11
-rw-r--r--target/i386/tcg/misc_helper.c10
-rw-r--r--target/i386/tcg/seg_helper.c25
-rw-r--r--target/i386/tcg/sysemu/misc_helper.c29
-rw-r--r--target/i386/tcg/translate.c8
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");