This commit is contained in:
2026-06-22 17:48:58 +08:00
parent 6b1165b6b1
commit 10a984d911
24 changed files with 695 additions and 102 deletions

Submodule lib/resources updated: 43e805d8e8...98eb8a3406

View File

@@ -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": {}

View File

@@ -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": ""

View File

@@ -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. 翻译上下文

View File

@@ -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;
}

View File

@@ -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

View File

@@ -4,7 +4,7 @@
* Date:2026_0209
*/
#include "cpu.h"
#include "helper.h"
#include "exec-all.h"
// MIPS操作辅助函数实现

View File

@@ -15,6 +15,7 @@
#include "arch_callbacks.h"
#include "tb-helper.h"
#include "debug.h"
#include "helper.h"
#include <inttypes.h>
#include <stdio.h>
#include <stdbool.h>
@@ -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;
}
}

View File

@@ -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"
}

View File

@@ -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": ""

View File

@@ -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": {}

View File

@@ -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": {}

View File

@@ -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": ""

View File

@@ -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": {}

View File

@@ -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": ""

View File

@@ -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": {}

View File

@@ -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": ""

View File

@@ -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": ""

View File

@@ -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": ""