From 2b44097e83d558b75b2bac45ba50f52e649d10ce Mon Sep 17 00:00:00 2001 From: wangsixiang <1936693111@qq.com> Date: Mon, 16 Mar 2026 13:12:50 +0800 Subject: [PATCH] yichu-trap-yichang --- output/bin/Debug/OptionsParser.deps.json | 4 +- output/bin/Debug/Renode.deps.json | 16 +- .../Emulator/Cores/tlib/arch/mips/translate.c | 573 ++++++++++-------- .../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 18 files changed, 400 insertions(+), 321 deletions(-) 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 4f83893..98e490d 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.9568.24184", + "AntShell.Reference": "1.0.9571.20353", "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.9568.24177", + "CxxDemangler.Reference": "1.0.9571.20346", "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.9568.24184": { + "AntShell.Reference/1.0.9571.20353": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9568.24184", + "assemblyVersion": "1.0.9571.20353", "fileVersion": "0.0.0.0" } } @@ -1994,10 +1994,10 @@ } } }, - "CxxDemangler.Reference/1.0.9568.24177": { + "CxxDemangler.Reference/1.0.9571.20346": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9568.24177", + "assemblyVersion": "1.0.9571.20346", "fileVersion": "0.0.0.0" } } @@ -3134,7 +3134,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9568.24184": { + "AntShell.Reference/1.0.9571.20353": { "type": "reference", "serviceable": false, "sha512": "" @@ -3159,7 +3159,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9568.24177": { + "CxxDemangler.Reference/1.0.9571.20346": { "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 79f6559..164d22a 100644 --- a/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/translate.c +++ b/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/translate.c @@ -1,11 +1,7 @@ /* - * MIPS32 指令翻译器 - 终极救赎版 (Ultimate Redemption Edition) - * * 核心破局:彻底避开老版 TCG 的“全局内存变量 (Global Mem Temp)”陷阱! - * * 解决逻辑: - * 1. 绝不将 cpu_gpr 等全局变量直接传入 tcg_gen_add_tl 等复杂 ALU 宏。 - * 2. 引入严格的 Load/Store 屏障:所有的全局变量必须先 mov 复制到 local temp 中, - * 计算完成后再 mov 回去。这彻底消灭了 TCG 后端隐式创建 unnamed 变量导致的 DEAD 崩溃。 - * 3. 完美迎回 MIPS 原生跳转与延迟槽架构! + * MIPS32 + * * 新增特性:完整 MIPS CP0 异常系统。 + * * 修复日志:全面实现了 MIPS 架构完整的 12 条 Trap 陷阱指令(R-Type 与 立即数型)。 */ #include "cpu.h" @@ -21,6 +17,26 @@ #define DISAS_STOP 4 #endif +// ======================================================================== +// MIPS 架构标准异常代号 (ExcCode) +// ======================================================================== +#define EXCP_INT 0 // 中断 (Interrupt) +#define EXCP_MOD 1 // TLB 修改异常 (TLB Mod) +#define EXCP_TLBL 2 // TLB 异常 (加载/取指) +#define EXCP_TLBS 3 // TLB 异常 (存储) +#define EXCP_AdEL 4 // 地址错误 (加载/取指) +#define EXCP_AdES 5 // 地址错误 (存储) +#define EXCP_IBE 6 // 总线错误 (取指) +#define EXCP_DBE 7 // 总线错误 (数据访问) +#define EXCP_SYSCALL 8 // 系统调用 (Syscall) +#define EXCP_BREAK 9 // 断点 (Breakpoint) +#define EXCP_RI 10 // 保留指令 (Reserved Instruction) +#define EXCP_CpU 11 // 协处理器不可用 (Coprocessor Unusable) +#define EXCP_OVERFLOW 12 // 算术溢出 (Arithmetic Overflow) +#define EXCP_TRAP 13 // 陷阱指令 (Trap) +#define EXCP_FPE 15 // 浮点异常 (Floating Point) +#define EXCP_WATCH 23 // 监视点 (Watchpoint) + #define OPCODE(insn) ((insn >> 26) & 0x3F) #define RS(insn) ((insn >> 21) & 0x1F) #define RT(insn) ((insn >> 16) & 0x1F) @@ -44,38 +60,47 @@ static const char * const mips_gpr_names[32] = { "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra" }; -/* ======================================================================== - * 绝对安全的寄存器屏障访问接口 (Load/Store Barrier) - * 每一滴数据都必须经过显式的 temp 中转! - * ======================================================================== */ -static inline int is_zero_reg(int reg) { - return reg == 0; +// ======================================================================== +// 异常抛出引擎 (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); + tcg_gen_st_i32(t_excp, cpu_env, offsetof(CPUState, exception_index)); + tcg_temp_free_i32(t_excp); + tcg_gen_exit_tb(0); } -/* 【核心救命神技】:永远返回一个崭新的 temp,绝不直接泄露 cpu_gpr */ +// 2. 用于无条件异常(抛出后彻底终止整个基本块的翻译) +static inline void generate_exception_end(DisasContext *ctx, int excp) { + generate_exception_err(ctx, excp); + ctx->base.is_jmp = DISAS_TB_JUMP; +} + +/* ======================================================================== + * 绝对安全的寄存器屏障访问接口 (Load/Store Barrier) + * ======================================================================== */ +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 链接语法 */ static inline void gen_goto_tb(DisasContext *dc, int n, uint32_t dest) { TranslationBlock *tb = dc->base.tb; if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK)) { tcg_gen_goto_tb(n); tcg_gen_movi_tl(cpu_PC, dest); - tcg_gen_exit_tb((uintptr_t)tb + n); // 必须用这种指针偏移法,这是老 QEMU 的规矩 + tcg_gen_exit_tb((uintptr_t)tb + n); } else { tcg_gen_movi_tl(cpu_PC, dest); tcg_gen_exit_tb(0); @@ -83,118 +108,119 @@ static inline void gen_goto_tb(DisasContext *dc, int n, uint32_t dest) { } /* ======================================================================== - * 纯线性算术与逻辑运算 (100% 本地 Temp 化) + * 带溢出检测的算术运算与逻辑运算 * ======================================================================== */ - -static void gen_add_addu(DisasContext *ctx, int rd, int rs, int rt) { +static void gen_add(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 res = tcg_temp_local_new(); // 跨越标签生存,必须使用 local temp tcg_gen_add_tl(res, t0, t1); + + TCGv t_ov = tcg_temp_new(); + TCGv t_tmp = tcg_temp_new(); + tcg_gen_xor_tl(t_ov, t0, res); + tcg_gen_xor_tl(t_tmp, t1, res); + tcg_gen_and_tl(t_ov, t_ov, t_tmp); + + int l_no_ov = gen_new_label(); + tcg_gen_brcondi_tl(TCG_COND_GE, t_ov, 0, l_no_ov); + + generate_exception_err(ctx, EXCP_OVERFLOW); + + gen_set_label(l_no_ov); 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); + tcg_temp_free(t_ov); tcg_temp_free(t_tmp); } -static void gen_sub_subu(DisasContext *ctx, int rd, int rs, int rt) { +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(); + tcg_gen_add_tl(res, t0, t1); + store_gpr(rd, 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) { if (is_zero_reg(rd)) return; TCGv t0 = load_gpr(rs); TCGv t1 = load_gpr(rt); - TCGv res = tcg_temp_new(); - + TCGv res = tcg_temp_local_new(); // 跨越标签生存,必须使用 local temp tcg_gen_sub_tl(res, t0, t1); + + TCGv t_ov = tcg_temp_new(); + TCGv t_tmp = tcg_temp_new(); + tcg_gen_xor_tl(t_ov, t0, t1); + tcg_gen_xor_tl(t_tmp, t0, res); + tcg_gen_and_tl(t_ov, t_ov, t_tmp); + + int l_no_ov = gen_new_label(); + tcg_gen_brcondi_tl(TCG_COND_GE, t_ov, 0, l_no_ov); + + generate_exception_err(ctx, EXCP_OVERFLOW); + + gen_set_label(l_no_ov); 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); + 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(); + tcg_gen_sub_tl(res, t0, t1); + store_gpr(rd, 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(); - + 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); - } - + else if (op == 0x27) { tcg_gen_or_tl(res, t0, t1); tcg_gen_not_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_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(); - + 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); + 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 { - // DIV / DIVU 防崩溃处理 - 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) { // DIV - TCGv is_min = tcg_temp_new(); - TCGv is_neg1 = tcg_temp_new(); - TCGv is_fpe = tcg_temp_new(); - TCGv fix_fpe = tcg_temp_new(); - + 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(); 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); // 复用 safe_t1 当 HI - 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 { // DIVU + 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); + } else { tcg_gen_divu_tl(res, t0, safe_t1); - tcg_gen_remu_tl(safe_t1, t0, safe_t1); // 复用 safe_t1 当 HI - tcg_gen_mov_tl(cpu_HI, safe_t1); - tcg_gen_mov_tl(cpu_LO, res); + 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_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); } /* ======================================================================== @@ -217,35 +243,57 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) switch (op) { case 0x00: // SPECIAL (R-Type) switch (funct) { - case 0x20: // ADD - case 0x21: // ADDU - gen_add_addu(ctx, rd, rs, rt); + 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 + + // 全系陷阱指令 (Trap) - R-Type + case 0x30: // TGE + case 0x31: // TGEU + case 0x32: // TLT + case 0x33: // TLTU + case 0x34: // TEQ + case 0x36: // TNE + { + 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; // TGE -> 不满足则跳过 (LT) + else if (funct == 0x31) cond_skip = TCG_COND_LTU; // TGEU -> 不满足则跳过 (LTU) + else if (funct == 0x32) cond_skip = TCG_COND_GE; // TLT -> 不满足则跳过 (GE) + else if (funct == 0x33) cond_skip = TCG_COND_GEU; // TLTU -> 不满足则跳过 (GEU) + else if (funct == 0x34) cond_skip = TCG_COND_NE; // TEQ -> 不满足则跳过 (NE) + else cond_skip = TCG_COND_EQ; // TNE -> 不满足则跳过 (EQ) + + tcg_gen_brcond_tl(cond_skip, t0, t1, l_no_trap); + generate_exception_err(ctx, EXCP_TRAP); // 条件成立,抛出陷阱异常 + gen_set_label(l_no_trap); // 安全着陆点 + + tcg_temp_free(t0); tcg_temp_free(t1); + } break; - - case 0x22: // SUB - case 0x23: // SUBU - gen_sub_subu(ctx, rd, rs, rt); + + case 0x0C: // SYSCALL + generate_exception_end(ctx, EXCP_SYSCALL); // 无条件异常,彻底截断 + break; + case 0x0D: // BREAK + generate_exception_end(ctx, EXCP_BREAK); 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; @@ -253,15 +301,12 @@ 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(); + 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); store_gpr(rd, res); - - tcg_temp_free(t0); - tcg_temp_free(res); + tcg_temp_free(t0); tcg_temp_free(res); } break; @@ -269,123 +314,98 @@ 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); 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); + 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); + 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); tcg_gen_mov_tl(cpu_PC, t0); 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); + 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); ctx->hflags |= MIPS_HFLAG_BR; - tcg_temp_free(t0); - tcg_temp_free(t1); + tcg_temp_free(t0); tcg_temp_free(t1); } break; default: - return false; // 交给兜底解释器 + generate_exception_end(ctx, EXCP_RI); + return true; } break; 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); store_gpr(rd, res); + tcg_temp_free(t0); tcg_temp_free(t1); tcg_temp_free(res); } } else { - return false; + generate_exception_end(ctx, EXCP_RI); return true; } break; + + case 0x11: // COP1 (FPU) + generate_exception_end(ctx, EXCP_CpU); + return true; 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)); 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(); + 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)); store_gpr(rt, res); - tcg_temp_free(t0); - tcg_temp_free(res); + tcg_temp_free(t0); tcg_temp_free(res); } break; @@ -393,14 +413,12 @@ 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); store_gpr(rt, res); - tcg_temp_free(t0); - tcg_temp_free(res); + tcg_temp_free(t0); tcg_temp_free(res); } break; @@ -408,64 +426,73 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) 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); + store_gpr(rt, res); tcg_temp_free(res); } break; - /* 分支跳转指令 */ + /* REGIMM 系列指令:分支与立即数陷阱 */ case 0x01: // REGIMM { - if (rt != 0x00 && rt != 0x01) return false; - TCGv t0 = load_gpr(rs); - TCGv res = tcg_temp_new(); - - if (rt == 0x00) tcg_gen_setcondi_tl(TCG_COND_LT, res, t0, 0); // BLTZ - else tcg_gen_setcondi_tl(TCG_COND_GE, res, t0, 0); // BGEZ - - // 安全使用 _tl 宏,绝对防止截断 - tcg_gen_st_tl(res, cpu_env, offsetof(CPUState, bcond)); - ctx->btarget = ctx->pc + 4 + (imm << 2); - ctx->hflags |= MIPS_HFLAG_BC; + TCGv t0 = load_gpr(rs); + if (rt == 0x00 || rt == 0x01) { // BLTZ, BGEZ + TCGv res = tcg_temp_new(); + if (rt == 0x00) 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) + + // 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); // 安全着陆点 + } + else { + generate_exception_end(ctx, EXCP_RI); // 不存在的 REGIMM 子指令 + tcg_temp_free(t0); + return true; + } tcg_temp_free(t0); - tcg_temp_free(res); } break; 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; @@ -474,61 +501,117 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) ctx->btarget = ((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; - /* 访存指令 */ - case 0x20: // LB - case 0x21: // LH + /* =============================================================== + * 访存异常监控 (Memory Traps: EXCP_AdEL / EXCP_AdES) + * =============================================================== */ case 0x23: // LW - case 0x24: // LBU + { + TCGv t0 = load_gpr(rs); + TCGv addr = tcg_temp_local_new(); // 使用 local temp,跨越标签存活 + 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); // 条件异常,仅本分支停止 + + 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); + } + break; + + case 0x2B: // SW + { + TCGv t0 = load_gpr(rs); + TCGv addr = tcg_temp_local_new(); // 使用 local temp + 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); // 条件异常,仅本分支停止 + + gen_set_label(l_align_ok); + 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); + } + break; + + case 0x21: // LH case 0x25: // LHU { - TCGv t0 = load_gpr(rs); - TCGv addr = tcg_temp_new(); - TCGv res = tcg_temp_new(); + TCGv t0 = load_gpr(rs); + TCGv addr = tcg_temp_local_new(); // 使用 local temp tcg_gen_addi_tl(addr, t0, SEXT16(imm)); - TCGMemOp mop = MO_TE; - if (op == 0x20) mop |= MO_SB; - else if (op == 0x21) mop |= MO_SW; - else if (op == 0x23) mop |= MO_SL; - else if (op == 0x24) mop |= MO_UB; - else mop |= MO_UW; - tcg_gen_qemu_ld_tl(res, addr, ctx->mem_idx, mop); - store_gpr(rt, res); - tcg_temp_free(t0); - tcg_temp_free(addr); - tcg_temp_free(res); + 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); // 条件异常,仅本分支停止 + + 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); + } + break; + + case 0x29: // SH + { + TCGv t0 = load_gpr(rs); + TCGv addr = tcg_temp_local_new(); // 使用 local temp + 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); // 条件异常,仅本分支停止 + + gen_set_label(l_align_ok); + 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); + } + break; + + case 0x20: // LB + case 0x24: // LBU + { + 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); } break; case 0x28: // SB - case 0x29: // SH - case 0x2B: // SW { - 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)); - TCGMemOp smop = MO_TE; - if (op == 0x28) smop |= MO_UB; - else if (op == 0x29) smop |= MO_UW; - else smop |= MO_UL; - tcg_gen_qemu_st_tl(t1, addr, ctx->mem_idx, smop); - - tcg_temp_free(t0); - tcg_temp_free(t1); - tcg_temp_free(addr); + 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); } break; default: - return false; + generate_exception_end(ctx, EXCP_RI); + return true; } return true; @@ -538,7 +621,7 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) * 主控架构 * ======================================================================== */ void translate_init(void) { - printf("\n==== 🚀 终极救赎版!重铸 Local Temp 屏障,完美消灭 TCG 死锁! ==== \n\n"); + printf("\n====ALL-GOOD==== \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]); } @@ -580,28 +663,24 @@ int gen_intermediate_code(CPUState *env, DisasContextBase *dcbase) { } else if (ctx->hflags & MIPS_HFLAG_BC) { int l1 = gen_new_label(); - int l_end = gen_new_label(); // 建立一个统一的安全出口 + int l_end = gen_new_label(); TCGv bv = tcg_temp_new(); tcg_gen_ld_tl(bv, cpu_env, offsetof(CPUState, bcond)); tcg_gen_brcondi_tl(TCG_COND_EQ, bv, 0, l1); - // --- 条件为真:起跳 --- 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); - tcg_gen_br(l_end); // 绝不提前 exit_tb,跳到统一出口 + tcg_gen_br(l_end); - // --- 条件为假:越过延迟槽 --- gen_set_label(l1); tcg_gen_movi_tl(cpu_PC, dcbase->pc + 4); - // --- 统一安全出口 (Common Exit) --- 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)); tcg_temp_free_i32(t_hflags); @@ -619,7 +698,7 @@ int gen_intermediate_code(CPUState *env, DisasContextBase *dcbase) { dcbase->tb->size += 4; dcbase->pc += 4; - // 如果上面经历了 exit_tb (即 IS_JUMP),则下面不会再生成多余的垃圾代码 + // 【修复核心】彻底移除了不存在的 DISAS_NORETURN 宏的判断 if (ctx->base.is_jmp != DISAS_TB_JUMP) { TCGv_i32 t_hflags = tcg_const_i32(ctx->hflags); tcg_gen_st_i32(t_hflags, cpu_env, offsetof(CPUState, hflags)); @@ -650,7 +729,7 @@ void setup_disas_context(DisasContextBase *dcbase, CPUState *env) { } int gen_breakpoint(DisasContextBase *dcbase, CPUBreakpoint *bp) { - tcg_gen_exit_tb(0); + generate_exception_end((DisasContext*)dcbase, EXCP_BREAK); return 1; } 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 aa98a93..0bef452 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.9568.24184", + "AntShell.Reference": "1.0.9571.20353", "BigGustave.Reference": "1.0.0.0", "crypto.Reference": "1.9.0.0", - "CxxDemangler.Reference": "1.0.9568.24177", + "CxxDemangler.Reference": "1.0.9571.20346", "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.9568.24184": { + "AntShell.Reference/1.0.9571.20353": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9568.24184", + "assemblyVersion": "1.0.9571.20353", "fileVersion": "0.0.0.0" } } @@ -1806,10 +1806,10 @@ } } }, - "CxxDemangler.Reference/1.0.9568.24177": { + "CxxDemangler.Reference/1.0.9571.20346": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9568.24177", + "assemblyVersion": "1.0.9571.20346", "fileVersion": "0.0.0.0" } } @@ -2841,7 +2841,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9568.24184": { + "AntShell.Reference/1.0.9571.20353": { "type": "reference", "serviceable": false, "sha512": "" @@ -2856,7 +2856,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9568.24177": { + "CxxDemangler.Reference/1.0.9571.20346": { "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 e60c143dc4e103e406a6bcf54cc525a29d58cdbf..dd2e092a77d8c27288d4b450cde5356a033210d8 100644 GIT binary patch delta 340 zcmeyfk@?R?<_Yo2G7IK!=4!sj!N|zS;h0wvoRON7!^p@00m-Ti42}MiADGBbTqwz5 zZm4HuU~FnUIZ#!5gFS4Hw7eE;eTouy~dK zWT^P&zfz`59Ix9OR)XxD{83P6@_Q43&1JGYOl+sNHtqtN)*+w9tghv~6RZO0Djw&G z3YXN}#Ju#J)FKp@0gVN^Y_f^6EYxWxW+10+Zc#2|Wb>Ao05oCqZ9&cADGBbTqwz5 zW}#<%_;PGfn)$OcuK$SgIvo>gFS4Hw7eE;eTouy|qI zWT^P&zfz`597|6HvViQI{83P6@_Q43&1JGYOl%KUi%J7c>yS@lR_|J)&I)xEk8?$Z zOKNUnUV2Vy5sJ%z#sXb7*+f|u>NIn6kkdA|C>JuaOuzjAq zT44L;X>c*I*(^0;1FBf3<;ccyI^i_LMYlNgfhq(yn;SMUvwhdL1*zC?a)X7F=9L6zq~_!>GBQ8_RCA!D1&6tzo{@pEsqyBCk_(yHUbi=_Q1KJ=gLY6IznPLL^1e$xOqbZ5W- delta 321 zcmeyfk@?R?<_T$RAL5_b9cF=9L6zq~_!>GBQ8_RCA!D1&5i1o{@>6g~{fLk_(yHmYxb^IoPn- zLe`6k>k8?$ZOKNUnUV2Vy5sKMBhXhK> zPc~7Og_>_}K6#>~_U0DlLPoZ!3)_JvZ2qm1$jnh%p3V%m!=FgG7?Ka8Hv)PP9z~WW@ zlcD09|4NxMalCGCSP8Oo@<&0P$?r`BHkZlrFtMH5+PDj7T8DfZv$~e|POu7~t9YC% zDqK=?6Z6t@Qj1Vr1~eAvvdJdOvQVd)n1P(Oxkb5rbzf}^MIsTY9LhSS8 z)dJf$PlJnzO;j&pHBiMmEk`yEclBedz%IJQp$}9cxY^vWiJ9#qPv;t-iv1=xSlB+# idbthAo@;rHi7j-x=LR6V(ng<+EiOQOC&&~h!72dj>T#I> delta 340 zcmdo0lWG4?rU~)NM(ef;9c;MA!N|zS;h0wvoRON7!^p@00ST%M3>9&cADGBbTqwz5 zW}#<%_;PGfn)$OcuK$SgIvo>gG7?Ka8Hv)PP9z~Y5* zlcD09|4NxMaV$L*$O5u+@<&0P$?r`BHkZlrFtI&YEh-H(twTPIS-oqGIxEywJkAvr zE~&YRdFeT+MJO%<8VhvUWD{jssME~NK~CG;qFl(xHg#b;(1gvuRT7ywO3Txk!S;Fb zYJu&Wr@_U4eh|7v18}2dWU`EJbHn!E<-%5f^aT2To00j4R(*OVf diff --git a/src/Renode/obj/Debug/Renode_NET.csproj.AssemblyReference.cache b/src/Renode/obj/Debug/Renode_NET.csproj.AssemblyReference.cache index b4fc29f01a0eba45290bf53906af80e91e9b29ca..8c0cb228e13b84e4fc77490cd753f824f95e5935 100644 GIT binary patch delta 497 zcmaF+j`{67<_Yl}G7IK!=4!sjF}Yt(lr346fuYfVa-o#`#D$U^=7xGk2F9kwlQ*(x zZ+x4{%qFTAv6`!Sa}0|k8;864u~lGwRd)K58>9p_KjA82W(%F}xdEsmj!&PBBQ8LE zCs;*-pX}uG8>~0K6-i)a`#kIAHlT`NDQ0H2XJ)3CK<3GMFv6@(WR{vNZ!IwSjIHnF zhFF!!uJQ$JE6>)P2P)ew--AV2z~l!vB{x4%+`!0oBA^qbZkqBgW;U}4vLK_w)VH&; z9hp7-Dv&L#`+|jShnwqqAe+%hn3?S(Pv;sSTgvnq3rF?!hiAZ!wbw8Jd&k3S6^3oP zT9K2_zmb`ILD+V(mbAxa8QVZ%u*0kTCqo^+d2WCy6UXcJhLvE`Cc5i@O%n^|VPZSA zwQ(2FK8?^cW_2y^onRG=jEp?a6%{V2xruq{IjKdAj0_L}iVC2yz^IsfB|;V&7ba$) txR`t(fqk=fWELZbx5Na9J$-swV0*4dsWNl?F>!>5zI1|!+QsS51ONlCtU>?) delta 497 zcmaF+j`{67<_Yl}M(ef;9c;MAF}Yt(lr2G(fuSO9a-o#`#D$U^W)^xzCWaO!lQ*(x zZ+x4{%x1IHi0xp*<`@=7HjdK?r&+-Is_gV9H%JL=e!^A4%=YSxs~Av49G^ZL$Lj5G zCBZ5Z{A4Ge-(bD@tw;hZn^A(aI8a5f6f-m1r?oSjK<3GMFv6@(WR{vNZ!IwSjIHnF zhFF!!uJQ$Js&Q(rKxMn-d$1@AnEc?T>UrQRT#GE zYDG>y|3+r=1!3FCTGAeyWo!e5!45Bsn+$dM=D7i;OdLy31wsO6qPq^*G_hbFCbkEw zMWuoEX@sURt9PwYX9d~E$jHd!Tv6eYnwyxHo|9U{$jATz3BafT8Vihy$yXv|p>bhu x4vLG(2NKvfYe!}=a!g&=4mM?SpPm-jp6gMn%p9fV>C9liymW$y+QsS51OS*iu#5lz 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 4f83893..98e490d 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.9568.24184", + "AntShell.Reference": "1.0.9571.20353", "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.9568.24177", + "CxxDemangler.Reference": "1.0.9571.20346", "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.9568.24184": { + "AntShell.Reference/1.0.9571.20353": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9568.24184", + "assemblyVersion": "1.0.9571.20353", "fileVersion": "0.0.0.0" } } @@ -1994,10 +1994,10 @@ } } }, - "CxxDemangler.Reference/1.0.9568.24177": { + "CxxDemangler.Reference/1.0.9571.20346": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9568.24177", + "assemblyVersion": "1.0.9571.20346", "fileVersion": "0.0.0.0" } } @@ -3134,7 +3134,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9568.24184": { + "AntShell.Reference/1.0.9571.20353": { "type": "reference", "serviceable": false, "sha512": "" @@ -3159,7 +3159,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9568.24177": { + "CxxDemangler.Reference/1.0.9571.20346": { "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 1957352..be6f548 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.9568.24184", + "AntShell.Reference": "1.0.9571.20353", "BigGustave.Reference": "1.0.0.0", "CoSimulationPlugin.Reference": "1.0.0.0", "crypto.Reference": "1.9.0.0", - "CxxDemangler.Reference": "1.0.9568.24177", + "CxxDemangler.Reference": "1.0.9571.20346", "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.24240", + "Renode.Reference": "1.16.0.20385", "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.9568.24184": { + "AntShell.Reference/1.0.9571.20353": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9568.24184", + "assemblyVersion": "1.0.9571.20353", "fileVersion": "0.0.0.0" } } @@ -2067,10 +2067,10 @@ } } }, - "CxxDemangler.Reference/1.0.9568.24177": { + "CxxDemangler.Reference/1.0.9571.20346": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9568.24177", + "assemblyVersion": "1.0.9571.20346", "fileVersion": "0.0.0.0" } } @@ -2131,10 +2131,10 @@ } } }, - "Renode.Reference/1.16.0.24240": { + "Renode.Reference/1.16.0.20385": { "runtime": { "Renode.dll": { - "assemblyVersion": "1.16.0.24240", + "assemblyVersion": "1.16.0.20385", "fileVersion": "0.0.0.0" } } @@ -3255,7 +3255,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9568.24184": { + "AntShell.Reference/1.0.9571.20353": { "type": "reference", "serviceable": false, "sha512": "" @@ -3275,7 +3275,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9568.24177": { + "CxxDemangler.Reference/1.0.9571.20346": { "type": "reference", "serviceable": false, "sha512": "" @@ -3315,7 +3315,7 @@ "serviceable": false, "sha512": "" }, - "Renode.Reference/1.16.0.24240": { + "Renode.Reference/1.16.0.20385": { "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 362045d..c840040 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.9568.24184", + "AntShell.Reference": "1.0.9571.20353", "BigGustave.Reference": "1.0.0.0", "CoSimulationPlugin.Reference": "1.0.0.0", "crypto.Reference": "1.9.0.0", - "CxxDemangler.Reference": "1.0.9568.24177", + "CxxDemangler.Reference": "1.0.9571.20346", "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.24240", + "Renode.Reference": "1.16.0.20385", "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.9568.24184": { + "AntShell.Reference/1.0.9571.20353": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9568.24184", + "assemblyVersion": "1.0.9571.20353", "fileVersion": "0.0.0.0" } } @@ -2050,10 +2050,10 @@ } } }, - "CxxDemangler.Reference/1.0.9568.24177": { + "CxxDemangler.Reference/1.0.9571.20346": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9568.24177", + "assemblyVersion": "1.0.9571.20346", "fileVersion": "0.0.0.0" } } @@ -2122,10 +2122,10 @@ } } }, - "Renode.Reference/1.16.0.24240": { + "Renode.Reference/1.16.0.20385": { "runtime": { "Renode.dll": { - "assemblyVersion": "1.16.0.24240", + "assemblyVersion": "1.16.0.20385", "fileVersion": "0.0.0.0" } } @@ -3232,7 +3232,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9568.24184": { + "AntShell.Reference/1.0.9571.20353": { "type": "reference", "serviceable": false, "sha512": "" @@ -3252,7 +3252,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9568.24177": { + "CxxDemangler.Reference/1.0.9571.20346": { "type": "reference", "serviceable": false, "sha512": "" @@ -3297,7 +3297,7 @@ "serviceable": false, "sha512": "" }, - "Renode.Reference/1.16.0.24240": { + "Renode.Reference/1.16.0.20385": { "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 233f64dcaaaeb1e4123da01eaf9ce1ee440594f0..0af9b9dca654dcd3c072db6a5cf264e01efae17a 100644 GIT binary patch delta 541 zcmcaNjpg1nmI>}`m!~|t&ec58SCVO=|Kvnxg^3*!EC$9Frjr>(v^Sp5WnoKJWngIZ zpKO?}HTiB#(oGg5PM z7#SHL0BS&@f&AqA{E{5zhI&Q@#-_#~3pQ&DlrgitZf{r#G-Rn_OTZxY^6(7z^7oGgFZJ#4J4+kwd1>>JrQ0na~z8{P_w}1R)=j&Y%9;!oCm6KbnZdZ>^s@OC}wiQ2j0mO>}@xHa8+Yu zI}y+cQY+)Wh?ygFy5|P4X$x5-CM)c<-Yn^Ti}`nR@qq4mM2mm1NowH#yN+VPb~_vx$+( z8>VYbz8e!cnfEit=CiCxENniXMMDoZY&PY}U{y9+w^it1!#xg0Mn(?DyprII)SMhf zMg|Cg8jxrpKlwhtB!`)Wo{@>6g~?<_5$(;|0%go>OHT!|08LshoWR5;F;&+Q$mSJW z&C2#*wWu_Zy-zxgnXPM$I_trP$y)N#U5yvhIa*(Y8Lm|UPb zZ}NJD8n&qm+kv_^8!9F;vz3;oGXvQ(RQ#COR^FS<31q)fV`FBsS!%=vWdG1~WMey> za2n(idxIm)9N)EVf#UZ#CdaeuO)fAH-0Wp?jD_vf+8Itj6=IeijL0F=XLX6Kw*9j^ zP%6#(4hx4-g0whTa~z8{P_w}1R)=j&Y^rf;u0R!z&OKD{;a zVc-K6jt}uq?7%XNRt8|(Im1_>*qF;0IrRXe%;fV-4x490P7{WODKL^3$K}og0IsaT A4*&oF