@@ -55,7 +55,8 @@ static void rv_exception_default_handler(riscv_t *rv)
55
55
}
56
56
57
57
#define EXCEPTION_HANDLER_IMPL (type , code ) \
58
- static void rv_except_##type(riscv_t *rv, uint32_t mtval) \
58
+ static void rv_except_##type(riscv_t *rv, uint32_t mtval, \
59
+ uint8_t insn_len) \
59
60
{ \
60
61
/* mtvec (Machine Trap-Vector Base Address Register) \
61
62
* mtvec[MXLEN-1:2]: vector base address \
@@ -71,6 +72,7 @@ static void rv_exception_default_handler(riscv_t *rv)
71
72
rv -> csr_mtval = mtval ; \
72
73
rv -> csr_mcause = code ; \
73
74
if (!rv -> csr_mtvec ) { /* in case CSR is not configured */ \
75
+ rv -> compressed = (insn_len == INSN_16 ); \
74
76
rv_exception_default_handler (rv ); \
75
77
return ; \
76
78
} \
@@ -254,10 +256,14 @@ static bool insn_is_misaligned(uint32_t pc)
254
256
);
255
257
}
256
258
259
+ #define RV_Op (OPCODE ) static bool op_##OPCODE(riscv_t *rv, rv_insn_t *ir)
260
+ #define EMU_Op (OPCODE , RV , IR ) op_##OPCODE(RV, IR)
261
+
262
+
257
263
static bool emulate (riscv_t * rv , rv_insn_t * ir )
258
264
{
259
265
/* check instruction is compressed or not */
260
- rv -> compressed = (ir -> insn_len == INSN_16 );
266
+ // rv->compressed = (ir->insn_len == INSN_16);
261
267
262
268
switch (ir -> opcode ) {
263
269
/* RV32I Base Instruction Set */
@@ -290,7 +296,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
290
296
rv -> X [ir -> rd ] = pc + ir -> insn_len ;
291
297
/* check instruction misaligned */
292
298
if (insn_is_misaligned (rv -> PC )) {
293
- rv_except_insn_misaligned (rv , pc );
299
+ rv_except_insn_misaligned (rv , pc , ir -> insn_len );
294
300
return false;
295
301
}
296
302
/* can branch */
@@ -312,7 +318,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
312
318
rv -> X [ir -> rd ] = pc + ir -> insn_len ;
313
319
/* check instruction misaligned */
314
320
if (insn_is_misaligned (rv -> PC )) {
315
- rv_except_insn_misaligned (rv , pc );
321
+ rv_except_insn_misaligned (rv , pc , ir -> insn_len );
316
322
return false;
317
323
}
318
324
/* can branch */
@@ -324,7 +330,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
324
330
rv -> PC += ir -> imm ;
325
331
/* check instruction misaligned */
326
332
if (insn_is_misaligned (rv -> PC )) {
327
- rv_except_insn_misaligned (rv , pc );
333
+ rv_except_insn_misaligned (rv , pc , ir -> insn_len );
328
334
return false;
329
335
}
330
336
/* can branch */
@@ -338,7 +344,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
338
344
rv -> PC += ir -> imm ;
339
345
/* check instruction misaligned */
340
346
if (insn_is_misaligned (rv -> PC )) {
341
- rv_except_insn_misaligned (rv , pc );
347
+ rv_except_insn_misaligned (rv , pc , ir -> insn_len );
342
348
return false;
343
349
}
344
350
/* can branch */
@@ -352,7 +358,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
352
358
rv -> PC += ir -> imm ;
353
359
/* check instruction misaligned */
354
360
if (insn_is_misaligned (rv -> PC )) {
355
- rv_except_insn_misaligned (rv , pc );
361
+ rv_except_insn_misaligned (rv , pc , ir -> insn_len );
356
362
return false;
357
363
}
358
364
/* can branch */
@@ -366,7 +372,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
366
372
rv -> PC += ir -> imm ;
367
373
/* check instruction misaligned */
368
374
if (insn_is_misaligned (rv -> PC )) {
369
- rv_except_insn_misaligned (rv , pc );
375
+ rv_except_insn_misaligned (rv , pc , ir -> insn_len );
370
376
return false;
371
377
}
372
378
/* can branch */
@@ -380,7 +386,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
380
386
rv -> PC += ir -> imm ;
381
387
/* check instruction misaligned */
382
388
if (insn_is_misaligned (rv -> PC )) {
383
- rv_except_insn_misaligned (rv , pc );
389
+ rv_except_insn_misaligned (rv , pc , ir -> insn_len );
384
390
return false;
385
391
}
386
392
/* can branch */
@@ -394,7 +400,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
394
400
rv -> PC += ir -> imm ;
395
401
/* check instruction misaligned */
396
402
if (insn_is_misaligned (rv -> PC )) {
397
- rv_except_insn_misaligned (rv , pc );
403
+ rv_except_insn_misaligned (rv , pc , ir -> insn_len );
398
404
return false;
399
405
}
400
406
/* can branch */
@@ -409,7 +415,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
409
415
case rv_insn_lh : { /* LH: Load Halfword */
410
416
const uint32_t addr = rv -> X [ir -> rs1 ] + ir -> imm ;
411
417
if (addr & 1 ) {
412
- rv_except_load_misaligned (rv , addr );
418
+ rv_except_load_misaligned (rv , addr , ir -> insn_len );
413
419
return false;
414
420
}
415
421
rv -> X [ir -> rd ] = sign_extend_h (rv -> io .mem_read_s (rv , addr ));
@@ -418,7 +424,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
418
424
case rv_insn_lw : { /* LW: Load Word */
419
425
const uint32_t addr = rv -> X [ir -> rs1 ] + ir -> imm ;
420
426
if (addr & 3 ) {
421
- rv_except_load_misaligned (rv , addr );
427
+ rv_except_load_misaligned (rv , addr , ir -> insn_len );
422
428
return false;
423
429
}
424
430
rv -> X [ir -> rd ] = rv -> io .mem_read_w (rv , addr );
@@ -430,7 +436,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
430
436
case rv_insn_lhu : { /* LHU: Load Halfword Unsigned */
431
437
const uint32_t addr = rv -> X [ir -> rs1 ] + ir -> imm ;
432
438
if (addr & 1 ) {
433
- rv_except_load_misaligned (rv , addr );
439
+ rv_except_load_misaligned (rv , addr , ir -> insn_len );
434
440
return false;
435
441
}
436
442
rv -> X [ir -> rd ] = rv -> io .mem_read_s (rv , addr );
@@ -442,7 +448,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
442
448
case rv_insn_sh : { /* SH: Store Halfword */
443
449
const uint32_t addr = rv -> X [ir -> rs1 ] + ir -> imm ;
444
450
if (addr & 1 ) {
445
- rv_except_store_misaligned (rv , addr );
451
+ rv_except_store_misaligned (rv , addr , ir -> insn_len );
446
452
return false;
447
453
}
448
454
rv -> io .mem_write_s (rv , addr , rv -> X [ir -> rs2 ]);
@@ -451,7 +457,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
451
457
case rv_insn_sw : { /* SW: Store Word */
452
458
const uint32_t addr = rv -> X [ir -> rs1 ] + ir -> imm ;
453
459
if (addr & 3 ) {
454
- rv_except_store_misaligned (rv , addr );
460
+ rv_except_store_misaligned (rv , addr , ir -> insn_len );
455
461
return false;
456
462
}
457
463
rv -> io .mem_write_w (rv , addr , rv -> X [ir -> rs2 ]);
@@ -931,7 +937,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
931
937
*/
932
938
const uint32_t addr = rv -> X [ir -> rs1 ] + (uint32_t ) ir -> imm ;
933
939
if (addr & 3 ) {
934
- rv_except_load_misaligned (rv , addr );
940
+ rv_except_load_misaligned (rv , addr , ir -> insn_len );
935
941
return false;
936
942
}
937
943
rv -> X [ir -> rd ] = rv -> io .mem_read_w (rv , addr );
@@ -945,7 +951,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
945
951
*/
946
952
const uint32_t addr = rv -> X [ir -> rs1 ] + (uint32_t ) ir -> imm ;
947
953
if (addr & 3 ) {
948
- rv_except_store_misaligned (rv , addr );
954
+ rv_except_store_misaligned (rv , addr , ir -> insn_len );
949
955
return false;
950
956
}
951
957
rv -> io .mem_write_w (rv , addr , rv -> X [ir -> rs2 ]);
@@ -967,7 +973,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
967
973
rv -> X [1 ] = rv -> PC + ir -> insn_len ;
968
974
rv -> PC += ir -> imm ;
969
975
if (rv -> PC & 0x1 ) {
970
- rv_except_insn_misaligned (rv , rv -> PC );
976
+ rv_except_insn_misaligned (rv , rv -> PC , ir -> insn_len );
971
977
return false;
972
978
}
973
979
/* can branch */
@@ -1044,7 +1050,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
1044
1050
*/
1045
1051
rv -> PC += ir -> imm ;
1046
1052
if (rv -> PC & 0x1 ) {
1047
- rv_except_insn_misaligned (rv , rv -> PC );
1053
+ rv_except_insn_misaligned (rv , rv -> PC , ir -> insn_len );
1048
1054
return false;
1049
1055
}
1050
1056
/* can branch */
@@ -1074,7 +1080,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
1074
1080
case rv_insn_clwsp : { /* C.LWSP */
1075
1081
const uint32_t addr = rv -> X [rv_reg_sp ] + ir -> imm ;
1076
1082
if (addr & 3 ) {
1077
- rv_except_load_misaligned (rv , addr );
1083
+ rv_except_load_misaligned (rv , addr , ir -> insn_len );
1078
1084
return false;
1079
1085
}
1080
1086
rv -> X [ir -> rd ] = rv -> io .mem_read_w (rv , addr );
@@ -1097,7 +1103,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
1097
1103
rv -> X [rv_reg_ra ] = rv -> PC + ir -> insn_len ;
1098
1104
rv -> PC = jump_to ;
1099
1105
if (rv -> PC & 0x1 ) {
1100
- rv_except_insn_misaligned (rv , rv -> PC );
1106
+ rv_except_insn_misaligned (rv , rv -> PC , ir -> insn_len );
1101
1107
return false;
1102
1108
}
1103
1109
/* can branch */
@@ -1116,7 +1122,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
1116
1122
case rv_insn_cswsp : { /* C.SWSP */
1117
1123
const uint32_t addr = rv -> X [2 ] + ir -> imm ;
1118
1124
if (addr & 3 ) {
1119
- rv_except_store_misaligned (rv , addr );
1125
+ rv_except_store_misaligned (rv , addr , ir -> insn_len );
1120
1126
return false;
1121
1127
}
1122
1128
rv -> io .mem_write_w (rv , addr , rv -> X [ir -> rs2 ]);
@@ -1252,7 +1258,7 @@ static void block_translate(riscv_t *rv, block_t *block)
1252
1258
1253
1259
/* decode the instruction */
1254
1260
if (!rv_decode (ir , insn )) {
1255
- rv_except_illegal_insn (rv , insn );
1261
+ rv_except_illegal_insn (rv , insn , ir -> insn_len );
1256
1262
break ;
1257
1263
}
1258
1264
@@ -1336,12 +1342,12 @@ void rv_step(riscv_t *rv, int32_t cycles)
1336
1342
void ebreak_handler (riscv_t * rv )
1337
1343
{
1338
1344
assert (rv );
1339
- rv_except_breakpoint (rv , rv -> PC );
1345
+ rv_except_breakpoint (rv , rv -> PC , 0 );
1340
1346
}
1341
1347
1342
1348
void ecall_handler (riscv_t * rv )
1343
1349
{
1344
1350
assert (rv );
1345
- rv_except_ecall_M (rv , 0 );
1351
+ rv_except_ecall_M (rv , 0 , 0 );
1346
1352
syscall_handler (rv );
1347
1353
}
0 commit comments