From 47de89f88c49676a86a987bd4bcbe866e19971ff Mon Sep 17 00:00:00 2001 From: Zhijin Zeng Date: Tue, 8 Sep 2026 13:54:07 +0800 Subject: [PATCH] [RV64_DYNAREC] Fix writing read-only page for SHA/AES opcode If `Ex` is memory source operand, not need to write back. If `Ex` pointer to read-only page, `if (!MODREG) PUTEX_vector(v1, VECTOR_SEW32)` will cause SIGSEGV error. --- src/dynarec/rv64/dynarec_rv64_0f.c | 2 -- src/dynarec/rv64/dynarec_rv64_660f38.c | 5 ----- 2 files changed, 7 deletions(-) diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index 2634ba07f7..ebaedde524 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -880,7 +880,6 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni vx0 = t; } VSHA2CL_VV(v0, v1, vx0); - if (!MODREG) PUTEX_vector(v1, VECTOR_SEW32); break; } if (u8 != 0xCB && cpuext.vector && cpuext.zvbb) { @@ -945,7 +944,6 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni VADD_VV(v0, v0, d1, 1); break; } - if (!MODREG) PUTEX_vector(v1, VECTOR_SEW32); break; } if (MODREG) { diff --git a/src/dynarec/rv64/dynarec_rv64_660f38.c b/src/dynarec/rv64/dynarec_rv64_660f38.c index d7f17962c8..783bb448a3 100644 --- a/src/dynarec/rv64/dynarec_rv64_660f38.c +++ b/src/dynarec/rv64/dynarec_rv64_660f38.c @@ -734,7 +734,6 @@ uintptr_t dynarec64_660F38(dynarec_rv64_t* dyn, uintptr_t addr, uint8_t opcode, VMV_V_X(v2, x4); VAESDM_VV(v2, v1); VMV_V_V(v0, v2); - if (!MODREG) PUTEX_vector(v1, VECTOR_SEW32); break; } GETGX(); @@ -752,7 +751,6 @@ uintptr_t dynarec64_660F38(dynarec_rv64_t* dyn, uintptr_t addr, uint8_t opcode, GETGX_vector(v0, 1, VECTOR_SEW32); GETEX_vector(v1, 0, 8, VECTOR_SEW32); VAESEM_VV(v0, v1); - if (!MODREG) PUTEX_vector(v1, VECTOR_SEW32); break; } GETG; @@ -781,7 +779,6 @@ uintptr_t dynarec64_660F38(dynarec_rv64_t* dyn, uintptr_t addr, uint8_t opcode, GETGX_vector(v0, 1, VECTOR_SEW32); GETEX_vector(v1, 0, 8, VECTOR_SEW32); VAESEF_VV(v0, v1); - if (!MODREG) PUTEX_vector(v1, VECTOR_SEW32); break; } GETG; @@ -822,7 +819,6 @@ uintptr_t dynarec64_660F38(dynarec_rv64_t* dyn, uintptr_t addr, uint8_t opcode, VMV_V_X(v2, x4); VAESDM_VV(v2, v0); VXOR_VV(v0, v2, v1, 1); - if (!MODREG) PUTEX_vector(v1, VECTOR_SEW32); break; } GETG; @@ -852,7 +848,6 @@ uintptr_t dynarec64_660F38(dynarec_rv64_t* dyn, uintptr_t addr, uint8_t opcode, GETGX_vector(v0, 1, VECTOR_SEW32); GETEX_vector(v1, 0, 8, VECTOR_SEW32); VAESDF_VV(v0, v1); - if (!MODREG) PUTEX_vector(v1, VECTOR_SEW32); break; } GETG;