@@ -1224,6 +1224,73 @@ static const char regnames_LO[][4] = {
1224
1224
"LO0", "LO1", "LO2", "LO3",
1225
1225
};
1226
1226
1227
+ /*
1228
+ ** Include useful headers and defines
1229
+ */
1230
+ #ifdef HAS_TRACEWRAP
1231
+ #include <frame_arch.h>
1232
+ #endif // HAS_TRACEWRAP
1233
+
1234
+ static inline void gen_trace_newframe(uint64_t pc) {
1235
+ #ifdef HAS_TRACEWRAP
1236
+
1237
+ // create new traceframe
1238
+ TCGv_i64 _pc = tcg_const_i64(pc);
1239
+ gen_helper_trace_newframe(_pc);
1240
+ tcg_temp_free_i64(_pc);
1241
+
1242
+ // get machine type
1243
+ #ifdef TARGET_MIPS64
1244
+ TCGv_ptr mt = tcg_const_ptr(FRAME_MODE_MIPS64); // TODO: Check this
1245
+ #else
1246
+ TCGv_ptr mt = tcg_const_ptr(FRAME_MODE_MIPS);
1247
+ #endif // TARGET_MIPS64
1248
+
1249
+ // set trace mode to mips64 or mips
1250
+ gen_helper_trace_mode(mt);
1251
+ tcg_trace_free_ptr(mt);
1252
+
1253
+ #endif // HAS_TRACEWRAP
1254
+ }
1255
+
1256
+ static inline void gen_trace_endframe(uint64_t pc) {
1257
+ #ifdef HAS_TRACEWRAP
1258
+ TCGv_i64 _pc = tcg_const_i64(pc);
1259
+ gen_helper_trace_endframe(cpu_env, _pc);
1260
+ tcg_temp_free_i64(_pc);
1261
+
1262
+ #endif // HAS_TRACEWRAP
1263
+ }
1264
+
1265
+ static void gen_trace_load_reg(int reg, TCGv var) {
1266
+ #ifdef HAS_TRACEWRAP
1267
+
1268
+ TCGv_i32 r = tcg_const_i32(reg);
1269
+ #ifdef TARGET_MIPS64
1270
+ gen_helper_trace_load_reg64(r, var);
1271
+ #else
1272
+ gen_helper_trace_load_reg(r, var);
1273
+ #endif
1274
+ tcg_temp_free_i32(r);
1275
+
1276
+ #endif // HAS_TRACEWRAP
1277
+ }
1278
+
1279
+ static void gen_trace_store_reg(int reg, TCGv var) {
1280
+ #ifdef HAS_TRACEWRAP
1281
+
1282
+ TCGv_i32 r = tcg_const_i32(reg);
1283
+ #ifdef TARGET_PPC64
1284
+ gen_helper_trace_store_reg64(r, var);
1285
+ #else
1286
+ gen_helper_trace_store_reg(r, var);
1287
+ #endif
1288
+ tcg_temp_free_i32(r);
1289
+
1290
+ #endif // HAS_TRACEWRAP
1291
+ }
1292
+
1293
+
1227
1294
/* General purpose registers moves. */
1228
1295
void gen_load_gpr(TCGv t, int reg)
1229
1296
{
@@ -1232,13 +1299,17 @@ void gen_load_gpr(TCGv t, int reg)
1232
1299
} else {
1233
1300
tcg_gen_mov_tl(t, cpu_gpr[reg]);
1234
1301
}
1302
+
1303
+ gen_trace_load_reg(reg, t);
1235
1304
}
1236
1305
1237
1306
void gen_store_gpr(TCGv t, int reg)
1238
1307
{
1239
1308
if (reg != 0) {
1240
1309
tcg_gen_mov_tl(cpu_gpr[reg], t);
1241
1310
}
1311
+
1312
+ gen_trace_store_reg(reg, t);
1242
1313
}
1243
1314
1244
1315
#if defined(TARGET_MIPS64)
@@ -1249,13 +1320,21 @@ void gen_load_gpr_hi(TCGv_i64 t, int reg)
1249
1320
} else {
1250
1321
tcg_gen_mov_i64(t, cpu_gpr_hi[reg]);
1251
1322
}
1323
+
1324
+ #ifdef HAS_TRACEWRAP
1325
+ gen_trace_load_reg(reg, t);
1326
+ #endif
1252
1327
}
1253
1328
1254
1329
void gen_store_gpr_hi(TCGv_i64 t, int reg)
1255
1330
{
1256
1331
if (reg != 0) {
1257
1332
tcg_gen_mov_i64(cpu_gpr_hi[reg], t);
1258
1333
}
1334
+
1335
+ #ifdef HAS_TRACEWRAP
1336
+ gen_trace_store_reg(reg, t);
1337
+ #endif
1259
1338
}
1260
1339
#endif /* TARGET_MIPS64 */
1261
1340
@@ -1264,6 +1343,7 @@ static inline void gen_load_srsgpr(int from, int to)
1264
1343
{
1265
1344
TCGv t0 = tcg_temp_new();
1266
1345
1346
+ // if from == r0 then just move 0
1267
1347
if (from == 0) {
1268
1348
tcg_gen_movi_tl(t0, 0);
1269
1349
} else {
@@ -1283,6 +1363,8 @@ static inline void gen_load_srsgpr(int from, int to)
1283
1363
}
1284
1364
gen_store_gpr(t0, to);
1285
1365
tcg_temp_free(t0);
1366
+
1367
+ #ifdef H
1286
1368
}
1287
1369
1288
1370
static inline void gen_store_srsgpr(int from, int to)
@@ -16033,19 +16115,24 @@ static void mips_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
16033
16115
int insn_bytes;
16034
16116
int is_slot;
16035
16117
16118
+ // get pc_next and start generating new traceframe
16119
+ uint64_t pc_next = ctx->base.px_next;
16120
+ gen_trace_newframe(pc_next);
16121
+
16122
+ // translate depending on architecture
16036
16123
is_slot = ctx->hflags & MIPS_HFLAG_BMASK;
16037
16124
if (ctx->insn_flags & ISA_NANOMIPS32) {
16038
- ctx->opcode = translator_lduw(env, &ctx->base, ctx->base. pc_next);
16125
+ ctx->opcode = translator_lduw(env, &ctx->base, pc_next);
16039
16126
insn_bytes = decode_isa_nanomips(env, ctx);
16040
16127
} else if (!(ctx->hflags & MIPS_HFLAG_M16)) {
16041
- ctx->opcode = translator_ldl(env, &ctx->base, ctx->base. pc_next);
16128
+ ctx->opcode = translator_ldl(env, &ctx->base, pc_next);
16042
16129
insn_bytes = 4;
16043
16130
decode_opc(env, ctx);
16044
16131
} else if (ctx->insn_flags & ASE_MICROMIPS) {
16045
- ctx->opcode = translator_lduw(env, &ctx->base, ctx->base. pc_next);
16132
+ ctx->opcode = translator_lduw(env, &ctx->base, pc_next);
16046
16133
insn_bytes = decode_isa_micromips(env, ctx);
16047
16134
} else if (ctx->insn_flags & ASE_MIPS16) {
16048
- ctx->opcode = translator_lduw(env, &ctx->base, ctx->base. pc_next);
16135
+ ctx->opcode = translator_lduw(env, &ctx->base, pc_next);
16049
16136
insn_bytes = decode_ase_mips16e(env, ctx);
16050
16137
} else {
16051
16138
gen_reserved_instruction(ctx);
@@ -16074,7 +16161,11 @@ static void mips_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
16074
16161
if (is_slot) {
16075
16162
gen_branch(ctx, insn_bytes);
16076
16163
}
16164
+
16165
+ // update pc for next instruction
16166
+ // and get pc_next
16077
16167
ctx->base.pc_next += insn_bytes;
16168
+ pc_next = ctx->base.pc_next;
16078
16169
16079
16170
if (ctx->base.is_jmp != DISAS_NEXT) {
16080
16171
return;
@@ -16085,10 +16176,13 @@ static void mips_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
16085
16176
* See mips_tr_init_disas_context about single-stepping a branch
16086
16177
* together with its delay slot.
16087
16178
*/
16088
- if (ctx->base. pc_next - ctx->page_start >= TARGET_PAGE_SIZE
16179
+ if (pc_next - ctx->page_start >= TARGET_PAGE_SIZE
16089
16180
&& !ctx->base.singlestep_enabled) {
16090
16181
ctx->base.is_jmp = DISAS_TOO_MANY;
16091
16182
}
16183
+
16184
+ // end the frame
16185
+ gen_pc_endframe(pc_next);
16092
16186
}
16093
16187
16094
16188
static void mips_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
0 commit comments