diff --git a/lib/resources b/lib/resources index 43e805d..98eb8a3 160000 --- a/lib/resources +++ b/lib/resources @@ -1 +1 @@ -Subproject commit 43e805d8e812fc5e519a46ce29e6c2910a42f015 +Subproject commit 98eb8a3406fd179405c4456b355b4fb4620dbf57 diff --git a/output/bin/Debug/OptionsParser.deps.json b/output/bin/Debug/OptionsParser.deps.json index 6370e9e..5b9eb74 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" + "NUnit3TestAdapter": "3.17.0", + "OptionsParser": "1.0.0" }, "runtime": { "OptionsParser.dll": {} diff --git a/output/bin/Debug/Renode.deps.json b/output/bin/Debug/Renode.deps.json index dc471c2..ef2601d 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.9606.31907", + "AntShell.Reference": "1.0.9669.26120", "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.9606.31897", + "CxxDemangler.Reference": "1.0.9669.26104", "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.9606.31907": { + "AntShell.Reference/1.0.9669.26120": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9606.31907", + "assemblyVersion": "1.0.9669.26120", "fileVersion": "0.0.0.0" } } @@ -1994,10 +1994,10 @@ } } }, - "CxxDemangler.Reference/1.0.9606.31897": { + "CxxDemangler.Reference/1.0.9669.26104": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9606.31897", + "assemblyVersion": "1.0.9669.26104", "fileVersion": "0.0.0.0" } } @@ -3134,7 +3134,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9606.31907": { + "AntShell.Reference/1.0.9669.26120": { "type": "reference", "serviceable": false, "sha512": "" @@ -3159,7 +3159,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9606.31897": { + "CxxDemangler.Reference/1.0.9669.26104": { "type": "reference", "serviceable": false, "sha512": "" diff --git a/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/cpu.h b/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/cpu.h index 7b2f7cf..e5fdd61 100644 --- a/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/cpu.h +++ b/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/cpu.h @@ -114,7 +114,7 @@ typedef struct CPUState { // FPU状态(CP1 - 浮点协处理器) float_status fp_status; - float64 fpr[32]; + uint64_t fpu_gpr[32]; uint32_t fcr0; uint32_t fcr31; @@ -146,6 +146,7 @@ typedef struct CPUState { #define MIPS_HFLAG_BL 0x00020 #define MIPS_HFLAG_BR 0x00040 #define MIPS_HFLAG_DSLOT 0x00080 // 正式定义的延迟槽标志 +#define MIPS_HFLAG_FPU 0x00100 // 【修复】新增 FPU 可用门禁标志 /* ========================================= 6. 翻译上下文 diff --git a/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/helper.c b/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/helper.c index 4149822..1a6cc98 100644 --- a/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/helper.c +++ b/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/helper.c @@ -4,6 +4,7 @@ * Date:2026_0209 */ #include "cpu.h" +#include "softfloat-2.h" // grep 找到的路径 // MIPS Helper函数实现 @@ -12,36 +13,48 @@ void cpu_reset(CPUState *env) { int i; - // 清零所有通用寄存器 + // 先清零整个结构体(确保所有字段初始化,避免释放未初始化的指针) + memset(env, 0, sizeof(CPUState)); + + // --- FPU 状态初始化 --- + for (i = 0; i < 32; i++) { + env->fpu_gpr[i] = 0; + } + env->fcr31 = 0; + env->fcr0 = 0x00003300; // 1E300 的 FPU ID + + // 通用寄存器 for (i = 0; i < 32; i++) { env->gpr[i] = 0; } - // 初始化PC到复位向量 - env->pc = 0xBFC00000; // MIPS复位向量地址 + // PC + env->pc = 0x80000000; // 直接指向程序入口,跳过 bootrom - // 初始化HI/LO + // HI/LO env->HI = 0; env->LO = 0; - // 初始化CP0寄存器 - env->CP0_Status = CP0_STATUS_BEV | CP0_STATUS_ERL; // Bootstrap向量启用,Error Level + // CP0寄存器 + env->CP0_Status = CP0_STATUS_ERL | CP0_STATUS_CU1; env->CP0_Cause = 0; env->CP0_EPC = 0; - env->CP0_PRId = 0x00006302; // 示例处理器ID(需要根据龙芯1E300实际值修改) - env->CP0_Config0 = 0x80000000; // 基本配置 + env->CP0_PRId = 0x00006302; + env->CP0_Config0 = 0x80000000; env->CP0_Config1 = 0; env->CP0_Random = 0x0000001f; env->CP0_Wired = 0; env->CP0_Count = 0; env->CP0_Compare = 0; - // 初始化内部状态 + // 内部状态 env->hflags = MIPS_HFLAG_KM; // Kernel mode env->error_code = 0; - - // 清除中断 env->interrupt_request = 0; + + // 初始化浮点状态 + set_float_rounding_mode(float_round_nearest_even, &env->fp_status); + set_float_exception_flags(0, &env->fp_status); } // 计算MMU索引 @@ -158,3 +171,305 @@ void cpu_exec_epilogue(CPUState *env) { // 最小实现 } + +/* ======================================================================== + * MIPS FPU (COP1) Helper Functions + * ======================================================================== */ + +// helper.c (保留原有的 cpu_reset, cpu_init 等函数,仅替换浮点部分) + +// 1. 处理控制寄存器写入 (CTC1) +void helper_ctc1(CPUState *env, uint32_t val) { + uint32_t mask = 0x0183FFFF; + env->fcr31 = (env->fcr31 & ~mask) | (val & mask); + int rm = (env->fcr31 & 3); + switch (rm) { + case 0: set_float_rounding_mode(float_round_nearest_even, &env->fp_status); break; + case 1: set_float_rounding_mode(float_round_to_zero, &env->fp_status); break; + case 2: set_float_rounding_mode(float_round_up, &env->fp_status); break; + case 3: set_float_rounding_mode(float_round_down, &env->fp_status); break; + } + if ((env->fcr31 >> 12) & ((env->fcr31 >> 7) & 0x1f)) { + env->exception_index = 15; + do_interrupt(env); + } +} + +// 2. 异常同步 +static inline void update_fcr31_exceptions(CPUState *env) { + int flags = get_float_exception_flags(&env->fp_status); + if (flags) { + env->fcr31 |= (flags << 2); + env->fcr31 |= (flags << 12); + if ((env->fcr31 >> 12) & ((env->fcr31 >> 7) & 0x1f)) { + env->exception_index = 15; + do_interrupt(env); + } + } + set_float_exception_flags(0, &env->fp_status); +} + +// 3. 核心整合:接收一整条 32 位指令,在 C 层面解码并执行 +void helper_fpu_math(CPUState *env, uint32_t insn) { + uint32_t rs = (insn >> 21) & 0x1F; + uint32_t funct = insn & 0x3F; + uint32_t fs = (insn >> 11) & 0x1F; + uint32_t ft = (insn >> 16) & 0x1F; + uint32_t fd = (insn >> 6) & 0x1F; + + uint64_t fst0 = env->fpu_gpr[fs]; + uint64_t fst1 = env->fpu_gpr[ft]; + uint64_t res = 0; + + // 处理乘加融合指令 (MADD/MSUB/NMADD/NMSUB) + // 这些指令在 SPECIAL2 中,funct=0x08-0x0F + if (funct >= 0x08 && funct <= 0x0F) { + uint64_t fd_val = env->fpu_gpr[fd]; + int is_double = funct & 0x01; + int is_neg = (funct & 0x04) != 0; + int is_sub = (funct & 0x02) != 0; + + if (!is_double) { // Single precision + float32 wfs = (float32)(uint32_t)fst0; + float32 wft = (float32)(uint32_t)fst1; + float32 wfd = (float32)(uint32_t)fd_val; + float32 mul = float32_mul(wfs, wft, &env->fp_status); + if (is_sub) { + res = float32_sub(wfd, mul, &env->fp_status); + } else { + res = float32_add(wfd, mul, &env->fp_status); + } + if (is_neg) { + res = (uint32_t)res ^ 0x80000000; + } + } else { // Double precision + float64 wfs = (float64)fst0; + float64 wft = (float64)fst1; + float64 wfd = (float64)fd_val; + float64 mul = float64_mul(wfs, wft, &env->fp_status); + if (is_sub) { + res = float64_sub(wfd, mul, &env->fp_status); + } else { + res = float64_add(wfd, mul, &env->fp_status); + } + if (is_neg) { + res = res ^ 0x8000000000000000ULL; + } + } + update_fcr31_exceptions(env); + env->fpu_gpr[fd] = res; + return; + } + + if (rs == 0x10) { // Single (单精度) + float32 wt0 = (float32)(uint32_t)fst0; + float32 wt1 = (float32)(uint32_t)fst1; + switch(funct) { + case 0x00: res = float32_add(wt0, wt1, &env->fp_status); break; + case 0x01: res = float32_sub(wt0, wt1, &env->fp_status); break; + case 0x02: res = float32_mul(wt0, wt1, &env->fp_status); break; + case 0x03: res = float32_div(wt0, wt1, &env->fp_status); break; + case 0x04: res = float32_sqrt(wt0, &env->fp_status); break; // sqrt.s + case 0x05: res = (uint32_t)fst0 & 0x7FFFFFFF; break; // abs.s + case 0x07: res = (uint32_t)fst0 ^ 0x80000000; break; // neg.s + case 0x08: res = float32_to_int64(wt0, &env->fp_status); break; // round.l.s + case 0x10: { // movf.s - 如果FCC为假则传送 + uint32_t cc = (insn >> 18) & 0x7; + int fcc = (env->fcr31 >> (23 + cc)) & 1; + if (!fcc) res = (uint32_t)fst0; + else res = (uint32_t)fst1; // 保持目标原值 + break; + } + case 0x11: { // movt.s - 如果FCC为真则传送 + uint32_t cc = (insn >> 18) & 0x7; + int fcc = (env->fcr31 >> (23 + cc)) & 1; + if (fcc) res = (uint32_t)fst0; + else res = (uint32_t)fst1; + break; + } + case 0x12: { // movn.s - 如果通用寄存器非零则传送 + uint32_t rt_idx = (insn >> 16) & 0x1F; + if (env->gpr[rt_idx] != 0) res = (uint32_t)fst0; + else res = (uint32_t)fst1; + break; + } + case 0x13: { // movz.s - 如果通用寄存器为零则传送 + uint32_t rt_idx = (insn >> 16) & 0x1F; + if (env->gpr[rt_idx] == 0) res = (uint32_t)fst0; + else res = (uint32_t)fst1; + break; + } + case 0x20: res = int32_to_float32((int32_t)fst0, &env->fp_status); break; // cvt.s.w + case 0x21: res = int32_to_float64((int32_t)fst0, &env->fp_status); break; //cvt.d.w(整数转双精度,结果在单精度分支是因为源操作数是整数) + case 0x24: res = (uint64_t)(uint32_t)float32_to_int32(wt0, &env->fp_status); break; // cvt.w.s + case 0x25: res = (uint64_t)(uint32_t)float32_to_int32(wt0, &env->fp_status); break; // cvt.l.s(简化为32位) + case 0x0C: { // round.w.s + int old_mode = get_float_rounding_mode(&env->fp_status); + set_float_rounding_mode(float_round_nearest_even, &env->fp_status); + res = (uint64_t)(uint32_t)float32_to_int32(wt0, &env->fp_status); + set_float_rounding_mode(old_mode, &env->fp_status); + break; + } + case 0x0D: { // trunc.w.s + int old_mode = get_float_rounding_mode(&env->fp_status); + set_float_rounding_mode(float_round_to_zero, &env->fp_status); + res = (uint64_t)(uint32_t)float32_to_int32(wt0, &env->fp_status); + set_float_rounding_mode(old_mode, &env->fp_status); + break; + } + case 0x0E: { // ceil.w.s + int old_mode = get_float_rounding_mode(&env->fp_status); + set_float_rounding_mode(float_round_up, &env->fp_status); + res = (uint64_t)(uint32_t)float32_to_int32(wt0, &env->fp_status); + set_float_rounding_mode(old_mode, &env->fp_status); + break; + } + case 0x0F: { // floor.w.s + int old_mode = get_float_rounding_mode(&env->fp_status); + set_float_rounding_mode(float_round_down, &env->fp_status); + res = (uint64_t)(uint32_t)float32_to_int32(wt0, &env->fp_status); + set_float_rounding_mode(old_mode, &env->fp_status); + break; + } + default: { + if (funct >= 0x30) { // c.cond.s + int cond = funct & 0x0F; + int cmp_result = float32_compare(wt0, wt1, &env->fp_status); + // cmp_result: -1(小于), 0(等于), 1(大于), 2(无序NaN) + int cc = 0; + switch (cond) { + case 0x0: cc = 0; break; // F (总是假) + case 0x1: cc = (cmp_result == 2); break; // UN (无序) + case 0x2: cc = (cmp_result == 0); break; // EQ (相等) + case 0x3: cc = (cmp_result == 0 || cmp_result == 2); break; // UEQ + case 0x4: cc = (cmp_result == -1); break; // OLT (有序小于) + case 0x5: cc = (cmp_result == -1 || cmp_result == 2); break; // ULT + case 0x6: cc = (cmp_result == -1 || cmp_result == 0); break; // OLE + case 0x7: cc = (cmp_result != 1); break; // ULE + case 0x8: cc = 0; break; // SF (信号假,简化处理) + case 0x9: cc = (cmp_result == 2); break; // NGLE + case 0xA: cc = (cmp_result == 0); break; // SEQ + case 0xB: cc = (cmp_result == 0 || cmp_result == 2); break; // NGL + case 0xC: cc = (cmp_result == -1); break; // LT + case 0xD: cc = (cmp_result == -1 || cmp_result == 2); break; // NGE + case 0xE: cc = (cmp_result == -1 || cmp_result == 0); break; // LE + case 0xF: cc = (cmp_result != 1); break; // NGT + } + // 写入 fcr31 的 FCC0 (bit 23) + if (cc) { + env->fcr31 |= (1 << 23); + } else { + env->fcr31 &= ~(1 << 23); + } + } + break; + } + } + } else if (rs == 0x11) { // Double (双精度) + float64 wt0 = (float64)fst0; + float64 wt1 = (float64)fst1; + switch(funct) { + case 0x00: res = float64_add(wt0, wt1, &env->fp_status); break; + case 0x01: res = float64_sub(wt0, wt1, &env->fp_status); break; + case 0x02: res = float64_mul(wt0, wt1, &env->fp_status); break; + case 0x03: res = float64_div(wt0, wt1, &env->fp_status); break; + case 0x04: res = float64_sqrt(wt0, &env->fp_status); break; // sqrt.d + case 0x05: res = fst0 & 0x7FFFFFFFFFFFFFFFULL; break; // abs.d + case 0x07: res = fst0 ^ 0x8000000000000000ULL; break; // neg.d + case 0x08: res = float64_to_int64(wt0, &env->fp_status); break; // round.l.d + case 0x10: { // movf.d - 如果FCC为假则传送 + uint32_t cc = (insn >> 18) & 0x7; + int fcc = (env->fcr31 >> (23 + cc)) & 1; + if (!fcc) res = fst0; + else res = fst1; + break; + } + case 0x11: { // movt.d - 如果FCC为真则传送 + uint32_t cc = (insn >> 18) & 0x7; + int fcc = (env->fcr31 >> (23 + cc)) & 1; + if (fcc) res = fst0; + else res = fst1; + break; + } + case 0x12: { // movn.d - 如果通用寄存器非零则传送 + uint32_t rt_idx = (insn >> 16) & 0x1F; + if (env->gpr[rt_idx] != 0) res = fst0; + else res = fst1; + break; + } + case 0x13: { // movz.d - 如果通用寄存器为零则传送 + uint32_t rt_idx = (insn >> 16) & 0x1F; + if (env->gpr[rt_idx] == 0) res = fst0; + else res = fst1; + break; + } + case 0x20: res = float64_to_float32(wt0, &env->fp_status); break; // cvt.s.d + case 0x21: res = wt0; break; // cvt.d.d(双精度转双精度,直接赋值) + case 0x24: res = (uint64_t)(uint32_t)float64_to_int32(wt0, &env->fp_status); break; // cvt.w.d + case 0x25: res = (uint64_t)(uint32_t)float64_to_int32(wt0, &env->fp_status); break; // cvt.l.d(简化为32位) + case 0x0C: { // round.w.d + int old_mode = get_float_rounding_mode(&env->fp_status); + set_float_rounding_mode(float_round_nearest_even, &env->fp_status); + res = (uint64_t)(uint32_t)float64_to_int32(wt0, &env->fp_status); + set_float_rounding_mode(old_mode, &env->fp_status); + break; + } + case 0x0D: { // trunc.w.d + int old_mode = get_float_rounding_mode(&env->fp_status); + set_float_rounding_mode(float_round_to_zero, &env->fp_status); + res = (uint64_t)(uint32_t)float64_to_int32(wt0, &env->fp_status); + set_float_rounding_mode(old_mode, &env->fp_status); + break; + } + case 0x0E: { // ceil.w.d + int old_mode = get_float_rounding_mode(&env->fp_status); + set_float_rounding_mode(float_round_up, &env->fp_status); + res = (uint64_t)(uint32_t)float64_to_int32(wt0, &env->fp_status); + set_float_rounding_mode(old_mode, &env->fp_status); + break; + } + case 0x0F: { // floor.w.d + int old_mode = get_float_rounding_mode(&env->fp_status); + set_float_rounding_mode(float_round_down, &env->fp_status); + res = (uint64_t)(uint32_t)float64_to_int32(wt0, &env->fp_status); + set_float_rounding_mode(old_mode, &env->fp_status); + break; + } + default: { + if (funct >= 0x30) { // c.cond.d + int cond = funct & 0x0F; + int cmp_result = float64_compare(wt0, wt1, &env->fp_status); + int cc = 0; + switch (cond) { + case 0x0: cc = 0; break; + case 0x1: cc = (cmp_result == 2); break; + case 0x2: cc = (cmp_result == 0); break; + case 0x3: cc = (cmp_result == 0 || cmp_result == 2); break; + case 0x4: cc = (cmp_result == -1); break; + case 0x5: cc = (cmp_result == -1 || cmp_result == 2); break; + case 0x6: cc = (cmp_result == -1 || cmp_result == 0); break; + case 0x7: cc = (cmp_result != 1); break; + case 0x8: cc = 0; break; + case 0x9: cc = (cmp_result == 2); break; + case 0xA: cc = (cmp_result == 0); break; + case 0xB: cc = (cmp_result == 0 || cmp_result == 2); break; + case 0xC: cc = (cmp_result == -1); break; + case 0xD: cc = (cmp_result == -1 || cmp_result == 2); break; + case 0xE: cc = (cmp_result == -1 || cmp_result == 0); break; + case 0xF: cc = (cmp_result != 1); break; + } + if (cc) { + env->fcr31 |= (1 << 23); + } else { + env->fcr31 &= ~(1 << 23); + } + } + break; + } + } + } + + // 更新异常状态并将结果写回目标寄存器 + update_fcr31_exceptions(env); + env->fpu_gpr[fd] = res; +} \ No newline at end of file diff --git a/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/helper.h b/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/helper.h index 3f59f30..a9eac72 100644 --- a/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/helper.h +++ b/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/helper.h @@ -1,12 +1,27 @@ /* - * MIPS - * Author:liuwb - * Date:2026_0209 + * helper.h - MIPS helper function declarations + * + * 简化方案:不使用 def-helper.h 的宏系统(GEN_HELPER 模式切换), + * 直接声明 helper 函数原型。translate.c 中手写 wrapper 函数。 + * + * 用 DEF_HELPER_FLAGS_2 守卫确保只在 tlib 版 def-helper.h 的 + * 宏环境中展开(exports.c 的注册模式),其他时候跳过。 */ -#include "def-helper.h" +#ifdef DEF_HELPER_FLAGS_2 -/* Exceptions */ +/* exports.c (GEN_HELPER=2) 注册模式:生成 tcg_register_helper 调用 */ +DEF_HELPER_2(ctc1, void, env, i32) +DEF_HELPER_2(fpu_math, void, env, i32) DEF_HELPER_2(raise_exception, void, env, i32) +DEF_HELPER_1(eret, void, env) -#include "def-helper.h" +#else + +/* 普通模式(translate.c / helper.c):生成 C 函数原型 */ +void helper_ctc1(CPUState *env, uint32_t val); +void helper_fpu_math(CPUState *env, uint32_t insn); +void helper_raise_exception(CPUState *env, uint32_t exception); +void helper_eret(CPUState *env); + +#endif diff --git a/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/op_helper.c b/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/op_helper.c index 3f05e63..0c0a786 100644 --- a/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/op_helper.c +++ b/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/op_helper.c @@ -4,7 +4,7 @@ * Date:2026_0209 */ #include "cpu.h" -#include "helper.h" +#include "exec-all.h" // MIPS操作辅助函数实现 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 c46ade1..8e50edf 100644 --- a/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/translate.c +++ b/src/Infrastructure/src/Emulator/Cores/tlib/arch/mips/translate.c @@ -15,6 +15,7 @@ #include "arch_callbacks.h" #include "tb-helper.h" #include "debug.h" +#include "helper.h" #include #include #include @@ -23,6 +24,24 @@ #define DISAS_STOP 4 #endif +/* ======================================================================== + * Helper 函数 inline 包装(TCG → C 调用桥接) + * + * 不使用 def-helper.h 的 GEN_HELPER 宏系统(会因 include 顺序和 + * 双重 def-helper.h 冲突导致编译失败),直接手写简单包装。 + * ======================================================================== */ +static inline void gen_helper_ctc1(TCGv_ptr env, TCGv_i32 val) +{ + tcg_gen_helperN(helper_ctc1, 0, 0, TCG_CALL_DUMMY_ARG, 2, + (TCGArg[]){GET_TCGV_PTR(env), GET_TCGV_I32(val)}); +} + +static inline void gen_helper_fpu_math(TCGv_ptr env, TCGv_i32 insn) +{ + tcg_gen_helperN(helper_fpu_math, 0, 0, TCG_CALL_DUMMY_ARG, 2, + (TCGArg[]){GET_TCGV_PTR(env), GET_TCGV_I32(insn)}); +} + // ======================================================================== // MIPS 架构标准异常代号 (ExcCode) // ======================================================================== @@ -58,6 +77,8 @@ static TCGv cpu_gpr[32]; static TCGv cpu_PC; static TCGv cpu_HI; static TCGv cpu_LO; +static TCGv_i64 fpu_gpr[32]; // 64位浮点数据寄存器 +static TCGv_i32 fcr31; // 32位控制状态寄存器 static const char * const mips_gpr_names[32] = { "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3", @@ -66,6 +87,13 @@ static const char * const mips_gpr_names[32] = { "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra" }; +static const char * const mips_fpr_names[32] = { + "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", + "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", + "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", + "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31" +}; + // ======================================================================== // 异常抛出引擎 (Exception Generator) // ======================================================================== @@ -304,6 +332,99 @@ static void gen_muldiv(DisasContext *ctx, int rs, int rt, int op) { /* ======================================================================== * 核心翻译器 (Instruction Decoding) * ======================================================================== */ +static void disas_cop1(DisasContext *ctx, CPUState *env, uint32_t insn) { + uint32_t rs = RS(insn); + uint32_t rt = RT(insn); + uint32_t rd = RD(insn); + + switch (rs) { + case 0x00: // MFC1 (从浮点寄存器搬到主 CPU 通用寄存器) + if (!is_zero_reg(rt)) { + TCGv t0 = tcg_temp_new(); + // 取出浮点寄存器的低 32 位 + tcg_gen_extrl_i64_i32(t0, fpu_gpr[rd]); + tcg_gen_ext32s_tl(t0, t0); // 必须保持主 CPU 符号扩展一致性 + store_gpr(rt, t0); + tcg_temp_free(t0); + } + break; + + case 0x04: // MTC1 (从主 CPU 搬到浮点寄存器低 32 位) + { + TCGv t0 = load_gpr(rt); + TCGv_i64 t64 = tcg_temp_new_i64(); + tcg_gen_ext_tl_i64(t64, t0); // 零扩展或符号扩展 + // 写入前要处理拼接模式 (FR=0) 或 64位模式 (FR=1) 的逻辑 + tcg_gen_mov_i64(fpu_gpr[rd], t64); + tcg_temp_free(t0); + tcg_temp_free_i64(t64); + } + break; + + case 0x02: // CFC1 (读控制寄存器) + if (rd == 31 && !is_zero_reg(rt)) { + TCGv t0 = tcg_temp_new(); + tcg_gen_ext_i32_tl(t0, fcr31); // fcr31 是 TCGv_i32,需扩展到目标寄存器宽度 + tcg_gen_ext32s_tl(t0, t0); + store_gpr(rt, t0); + tcg_temp_free(t0); + } + break; + + case 0x06: // CTC1 (写控制寄存器) + if (rd == 31) { + TCGv t0 = load_gpr(rt); + TCGv_i32 t32 = tcg_temp_new_i32(); + tcg_gen_trunc_tl_i32(t32, t0); + + gen_helper_ctc1(cpu_env, t32); + + tcg_temp_free(t0); + tcg_temp_free_i32(t32); + ctx->base.is_jmp = DISAS_TB_JUMP; + } + break; + case 0x08: // BC1 (浮点条件分支指令) + { + uint32_t tf = (insn >> 16) & 1; // 0=False (BC1F), 1=True (BC1T) + int32_t imm = IMM(insn); // 分支偏移量 + + TCGv t_cond = tcg_temp_new(); + + // MIPS 的浮点比较结果默认存在 fcr31 的第 23 位 (FCC0) + tcg_gen_ext_i32_tl(t_cond, fcr31); + tcg_gen_shri_tl(t_cond, t_cond, 23); + tcg_gen_andi_tl(t_cond, t_cond, 1); // 提取 FCC0 的值 (0 或 1) + + if (tf == 0) { + // 如果是 BC1F 指令,条件为 0 时才跳转,所以把条件反转一下 + tcg_gen_xori_tl(t_cond, t_cond, 1); + } + + // 复用主 CPU 的分支逻辑:存入 bcond 寄存器,计算目标地址 + tcg_gen_st_tl(t_cond, cpu_env, offsetof(CPUState, bcond)); + ctx->btarget = ctx->pc + 4 + (imm << 2); + ctx->hflags |= MIPS_HFLAG_BC; // 标记延迟槽与分支状态 + + tcg_temp_free(t_cond); + } + break; + case 0x10: // Single (单精度浮点运算指令) + case 0x11: // Double (双精度浮点运算指令) + { + // 抛弃繁琐的 TCGv_i64 搬运,直接把 32 位指令扔给 C 语言后端解码 + TCGv_i32 t_insn = tcg_const_i32(insn); + gen_helper_fpu_math(cpu_env, t_insn); + tcg_temp_free_i32(t_insn); + } + break; + + default: + generate_exception_end(ctx, EXCP_RI); + break; + } +} + static bool disas_insn(CPUState *env, DisasContext *ctx) { uint32_t insn = ldl_code(ctx->pc); @@ -544,15 +665,20 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) TCGv t0 = load_gpr(rs); TCGv t1 = load_gpr(rt); TCGv res = tcg_temp_new(); - - tcg_gen_mul_tl(res, t0, t1); + + 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 >= 0x08 && funct <= 0x0F) { // MADD/MSUB/NMADD/NMSUB + // 浮点乘加融合指令,传给 helper 处理 + TCGv_i32 t_insn = tcg_const_i32(insn); + gen_helper_fpu_math(cpu_env, t_insn); + tcg_temp_free_i32(t_insn); } else if (funct == 0x3F) { // SDBBP generate_exception_end(ctx, EXCP_DEBUG); return true; @@ -637,8 +763,15 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) break; case 0x11: // COP1 - generate_exception_end(ctx, EXCP_CpU); - return true; + // 校验 CP0 Status.CU1 位 (假设你的 hflags 中 MIPS_HFLAG_FPU 代表 CU1 状态) + if (!(ctx->hflags & MIPS_HFLAG_FPU)) { + // 门禁未开,操作系统拦截,触发浮点懒加载陷阱 + generate_exception_end(ctx, EXCP_CpU); + return true; + } + // 门禁已开,跳转到我们新建的浮点专用解码函数 + disas_cop1(ctx, env, insn); + break; case 0x10: // COP0 if (rs == 0x00) { // MFC0 @@ -660,6 +793,119 @@ static bool disas_insn(CPUState *env, DisasContext *ctx) case 0x2F: // CACHE case 0x33: // PREF break; + case 0x35: // LDC1 (Load Doubleword to Coprocessor 1) + { + TCGv t0 = load_gpr(rs); + TCGv addr = tcg_temp_local_new(); + TCGv val_lo = tcg_temp_new(); + TCGv val_hi = tcg_temp_new(); + TCGv_i64 t64 = tcg_temp_new_i64(); + TCGv_i32 t32_lo = tcg_temp_new_i32(); + TCGv_i32 t32_hi = tcg_temp_new_i32(); + + tcg_gen_addi_tl(addr, t0, SEXT16(imm)); + + // 加载低32位 + tcg_gen_qemu_ld_tl(val_lo, addr, ctx->mem_idx, MO_TE | MO_UL); + // 加载高32位(地址+4) + TCGv addr_plus4 = tcg_temp_new(); + tcg_gen_addi_tl(addr_plus4, addr, 4); + tcg_gen_qemu_ld_tl(val_hi, addr_plus4, ctx->mem_idx, MO_TE | MO_UL); + + // 拼接成64位 + tcg_gen_trunc_tl_i32(t32_lo, val_lo); + tcg_gen_trunc_tl_i32(t32_hi, val_hi); + tcg_gen_concat_i32_i64(t64, t32_lo, t32_hi); + tcg_gen_mov_i64(fpu_gpr[rt], t64); + + tcg_temp_free(t0); + tcg_temp_free(addr); + tcg_temp_free(val_lo); + tcg_temp_free(val_hi); + tcg_temp_free_i64(t64); + tcg_temp_free_i32(t32_lo); + tcg_temp_free_i32(t32_hi); + tcg_temp_free(addr_plus4); + } + break; + + case 0x3D: // SDC1 (Store Doubleword from Coprocessor 1) + { + TCGv t0 = load_gpr(rs); + TCGv addr = tcg_temp_local_new(); + TCGv val_lo = tcg_temp_new(); + TCGv val_hi = tcg_temp_new(); + TCGv_i64 t64 = tcg_temp_new_i64(); + TCGv_i32 t32_lo = tcg_temp_new_i32(); + TCGv_i32 t32_hi = tcg_temp_new_i32(); + + tcg_gen_addi_tl(addr, t0, SEXT16(imm)); + + // 拆分64位为两个32位 + tcg_gen_mov_i64(t64, fpu_gpr[rt]); + tcg_gen_extrl_i64_i32(t32_lo, t64); + tcg_gen_shri_i64(t64, t64, 32); + tcg_gen_extrl_i64_i32(t32_hi, t64); + + // 扩展到目标寄存器宽度 + tcg_gen_ext_i32_tl(val_lo, t32_lo); + tcg_gen_ext_i32_tl(val_hi, t32_hi); + + // 存储低32位 + tcg_gen_qemu_st_tl(val_lo, addr, ctx->mem_idx, MO_TE | MO_UL); + // 存储高32位(地址+4) + TCGv addr_plus4 = tcg_temp_new(); + tcg_gen_addi_tl(addr_plus4, addr, 4); + tcg_gen_qemu_st_tl(val_hi, addr_plus4, ctx->mem_idx, MO_TE | MO_UL); + + tcg_temp_free(t0); + tcg_temp_free(addr); + tcg_temp_free(val_lo); + tcg_temp_free(val_hi); + tcg_temp_free_i64(t64); + tcg_temp_free_i32(t32_lo); + tcg_temp_free_i32(t32_hi); + tcg_temp_free(addr_plus4); + } + break; + + case 0x31: // LWC1 (Load Word to Coprocessor 1) + { + TCGv t0 = load_gpr(rs); + TCGv addr = tcg_temp_local_new(); + TCGv val = tcg_temp_new(); + TCGv_i64 t64 = tcg_temp_new_i64(); + + tcg_gen_addi_tl(addr, t0, SEXT16(imm)); + tcg_gen_qemu_ld_tl(val, addr, ctx->mem_idx, MO_TE | MO_UL); + tcg_gen_ext_tl_i64(t64, val); + tcg_gen_mov_i64(fpu_gpr[rt], t64); + + tcg_temp_free(t0); + tcg_temp_free(addr); + tcg_temp_free(val); + tcg_temp_free_i64(t64); + } + break; + + case 0x39: // SWC1 (Store Word from Coprocessor 1) + { + TCGv t0 = load_gpr(rs); + TCGv addr = tcg_temp_local_new(); + TCGv val = tcg_temp_new(); + TCGv_i32 t32 = tcg_temp_new_i32(); + + tcg_gen_addi_tl(addr, t0, SEXT16(imm)); + tcg_gen_extrl_i64_i32(t32, fpu_gpr[rt]); + tcg_gen_ext_i32_tl(val, t32); + tcg_gen_qemu_st_tl(val, addr, ctx->mem_idx, MO_TE | MO_UL); + + tcg_temp_free(t0); + tcg_temp_free(addr); + tcg_temp_free(val); + tcg_temp_free_i32(t32); + } + break; case 0x08: // ADDI case 0x09: // ADDIU @@ -962,6 +1208,14 @@ void translate_init(void) { cpu_PC = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, pc), "pc"); cpu_HI = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, HI), "HI"); cpu_LO = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, LO), "LO"); + + // 1. 绑定 32 个 64位的浮点数据寄存器 + for (int i = 0; i < 32; i++) { + fpu_gpr[i] = tcg_global_mem_new_i64(TCG_AREG0, offsetof(CPUState, fpu_gpr[i]), mips_fpr_names[i]); + } + + // 2. 绑定 32位的浮点控制状态寄存器 + fcr31 = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUState, fcr31), "fcr31"); } void gen_sync_pc(DisasContext *dc) { @@ -1093,7 +1347,14 @@ void restore_state_to_opc(CPUState *env, TranslationBlock *tb, target_ulong *dat env->pc = data[0]; } -void setup_disas_context(DisasContextBase *dcbase, CPUState *env) { - ((DisasContext *)dcbase)->mem_idx = cpu_mmu_index(env); - ((DisasContext *)dcbase)->hflags = env->hflags; +void setup_disas_context(DisasContextBase *dcbase, CPUState *env) { + DisasContext *ctx = (DisasContext *)dcbase; + ctx->mem_idx = cpu_mmu_index(env); + ctx->hflags = env->hflags; + /* 同步 CP0 Status.CU1 → MIPS_HFLAG_FPU 门禁 */ + if (env->CP0_Status & CP0_STATUS_CU1) { + ctx->hflags |= MIPS_HFLAG_FPU; + } else { + ctx->hflags &= ~MIPS_HFLAG_FPU; + } } \ No newline at end of file diff --git a/src/Infrastructure/src/Emulator/Cores/tlib/exports.c b/src/Infrastructure/src/Emulator/Cores/tlib/exports.c index 086135d..bb6057e 100644 --- a/src/Infrastructure/src/Emulator/Cores/tlib/exports.c +++ b/src/Infrastructure/src/Emulator/Cores/tlib/exports.c @@ -34,6 +34,7 @@ static tcg_t stcg; void gen_helpers(void) { +#undef GEN_HELPER // ← 新增:清除 tb-helper.h 中的旧定义 #define GEN_HELPER 2 #include "helper.h" } 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 834dc11..19e51fb 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.9606.31907", + "AntShell.Reference": "1.0.9669.26120", "BigGustave.Reference": "1.0.0.0", "crypto.Reference": "1.9.0.0", - "CxxDemangler.Reference": "1.0.9606.31897", + "CxxDemangler.Reference": "1.0.9669.26104", "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.9606.31907": { + "AntShell.Reference/1.0.9669.26120": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9606.31907", + "assemblyVersion": "1.0.9669.26120", "fileVersion": "0.0.0.0" } } @@ -1806,10 +1806,10 @@ } } }, - "CxxDemangler.Reference/1.0.9606.31897": { + "CxxDemangler.Reference/1.0.9669.26104": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9606.31897", + "assemblyVersion": "1.0.9669.26104", "fileVersion": "0.0.0.0" } } @@ -2841,7 +2841,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9606.31907": { + "AntShell.Reference/1.0.9669.26120": { "type": "reference", "serviceable": false, "sha512": "" @@ -2856,7 +2856,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9606.31897": { + "CxxDemangler.Reference/1.0.9669.26104": { "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 6370e9e..5b9eb74 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" + "NUnit3TestAdapter": "3.17.0", + "OptionsParser": "1.0.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 ba65456..3c3d9b1 100644 Binary files a/src/Plugins/CoSimulationPlugin/obj/Debug/net8.0/CoSimulationPlugin_NET.csproj.AssemblyReference.cache and b/src/Plugins/CoSimulationPlugin/obj/Debug/net8.0/CoSimulationPlugin_NET.csproj.AssemblyReference.cache differ diff --git a/src/Plugins/SystemCPlugin/bin/Debug/net8.0/OptionsParser.deps.json b/src/Plugins/SystemCPlugin/bin/Debug/net8.0/OptionsParser.deps.json index 6370e9e..5b9eb74 100644 --- a/src/Plugins/SystemCPlugin/bin/Debug/net8.0/OptionsParser.deps.json +++ b/src/Plugins/SystemCPlugin/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" + "NUnit3TestAdapter": "3.17.0", + "OptionsParser": "1.0.0" }, "runtime": { "OptionsParser.dll": {} diff --git a/src/Plugins/SystemCPlugin/bin/Debug/net8.0/SystemCPlugin.deps.json b/src/Plugins/SystemCPlugin/bin/Debug/net8.0/SystemCPlugin.deps.json index 42795fb..4c971bc 100644 --- a/src/Plugins/SystemCPlugin/bin/Debug/net8.0/SystemCPlugin.deps.json +++ b/src/Plugins/SystemCPlugin/bin/Debug/net8.0/SystemCPlugin.deps.json @@ -14,10 +14,10 @@ "System.ServiceModel.Duplex": "4.8.1", "System.ServiceModel.Federation": "4.8.1", "System.ServiceModel.NetTcp": "4.8.1", - "AntShell.Reference": "1.0.9606.31907", + "AntShell.Reference": "1.0.9669.26120", "BigGustave.Reference": "1.0.0.0", "crypto.Reference": "1.9.0.0", - "CxxDemangler.Reference": "1.0.9606.31897", + "CxxDemangler.Reference": "1.0.9669.26104", "ELFSharp.Reference": "0.1.1.0", "FdtSharp.Reference": "0.1.0.0", "Infrastructure.Reference": "1.0.0.0", @@ -1781,10 +1781,10 @@ } } }, - "AntShell.Reference/1.0.9606.31907": { + "AntShell.Reference/1.0.9669.26120": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9606.31907", + "assemblyVersion": "1.0.9669.26120", "fileVersion": "0.0.0.0" } } @@ -1805,10 +1805,10 @@ } } }, - "CxxDemangler.Reference/1.0.9606.31897": { + "CxxDemangler.Reference/1.0.9669.26104": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9606.31897", + "assemblyVersion": "1.0.9669.26104", "fileVersion": "0.0.0.0" } } @@ -2840,7 +2840,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9606.31907": { + "AntShell.Reference/1.0.9669.26120": { "type": "reference", "serviceable": false, "sha512": "" @@ -2855,7 +2855,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9606.31897": { + "CxxDemangler.Reference/1.0.9669.26104": { "type": "reference", "serviceable": false, "sha512": "" diff --git a/src/Plugins/SystemCPlugin/obj/Debug/net8.0/SystemCPlugin_NET.csproj.AssemblyReference.cache b/src/Plugins/SystemCPlugin/obj/Debug/net8.0/SystemCPlugin_NET.csproj.AssemblyReference.cache index 916f08c..e66166c 100644 Binary files a/src/Plugins/SystemCPlugin/obj/Debug/net8.0/SystemCPlugin_NET.csproj.AssemblyReference.cache and b/src/Plugins/SystemCPlugin/obj/Debug/net8.0/SystemCPlugin_NET.csproj.AssemblyReference.cache differ 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 6370e9e..5b9eb74 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" + "NUnit3TestAdapter": "3.17.0", + "OptionsParser": "1.0.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 a26ebb5..607212b 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.9606.31907", + "AntShell.Reference": "1.0.9669.26120", "BigGustave.Reference": "1.0.0.0", "crypto.Reference": "1.9.0.0", - "CxxDemangler.Reference": "1.0.9606.31897", + "CxxDemangler.Reference": "1.0.9669.26104", "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.9606.31907": { + "AntShell.Reference/1.0.9669.26120": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9606.31907", + "assemblyVersion": "1.0.9669.26120", "fileVersion": "0.0.0.0" } } @@ -1598,10 +1598,10 @@ } } }, - "CxxDemangler.Reference/1.0.9606.31897": { + "CxxDemangler.Reference/1.0.9669.26104": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9606.31897", + "assemblyVersion": "1.0.9669.26104", "fileVersion": "0.0.0.0" } } @@ -2507,7 +2507,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9606.31907": { + "AntShell.Reference/1.0.9669.26120": { "type": "reference", "serviceable": false, "sha512": "" @@ -2522,7 +2522,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9606.31897": { + "CxxDemangler.Reference/1.0.9669.26104": { "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 52123dd..ab9d57f 100644 Binary files a/src/Plugins/WiresharkPlugin/obj/Debug/net8.0/WiresharkPlugin_NET.csproj.AssemblyReference.cache and b/src/Plugins/WiresharkPlugin/obj/Debug/net8.0/WiresharkPlugin_NET.csproj.AssemblyReference.cache differ diff --git a/src/Renode/obj/Debug/Renode_NET.csproj.AssemblyReference.cache b/src/Renode/obj/Debug/Renode_NET.csproj.AssemblyReference.cache index 68fc109..a6b2ee6 100644 Binary files a/src/Renode/obj/Debug/Renode_NET.csproj.AssemblyReference.cache and b/src/Renode/obj/Debug/Renode_NET.csproj.AssemblyReference.cache differ 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 6370e9e..5b9eb74 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" + "NUnit3TestAdapter": "3.17.0", + "OptionsParser": "1.0.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 dc471c2..ef2601d 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.9606.31907", + "AntShell.Reference": "1.0.9669.26120", "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.9606.31897", + "CxxDemangler.Reference": "1.0.9669.26104", "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.9606.31907": { + "AntShell.Reference/1.0.9669.26120": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9606.31907", + "assemblyVersion": "1.0.9669.26120", "fileVersion": "0.0.0.0" } } @@ -1994,10 +1994,10 @@ } } }, - "CxxDemangler.Reference/1.0.9606.31897": { + "CxxDemangler.Reference/1.0.9669.26104": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9606.31897", + "assemblyVersion": "1.0.9669.26104", "fileVersion": "0.0.0.0" } } @@ -3134,7 +3134,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9606.31907": { + "AntShell.Reference/1.0.9669.26120": { "type": "reference", "serviceable": false, "sha512": "" @@ -3159,7 +3159,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9606.31897": { + "CxxDemangler.Reference/1.0.9669.26104": { "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 53057fc..01a0ad2 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.9606.31907", + "AntShell.Reference": "1.0.9669.26120", "BigGustave.Reference": "1.0.0.0", "CoSimulationPlugin.Reference": "1.0.0.0", "crypto.Reference": "1.9.0.0", - "CxxDemangler.Reference": "1.0.9606.31897", + "CxxDemangler.Reference": "1.0.9669.26104", "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.31961", + "Renode.Reference": "1.16.0.26170", "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.9606.31907": { + "AntShell.Reference/1.0.9669.26120": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9606.31907", + "assemblyVersion": "1.0.9669.26120", "fileVersion": "0.0.0.0" } } @@ -2067,10 +2067,10 @@ } } }, - "CxxDemangler.Reference/1.0.9606.31897": { + "CxxDemangler.Reference/1.0.9669.26104": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9606.31897", + "assemblyVersion": "1.0.9669.26104", "fileVersion": "0.0.0.0" } } @@ -2131,10 +2131,10 @@ } } }, - "Renode.Reference/1.16.0.31961": { + "Renode.Reference/1.16.0.26170": { "runtime": { "Renode.dll": { - "assemblyVersion": "1.16.0.31961", + "assemblyVersion": "1.16.0.26170", "fileVersion": "0.0.0.0" } } @@ -3255,7 +3255,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9606.31907": { + "AntShell.Reference/1.0.9669.26120": { "type": "reference", "serviceable": false, "sha512": "" @@ -3275,7 +3275,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9606.31897": { + "CxxDemangler.Reference/1.0.9669.26104": { "type": "reference", "serviceable": false, "sha512": "" @@ -3315,7 +3315,7 @@ "serviceable": false, "sha512": "" }, - "Renode.Reference/1.16.0.31961": { + "Renode.Reference/1.16.0.26170": { "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 f0eb8ad..f7922b5 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.9606.31907", + "AntShell.Reference": "1.0.9669.26120", "BigGustave.Reference": "1.0.0.0", "CoSimulationPlugin.Reference": "1.0.0.0", "crypto.Reference": "1.9.0.0", - "CxxDemangler.Reference": "1.0.9606.31897", + "CxxDemangler.Reference": "1.0.9669.26104", "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.31961", + "Renode.Reference": "1.16.0.26170", "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.9606.31907": { + "AntShell.Reference/1.0.9669.26120": { "runtime": { "AntShell.dll": { - "assemblyVersion": "1.0.9606.31907", + "assemblyVersion": "1.0.9669.26120", "fileVersion": "0.0.0.0" } } @@ -2050,10 +2050,10 @@ } } }, - "CxxDemangler.Reference/1.0.9606.31897": { + "CxxDemangler.Reference/1.0.9669.26104": { "runtime": { "CxxDemangler.dll": { - "assemblyVersion": "1.0.9606.31897", + "assemblyVersion": "1.0.9669.26104", "fileVersion": "0.0.0.0" } } @@ -2122,10 +2122,10 @@ } } }, - "Renode.Reference/1.16.0.31961": { + "Renode.Reference/1.16.0.26170": { "runtime": { "Renode.dll": { - "assemblyVersion": "1.16.0.31961", + "assemblyVersion": "1.16.0.26170", "fileVersion": "0.0.0.0" } } @@ -3232,7 +3232,7 @@ "serviceable": false, "sha512": "" }, - "AntShell.Reference/1.0.9606.31907": { + "AntShell.Reference/1.0.9669.26120": { "type": "reference", "serviceable": false, "sha512": "" @@ -3252,7 +3252,7 @@ "serviceable": false, "sha512": "" }, - "CxxDemangler.Reference/1.0.9606.31897": { + "CxxDemangler.Reference/1.0.9669.26104": { "type": "reference", "serviceable": false, "sha512": "" @@ -3297,7 +3297,7 @@ "serviceable": false, "sha512": "" }, - "Renode.Reference/1.16.0.31961": { + "Renode.Reference/1.16.0.26170": { "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 e437fcf..1d39bd9 100644 Binary files a/tests/unit-tests/RenodeTests/obj/Debug/net8.0/RenodeTests_NET.csproj.AssemblyReference.cache and b/tests/unit-tests/RenodeTests/obj/Debug/net8.0/RenodeTests_NET.csproj.AssemblyReference.cache differ