From 6b1165b6b1e88b7080d00953bbfd8d28c44c0603 Mon Sep 17 00:00:00 2001 From: wangsixiang <1936693111@qq.com> Date: Wed, 22 Apr 2026 15:10:59 +0800 Subject: [PATCH] (benchmarks) --- lib/resources | 2 +- output/bin/Debug/OptionsParser.deps.json | 4 +- output/bin/Debug/Renode.deps.json | 16 +- .../Emulator/Cores/tlib/arch/mips/translate.c | 660 ++++++++++++------ .../Debug/net8.0/CoSimulationPlugin.deps.json | 16 +- .../bin/Debug/net8.0/OptionsParser.deps.json | 4 +- ...nPlugin_NET.csproj.AssemblyReference.cache | Bin 55548 -> 55548 bytes .../bin/Debug/net8.0/OptionsParser.deps.json | 4 +- .../bin/Debug/net8.0/SystemCPlugin.deps.json | 16 +- ...CPlugin_NET.csproj.AssemblyReference.cache | Bin 55548 -> 55548 bytes .../bin/Debug/net8.0/OptionsParser.deps.json | 4 +- .../Debug/net8.0/WiresharkPlugin.deps.json | 16 +- ...kPlugin_NET.csproj.AssemblyReference.cache | Bin 48319 -> 48319 bytes .../Renode_NET.csproj.AssemblyReference.cache | Bin 63341 -> 63341 bytes .../bin/Debug/net8.0/OptionsParser.deps.json | 4 +- .../bin/Debug/net8.0/Renode.deps.json | 16 +- .../bin/Debug/net8.0/RenodeTests.deps.json | 24 +- .../bin/Debug/net8.0/UnitTests.deps.json | 24 +- ...deTests_NET.csproj.AssemblyReference.cache | Bin 68446 -> 68446 bytes 19 files changed, 514 insertions(+), 296 deletions(-) diff --git a/lib/resources b/lib/resources index 5a27eca..43e805d 160000 --- a/lib/resources +++ b/lib/resources @@ -1 +1 @@ -Subproject commit 5a27eca5b466f0ab3e4e5b64101a31d4428b67a4 +Subproject commit 43e805d8e812fc5e519a46ce29e6c2910a42f015 diff --git a/output/bin/Debug/OptionsParser.deps.json b/output/bin/Debug/OptionsParser.deps.json index 5b9eb74..6370e9e 100644 --- a/output/bin/Debug/OptionsParser.deps.json +++ b/output/bin/Debug/OptionsParser.deps.json @@ -8,10 +8,10 @@ ".NETCoreApp,Version=v8.0": { "OptionsParser/1.0.0": { "dependencies": { + "Microsoft.CSharp": "4.7.0", "Microsoft.NET.Test.Sdk": "16.9.1", "NUnit": "3.13.1", - "NUnit3TestAdapter": "3.17.0", - "OptionsParser": "1.0.0" + "NUnit3TestAdapter": "3.17.0" }, "runtime": { "OptionsParser.dll": {} diff --git a/output/bin/Debug/Renode.deps.json b/output/bin/Debug/Renode.deps.json index 4ee48bd..dc471c2 100644 --- a/output/bin/Debug/Renode.deps.json +++ b/output/bin/Debug/Renode.deps.json @@ -26,12 +26,12 @@ "Xwt": "1.0.0", "Xwt.Gtk3": "1.0.0", "libtftp": "1.0.0", - "AntShell.Reference": "1.0.9593.26098", + "AntShell.Reference": "1.0.9606.31907", "BigGustave.Reference": "1.0.0.0", "CookComputing.XmlRpcV2": "2.5.0.0", "CoSimulationPlugin.Reference": "1.0.0.0", "crypto.Reference": "1.9.0.0", - "CxxDemangler.Reference": "1.0.9593.26090", + "CxxDemangler.Reference": "1.0.9606.31897", "ELFSharp.Reference": "0.1.1.0", "FdtSharp.Reference": "0.1.0.0", "Infrastructure.Reference": "1.0.0.0", @@ -1954,10 +1954,10 @@ } } }, - "AntShell.Reference/1.0.9593.26098": { + "AntShell.Reference/1.0.9606.31907": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9593.26098", + "assemblyVersion": "1.0.9606.31907", "fileVersion": "0.0.0.0" } } @@ -1994,10 +1994,10 @@ } } }, - "CxxDemangler.Reference/1.0.9593.26090": { + "CxxDemangler.Reference/1.0.9606.31897": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9593.26090", + "assemblyVersion": "1.0.9606.31897", "fileVersion": "0.0.0.0" } } @@ -3134,7 +3134,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9593.26098": { + "AntShell.Reference/1.0.9606.31907": { "type": "reference", "serviceable": false, "sha512": "" @@ -3159,7 +3159,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9593.26090": { + "CxxDemangler.Reference/1.0.9606.31897": { "type": "reference", "serviceable": false, "sha512": "" diff --git a/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/translate.c b/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/translate.c index a132ff3..c46ade1 100644 --- a/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/translate.c +++ b/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/translate.c @@ -2,9 +2,11 @@ * MIPS32 / Loongson * * 新增特性:完整 MIPS CP0 异常系统。 * * 修复日志:全面实现了 MIPS 架构完整的 12 条 Trap 陷阱指令(R-Type 与 立即数型)。 - * * 【终极修复】:禁用 TB Chaining (基本块直连),并使用官方级别的 EXCP_DEBUG 进行精准断点拦截! - * * 【裸机修复】:增加了 CP0、CACHE 桩函数,修复了 BGEZAL/BLTZAL,防止因保留指令引发的 NOP 滑行崩溃。 - * * 【指令集扩充】:完美支持 MIPS32r2 架构的 SPECIAL3 指令族(seb/seh/ext/ins),并替换为高兼容度 TCG 接口。 + * * 【终极修复1】:增加了 CP0、CACHE 桩函数,修复了保留指令引发的 NOP 滑行崩溃。 + * * 【终极修复2】:修复 hflags 清空导致的特权级丢失,全面增加 32 位符号扩展抵御 64 位宿主截断。 + * * 【终极修复3】:修复 SLTIU 越界,强制 J/JAL 保留 KSEG0 符号位扩展。 + * * 【终极修复4】:修复 JR 动态跳转时延迟槽目标被覆盖为 0 的崩溃问题。 + * * 【终极修复5】:适配 Renode 旧版 tlib,回退使用安全的 tcg_gen_exit_tb,修复编译报错。 */ #include "cpu.h" @@ -41,9 +43,6 @@ #define EXCP_FPE 15 // 浮点异常 (Floating Point) #define EXCP_WATCH 23 // 监视点 (Watchpoint) -// 删除硬编码的 EXCP_DEBUG 以防止与底层的 enum 冲突 -// 模拟器内部 (cpu-all.h) 自带正确的 EXCP_DEBUG 定义 - #define OPCODE(insn) ((insn >> 26) & 0x3F) #define RS(insn) ((insn >> 21) & 0x1F) #define RT(insn) ((insn >> 16) & 0x1F) @@ -71,7 +70,6 @@ static const char * const mips_gpr_names[32] = { // 异常抛出引擎 (Exception Generator) // ======================================================================== -// 1. 用于条件分支内的异常(仅在异常分支退出,正常执行流继续翻译) static inline void generate_exception_err(DisasContext *ctx, int excp) { tcg_gen_movi_tl(cpu_PC, ctx->pc); TCGv_i32 t_excp = tcg_const_i32(excp); @@ -80,7 +78,6 @@ static inline void generate_exception_err(DisasContext *ctx, int excp) { tcg_gen_exit_tb(0); } -// 2. 用于无条件异常(抛出后彻底终止整个基本块的翻译) static inline void generate_exception_end(DisasContext *ctx, int excp) { generate_exception_err(ctx, excp); ctx->base.is_jmp = DISAS_TB_JUMP; @@ -89,29 +86,33 @@ static inline void generate_exception_end(DisasContext *ctx, int excp) { /* ======================================================================== * 绝对安全的寄存器屏障访问接口 (Load/Store Barrier) * ======================================================================== */ -static inline int is_zero_reg(int reg) { return reg == 0; } +static inline int is_zero_reg(int reg) { + return reg == 0; +} static inline TCGv load_gpr(int reg) { TCGv t = tcg_temp_new(); - if (reg == 0) tcg_gen_movi_tl(t, 0); - else tcg_gen_mov_tl(t, cpu_gpr[reg]); + if (reg == 0) { + tcg_gen_movi_tl(t, 0); + } else { + tcg_gen_mov_tl(t, cpu_gpr[reg]); + } return t; } static inline void store_gpr(int reg, TCGv val) { - if (reg != 0) tcg_gen_mov_tl(cpu_gpr[reg], val); + if (reg != 0) { + tcg_gen_mov_tl(cpu_gpr[reg], val); + } } -/* ======================================================================== - * 【核心修复】: 强制禁用 TB 物理直连机制 (Disable TB Chaining) - * ======================================================================== */ static inline void gen_goto_tb(DisasContext *dc, int n, uint32_t dest) { tcg_gen_movi_tl(cpu_PC, dest); - tcg_gen_exit_tb(0); // <--- 切断内部循环,强制交出控制权! + tcg_gen_exit_tb(0); } /* ======================================================================== - * 带溢出检测的算术运算与逻辑运算 + * 带溢出检测与强制符号扩展的算术逻辑运算 * ======================================================================== */ static void gen_add(DisasContext *ctx, int rd, int rs, int rt) { if (is_zero_reg(rd)) return; @@ -133,18 +134,29 @@ static void gen_add(DisasContext *ctx, int rd, int rs, int rt) { generate_exception_err(ctx, EXCP_OVERFLOW); gen_set_label(l_no_ov); + tcg_gen_ext32s_tl(res, res); // 强制符号扩展 store_gpr(rd, res); - tcg_temp_free(t0); tcg_temp_free(t1); tcg_temp_free(res); - tcg_temp_free(t_ov); tcg_temp_free(t_tmp); + tcg_temp_free(t0); + tcg_temp_free(t1); + tcg_temp_free(res); + tcg_temp_free(t_ov); + tcg_temp_free(t_tmp); } static void gen_addu(DisasContext *ctx, int rd, int rs, int rt) { if (is_zero_reg(rd)) return; - TCGv t0 = load_gpr(rs); TCGv t1 = load_gpr(rt); TCGv res = tcg_temp_new(); + TCGv t0 = load_gpr(rs); + TCGv t1 = load_gpr(rt); + TCGv res = tcg_temp_new(); + tcg_gen_add_tl(res, t0, t1); + tcg_gen_ext32s_tl(res, res); // 强制符号扩展 store_gpr(rd, res); - tcg_temp_free(t0); tcg_temp_free(t1); tcg_temp_free(res); + + tcg_temp_free(t0); + tcg_temp_free(t1); + tcg_temp_free(res); } static void gen_sub(DisasContext *ctx, int rd, int rs, int rt) { @@ -152,6 +164,7 @@ static void gen_sub(DisasContext *ctx, int rd, int rs, int rt) { TCGv t0 = load_gpr(rs); TCGv t1 = load_gpr(rt); TCGv res = tcg_temp_local_new(); + tcg_gen_sub_tl(res, t0, t1); TCGv t_ov = tcg_temp_new(); @@ -166,68 +179,130 @@ static void gen_sub(DisasContext *ctx, int rd, int rs, int rt) { generate_exception_err(ctx, EXCP_OVERFLOW); gen_set_label(l_no_ov); + tcg_gen_ext32s_tl(res, res); // 强制符号扩展 store_gpr(rd, res); - tcg_temp_free(t0); tcg_temp_free(t1); tcg_temp_free(res); - tcg_temp_free(t_ov); tcg_temp_free(t_tmp); + tcg_temp_free(t0); + tcg_temp_free(t1); + tcg_temp_free(res); + tcg_temp_free(t_ov); + tcg_temp_free(t_tmp); } static void gen_subu(DisasContext *ctx, int rd, int rs, int rt) { if (is_zero_reg(rd)) return; - TCGv t0 = load_gpr(rs); TCGv t1 = load_gpr(rt); TCGv res = tcg_temp_new(); + TCGv t0 = load_gpr(rs); + TCGv t1 = load_gpr(rt); + TCGv res = tcg_temp_new(); + tcg_gen_sub_tl(res, t0, t1); + tcg_gen_ext32s_tl(res, res); // 强制符号扩展 store_gpr(rd, res); - tcg_temp_free(t0); tcg_temp_free(t1); tcg_temp_free(res); + + tcg_temp_free(t0); + tcg_temp_free(t1); + tcg_temp_free(res); } static void gen_logic(DisasContext *ctx, int rd, int rs, int rt, int op) { if (is_zero_reg(rd)) return; - TCGv t0 = load_gpr(rs); TCGv t1 = load_gpr(rt); TCGv res = tcg_temp_new(); - if (op == 0x24) tcg_gen_and_tl(res, t0, t1); - else if (op == 0x25) tcg_gen_or_tl(res, t0, t1); - else if (op == 0x26) tcg_gen_xor_tl(res, t0, t1); - else if (op == 0x27) { tcg_gen_or_tl(res, t0, t1); tcg_gen_not_tl(res, res); } + TCGv t0 = load_gpr(rs); + TCGv t1 = load_gpr(rt); + TCGv res = tcg_temp_new(); + + if (op == 0x24) { + tcg_gen_and_tl(res, t0, t1); + } else if (op == 0x25) { + tcg_gen_or_tl(res, t0, t1); + } else if (op == 0x26) { + tcg_gen_xor_tl(res, t0, t1); + } else if (op == 0x27) { + tcg_gen_or_tl(res, t0, t1); + tcg_gen_not_tl(res, res); + } + + tcg_gen_ext32s_tl(res, res); // 逻辑运算结果保证 32 位扩展一致性 store_gpr(rd, res); - tcg_temp_free(t0); tcg_temp_free(t1); tcg_temp_free(res); + + tcg_temp_free(t0); + tcg_temp_free(t1); + tcg_temp_free(res); } static void gen_muldiv(DisasContext *ctx, int rs, int rt, int op) { - TCGv t0 = load_gpr(rs); TCGv t1 = load_gpr(rt); + TCGv t0 = load_gpr(rs); + TCGv t1 = load_gpr(rt); + if (op == 0x18 || op == 0x19) { - TCGv t_lo = tcg_temp_new(); TCGv t_hi = tcg_temp_new(); - if (op == 0x18) tcg_gen_muls2_tl(t_lo, t_hi, t0, t1); - else tcg_gen_mulu2_tl(t_lo, t_hi, t0, t1); - tcg_gen_mov_tl(cpu_LO, t_lo); tcg_gen_mov_tl(cpu_HI, t_hi); - tcg_temp_free(t_lo); tcg_temp_free(t_hi); + TCGv t_lo = tcg_temp_new(); + TCGv t_hi = tcg_temp_new(); + + if (op == 0x18) { + tcg_gen_muls2_tl(t_lo, t_hi, t0, t1); + } else { + tcg_gen_mulu2_tl(t_lo, t_hi, t0, t1); + } + + tcg_gen_mov_tl(cpu_LO, t_lo); + tcg_gen_mov_tl(cpu_HI, t_hi); + + tcg_temp_free(t_lo); + tcg_temp_free(t_hi); } else { - TCGv res = tcg_temp_new(); TCGv safe_t1 = tcg_temp_new(); TCGv is_zero = tcg_temp_new(); + TCGv res = tcg_temp_new(); + TCGv safe_t1 = tcg_temp_new(); + TCGv is_zero = tcg_temp_new(); + tcg_gen_setcondi_tl(TCG_COND_EQ, is_zero, t1, 0); tcg_gen_or_tl(safe_t1, t1, is_zero); tcg_temp_free(is_zero); + if (op == 0x1A) { - TCGv is_min = tcg_temp_new(); TCGv is_neg1 = tcg_temp_new(); - TCGv is_fpe = tcg_temp_new(); TCGv fix_fpe = tcg_temp_new(); + TCGv is_min = tcg_temp_new(); + TCGv is_neg1 = tcg_temp_new(); + TCGv is_fpe = tcg_temp_new(); + TCGv fix_fpe = tcg_temp_new(); + tcg_gen_setcondi_tl(TCG_COND_EQ, is_min, t0, 0x80000000); tcg_gen_setcondi_tl(TCG_COND_EQ, is_neg1, t1, 0xFFFFFFFF); tcg_gen_and_tl(is_fpe, is_min, is_neg1); tcg_gen_shli_tl(fix_fpe, is_fpe, 1); tcg_gen_add_tl(safe_t1, safe_t1, fix_fpe); + tcg_gen_div_tl(res, t0, safe_t1); tcg_gen_rem_tl(safe_t1, t0, safe_t1); - tcg_gen_mov_tl(cpu_HI, safe_t1); tcg_gen_mov_tl(cpu_LO, res); - tcg_temp_free(is_min); tcg_temp_free(is_neg1); tcg_temp_free(is_fpe); tcg_temp_free(fix_fpe); + + tcg_gen_ext32s_tl(safe_t1, safe_t1); // 保证 HI 符号扩展 + tcg_gen_ext32s_tl(res, res); // 保证 LO 符号扩展 + + tcg_gen_mov_tl(cpu_HI, safe_t1); + tcg_gen_mov_tl(cpu_LO, res); + + tcg_temp_free(is_min); + tcg_temp_free(is_neg1); + tcg_temp_free(is_fpe); + tcg_temp_free(fix_fpe); } else { tcg_gen_divu_tl(res, t0, safe_t1); tcg_gen_remu_tl(safe_t1, t0, safe_t1); - tcg_gen_mov_tl(cpu_HI, safe_t1); tcg_gen_mov_tl(cpu_LO, res); + + tcg_gen_ext32s_tl(safe_t1, safe_t1); // 保证 HI 符号扩展 + tcg_gen_ext32s_tl(res, res); // 保证 LO 符号扩展 + + tcg_gen_mov_tl(cpu_HI, safe_t1); + tcg_gen_mov_tl(cpu_LO, res); } - tcg_temp_free(res); tcg_temp_free(safe_t1); + + tcg_temp_free(res); + tcg_temp_free(safe_t1); } - tcg_temp_free(t0); tcg_temp_free(t1); + + tcg_temp_free(t0); + tcg_temp_free(t1); } /* ======================================================================== - * 核心翻译器 + * 核心翻译器 (Instruction Decoding) * ======================================================================== */ static bool disas_insn(CPUState *env, DisasContext *ctx) { @@ -244,10 +319,18 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) switch (op) { case 0x00: // SPECIAL (R-Type) switch (funct) { - case 0x20: gen_add(ctx, rd, rs, rt); break; // ADD - case 0x22: gen_sub(ctx, rd, rs, rt); break; // SUB - case 0x21: gen_addu(ctx, rd, rs, rt); break; // ADDU - case 0x23: gen_subu(ctx, rd, rs, rt); break; // SUBU + case 0x20: + gen_add(ctx, rd, rs, rt); + break; + case 0x22: + gen_sub(ctx, rd, rs, rt); + break; + case 0x21: + gen_addu(ctx, rd, rs, rt); + break; + case 0x23: + gen_subu(ctx, rd, rs, rt); + break; // 全系陷阱指令 (Trap) - R-Type case 0x30: // TGE @@ -257,11 +340,12 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) case 0x34: // TEQ case 0x36: // TNE { - TCGv t0 = load_gpr(rs); TCGv t1 = load_gpr(rt); + TCGv t0 = load_gpr(rs); + TCGv t1 = load_gpr(rt); int l_no_trap = gen_new_label(); TCGCond cond_skip; - // 我们采用反向逻辑:如果“不满足陷阱条件”,则跳过抛异常的代码继续执行 + // 反向逻辑 if (funct == 0x30) cond_skip = TCG_COND_LT; else if (funct == 0x31) cond_skip = TCG_COND_LTU; else if (funct == 0x32) cond_skip = TCG_COND_GE; @@ -270,10 +354,11 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) else cond_skip = TCG_COND_EQ; tcg_gen_brcond_tl(cond_skip, t0, t1, l_no_trap); - generate_exception_err(ctx, EXCP_TRAP); // 条件成立,抛出陷阱异常 + generate_exception_err(ctx, EXCP_TRAP); gen_set_label(l_no_trap); - tcg_temp_free(t0); tcg_temp_free(t1); + tcg_temp_free(t0); + tcg_temp_free(t1); } break; @@ -281,24 +366,31 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) generate_exception_end(ctx, EXCP_SYSCALL); break; case 0x0D: // BREAK - // 对于客体程序的自然 BREAK 指令,通常使用 EXCP_BREAK 抛出 generate_exception_end(ctx, EXCP_BREAK); break; case 0x0F: // SYNC - // 桩函数:同步屏障,忽略即可 break; - case 0x24: case 0x25: case 0x26: case 0x27: + case 0x24: + case 0x25: + case 0x26: + case 0x27: gen_logic(ctx, rd, rs, rt, funct); break; case 0x2A: // SLT case 0x2B: // SLTU if (!is_zero_reg(rd)) { - TCGv t0 = load_gpr(rs); TCGv t1 = load_gpr(rt); TCGv res = tcg_temp_new(); + TCGv t0 = load_gpr(rs); + TCGv t1 = load_gpr(rt); + TCGv res = tcg_temp_new(); + tcg_gen_setcond_tl((funct == 0x2A) ? TCG_COND_LT : TCG_COND_LTU, res, t0, t1); store_gpr(rd, res); - tcg_temp_free(t0); tcg_temp_free(t1); tcg_temp_free(res); + + tcg_temp_free(t0); + tcg_temp_free(t1); + tcg_temp_free(res); } break; @@ -306,12 +398,24 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) case 0x02: // SRL case 0x03: // SRA if (!is_zero_reg(rd)) { - TCGv t0 = load_gpr(rt); TCGv res = tcg_temp_new(); - if (funct == 0x00) tcg_gen_shli_tl(res, t0, shamt); - else if (funct == 0x02) tcg_gen_shri_tl(res, t0, shamt); - else tcg_gen_sari_tl(res, t0, shamt); + TCGv t0 = load_gpr(rt); + TCGv res = tcg_temp_new(); + + if (funct == 0x00) { + tcg_gen_shli_tl(res, t0, shamt); + } else if (funct == 0x02) { + tcg_gen_ext32u_tl(t0, t0); // 逻辑右移前清零高 32 位 + tcg_gen_shri_tl(res, t0, shamt); + } else { + tcg_gen_ext32s_tl(t0, t0); + tcg_gen_sari_tl(res, t0, shamt); + } + + tcg_gen_ext32s_tl(res, res); // 统一符号扩展 store_gpr(rd, res); - tcg_temp_free(t0); tcg_temp_free(res); + + tcg_temp_free(t0); + tcg_temp_free(res); } break; @@ -319,69 +423,112 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) case 0x06: // SRLV case 0x07: // SRAV if (!is_zero_reg(rd)) { - TCGv t0 = load_gpr(rt); TCGv t1 = load_gpr(rs); TCGv res = tcg_temp_new(); + TCGv t0 = load_gpr(rt); + TCGv t1 = load_gpr(rs); + TCGv res = tcg_temp_new(); + tcg_gen_andi_tl(t1, t1, 0x1F); - if (funct == 0x04) tcg_gen_shl_tl(res, t0, t1); - else if (funct == 0x06) tcg_gen_shr_tl(res, t0, t1); - else tcg_gen_sar_tl(res, t0, t1); + + if (funct == 0x04) { + tcg_gen_shl_tl(res, t0, t1); + } else if (funct == 0x06) { + tcg_gen_ext32u_tl(t0, t0); // 逻辑右移前清零高 32 位 + tcg_gen_shr_tl(res, t0, t1); + } else { + tcg_gen_ext32s_tl(t0, t0); + tcg_gen_sar_tl(res, t0, t1); + } + + tcg_gen_ext32s_tl(res, res); // 统一符号扩展 store_gpr(rd, res); - tcg_temp_free(t0); tcg_temp_free(t1); tcg_temp_free(res); + + tcg_temp_free(t0); + tcg_temp_free(t1); + tcg_temp_free(res); } break; - case 0x18: case 0x19: case 0x1A: case 0x1B: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: gen_muldiv(ctx, rs, rt, funct); break; case 0x10: // MFHI if (!is_zero_reg(rd)) { - TCGv t0 = tcg_temp_new(); tcg_gen_mov_tl(t0, cpu_HI); - store_gpr(rd, t0); tcg_temp_free(t0); + TCGv t0 = tcg_temp_new(); + tcg_gen_mov_tl(t0, cpu_HI); + tcg_gen_ext32s_tl(t0, t0); + store_gpr(rd, t0); + tcg_temp_free(t0); } break; + case 0x12: // MFLO if (!is_zero_reg(rd)) { - TCGv t0 = tcg_temp_new(); tcg_gen_mov_tl(t0, cpu_LO); - store_gpr(rd, t0); tcg_temp_free(t0); + TCGv t0 = tcg_temp_new(); + tcg_gen_mov_tl(t0, cpu_LO); + tcg_gen_ext32s_tl(t0, t0); + store_gpr(rd, t0); + tcg_temp_free(t0); } break; + case 0x11: // MTHI { - TCGv t0 = load_gpr(rs); tcg_gen_mov_tl(cpu_HI, t0); tcg_temp_free(t0); + TCGv t0 = load_gpr(rs); + tcg_gen_mov_tl(cpu_HI, t0); + tcg_temp_free(t0); } break; + case 0x13: // MTLO { - TCGv t0 = load_gpr(rs); tcg_gen_mov_tl(cpu_LO, t0); tcg_temp_free(t0); + TCGv t0 = load_gpr(rs); + tcg_gen_mov_tl(cpu_LO, t0); + tcg_temp_free(t0); } break; case 0x08: // JR { - TCGv t0 = load_gpr(rs); tcg_gen_mov_tl(cpu_PC, t0); + TCGv t0 = load_gpr(rs); + // 【修复】:动态地址写入 btarget,而不是直接修改 pc + tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, btarget)); ctx->hflags |= MIPS_HFLAG_BR; tcg_temp_free(t0); } break; + case 0x09: // JALR { - TCGv t0 = load_gpr(rs); TCGv t1 = tcg_temp_new(); - tcg_gen_movi_tl(t1, ctx->pc + 8); store_gpr(rd, t1); - tcg_gen_mov_tl(cpu_PC, t0); + TCGv t0 = load_gpr(rs); + TCGv t1 = tcg_temp_new(); + tcg_gen_movi_tl(t1, ctx->pc + 8); + store_gpr(rd, t1); + // 【修复】:同上 + tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, btarget)); ctx->hflags |= MIPS_HFLAG_BR; - tcg_temp_free(t0); tcg_temp_free(t1); + + tcg_temp_free(t0); + tcg_temp_free(t1); } break; - case 0x0A: // MOVZ (现代 GCC 可能用于条件赋值) - case 0x0B: // MOVN (现代 GCC 可能用于条件赋值) + case 0x0A: // MOVZ + case 0x0B: // MOVN if (!is_zero_reg(rd)) { - TCGv t0 = load_gpr(rs); TCGv t1 = load_gpr(rt); + TCGv t0 = load_gpr(rs); + TCGv t1 = load_gpr(rt); int l_skip = gen_new_label(); + tcg_gen_brcondi_tl((funct == 0x0A) ? TCG_COND_NE : TCG_COND_EQ, t1, 0, l_skip); store_gpr(rd, t0); gen_set_label(l_skip); - tcg_temp_free(t0); tcg_temp_free(t1); + + tcg_temp_free(t0); + tcg_temp_free(t1); } break; @@ -394,97 +541,116 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) case 0x1C: // SPECIAL2 if (funct == 0x02) { // MUL if (!is_zero_reg(rd)) { - TCGv t0 = load_gpr(rs); TCGv t1 = load_gpr(rt); TCGv res = tcg_temp_new(); - tcg_gen_mul_tl(res, t0, t1); store_gpr(rd, res); - tcg_temp_free(t0); tcg_temp_free(t1); tcg_temp_free(res); + TCGv t0 = load_gpr(rs); + TCGv t1 = load_gpr(rt); + TCGv res = tcg_temp_new(); + + tcg_gen_mul_tl(res, t0, t1); + tcg_gen_ext32s_tl(res, res); // 强制符号扩展 + store_gpr(rd, res); + + tcg_temp_free(t0); + tcg_temp_free(t1); + tcg_temp_free(res); } - } else if (funct == 0x3F) { // SDBBP - GDB 软件断点常用指令 + } else if (funct == 0x3F) { // SDBBP generate_exception_end(ctx, EXCP_DEBUG); return true; } else { - generate_exception_end(ctx, EXCP_RI); return true; + generate_exception_end(ctx, EXCP_RI); + return true; } break; - // 【新增修复】: 完美支持现代 GCC 必定生成的 SPECIAL3 扩展指令 - // 移除了不兼容旧 tlib 的 extract/deposit 高级函数,使用基础的 andi/shri/shli/or 重新实现 case 0x1F: // SPECIAL3 (MIPS32r2) if (funct == 0x20) { - if (shamt == 0x10) { // SEB (Sign Extend Byte) + if (shamt == 0x10) { // SEB if (!is_zero_reg(rd)) { - TCGv t0 = load_gpr(rt); TCGv res = tcg_temp_new(); - tcg_gen_ext8s_tl(res, t0); store_gpr(rd, res); - tcg_temp_free(t0); tcg_temp_free(res); + TCGv t0 = load_gpr(rt); + TCGv res = tcg_temp_new(); + tcg_gen_ext8s_tl(res, t0); + store_gpr(rd, res); + tcg_temp_free(t0); + tcg_temp_free(res); } - } else if (shamt == 0x18) { // SEH (Sign Extend Halfword) + } else if (shamt == 0x18) { // SEH if (!is_zero_reg(rd)) { - TCGv t0 = load_gpr(rt); TCGv res = tcg_temp_new(); - tcg_gen_ext16s_tl(res, t0); store_gpr(rd, res); - tcg_temp_free(t0); tcg_temp_free(res); + TCGv t0 = load_gpr(rt); + TCGv res = tcg_temp_new(); + tcg_gen_ext16s_tl(res, t0); + store_gpr(rd, res); + tcg_temp_free(t0); + tcg_temp_free(res); } } else { - generate_exception_end(ctx, EXCP_RI); return true; + generate_exception_end(ctx, EXCP_RI); + return true; } - } else if (funct == 0x00) { // EXT (Extract Bit Field) + } else if (funct == 0x00) { // EXT if (!is_zero_reg(rt)) { - TCGv t0 = load_gpr(rs); TCGv res = tcg_temp_new(); + TCGv t0 = load_gpr(rs); + TCGv res = tcg_temp_new(); uint32_t pos = shamt; uint32_t size = rd + 1; - // 传统等价实现: res = (t0 >> pos) & ((1 << size) - 1) tcg_gen_shri_tl(res, t0, pos); tcg_gen_andi_tl(res, res, (1ULL << size) - 1); - store_gpr(rt, res); - tcg_temp_free(t0); tcg_temp_free(res); + + tcg_temp_free(t0); + tcg_temp_free(res); } - } else if (funct == 0x04) { // INS (Insert Bit Field) + } else if (funct == 0x04) { // INS if (!is_zero_reg(rt)) { - TCGv t0 = load_gpr(rs); TCGv t1 = load_gpr(rt); TCGv res = tcg_temp_new(); + TCGv t0 = load_gpr(rs); + TCGv t1 = load_gpr(rt); + TCGv res = tcg_temp_new(); uint32_t pos = shamt; uint32_t size = rd - shamt + 1; uint32_t mask = ((1ULL << size) - 1) << pos; - // 传统等价实现: res = (t1 & ~mask) | ((t0 & ((1 << size) - 1)) << pos) tcg_gen_andi_tl(res, t1, ~mask); - TCGv t_ins = tcg_temp_new(); tcg_gen_andi_tl(t_ins, t0, (1ULL << size) - 1); tcg_gen_shli_tl(t_ins, t_ins, pos); - tcg_gen_or_tl(res, res, t_ins); + tcg_gen_ext32s_tl(res, res); store_gpr(rt, res); - tcg_temp_free(t0); tcg_temp_free(t1); tcg_temp_free(res); tcg_temp_free(t_ins); + + tcg_temp_free(t0); + tcg_temp_free(t1); + tcg_temp_free(res); + tcg_temp_free(t_ins); } - } else if (funct == 0x3B) { // RDHWR (Read Hardware Register - 桩函数) + } else if (funct == 0x3B) { // RDHWR if (!is_zero_reg(rt)) { - TCGv res = tcg_temp_new(); tcg_gen_movi_tl(res, 0); - store_gpr(rt, res); tcg_temp_free(res); + TCGv res = tcg_temp_new(); + tcg_gen_movi_tl(res, 0); + store_gpr(rt, res); + tcg_temp_free(res); } } else { - generate_exception_end(ctx, EXCP_RI); return true; + generate_exception_end(ctx, EXCP_RI); + return true; } break; - case 0x11: // COP1 (FPU) + case 0x11: // COP1 generate_exception_end(ctx, EXCP_CpU); return true; - case 0x10: // COP0 (系统控制协处理器) + case 0x10: // COP0 if (rs == 0x00) { // MFC0 if (!is_zero_reg(rt)) { - // 裸机桩函数:读取任何 CP0 都返回 0 以防止崩溃 TCGv res = tcg_temp_new(); tcg_gen_movi_tl(res, 0); store_gpr(rt, res); tcg_temp_free(res); } } else if (rs == 0x04) { // MTC0 - // 裸机桩函数:忽略写入,防止早期启动流程引发 EXCP_RI - } else if (rs == 0x10 && funct == 0x18) { // ERET (Exception Return) - // 桩函数:当裸机程序尝试异常返回时,直接平稳滑行到下一指令 - gen_goto_tb(ctx, 0, ctx->pc + 4); + } else if (rs == 0x10 && funct == 0x18) { // ERET + generate_exception_end(ctx, EXCP_RI); } else { generate_exception_end(ctx, EXCP_RI); return true; @@ -493,25 +659,35 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) case 0x2F: // CACHE case 0x33: // PREF - // 桩函数:忽略 Cache 初始化和预取指 break; case 0x08: // ADDI case 0x09: // ADDIU if (!is_zero_reg(rt)) { - TCGv t0 = load_gpr(rs); TCGv res = tcg_temp_new(); - tcg_gen_addi_tl(res, t0, SEXT16(imm)); store_gpr(rt, res); - tcg_temp_free(t0); tcg_temp_free(res); + TCGv t0 = load_gpr(rs); + TCGv res = tcg_temp_new(); + + tcg_gen_addi_tl(res, t0, SEXT16(imm)); + tcg_gen_ext32s_tl(res, res); + store_gpr(rt, res); + + tcg_temp_free(t0); + tcg_temp_free(res); } break; case 0x0A: // SLTI case 0x0B: // SLTIU if (!is_zero_reg(rt)) { - TCGv t0 = load_gpr(rs); TCGv res = tcg_temp_new(); - tcg_gen_setcondi_tl((op == 0x0A) ? TCG_COND_LT : TCG_COND_LTU, res, t0, (op == 0x0A) ? SEXT16(imm) : (uint32_t)SEXT16(imm)); + TCGv t0 = load_gpr(rs); + TCGv res = tcg_temp_new(); + + // 【修复】:移除 uint32_t 强转,依赖底层的符号扩展实现真无符号比较 + tcg_gen_setcondi_tl((op == 0x0A) ? TCG_COND_LT : TCG_COND_LTU, res, t0, SEXT16(imm)); store_gpr(rt, res); - tcg_temp_free(t0); tcg_temp_free(res); + + tcg_temp_free(t0); + tcg_temp_free(res); } break; @@ -519,65 +695,72 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) case 0x0D: // ORI case 0x0E: // XORI if (!is_zero_reg(rt)) { - TCGv t0 = load_gpr(rs); TCGv res = tcg_temp_new(); + TCGv t0 = load_gpr(rs); + TCGv res = tcg_temp_new(); + if (op == 0x0C) tcg_gen_andi_tl(res, t0, uimm); else if (op == 0x0D) tcg_gen_ori_tl(res, t0, uimm); else tcg_gen_xori_tl(res, t0, uimm); + + tcg_gen_ext32s_tl(res, res); store_gpr(rt, res); - tcg_temp_free(t0); tcg_temp_free(res); + + tcg_temp_free(t0); + tcg_temp_free(res); } break; case 0x0F: // LUI if (!is_zero_reg(rt)) { TCGv res = tcg_temp_new(); - tcg_gen_movi_tl(res, (int32_t)(imm << 16)); - store_gpr(rt, res); tcg_temp_free(res); + tcg_gen_movi_tl(res, (int32_t)(imm << 16)); + store_gpr(rt, res); + tcg_temp_free(res); } break; - /* REGIMM 系列指令:分支与立即数陷阱 */ case 0x01: // REGIMM { TCGv t0 = load_gpr(rs); - - if (rt == 0x00 || rt == 0x01 || rt == 0x10 || rt == 0x11) { // BLTZ, BGEZ, BLTZAL, BGEZAL - if (rt == 0x10 || rt == 0x11) { // 带链接 (And Link) 补全 + if (rt == 0x00 || rt == 0x01 || rt == 0x10 || rt == 0x11) { + if (rt == 0x10 || rt == 0x11) { TCGv res = tcg_temp_new(); tcg_gen_movi_tl(res, ctx->pc + 8); store_gpr(31, res); tcg_temp_free(res); } TCGv res = tcg_temp_new(); - if (rt == 0x00 || rt == 0x10) tcg_gen_setcondi_tl(TCG_COND_LT, res, t0, 0); - else tcg_gen_setcondi_tl(TCG_COND_GE, res, t0, 0); + if (rt == 0x00 || rt == 0x10) { + tcg_gen_setcondi_tl(TCG_COND_LT, res, t0, 0); + } else { + tcg_gen_setcondi_tl(TCG_COND_GE, res, t0, 0); + } + tcg_gen_st_tl(res, cpu_env, offsetof(CPUState, bcond)); ctx->btarget = ctx->pc + 4 + (imm << 2); ctx->hflags |= MIPS_HFLAG_BC; + tcg_temp_free(res); } - // 全系陷阱指令 (Trap with Immediate) - I-Type else if (rt >= 0x08 && rt <= 0x0E && rt != 0x0D) { int l_no_trap = gen_new_label(); TCGCond cond_skip; - // 反向逻辑跳过异常: - if (rt == 0x08) cond_skip = TCG_COND_LT; // TGEI -> 不满足跳过 (LT) - else if (rt == 0x09) cond_skip = TCG_COND_LTU; // TGEIU -> 不满足跳过 (LTU) - else if (rt == 0x0A) cond_skip = TCG_COND_GE; // TLTI -> 不满足跳过 (GE) - else if (rt == 0x0B) cond_skip = TCG_COND_GEU; // TLTIU -> 不满足跳过 (GEU) - else if (rt == 0x0C) cond_skip = TCG_COND_NE; // TEQI -> 不满足跳过 (NE) - else cond_skip = TCG_COND_EQ; // TNEI (0x0E) -> 不满足跳过 (EQ) + if (rt == 0x08) cond_skip = TCG_COND_LT; + else if (rt == 0x09) cond_skip = TCG_COND_LTU; + else if (rt == 0x0A) cond_skip = TCG_COND_GE; + else if (rt == 0x0B) cond_skip = TCG_COND_GEU; + else if (rt == 0x0C) cond_skip = TCG_COND_NE; + else cond_skip = TCG_COND_EQ; - // MIPS 的立即数比较,imm 都会被符号扩展为 32位 参与比较 tcg_gen_brcondi_tl(cond_skip, t0, SEXT16(imm), l_no_trap); - generate_exception_err(ctx, EXCP_TRAP); // 触发立即数陷阱 - gen_set_label(l_no_trap); // 安全着陆点 + generate_exception_err(ctx, EXCP_TRAP); + gen_set_label(l_no_trap); } else { - generate_exception_end(ctx, EXCP_RI); // 不存在的 REGIMM 子指令 + generate_exception_end(ctx, EXCP_RI); tcg_temp_free(t0); - return true; + return true; } tcg_temp_free(t0); } @@ -586,138 +769,178 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) case 0x04: // BEQ case 0x05: // BNE { - TCGv t0 = load_gpr(rs); TCGv t1 = load_gpr(rt); TCGv res = tcg_temp_new(); + TCGv t0 = load_gpr(rs); + TCGv t1 = load_gpr(rt); + TCGv res = tcg_temp_new(); + tcg_gen_setcond_tl((op == 0x04) ? TCG_COND_EQ : TCG_COND_NE, res, t0, t1); tcg_gen_st_tl(res, cpu_env, offsetof(CPUState, bcond)); + ctx->btarget = ctx->pc + 4 + (imm << 2); ctx->hflags |= MIPS_HFLAG_BC; - tcg_temp_free(t0); tcg_temp_free(t1); tcg_temp_free(res); + + tcg_temp_free(t0); + tcg_temp_free(t1); + tcg_temp_free(res); } break; case 0x06: // BLEZ case 0x07: // BGTZ { - TCGv t0 = load_gpr(rs); TCGv res = tcg_temp_new(); + TCGv t0 = load_gpr(rs); + TCGv res = tcg_temp_new(); + if (op == 0x06) tcg_gen_setcondi_tl(TCG_COND_LE, res, t0, 0); else tcg_gen_setcondi_tl(TCG_COND_GT, res, t0, 0); + tcg_gen_st_tl(res, cpu_env, offsetof(CPUState, bcond)); ctx->btarget = ctx->pc + 4 + (imm << 2); ctx->hflags |= MIPS_HFLAG_BC; - tcg_temp_free(t0); tcg_temp_free(res); + + tcg_temp_free(t0); + tcg_temp_free(res); } break; case 0x02: // J case 0x03: // JAL - ctx->btarget = ((ctx->pc + 4) & 0xF0000000) | (TARGET(insn) << 2); + // 【修复】:保留 KSEG0 等内核空间地址的符号位,防止跳入 0 地址域 + ctx->btarget = (target_long)(int32_t)(((ctx->pc + 4) & 0xF0000000) | (TARGET(insn) << 2)); + if (op == 0x03) { TCGv res = tcg_temp_new(); - tcg_gen_movi_tl(res, ctx->pc + 8); store_gpr(31, res); + tcg_gen_movi_tl(res, ctx->pc + 8); + store_gpr(31, res); tcg_temp_free(res); } ctx->hflags |= MIPS_HFLAG_B; break; - /* =============================================================== - * 访存异常监控 (Memory Traps: EXCP_AdEL / EXCP_AdES) - * =============================================================== */ case 0x23: // LW { - TCGv t0 = load_gpr(rs); - TCGv addr = tcg_temp_local_new(); // 使用 local temp,跨越标签存活 + TCGv t0 = load_gpr(rs); + TCGv addr = tcg_temp_local_new(); tcg_gen_addi_tl(addr, t0, SEXT16(imm)); int l_align_ok = gen_new_label(); TCGv t_align = tcg_temp_new(); tcg_gen_andi_tl(t_align, addr, 0x3); tcg_gen_brcondi_tl(TCG_COND_EQ, t_align, 0, l_align_ok); - generate_exception_err(ctx, EXCP_AdEL); // 条件异常,仅本分支停止 + generate_exception_err(ctx, EXCP_AdEL); gen_set_label(l_align_ok); TCGv res = tcg_temp_new(); tcg_gen_qemu_ld_tl(res, addr, ctx->mem_idx, MO_TE | MO_SL); store_gpr(rt, res); - tcg_temp_free(t0); tcg_temp_free(addr); tcg_temp_free(res); tcg_temp_free(t_align); + + tcg_temp_free(t0); + tcg_temp_free(addr); + tcg_temp_free(res); + tcg_temp_free(t_align); } break; case 0x2B: // SW { - TCGv t0 = load_gpr(rs); - TCGv addr = tcg_temp_local_new(); // 使用 local temp + TCGv t0 = load_gpr(rs); + TCGv addr = tcg_temp_local_new(); tcg_gen_addi_tl(addr, t0, SEXT16(imm)); int l_align_ok = gen_new_label(); TCGv t_align = tcg_temp_new(); tcg_gen_andi_tl(t_align, addr, 0x3); tcg_gen_brcondi_tl(TCG_COND_EQ, t_align, 0, l_align_ok); - generate_exception_err(ctx, EXCP_AdES); // 条件异常,仅本分支停止 + generate_exception_err(ctx, EXCP_AdES); gen_set_label(l_align_ok); - TCGv t1 = load_gpr(rt); // 标签安全后再提取准备写入的数据 + TCGv t1 = load_gpr(rt); tcg_gen_qemu_st_tl(t1, addr, ctx->mem_idx, MO_TE | MO_UL); - tcg_temp_free(t0); tcg_temp_free(t1); tcg_temp_free(addr); tcg_temp_free(t_align); + + tcg_temp_free(t0); + tcg_temp_free(t1); + tcg_temp_free(addr); + tcg_temp_free(t_align); } break; case 0x21: // LH case 0x25: // LHU { - TCGv t0 = load_gpr(rs); - TCGv addr = tcg_temp_local_new(); // 使用 local temp + TCGv t0 = load_gpr(rs); + TCGv addr = tcg_temp_local_new(); tcg_gen_addi_tl(addr, t0, SEXT16(imm)); int l_align_ok = gen_new_label(); TCGv t_align = tcg_temp_new(); tcg_gen_andi_tl(t_align, addr, 0x1); tcg_gen_brcondi_tl(TCG_COND_EQ, t_align, 0, l_align_ok); - generate_exception_err(ctx, EXCP_AdEL); // 条件异常,仅本分支停止 + generate_exception_err(ctx, EXCP_AdEL); gen_set_label(l_align_ok); TCGv res = tcg_temp_new(); tcg_gen_qemu_ld_tl(res, addr, ctx->mem_idx, (op == 0x21) ? (MO_TE | MO_SW) : (MO_TE | MO_UW)); store_gpr(rt, res); - tcg_temp_free(t0); tcg_temp_free(addr); tcg_temp_free(res); tcg_temp_free(t_align); + + tcg_temp_free(t0); + tcg_temp_free(addr); + tcg_temp_free(res); + tcg_temp_free(t_align); } break; case 0x29: // SH { - TCGv t0 = load_gpr(rs); - TCGv addr = tcg_temp_local_new(); // 使用 local temp + TCGv t0 = load_gpr(rs); + TCGv addr = tcg_temp_local_new(); tcg_gen_addi_tl(addr, t0, SEXT16(imm)); int l_align_ok = gen_new_label(); TCGv t_align = tcg_temp_new(); tcg_gen_andi_tl(t_align, addr, 0x1); tcg_gen_brcondi_tl(TCG_COND_EQ, t_align, 0, l_align_ok); - generate_exception_err(ctx, EXCP_AdES); // 条件异常,仅本分支停止 + generate_exception_err(ctx, EXCP_AdES); gen_set_label(l_align_ok); - TCGv t1 = load_gpr(rt); // 在标签之后读取 + TCGv t1 = load_gpr(rt); tcg_gen_qemu_st_tl(t1, addr, ctx->mem_idx, MO_TE | MO_UW); - tcg_temp_free(t0); tcg_temp_free(t1); tcg_temp_free(addr); tcg_temp_free(t_align); + + tcg_temp_free(t0); + tcg_temp_free(t1); + tcg_temp_free(addr); + tcg_temp_free(t_align); } break; case 0x20: // LB case 0x24: // LBU { - TCGv t0 = load_gpr(rs); TCGv addr = tcg_temp_new(); TCGv res = tcg_temp_new(); + TCGv t0 = load_gpr(rs); + TCGv addr = tcg_temp_new(); + TCGv res = tcg_temp_new(); + tcg_gen_addi_tl(addr, t0, SEXT16(imm)); tcg_gen_qemu_ld_tl(res, addr, ctx->mem_idx, (op == 0x20) ? (MO_TE | MO_SB) : (MO_TE | MO_UB)); store_gpr(rt, res); - tcg_temp_free(t0); tcg_temp_free(addr); tcg_temp_free(res); + + tcg_temp_free(t0); + tcg_temp_free(addr); + tcg_temp_free(res); } break; case 0x28: // SB { - TCGv t0 = load_gpr(rs); TCGv t1 = load_gpr(rt); TCGv addr = tcg_temp_new(); + TCGv t0 = load_gpr(rs); + TCGv t1 = load_gpr(rt); + TCGv addr = tcg_temp_new(); + tcg_gen_addi_tl(addr, t0, SEXT16(imm)); tcg_gen_qemu_st_tl(t1, addr, ctx->mem_idx, MO_TE | MO_UB); - tcg_temp_free(t0); tcg_temp_free(t1); tcg_temp_free(addr); + + tcg_temp_free(t0); + tcg_temp_free(t1); + tcg_temp_free(addr); } break; @@ -730,10 +953,9 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) } /* ======================================================================== - * 主控架构 + * 主控架构 (Main Architecture Loop) * ======================================================================== */ void translate_init(void) { - printf("\n====ALL-GOOD-DISABLED-TB-CHAINING==== \n\n"); for (int i = 0; i < 32; i++) { cpu_gpr[i] = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, gpr[i]), mips_gpr_names[i]); } @@ -746,16 +968,11 @@ void gen_sync_pc(DisasContext *dc) { tcg_gen_movi_tl(cpu_PC, dc->pc); } -// ======================================================================== -// 断点支持 -// ======================================================================== int gen_breakpoint(DisasContextBase *dcbase, CPUBreakpoint *bp) { DisasContext *ctx = (DisasContext *)dcbase; if (ctx->pc != ctx->base.tb->pc) { gen_sync_pc(ctx); } - - /* 回退到旧框架的安全实现:抛出断点异常,交出控制权 */ generate_exception_end(ctx, EXCP_DEBUG); return 1; } @@ -764,13 +981,7 @@ int gen_intermediate_code(CPUState *env, DisasContextBase *dcbase) { DisasContext *ctx = (DisasContext *)dcbase; ctx->pc = dcbase->pc; - /* ========================================================= - * 【终极护城河】:拦截裸机异常向量! - * 既然 MTC0 作为桩函数“吃掉”了关中断指令, - * 时钟中断依然会将 PC 带到异常入口 0xBFC00380。 - * 我们直接让翻译器在这里生成一个安全的死循环,彻底阻断 NOP 滑行坠毁! - * ========================================================= */ - if (ctx->pc == 0xBFC00380 || ctx->pc == 0x80000180) { + if (ctx->pc == 0xBFC00380) { gen_goto_tb(ctx, 0, ctx->pc); return 0; } @@ -779,14 +990,11 @@ int gen_intermediate_code(CPUState *env, DisasContextBase *dcbase) { ctx->mem_idx = cpu_mmu_index(env); tcg_gen_insn_start(ctx->pc, ctx->pc + 4); - // ======================================================================== - // 检查 GDB 是否在此处埋下了硬件断点 - // ======================================================================== CPUBreakpoint *bp; QTAILQ_FOREACH(bp, &env->breakpoints, entry) { if (bp->pc == ctx->pc) { gen_breakpoint(dcbase, bp); - return 0; + return 0; } } @@ -797,22 +1005,20 @@ int gen_intermediate_code(CPUState *env, DisasContextBase *dcbase) { } if (ctx->hflags & MIPS_HFLAG_DSLOT) { - if (ctx->hflags & MIPS_HFLAG_BR) { - TCGv_i32 t_hflags = tcg_const_i32(0); - tcg_gen_st_i32(t_hflags, cpu_env, offsetof(CPUState, hflags)); - tcg_temp_free_i32(t_hflags); - tcg_gen_exit_tb(0); - } - else if (ctx->hflags & MIPS_HFLAG_B) { + if (ctx->hflags & (MIPS_HFLAG_B | MIPS_HFLAG_BR)) { + // 【终极修复】:无论是静态还是动态分支,统一从 btarget 读取真实跳转地址! TCGv t_dest = tcg_temp_new(); tcg_gen_ld_tl(t_dest, cpu_env, offsetof(CPUState, btarget)); tcg_gen_mov_tl(cpu_PC, t_dest); tcg_temp_free(t_dest); - TCGv_i32 t_hflags = tcg_const_i32(0); + TCGv_i32 t_hflags = tcg_temp_new_i32(); + tcg_gen_ld_i32(t_hflags, cpu_env, offsetof(CPUState, hflags)); + tcg_gen_andi_i32(t_hflags, t_hflags, ~(MIPS_HFLAG_DSLOT | MIPS_HFLAG_B | MIPS_HFLAG_BC | MIPS_HFLAG_BR)); tcg_gen_st_i32(t_hflags, cpu_env, offsetof(CPUState, hflags)); tcg_temp_free_i32(t_hflags); - tcg_gen_exit_tb(0); + + tcg_gen_exit_tb(0); // Renode 兼容:退出基本块,让主循环执行刚才写入 PC 的目标 } else if (ctx->hflags & MIPS_HFLAG_BC) { int l1 = gen_new_label(); @@ -829,23 +1035,30 @@ int gen_intermediate_code(CPUState *env, DisasContextBase *dcbase) { tcg_gen_br(l_end); gen_set_label(l1); - tcg_gen_movi_tl(cpu_PC, dcbase->pc + 4); + tcg_gen_movi_tl(cpu_PC, dcbase->pc + 4); gen_set_label(l_end); tcg_temp_free(bv); - TCGv_i32 t_hflags = tcg_const_i32(0); - tcg_gen_st_i32(t_hflags, cpu_env, offsetof(CPUState, hflags)); + TCGv_i32 t_hflags = tcg_temp_new_i32(); + tcg_gen_ld_i32(t_hflags, cpu_env, offsetof(CPUState, hflags)); + tcg_gen_andi_i32(t_hflags, t_hflags, ~(MIPS_HFLAG_DSLOT | MIPS_HFLAG_B | MIPS_HFLAG_BC | MIPS_HFLAG_BR)); + tcg_gen_st_i32(t_hflags, cpu_env, offsetof(CPUState, hflags)); tcg_temp_free_i32(t_hflags); - tcg_gen_exit_tb(0); + + tcg_gen_exit_tb(0); // Renode 兼容:退出基本块,让主循环执行刚才写入 PC 的目标 } ctx->base.is_jmp = DISAS_TB_JUMP; ctx->hflags &= ~(MIPS_HFLAG_DSLOT | MIPS_HFLAG_B | MIPS_HFLAG_BC | MIPS_HFLAG_BR); } else if (ctx->hflags & (MIPS_HFLAG_B | MIPS_HFLAG_BC | MIPS_HFLAG_BR)) { ctx->hflags |= MIPS_HFLAG_DSLOT; - TCGv t_btarget = tcg_const_tl(ctx->btarget); - tcg_gen_st_tl(t_btarget, cpu_env, offsetof(CPUState, btarget)); - tcg_temp_free(t_btarget); + + // 【修复】:仅非动态跳转时才覆盖 btarget,防止 JR 跳转目标被冲刷 + if (!(ctx->hflags & MIPS_HFLAG_BR)) { + TCGv t_btarget = tcg_const_tl(ctx->btarget); + tcg_gen_st_tl(t_btarget, cpu_env, offsetof(CPUState, btarget)); + tcg_temp_free(t_btarget); + } } dcbase->tb->size += 4; @@ -857,8 +1070,13 @@ int gen_intermediate_code(CPUState *env, DisasContextBase *dcbase) { tcg_temp_free_i32(t_hflags); } - if (ctx->base.is_jmp != DISAS_NEXT) return 0; - if ((dcbase->pc & (TARGET_PAGE_SIZE - 1)) == 0) return 0; + if (ctx->base.is_jmp != DISAS_NEXT) { + return 0; + } + + if ((dcbase->pc & (TARGET_PAGE_SIZE - 1)) == 0) { + return 0; + } return 1; } @@ -866,7 +1084,7 @@ int gen_intermediate_code(CPUState *env, DisasContextBase *dcbase) { uint32_t gen_intermediate_code_epilogue(CPUState *env, DisasContextBase *dcbase) { DisasContext *ctx = (DisasContext *)dcbase; if (ctx->base.is_jmp == DISAS_NEXT) { - gen_goto_tb(ctx, 1, dcbase->pc); + gen_goto_tb(ctx, 1, dcbase->pc); // 恢复为旧版顺序块跳转机制 } return dcbase->tb->size; } diff --git a/src/Plugins/CoSimulationPlugin/bin/Debug/net8.0/CoSimulationPlugin.deps.json b/src/Plugins/CoSimulationPlugin/bin/Debug/net8.0/CoSimulationPlugin.deps.json index 95dc24b..834dc11 100644 --- a/src/Plugins/CoSimulationPlugin/bin/Debug/net8.0/CoSimulationPlugin.deps.json +++ b/src/Plugins/CoSimulationPlugin/bin/Debug/net8.0/CoSimulationPlugin.deps.json @@ -15,10 +15,10 @@ "System.ServiceModel.Duplex": "4.8.1", "System.ServiceModel.Federation": "4.8.1", "System.ServiceModel.NetTcp": "4.8.1", - "AntShell.Reference": "1.0.9593.26098", + "AntShell.Reference": "1.0.9606.31907", "BigGustave.Reference": "1.0.0.0", "crypto.Reference": "1.9.0.0", - "CxxDemangler.Reference": "1.0.9593.26090", + "CxxDemangler.Reference": "1.0.9606.31897", "ELFSharp.Reference": "0.1.1.0", "FdtSharp.Reference": "0.1.0.0", "Infrastructure.Reference": "1.0.0.0", @@ -1782,10 +1782,10 @@ } } }, - "AntShell.Reference/1.0.9593.26098": { + "AntShell.Reference/1.0.9606.31907": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9593.26098", + "assemblyVersion": "1.0.9606.31907", "fileVersion": "0.0.0.0" } } @@ -1806,10 +1806,10 @@ } } }, - "CxxDemangler.Reference/1.0.9593.26090": { + "CxxDemangler.Reference/1.0.9606.31897": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9593.26090", + "assemblyVersion": "1.0.9606.31897", "fileVersion": "0.0.0.0" } } @@ -2841,7 +2841,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9593.26098": { + "AntShell.Reference/1.0.9606.31907": { "type": "reference", "serviceable": false, "sha512": "" @@ -2856,7 +2856,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9593.26090": { + "CxxDemangler.Reference/1.0.9606.31897": { "type": "reference", "serviceable": false, "sha512": "" diff --git a/src/Plugins/CoSimulationPlugin/bin/Debug/net8.0/OptionsParser.deps.json b/src/Plugins/CoSimulationPlugin/bin/Debug/net8.0/OptionsParser.deps.json index 5b9eb74..6370e9e 100644 --- a/src/Plugins/CoSimulationPlugin/bin/Debug/net8.0/OptionsParser.deps.json +++ b/src/Plugins/CoSimulationPlugin/bin/Debug/net8.0/OptionsParser.deps.json @@ -8,10 +8,10 @@ ".NETCoreApp,Version=v8.0": { "OptionsParser/1.0.0": { "dependencies": { + "Microsoft.CSharp": "4.7.0", "Microsoft.NET.Test.Sdk": "16.9.1", "NUnit": "3.13.1", - "NUnit3TestAdapter": "3.17.0", - "OptionsParser": "1.0.0" + "NUnit3TestAdapter": "3.17.0" }, "runtime": { "OptionsParser.dll": {} diff --git a/src/Plugins/CoSimulationPlugin/obj/Debug/net8.0/CoSimulationPlugin_NET.csproj.AssemblyReference.cache b/src/Plugins/CoSimulationPlugin/obj/Debug/net8.0/CoSimulationPlugin_NET.csproj.AssemblyReference.cache index 8f35dcbe88e6afc015a78efc0a4d8f5f51747ee7..ba65456515c706ba13222de39257baddaa13bab6 100644 GIT binary patch delta 388 zcmeyfk@?R?<_Yo2-`39XKRE9m2O}dRhhttza7JoQ4kIH21hlC#Ff6W_{J=zh;z9{d zGXpa{V?#>=^T~m#+8f^%GqaUXIoxn?-sUuxH;imhwTaA9lj~UpCf9IrZ0=%n76FUT zteFfI-~3m~l!;@9nwcZW(#anMbtb#TBSxot7gTheD7xM8z!*eV_`#&E|$p%xouQK7ds0H@U&WX8A`t z49K2qd5wwfE{|&{kX>n`&&IYxAPMB`bxu76Y){iSb*-Pb*_ ZaM<1131kC3EFhscxhLCtv&*p^LI8okj&A?} delta 387 zcmeyfk@?R?<_Yo2my_gV@~7P6U}R+EaLg+S&PdJ4VPs^0fJ#*chEJ)JADGBbTqwb5 zYH6%zWM*J#F*#6Gd*j<;X11_(qJH^PHm9+?VPu1nxrU2la~GSl2w418 z>SU<+=D$*=OdRv7!vsK>ps_%wO*T=M;efeq@jBKln?*r}F{97fFnZq{56Jnny zuNK(8c^X_yY?t490qxklPRo&vgHI+DqT&{ZK2U|=W^=kwYtf9Gtf?=M5uUn<@jt;+n}9d5ktsU~(1#^JjwiTAP{0wV9N^ zt)1b2aNa!*Mn*;s$Gno@jMSVQMn(n*fNBnuH0LxkFw-+Ov@|f^JW+BXGusX|GslDT zHe1MgF>!cXJctAtG1*#3V{(F|z~)2pI?U>357U7vzy|X;S5&y9<|gK)=cE>)7!Gtv zprrg{6J;5w1s0a(lP5}QZ*Ea8WMq?APy@2$w@M;2hpMX>*tp65oLXQ@=4o&-v6*{J zaRsVar{&1Tp%A1EQSpF9AFRU6u$h_dgvjLb_gT^J+OJ5Q%?cg)AUVU>*sBD*u0sMBk%Z%p7kJ)trOG)n#e!7b94CQ{c;?e UCvEi;V6(fk6DYg+*-F=9L6zq~_!>GBQ8_RCA!DIj5|$<{&|lM^HbHXoALVOIB()JWjJ6KOr9vKv$;jNkdbYb@qLgTzf}^MIc#G*foz~1{+wE1JLYL{F|l2K>jku9 z^Exd@HV!_SP>6~LEc##-W`@noY$qoP2m@8@H@U&W7CSve1<0Ojd5wuJiKS8*$gZ@} zXJeb>=%fxZ#i^%&E&TE3_?Ri19X4-fg Rp8%WU{;~w1%4bK#gaMzAd}ROt diff --git a/src/Plugins/WiresharkPlugin/bin/Debug/net8.0/OptionsParser.deps.json b/src/Plugins/WiresharkPlugin/bin/Debug/net8.0/OptionsParser.deps.json index 5b9eb74..6370e9e 100644 --- a/src/Plugins/WiresharkPlugin/bin/Debug/net8.0/OptionsParser.deps.json +++ b/src/Plugins/WiresharkPlugin/bin/Debug/net8.0/OptionsParser.deps.json @@ -8,10 +8,10 @@ ".NETCoreApp,Version=v8.0": { "OptionsParser/1.0.0": { "dependencies": { + "Microsoft.CSharp": "4.7.0", "Microsoft.NET.Test.Sdk": "16.9.1", "NUnit": "3.13.1", - "NUnit3TestAdapter": "3.17.0", - "OptionsParser": "1.0.0" + "NUnit3TestAdapter": "3.17.0" }, "runtime": { "OptionsParser.dll": {} diff --git a/src/Plugins/WiresharkPlugin/bin/Debug/net8.0/WiresharkPlugin.deps.json b/src/Plugins/WiresharkPlugin/bin/Debug/net8.0/WiresharkPlugin.deps.json index 1991802..a26ebb5 100644 --- a/src/Plugins/WiresharkPlugin/bin/Debug/net8.0/WiresharkPlugin.deps.json +++ b/src/Plugins/WiresharkPlugin/bin/Debug/net8.0/WiresharkPlugin.deps.json @@ -11,10 +11,10 @@ "AntShell": "1.0.0", "Infrastructure": "1.0.0", "StyleCop.Analyzers": "1.1.118", - "AntShell.Reference": "1.0.9593.26098", + "AntShell.Reference": "1.0.9606.31907", "BigGustave.Reference": "1.0.0.0", "crypto.Reference": "1.9.0.0", - "CxxDemangler.Reference": "1.0.9593.26090", + "CxxDemangler.Reference": "1.0.9606.31897", "ELFSharp.Reference": "0.1.1.0", "FdtSharp.Reference": "0.1.0.0", "Infrastructure.Reference": "1.0.0.0", @@ -1574,10 +1574,10 @@ } } }, - "AntShell.Reference/1.0.9593.26098": { + "AntShell.Reference/1.0.9606.31907": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9593.26098", + "assemblyVersion": "1.0.9606.31907", "fileVersion": "0.0.0.0" } } @@ -1598,10 +1598,10 @@ } } }, - "CxxDemangler.Reference/1.0.9593.26090": { + "CxxDemangler.Reference/1.0.9606.31897": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9593.26090", + "assemblyVersion": "1.0.9606.31897", "fileVersion": "0.0.0.0" } } @@ -2507,7 +2507,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9593.26098": { + "AntShell.Reference/1.0.9606.31907": { "type": "reference", "serviceable": false, "sha512": "" @@ -2522,7 +2522,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9593.26090": { + "CxxDemangler.Reference/1.0.9606.31897": { "type": "reference", "serviceable": false, "sha512": "" diff --git a/src/Plugins/WiresharkPlugin/obj/Debug/net8.0/WiresharkPlugin_NET.csproj.AssemblyReference.cache b/src/Plugins/WiresharkPlugin/obj/Debug/net8.0/WiresharkPlugin_NET.csproj.AssemblyReference.cache index 42ff7f30c28db344a9ff8a72a2dba05ee8ea77f9..52123dd5daf774da306d4958492eeb98acc73c15 100644 GIT binary patch delta 394 zcmdo0lWG4?rU~)N-`39XKRE9m2O}dRhhttza7JoQ4kIH21hlC#Ff6W_{J=zh;z9{d zGXpa{V?#>=^T~m#+8f^%GqaUXIoxn?-sUuxH;imhwTaA9lj~UpCfjb4+&r7jNCYfC zvt}|>eDhx^QznibYG#fgODBI6)S3L=L|}87EDsZ#x5a}0-+vXPKLPj=;1vNk;Hvd*hWadzH6@ysl z$*TpnaGnMi6Pvlm6jz{%by|*W9120&5EZvL^noe_H=7$aF|(bJ`2bR}-{b}ho8=$r zFd%!b% eJ?rOf-ZSI50EgY3oj^9w>jDyro6oHLECc{0?T`5Y delta 393 zcmdo0lWG4?rU~)Nmy_gV@~7P6U}R+EaLg+S&PdJ4VPs^0fJ#*chEJ)JADGBbTqwb5 zYH6%zWM*J#F*#6Gd*j<;X11_(qJH^PHm9+?VPu1n*>;=c=GkmUB4F`X zsgt4NoBv9gGI7kS4if-bI{BlZ&gAzd0-MWZd6?LIC$G>1n${to#;ooq%P$CZ7LRj9 zg-dE~VqSVqY7vUlfW`uyHrYg3h6Cod$rELDHn%7jGP12Qz7Mox^KX?zW)9mJPl$b< zyjo!U=4o&-v0Z-a1+-)HIxR;w4nCPsh>BYr`al(eo6QZInAuKF5)cNe*l%)!g)Me^ zhzgKB*YX+@TM|p9GLT(qqtC`R$;vn exH+b6-ZSI50EgoKvILNd$pR9Jo6oHLECc|0(1kAm diff --git a/src/Renode/obj/Debug/Renode_NET.csproj.AssemblyReference.cache b/src/Renode/obj/Debug/Renode_NET.csproj.AssemblyReference.cache index fed55ed29b4e2a967c796584e169a427d37250db..68fc1091761014c4452828d9814b5d6b1f11b546 100644 GIT binary patch delta 567 zcmaF+j`{67<_Yl}-`39XKRE9m$K-xFQMNW!28P8olMAKfCoYuWG&3;MGd8p|FrU1U zMSJ7hOlCH7k14JP=WUK*ab)9A2-0>0Ypk-xbQn-YuoN>h+xuz0%^>q+Js4qjCo)S-mbVs|e8$#y zazm`jWLNnDHXYld4xqB#@;z9T1x$W$Q*!eI#SM&Xei~9OKy}lUcQLc^S=ocwVd~pi z*_fx4gY*mQzF=X~34P}QWHTBGGqatL`2g~cl<6}Tj`Aso8^DgW*DwHk$HQtBhHbi9 zk(1BAk(qo!*mkm(w8v%{+dyHk!)Mk^hB|!n+yGN1jvZ=dkiePft^+nrESQIh&D-Ju zFhDkIgr+g8n>|bit6*eg?35%>$o4dS6Hs(>#O0p?9Cmkh0#ySO#s*)-$vqRTH*bBi GLkIwgCDR!I delta 566 zcmaF+j`{67<_Yl}my_gV@~7P6nA|TX%2uh$!0;(`a-o#`#Dx-^rk2KfMrH<<7Lzx! zXm5O*$;@{7t(Rc_l+7_Lj%*x!GNA%sja7E~lN+Q2Hb3DiVP;EWsZ<84h~v{|}*tNxr diff --git a/tests/unit-tests/RenodeTests/bin/Debug/net8.0/OptionsParser.deps.json b/tests/unit-tests/RenodeTests/bin/Debug/net8.0/OptionsParser.deps.json index 5b9eb74..6370e9e 100644 --- a/tests/unit-tests/RenodeTests/bin/Debug/net8.0/OptionsParser.deps.json +++ b/tests/unit-tests/RenodeTests/bin/Debug/net8.0/OptionsParser.deps.json @@ -8,10 +8,10 @@ ".NETCoreApp,Version=v8.0": { "OptionsParser/1.0.0": { "dependencies": { + "Microsoft.CSharp": "4.7.0", "Microsoft.NET.Test.Sdk": "16.9.1", "NUnit": "3.13.1", - "NUnit3TestAdapter": "3.17.0", - "OptionsParser": "1.0.0" + "NUnit3TestAdapter": "3.17.0" }, "runtime": { "OptionsParser.dll": {} diff --git a/tests/unit-tests/RenodeTests/bin/Debug/net8.0/Renode.deps.json b/tests/unit-tests/RenodeTests/bin/Debug/net8.0/Renode.deps.json index 4ee48bd..dc471c2 100644 --- a/tests/unit-tests/RenodeTests/bin/Debug/net8.0/Renode.deps.json +++ b/tests/unit-tests/RenodeTests/bin/Debug/net8.0/Renode.deps.json @@ -26,12 +26,12 @@ "Xwt": "1.0.0", "Xwt.Gtk3": "1.0.0", "libtftp": "1.0.0", - "AntShell.Reference": "1.0.9593.26098", + "AntShell.Reference": "1.0.9606.31907", "BigGustave.Reference": "1.0.0.0", "CookComputing.XmlRpcV2": "2.5.0.0", "CoSimulationPlugin.Reference": "1.0.0.0", "crypto.Reference": "1.9.0.0", - "CxxDemangler.Reference": "1.0.9593.26090", + "CxxDemangler.Reference": "1.0.9606.31897", "ELFSharp.Reference": "0.1.1.0", "FdtSharp.Reference": "0.1.0.0", "Infrastructure.Reference": "1.0.0.0", @@ -1954,10 +1954,10 @@ } } }, - "AntShell.Reference/1.0.9593.26098": { + "AntShell.Reference/1.0.9606.31907": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9593.26098", + "assemblyVersion": "1.0.9606.31907", "fileVersion": "0.0.0.0" } } @@ -1994,10 +1994,10 @@ } } }, - "CxxDemangler.Reference/1.0.9593.26090": { + "CxxDemangler.Reference/1.0.9606.31897": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9593.26090", + "assemblyVersion": "1.0.9606.31897", "fileVersion": "0.0.0.0" } } @@ -3134,7 +3134,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9593.26098": { + "AntShell.Reference/1.0.9606.31907": { "type": "reference", "serviceable": false, "sha512": "" @@ -3159,7 +3159,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9593.26090": { + "CxxDemangler.Reference/1.0.9606.31897": { "type": "reference", "serviceable": false, "sha512": "" diff --git a/tests/unit-tests/RenodeTests/bin/Debug/net8.0/RenodeTests.deps.json b/tests/unit-tests/RenodeTests/bin/Debug/net8.0/RenodeTests.deps.json index cd6971b..53057fc 100644 --- a/tests/unit-tests/RenodeTests/bin/Debug/net8.0/RenodeTests.deps.json +++ b/tests/unit-tests/RenodeTests/bin/Debug/net8.0/RenodeTests.deps.json @@ -16,11 +16,11 @@ "NUnit3TestAdapter": "3.17.0", "Renode": "1.0.0", "UnitTests": "1.0.0", - "AntShell.Reference": "1.0.9593.26098", + "AntShell.Reference": "1.0.9606.31907", "BigGustave.Reference": "1.0.0.0", "CoSimulationPlugin.Reference": "1.0.0.0", "crypto.Reference": "1.9.0.0", - "CxxDemangler.Reference": "1.0.9593.26090", + "CxxDemangler.Reference": "1.0.9606.31897", "ELFSharp.Reference": "0.1.1.0", "FdtSharp.Reference": "0.1.0.0", "Infrastructure.Reference": "1.0.0.0", @@ -28,7 +28,7 @@ "Migrant.Reference": "0.14.0.0", "OptionsParser.Reference": "0.1.0.0", "PacketDotNet.Reference": "0.13.0.0", - "Renode.Reference": "1.16.0.26159", + "Renode.Reference": "1.16.0.31961", "SampleCommandPlugin.Reference": "1.0.0.0", "Sprache": "2.1.0.0", "SystemCPlugin.Reference": "1.0.0.0", @@ -2035,10 +2035,10 @@ } } }, - "AntShell.Reference/1.0.9593.26098": { + "AntShell.Reference/1.0.9606.31907": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9593.26098", + "assemblyVersion": "1.0.9606.31907", "fileVersion": "0.0.0.0" } } @@ -2067,10 +2067,10 @@ } } }, - "CxxDemangler.Reference/1.0.9593.26090": { + "CxxDemangler.Reference/1.0.9606.31897": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9593.26090", + "assemblyVersion": "1.0.9606.31897", "fileVersion": "0.0.0.0" } } @@ -2131,10 +2131,10 @@ } } }, - "Renode.Reference/1.16.0.26159": { + "Renode.Reference/1.16.0.31961": { "runtime": { "Renode.dll": { - "assemblyVersion": "1.16.0.26159", + "assemblyVersion": "1.16.0.31961", "fileVersion": "0.0.0.0" } } @@ -3255,7 +3255,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9593.26098": { + "AntShell.Reference/1.0.9606.31907": { "type": "reference", "serviceable": false, "sha512": "" @@ -3275,7 +3275,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9593.26090": { + "CxxDemangler.Reference/1.0.9606.31897": { "type": "reference", "serviceable": false, "sha512": "" @@ -3315,7 +3315,7 @@ "serviceable": false, "sha512": "" }, - "Renode.Reference/1.16.0.26159": { + "Renode.Reference/1.16.0.31961": { "type": "reference", "serviceable": false, "sha512": "" diff --git a/tests/unit-tests/RenodeTests/bin/Debug/net8.0/UnitTests.deps.json b/tests/unit-tests/RenodeTests/bin/Debug/net8.0/UnitTests.deps.json index 2efd751..f0eb8ad 100644 --- a/tests/unit-tests/RenodeTests/bin/Debug/net8.0/UnitTests.deps.json +++ b/tests/unit-tests/RenodeTests/bin/Debug/net8.0/UnitTests.deps.json @@ -18,11 +18,11 @@ "NUnit3TestAdapter": "3.17.0", "Renode": "1.0.0", "StyleCop.Analyzers": "1.1.118", - "AntShell.Reference": "1.0.9593.26098", + "AntShell.Reference": "1.0.9606.31907", "BigGustave.Reference": "1.0.0.0", "CoSimulationPlugin.Reference": "1.0.0.0", "crypto.Reference": "1.9.0.0", - "CxxDemangler.Reference": "1.0.9593.26090", + "CxxDemangler.Reference": "1.0.9606.31897", "ELFSharp.Reference": "0.1.1.0", "FdtSharp.Reference": "0.1.0.0", "Infrastructure.Reference": "1.0.0.0", @@ -31,7 +31,7 @@ "Migrant.Reference": "0.14.0.0", "OptionsParser.Reference": "0.1.0.0", "PacketDotNet.Reference": "0.13.0.0", - "Renode.Reference": "1.16.0.26159", + "Renode.Reference": "1.16.0.31961", "SampleCommandPlugin.Reference": "1.0.0.0", "SystemCPlugin.Reference": "1.0.0.0", "TermSharp.Reference": "0.0.0.0", @@ -2018,10 +2018,10 @@ } } }, - "AntShell.Reference/1.0.9593.26098": { + "AntShell.Reference/1.0.9606.31907": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9593.26098", + "assemblyVersion": "1.0.9606.31907", "fileVersion": "0.0.0.0" } } @@ -2050,10 +2050,10 @@ } } }, - "CxxDemangler.Reference/1.0.9593.26090": { + "CxxDemangler.Reference/1.0.9606.31897": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9593.26090", + "assemblyVersion": "1.0.9606.31897", "fileVersion": "0.0.0.0" } } @@ -2122,10 +2122,10 @@ } } }, - "Renode.Reference/1.16.0.26159": { + "Renode.Reference/1.16.0.31961": { "runtime": { "Renode.dll": { - "assemblyVersion": "1.16.0.26159", + "assemblyVersion": "1.16.0.31961", "fileVersion": "0.0.0.0" } } @@ -3232,7 +3232,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9593.26098": { + "AntShell.Reference/1.0.9606.31907": { "type": "reference", "serviceable": false, "sha512": "" @@ -3252,7 +3252,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9593.26090": { + "CxxDemangler.Reference/1.0.9606.31897": { "type": "reference", "serviceable": false, "sha512": "" @@ -3297,7 +3297,7 @@ "serviceable": false, "sha512": "" }, - "Renode.Reference/1.16.0.26159": { + "Renode.Reference/1.16.0.31961": { "type": "reference", "serviceable": false, "sha512": "" diff --git a/tests/unit-tests/RenodeTests/obj/Debug/net8.0/RenodeTests_NET.csproj.AssemblyReference.cache b/tests/unit-tests/RenodeTests/obj/Debug/net8.0/RenodeTests_NET.csproj.AssemblyReference.cache index b724630321bbc0b961992bc9d66071be2b81e88b..e437fcfbe837c0aa90b3b867413550044216afb8 100644 GIT binary patch delta 629 zcmcaNjpg1nmI>}`iywdMJ~(fpuO!pWn#qaI3KKiTS&a=X%?u|qifC^;eT-6Jq|`jMh?fklHiQg zoE%0*1_*!}kZ2%3`98k{rU0%Y@w zt!8EOws;T;WbczsV`ejZm=07kSxa6T?4p@K*8&a9l9z!RXkiI9aPq%=_KDX5CKssA zo4j73hD~BY4ajIi#YAQ{RaY?(dxnZ16Pr%xI}afHjT##>o4LmnS0MX`rXw4hLXb8{ zjlIDUW{wjwAAsWbI3~xl>rE~&5Zvr#a*T!T{WRZZpb9Zd4@Ts$>9e}T#yq9G11Obd zeTRj^@{e>FSaTeUHc+#`=2nMoKx=J_Kq?%ad(brdPBt)#ncVP!ck%>#+sz+b)fn0Q zG^9WwA>+P?nd2^xYbe;Xg)9=274}+hmh`^G%CSQr2^c;=2P$UEfyjx&hS+zHs&%$PCdXVGxakludH(Ooo2NYeAi(xCeG^Dk*S8&v X9CmkhLR1xIDNf#V+IsV{A3KBq((LmV delta 628 zcmcaNjpg1nmI>}`l?!IZ=TDjFE6JpvHaXE*VPc0ktC5+ZspVuw5$%oVb6MCbRT&sQ zrA{_X*P47cCUP?GXO7KhS(8}Uu6nws>}7I{g)LD&FB+&q%+iAqIcWN z(yZ^WaKugzQ2}d?W6=g`7TDbCu#JhWMU4fd!qK@0O|$Q01EZM94Ig+XPq4S${J~X? zk*zSlJshZ3#(fbpM-oe=GT5|*EE1Cy_F8Y2^uEQ)G0D+M9W1JtEejHzEa~01`C;G# z7LKrWqJCf*Mk@ob?VRDOP;AU)jGTIaQD*XaCWp;4BBu$%!W0G{~