|
39 | 39 | #include "fpu_helper.h"
|
40 | 40 | #include "translate.h"
|
41 | 41 |
|
| 42 | +/* MIPS_PATCH */ |
| 43 | +#include "qemuafl/cpu-translate.h" |
| 44 | + |
| 45 | +/* MIPS_PATCH */ |
| 46 | +#define AFL_QEMU_TARGET_MIPS_SNIPPET \ |
| 47 | + if (is_persistent) { \ |
| 48 | + if (ctx->base.pc_next == afl_persistent_addr) { \ |
| 49 | + gen_helper_afl_persistent_routine(cpu_env); \ |
| 50 | + \ |
| 51 | + if (afl_persistent_ret_addr == 0 && !persistent_exits) { \ |
| 52 | + tcg_gen_movi_tl(cpu_gpr[31], afl_persistent_addr); \ |
| 53 | + } \ |
| 54 | + \ |
| 55 | + if (!persistent_save_gpr) afl_gen_tcg_plain_call(&afl_persistent_loop); \ |
| 56 | + \ |
| 57 | + } else if (afl_persistent_ret_addr && \ |
| 58 | + ctx->base.pc_next == afl_persistent_ret_addr) { \ |
| 59 | + gen_goto_tb(ctx, 0, afl_persistent_addr); \ |
| 60 | + } \ |
| 61 | + } |
| 62 | + |
42 | 63 | enum {
|
43 | 64 | /* indirect opcode tables */
|
44 | 65 | OPC_SPECIAL = (0x00 << 26),
|
@@ -2274,6 +2295,128 @@ static const char * const mxuregnames[] = {
|
2274 | 2295 | };
|
2275 | 2296 | #endif
|
2276 | 2297 |
|
| 2298 | +/* MIPS_PATCH */ |
| 2299 | +void afl_save_regs(struct api_regs* r, CPUArchState *env) { |
| 2300 | + int i = 0; |
| 2301 | + int j = 0; |
| 2302 | + /* GP registers saving */ |
| 2303 | + r->r0 = env->active_tc.gpr[0]; |
| 2304 | + r->at = env->active_tc.gpr[1]; |
| 2305 | + r->v0 = env->active_tc.gpr[2]; |
| 2306 | + r->v1 = env->active_tc.gpr[3]; |
| 2307 | + r->a0 = env->active_tc.gpr[4]; |
| 2308 | + r->a1 = env->active_tc.gpr[5]; |
| 2309 | + r->a2 = env->active_tc.gpr[6]; |
| 2310 | + r->a3 = env->active_tc.gpr[7]; |
| 2311 | + r->t0 = env->active_tc.gpr[8]; |
| 2312 | + r->t1 = env->active_tc.gpr[9]; |
| 2313 | + r->t2 = env->active_tc.gpr[10]; |
| 2314 | + r->t3 = env->active_tc.gpr[11]; |
| 2315 | + r->t4 = env->active_tc.gpr[12]; |
| 2316 | + r->t5 = env->active_tc.gpr[13]; |
| 2317 | + r->t6 = env->active_tc.gpr[14]; |
| 2318 | + r->t7 = env->active_tc.gpr[15]; |
| 2319 | + r->s0 = env->active_tc.gpr[16]; |
| 2320 | + r->s1 = env->active_tc.gpr[17]; |
| 2321 | + r->s2 = env->active_tc.gpr[18]; |
| 2322 | + r->s3 = env->active_tc.gpr[19]; |
| 2323 | + r->s4 = env->active_tc.gpr[20]; |
| 2324 | + r->s5 = env->active_tc.gpr[21]; |
| 2325 | + r->s6 = env->active_tc.gpr[22]; |
| 2326 | + r->s7 = env->active_tc.gpr[23]; |
| 2327 | + r->t8 = env->active_tc.gpr[24]; |
| 2328 | + r->t9 = env->active_tc.gpr[25]; |
| 2329 | + r->k0 = env->active_tc.gpr[26]; |
| 2330 | + r->k1 = env->active_tc.gpr[27]; |
| 2331 | + r->gp = env->active_tc.gpr[28]; |
| 2332 | + r->sp = env->active_tc.gpr[29]; |
| 2333 | + r->fp = env->active_tc.gpr[30]; |
| 2334 | + r->ra = env->active_tc.gpr[31]; |
| 2335 | + r->PC = env->active_tc.PC; |
| 2336 | +#if defined(TARGET_MIPS64) |
| 2337 | + memcpy(r->gpr_hi, env->active_tc.gpr_hi, sizeof(r->gpr_hi)); |
| 2338 | +#endif |
| 2339 | + for (i = 0; i < MIPS_DSP_ACC; i++) { |
| 2340 | + r->HI[i] = env->active_tc.HI[i]; |
| 2341 | + r->LO[i] = env->active_tc.LO[i]; |
| 2342 | + } |
| 2343 | + /* FP registers saving */ |
| 2344 | + for (i = 0; i < 32; i++) { |
| 2345 | + r->fpr[i].fd = env->active_fpu.fpr[i].fd; |
| 2346 | + for (j = 0; j < 2; j++) { |
| 2347 | + r->fpr[i].fs[j] = env->active_fpu.fpr[i].fs[j]; |
| 2348 | + } |
| 2349 | + r->fpr[i].d = env->active_fpu.fpr[i].d; |
| 2350 | + for (j = 0; j < 2; j++) { |
| 2351 | + r->fpr[i].w[j] = env->active_fpu.fpr[i].w[j]; |
| 2352 | + } |
| 2353 | + for (j = 0; j < MSA_WRLEN / 8; j++) { |
| 2354 | + r->fpr[i].wr.b[j] = env->active_fpu.fpr[i].wr.b[j]; |
| 2355 | + } |
| 2356 | + } |
| 2357 | +} |
| 2358 | + |
| 2359 | +/* MIPS_PATCH */ |
| 2360 | +void afl_restore_regs(struct api_regs* r, CPUArchState *env) { |
| 2361 | + int i = 0; |
| 2362 | + int j = 0; |
| 2363 | + /* GP registers restoring */ |
| 2364 | + env->active_tc.gpr[0] = r->r0; |
| 2365 | + env->active_tc.gpr[1] = r->at; |
| 2366 | + env->active_tc.gpr[2] = r->v0; |
| 2367 | + env->active_tc.gpr[3] = r->v1; |
| 2368 | + env->active_tc.gpr[4] = r->a0; |
| 2369 | + env->active_tc.gpr[5] = r->a1; |
| 2370 | + env->active_tc.gpr[6] = r->a2; |
| 2371 | + env->active_tc.gpr[7] = r->a3; |
| 2372 | + env->active_tc.gpr[8] = r->t0; |
| 2373 | + env->active_tc.gpr[9] = r->t1; |
| 2374 | + env->active_tc.gpr[10] = r->t2; |
| 2375 | + env->active_tc.gpr[11] = r->t3; |
| 2376 | + env->active_tc.gpr[12] = r->t4; |
| 2377 | + env->active_tc.gpr[13] = r->t5; |
| 2378 | + env->active_tc.gpr[14] = r->t6; |
| 2379 | + env->active_tc.gpr[15] = r->t7; |
| 2380 | + env->active_tc.gpr[16] = r->s0; |
| 2381 | + env->active_tc.gpr[17] = r->s1; |
| 2382 | + env->active_tc.gpr[18] = r->s2; |
| 2383 | + env->active_tc.gpr[19] = r->s3; |
| 2384 | + env->active_tc.gpr[20] = r->s4; |
| 2385 | + env->active_tc.gpr[21] = r->s5; |
| 2386 | + env->active_tc.gpr[22] = r->s6; |
| 2387 | + env->active_tc.gpr[23] = r->s7; |
| 2388 | + env->active_tc.gpr[24] = r->t8; |
| 2389 | + env->active_tc.gpr[25] = r->t9; |
| 2390 | + env->active_tc.gpr[26] = r->k0; |
| 2391 | + env->active_tc.gpr[27] = r->k1; |
| 2392 | + env->active_tc.gpr[28] = r->gp; |
| 2393 | + env->active_tc.gpr[29] = r->sp; |
| 2394 | + env->active_tc.gpr[30] = r->fp; |
| 2395 | + env->active_tc.gpr[31] = r->ra; |
| 2396 | + env->active_tc.PC = r->PC; |
| 2397 | +#if defined(TARGET_MIPS64) |
| 2398 | + memcpy(env->active_tc.gpr_hi, r->gpr_hi, sizeof(r->gpr_hi)); |
| 2399 | +#endif |
| 2400 | + for (i = 0; i < MIPS_DSP_ACC; i++) { |
| 2401 | + env->active_tc.HI[i] = r->HI[i]; |
| 2402 | + env->active_tc.LO[i] = r->LO[i]; |
| 2403 | + } |
| 2404 | + /* FP registers restoring */ |
| 2405 | + for (i = 0; i < 32; i++) { |
| 2406 | + env->active_fpu.fpr[i].fd = r->fpr[i].fd; |
| 2407 | + for (j = 0; j < 2; j++) { |
| 2408 | + env->active_fpu.fpr[i].fs[j] = r->fpr[i].fs[j]; |
| 2409 | + } |
| 2410 | + env->active_fpu.fpr[i].d = r->fpr[i].d; |
| 2411 | + for (j = 0; j < 2; j++) { |
| 2412 | + env->active_fpu.fpr[i].w[j] = r->fpr[i].w[j]; |
| 2413 | + } |
| 2414 | + for (j = 0; j < MSA_WRLEN / 8; j++) { |
| 2415 | + env->active_fpu.fpr[i].wr.b[j] = r->fpr[i].wr.b[j]; |
| 2416 | + } |
| 2417 | + } |
| 2418 | +} |
| 2419 | + |
2277 | 2420 | /* General purpose registers moves. */
|
2278 | 2421 | void gen_load_gpr(TCGv t, int reg)
|
2279 | 2422 | {
|
@@ -29090,6 +29233,9 @@ static void mips_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
|
29090 | 29233 | int insn_bytes;
|
29091 | 29234 | int is_slot;
|
29092 | 29235 |
|
| 29236 | + /* MIPS_PATCH */ |
| 29237 | + AFL_QEMU_TARGET_MIPS_SNIPPET |
| 29238 | + |
29093 | 29239 | is_slot = ctx->hflags & MIPS_HFLAG_BMASK;
|
29094 | 29240 | if (ctx->insn_flags & ISA_NANOMIPS32) {
|
29095 | 29241 | ctx->opcode = translator_lduw(env, ctx->base.pc_next);
|
|
0 commit comments