diff options
| author | Ubuntu <[email protected]> | 2022-04-29 13:23:58 +0000 |
|---|---|---|
| committer | Ubuntu <[email protected]> | 2022-04-29 13:23:58 +0000 |
| commit | 7ec9332ce8d6e9587498f333ea91d303bf017283 (patch) | |
| tree | affa2b158b071f250d7d507b972ec92d6ccb0e6c | |
| parent | b07758db978d1cd6ea3dd219a5c111f1bf162f77 (diff) | |
add access of puid
| -rw-r--r-- | target/i386/tcg/misc_helper.c | 23 | ||||
| -rw-r--r-- | target/i386/tcg/sysemu/excp_helper.c | 2 | ||||
| -rw-r--r-- | target/i386/tcg/translate.c | 11 |
3 files changed, 21 insertions, 15 deletions
diff --git a/target/i386/tcg/misc_helper.c b/target/i386/tcg/misc_helper.c index 690ee3ca08..e6c5fb2bf2 100644 --- a/target/i386/tcg/misc_helper.c +++ b/target/i386/tcg/misc_helper.c @@ -79,14 +79,31 @@ void helper_rdtsc(CPUX86State *env) // ??? 读取时间相关的函数 void helper_senduipi(CPUX86State *env ,int reg_index){ // 改 // CPUState *cs = env_cpu(env); - int uipi_index = env->regs[R_EAX]; + int uitte_index = env->regs[R_EAX]; + if(Debug)printf("qemu:helper senduipi called receive regidx:%d, uipiindex: %d\n",reg_index,uitte_index); + int prot; + CPUState *cs = env_cpu(env); + + // read tempUITTE from 16 bytes at UITTADDR+ (reg « 4); + uint64_t uitt_phyaddress = get_hphys2(cs, (env->uintr_tt>>3)<<3 , MMU_DATA_LOAD, &prot); + if(Debug) printf("uitt_phyaddress %lx \n", uitt_phyaddress); + uint64_t content = x86_ldq_phys(cs,uitt_phyaddress + (uitte_index<<4)); + uint64_t upidaddress = x86_ldq_phys(cs, uitt_phyaddress + (uitte_index<<4) + 8); + if(Debug)printf("data of uitt %d is 0x%016lx\n",uitte_index, content); + if(Debug)printf("UPID address 0x%016lx\n", upidaddress); + + // tempUPID.PIR[tempUITTE.UV] := 1; + uint64_t upid_phyaddress = get_hphys2(cs, upidaddress , MMU_DATA_LOAD, &prot); + uint64_t upid_content = x86_ldq_phys(cs, upid_phyaddress); + if(Debug)printf("content of uipid: 0x%016lx\n", upid_content); + uint64_t SET_UV1 = 1<<8; + upid_content |= SET_UV1; + x86_stq_phys(cs, upid_phyaddress, upid_content); - if(Debug)printf("qemu:helper senduipi called receive regidx:%d, uipiindex: %d\n",reg_index,uipi_index); // uint64_t content = x86_ldq_phys(cs,(env->uintr_tt>>3)<<3); // if(Debug)printf("data of uitt0is 0x%016lx\n",content); - // if(Debug)printf("qemu:helper senduipi called receive regidx:%d, uipiindex: %d\n",reg_index,uipi_index); // uint64_t content = cpu_ldq_data_ra(env, (env->uintr_tt>>3)<<3,0); // if(Debug)printf("data of uitt0is 0x%016lx\n",content); diff --git a/target/i386/tcg/sysemu/excp_helper.c b/target/i386/tcg/sysemu/excp_helper.c index 14f9f318e0..deee394b52 100644 --- a/target/i386/tcg/sysemu/excp_helper.c +++ b/target/i386/tcg/sysemu/excp_helper.c @@ -359,7 +359,7 @@ hwaddr get_hphys2(CPUState *cs, hwaddr gphys, MMUAccessType access_type, int ret = mmu_translate(cs, gphys, get_hphys, env->cr[3], access_type, MMU_KNOSMAP_IDX , get_pg_mode(env) , &hphys, &page_size, &next_prot); - if(ret)printf("ret error !!!\n\n"); + printf("mmu_translate ret: %d\n",ret); return hphys; } diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 6a653711c0..ac49fa17eb 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -5410,15 +5410,6 @@ static inline void gen_op_ld_v(DisasContext *s, int idx, TCGv t0, TCGv a0) // s->tmp1_i64 = env->uintr_tt; //地址 // tcg_gen_qemu_ld_i64(s->tmp1_i64, s->A0 , 0, MO_LEUQ); // printf("qemu: loaded 0x%lx A0: 0x%lx\n",(uint64_t)((void*)s->tmp1_i64),(uint64_t)s->A0); - int prot; - CPUState *cs = env_cpu(env); - uint64_t addr = get_hphys2(cs, (env->uintr_tt>>3)<<3 , MMU_DATA_LOAD, &prot); - if(Debug) printf("addr %lx \n\n\n",addr); - uint64_t content = x86_ldq_phys(cs,addr); - uint64_t content2 = x86_ldq_phys(cs,addr+8); - if(Debug)printf("data of uitt0is 0x%016lx\n",content); - if(Debug)printf("data of uitt address 0x%016lx\n",content2); - // uint64_t content[10]; // read all zero @@ -5431,8 +5422,6 @@ static inline void gen_op_ld_v(DisasContext *s, int idx, TCGv t0, TCGv a0) // if(Debug) printf(" %lx \n\n\n",content); - - // TCGv t0; // t0 = tcg_temp_local_new(); // s->A0 = (TCGv)(env->uintr_tt>>3)<<3; |
