Skip to content

Commit 8c1fc48

Browse files
committed
Fix potential write to x0 register in RV32A instructions
Fix a potential issue where A extension instructions could inadvertently write to the x0 register. The fix ensures that such instructions do not modify the x0 register.
1 parent d511c1e commit 8c1fc48

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

src/rv32_template.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,7 +1320,8 @@ GEN({
13201320
RVOP(
13211321
lrw,
13221322
{
1323-
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
1323+
if (ir->rd)
1324+
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
13241325
/* skip registration of the 'reservation set'
13251326
* FIXME: uimplemented
13261327
*/
@@ -1347,7 +1348,8 @@ RVOP(
13471348
RVOP(
13481349
amoswapw,
13491350
{
1350-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1351+
if (ir->rd)
1352+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
13511353
rv->io.mem_write_s(ir->rs1, rv->X[ir->rs2]);
13521354
},
13531355
GEN({
@@ -1358,7 +1360,8 @@ RVOP(
13581360
RVOP(
13591361
amoaddw,
13601362
{
1361-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1363+
if (ir->rd)
1364+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
13621365
const int32_t res = (int32_t) rv->X[ir->rd] + (int32_t) rv->X[ir->rs2];
13631366
rv->io.mem_write_s(ir->rs1, res);
13641367
},
@@ -1370,7 +1373,8 @@ RVOP(
13701373
RVOP(
13711374
amoxorw,
13721375
{
1373-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1376+
if (ir->rd)
1377+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
13741378
const int32_t res = rv->X[ir->rd] ^ rv->X[ir->rs2];
13751379
rv->io.mem_write_s(ir->rs1, res);
13761380
},
@@ -1382,7 +1386,8 @@ RVOP(
13821386
RVOP(
13831387
amoandw,
13841388
{
1385-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1389+
if (ir->rd)
1390+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
13861391
const int32_t res = rv->X[ir->rd] & rv->X[ir->rs2];
13871392
rv->io.mem_write_s(ir->rs1, res);
13881393
},
@@ -1394,7 +1399,8 @@ RVOP(
13941399
RVOP(
13951400
amoorw,
13961401
{
1397-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1402+
if (ir->rd)
1403+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
13981404
const int32_t res = rv->X[ir->rd] | rv->X[ir->rs2];
13991405
rv->io.mem_write_s(ir->rs1, res);
14001406
},
@@ -1406,7 +1412,8 @@ RVOP(
14061412
RVOP(
14071413
amominw,
14081414
{
1409-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1415+
if (ir->rd)
1416+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
14101417
const int32_t a = rv->X[ir->rd];
14111418
const int32_t b = rv->X[ir->rs2];
14121419
const uint32_t res = a < b ? rv->X[ir->rd] : rv->X[ir->rs2];
@@ -1420,7 +1427,8 @@ RVOP(
14201427
RVOP(
14211428
amomaxw,
14221429
{
1423-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1430+
if (ir->rd)
1431+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
14241432
const int32_t a = rv->X[ir->rd];
14251433
const int32_t b = rv->X[ir->rs2];
14261434
const uint32_t res = a > b ? rv->X[ir->rd] : rv->X[ir->rs2];
@@ -1434,7 +1442,8 @@ RVOP(
14341442
RVOP(
14351443
amominuw,
14361444
{
1437-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1445+
if (ir->rd)
1446+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
14381447
const uint32_t ures =
14391448
rv->X[ir->rd] < rv->X[ir->rs2] ? rv->X[ir->rd] : rv->X[ir->rs2];
14401449
rv->io.mem_write_s(ir->rs1, ures);
@@ -1447,7 +1456,8 @@ RVOP(
14471456
RVOP(
14481457
amomaxuw,
14491458
{
1450-
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
1459+
if (ir->rd)
1460+
rv->X[ir->rd] = rv->io.mem_read_w(ir->rs1);
14511461
const uint32_t ures =
14521462
rv->X[ir->rd] > rv->X[ir->rs2] ? rv->X[ir->rd] : rv->X[ir->rs2];
14531463
rv->io.mem_write_s(ir->rs1, ures);

0 commit comments

Comments
 (0)