summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUbuntu <[email protected]>2022-04-29 13:23:58 +0000
committerUbuntu <[email protected]>2022-04-29 13:23:58 +0000
commit7ec9332ce8d6e9587498f333ea91d303bf017283 (patch)
treeaffa2b158b071f250d7d507b972ec92d6ccb0e6c
parentb07758db978d1cd6ea3dd219a5c111f1bf162f77 (diff)
add access of puid
-rw-r--r--target/i386/tcg/misc_helper.c23
-rw-r--r--target/i386/tcg/sysemu/excp_helper.c2
-rw-r--r--target/i386/tcg/translate.c11
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;