Skip to content

Commit ffd0e0b

Browse files
committed
Add address alignment checks for RV32A
Current RV32A implementation did not properly handle address alignment concerns. A check for address misalignment has been introduced, and the corresponding exception handler is invoked to ensure correct behavior.
1 parent 71af819 commit ffd0e0b

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

src/rv32_template.c

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,8 +1321,10 @@ GEN({
13211321
RVOP(
13221322
lrw,
13231323
{
1324+
const uint32_t addr = rv->X[ir->rs1];
1325+
RV_EXC_MISALIGN_HANDLER(3, load, false, 1);
13241326
if (ir->rd)
1325-
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
1327+
rv->X[ir->rd] = rv->io.mem_read_w(addr);
13261328
/* skip registration of the 'reservation set'
13271329
* FIXME: uimplemented
13281330
*/
@@ -1338,7 +1340,9 @@ RVOP(
13381340
/* assume the 'reservation set' is valid
13391341
* FIXME: unimplemented
13401342
*/
1341-
rv->io.mem_write_w(rv->X[ir->rs1], rv->X[ir->rs2]);
1343+
const uint32_t addr = rv->X[ir->rs1];
1344+
RV_EXC_MISALIGN_HANDLER(3, store, false, 1);
1345+
rv->io.mem_write_w(addr, rv->X[ir->rs2]);
13421346
rv->X[ir->rd] = 0;
13431347
},
13441348
GEN({
@@ -1350,6 +1354,7 @@ RVOP(
13501354
amoswapw,
13511355
{
13521356
const uint32_t addr = rv->X[ir->rs1];
1357+
RV_EXC_MISALIGN_HANDLER(3, load, false, 1);
13531358
const uint32_t value1 = rv->io.mem_read_w(rv->X[ir->rs1]);
13541359
const uint32_t value2 = rv->X[ir->rs2];
13551360
if (ir->rd)
@@ -1365,6 +1370,7 @@ RVOP(
13651370
amoaddw,
13661371
{
13671372
const uint32_t addr = rv->X[ir->rs1];
1373+
RV_EXC_MISALIGN_HANDLER(3, load, false, 1);
13681374
const uint32_t value1 = rv->io.mem_read_w(rv->X[ir->rs1]);
13691375
const uint32_t value2 = rv->X[ir->rs2];
13701376
if (ir->rd)
@@ -1381,6 +1387,7 @@ RVOP(
13811387
amoxorw,
13821388
{
13831389
const uint32_t addr = rv->X[ir->rs1];
1390+
RV_EXC_MISALIGN_HANDLER(3, load, false, 1);
13841391
const uint32_t value1 = rv->io.mem_read_w(rv->X[ir->rs1]);
13851392
const uint32_t value2 = rv->X[ir->rs2];
13861393
if (ir->rd)
@@ -1397,6 +1404,7 @@ RVOP(
13971404
amoandw,
13981405
{
13991406
const uint32_t addr = rv->X[ir->rs1];
1407+
RV_EXC_MISALIGN_HANDLER(3, load, false, 1);
14001408
const uint32_t value1 = rv->io.mem_read_w(rv->X[ir->rs1]);
14011409
const uint32_t value2 = rv->X[ir->rs2];
14021410
if (ir->rd)
@@ -1413,6 +1421,7 @@ RVOP(
14131421
amoorw,
14141422
{
14151423
const uint32_t addr = rv->X[ir->rs1];
1424+
RV_EXC_MISALIGN_HANDLER(3, load, false, 1);
14161425
const uint32_t value1 = rv->io.mem_read_w(rv->X[ir->rs1]);
14171426
const uint32_t value2 = rv->X[ir->rs2];
14181427
if (ir->rd)
@@ -1429,6 +1438,7 @@ RVOP(
14291438
amominw,
14301439
{
14311440
const uint32_t addr = rv->X[ir->rs1];
1441+
RV_EXC_MISALIGN_HANDLER(3, load, false, 1);
14321442
const uint32_t value1 = rv->io.mem_read_w(rv->X[ir->rs1]);
14331443
const uint32_t value2 = rv->X[ir->rs2];
14341444
if (ir->rd)
@@ -1447,6 +1457,7 @@ RVOP(
14471457
amomaxw,
14481458
{
14491459
const uint32_t addr = rv->X[ir->rs1];
1460+
RV_EXC_MISALIGN_HANDLER(3, load, false, 1);
14501461
const uint32_t value1 = rv->io.mem_read_w(rv->X[ir->rs1]);
14511462
const uint32_t value2 = rv->X[ir->rs2];
14521463
if (ir->rd)
@@ -1465,6 +1476,7 @@ RVOP(
14651476
amominuw,
14661477
{
14671478
const uint32_t addr = rv->X[ir->rs1];
1479+
RV_EXC_MISALIGN_HANDLER(3, load, false, 1);
14681480
const uint32_t value1 = rv->io.mem_read_w(rv->X[ir->rs1]);
14691481
const uint32_t value2 = rv->X[ir->rs2];
14701482
if (ir->rd)
@@ -1481,6 +1493,7 @@ RVOP(
14811493
amomaxuw,
14821494
{
14831495
const uint32_t addr = rv->X[ir->rs1];
1496+
RV_EXC_MISALIGN_HANDLER(3, load, false, 1);
14841497
const uint32_t value1 = rv->io.mem_read_w(rv->X[ir->rs1]);
14851498
const uint32_t value2 = rv->X[ir->rs2];
14861499
if (ir->rd)

0 commit comments

Comments
 (0)