summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYour Name <[email protected]>2023-07-13 02:12:32 +0000
committerYour Name <[email protected]>2023-07-13 02:12:32 +0000
commite6400e4dc449a8948f366bf605fef1fa6053fe12 (patch)
treeeee355b31f9cce52352464625d011304865e9ad6
parentb56a5bf3eb85865791875e1d5eb2be7772710fad (diff)
屏蔽 TNT 位
更多的打印输出
-rw-r--r--target/i386/tcg/misc_helper.c14
-rw-r--r--target/i386/tcg/seg_helper.c10
2 files changed, 22 insertions, 2 deletions
diff --git a/target/i386/tcg/misc_helper.c b/target/i386/tcg/misc_helper.c
index 2e35d6c24f..468ab9438c 100644
--- a/target/i386/tcg/misc_helper.c
+++ b/target/i386/tcg/misc_helper.c
@@ -108,11 +108,20 @@ void helper_senduipi(CPUX86State *env ,int reg_index){
cpu_physical_memory_rw(upid_phyaddress, &upid, 16, false);
// tempUPID.PIR[tempUITTE.UV] := 1;
upid.puir |= 1<<uitte.user_vec;
-
+
+ qemu_log("1puir is 0x%lx \n", upid.puir);
+ qemu_log("upid status: 0b");
+ for(int i = 8; i >= 0; i--){
+ qemu_log("%d", (upid.nc.status >> i) & 1);
+ }
+ qemu_log("\n");
bool sendNotify;
//IF tempUPID.SN = tempUPID.ON = 0
- if((upid.nc.status&0x11) == 0){
+ // 06 比较 SN 和 TNT
+ // 03 比较 ON 和 SN
+ if((upid.nc.status&0x03) == 0){
//THEN tempUPID.ON := 1; sendNotify := 1;
+ // upid.nc.status |= 5; // TNT 置位
upid.nc.status |= UPID_ON;
sendNotify = true;
}else{ // ELSE sendNotify := 0;
@@ -125,6 +134,7 @@ void helper_senduipi(CPUX86State *env ,int reg_index){
qemu_log("senduipi core: %d uitte index:%d dist core: %d ifsend: %d, nv: %d\n", get_apic_id(cpu_get_current_apic()), uitte_index, upid.nc.ndst >> 8, sendNotify,upid.nc.nv);
if(sendNotify){
+ qemu_log("senduipi for real \n");
uint8_t realdst = upid.nc.ndst >> 8;
send_ipi(realdst, upid.nc.nv);
}
diff --git a/target/i386/tcg/seg_helper.c b/target/i386/tcg/seg_helper.c
index e09ffed46c..dc360b2582 100644
--- a/target/i386/tcg/seg_helper.c
+++ b/target/i386/tcg/seg_helper.c
@@ -999,6 +999,7 @@ static void do_interrupt64(CPUX86State *env, int intno, int is_int,
uintr_upid upid;
cpu_physical_memory_rw(upid_phyaddress, &upid, 16, false);
upid.nc.status &= (~1); // clear on
+ qemu_log("2 puir is 0x%lx \n", upid.puir);
if(upid.puir != 0){
env->uintr_rr = upid.puir;
upid.puir = 0; // clear puir
@@ -1006,6 +1007,15 @@ static void do_interrupt64(CPUX86State *env, int intno, int is_int,
}
cpu_physical_memory_rw(upid_phyaddress, &upid, 16, true); // write back
helper_clear_eoi(env);
+
+ qemu_log("3 puir is 0x%lx \n", upid.puir);
+
+ qemu_log("receive upid status: 0b");
+ for(int i = 8; i >= 0; i--){
+ qemu_log("%d", (upid.nc.status >> i) & 1);
+ }
+ qemu_log("\n");
+
if(send)helper_rrnzero(env);
else qemu_log("do not go to handler\n");
return;