@@ -862,12 +862,9 @@ static block_t *block_find_or_translate(riscv_t *rv)
862
862
block_translate (rv , next_blk );
863
863
864
864
optimize_constant (rv , next_blk );
865
- #if RV32_HAS (GDBSTUB )
866
- if (likely (!rv -> debug_mode ))
867
- #endif
868
865
#if RV32_HAS (MOP_FUSION )
869
- /* macro operation fusion */
870
- match_pattern (rv , next_blk );
866
+ /* macro operation fusion */
867
+ match_pattern (rv , next_blk );
871
868
#endif
872
869
873
870
#if !RV32_HAS (JIT )
@@ -958,6 +955,41 @@ static bool rv_has_plic_trap(riscv_t *rv)
958
955
return ((rv -> csr_sstatus & SSTATUS_SIE || !rv -> priv_mode ) &&
959
956
(rv -> csr_sip & rv -> csr_sie ));
960
957
}
958
+
959
+ static void rv_check_interrupt (riscv_t * rv )
960
+ {
961
+ vm_attr_t * attr = PRIV (rv );
962
+ if (peripheral_update_ctr -- == 0 ) {
963
+ peripheral_update_ctr = 64 ;
964
+
965
+ u8250_check_ready (PRIV (rv )-> uart );
966
+ if (PRIV (rv )-> uart -> in_ready )
967
+ emu_update_uart_interrupts (rv );
968
+ }
969
+
970
+ if (ctr > attr -> timer )
971
+ rv -> csr_sip |= RV_INT_STI ;
972
+ else
973
+ rv -> csr_sip &= ~RV_INT_STI ;
974
+
975
+ if (rv_has_plic_trap (rv )) {
976
+ uint32_t intr_applicable = rv -> csr_sip & rv -> csr_sie ;
977
+ uint8_t intr_idx = ilog2 (intr_applicable );
978
+ switch (intr_idx ) {
979
+ case (SUPERVISOR_SW_INTR & 0xf ):
980
+ SET_CAUSE_AND_TVAL_THEN_TRAP (rv , SUPERVISOR_SW_INTR , 0 );
981
+ break ;
982
+ case (SUPERVISOR_TIMER_INTR & 0xf ):
983
+ SET_CAUSE_AND_TVAL_THEN_TRAP (rv , SUPERVISOR_TIMER_INTR , 0 );
984
+ break ;
985
+ case (SUPERVISOR_EXTERNAL_INTR & 0xf ):
986
+ SET_CAUSE_AND_TVAL_THEN_TRAP (rv , SUPERVISOR_EXTERNAL_INTR , 0 );
987
+ break ;
988
+ default :
989
+ break ;
990
+ }
991
+ }
992
+ }
961
993
#endif
962
994
963
995
void rv_step (void * arg )
@@ -975,38 +1007,8 @@ void rv_step(void *arg)
975
1007
while (rv -> csr_cycle < cycles_target && !rv -> halt ) {
976
1008
#if RV32_HAS (SYSTEM ) && !RV32_HAS (ELF_LOADER )
977
1009
/* check for any interrupt after every block emulation */
978
-
979
- if (peripheral_update_ctr -- == 0 ) {
980
- peripheral_update_ctr = 64 ;
981
-
982
- u8250_check_ready (PRIV (rv )-> uart );
983
- if (PRIV (rv )-> uart -> in_ready )
984
- emu_update_uart_interrupts (rv );
985
- }
986
-
987
- if (ctr > attr -> timer )
988
- rv -> csr_sip |= RV_INT_STI ;
989
- else
990
- rv -> csr_sip &= ~RV_INT_STI ;
991
-
992
- if (rv_has_plic_trap (rv )) {
993
- uint32_t intr_applicable = rv -> csr_sip & rv -> csr_sie ;
994
- uint8_t intr_idx = ilog2 (intr_applicable );
995
- switch (intr_idx ) {
996
- case (SUPERVISOR_SW_INTR & 0xf ):
997
- SET_CAUSE_AND_TVAL_THEN_TRAP (rv , SUPERVISOR_SW_INTR , 0 );
998
- break ;
999
- case (SUPERVISOR_TIMER_INTR & 0xf ):
1000
- SET_CAUSE_AND_TVAL_THEN_TRAP (rv , SUPERVISOR_TIMER_INTR , 0 );
1001
- break ;
1002
- case (SUPERVISOR_EXTERNAL_INTR & 0xf ):
1003
- SET_CAUSE_AND_TVAL_THEN_TRAP (rv , SUPERVISOR_EXTERNAL_INTR , 0 );
1004
- break ;
1005
- default :
1006
- break ;
1007
- }
1008
- }
1009
- #endif /* RV32_HAS(SYSTEM) && !RV32_HAS(ELF_LOADER) */
1010
+ rv_check_interrupt (rv );
1011
+ #endif
1010
1012
1011
1013
if (prev && prev -> pc_start != last_pc ) {
1012
1014
/* update previous block */
@@ -1111,6 +1113,43 @@ void rv_step(void *arg)
1111
1113
#endif
1112
1114
}
1113
1115
1116
+ void rv_step_debug (void * arg )
1117
+ {
1118
+ assert (arg );
1119
+ riscv_t * rv = arg ;
1120
+
1121
+ #if RV32_HAS (SYSTEM ) && !RV32_HAS (ELF_LOADER )
1122
+ rv_check_interrupt (rv );
1123
+ #endif
1124
+
1125
+ retranslate :
1126
+ /* fetch the next instruction */
1127
+ rv_insn_t ir ;
1128
+ memset (& ir , 0 , sizeof (rv_insn_t ));
1129
+
1130
+ uint32_t insn = rv -> io .mem_ifetch (rv , rv -> PC );
1131
+ #if RV32_HAS (SYSTEM )
1132
+ if (!insn && need_retranslate ) {
1133
+ need_retranslate = false;
1134
+ goto retranslate ;
1135
+ }
1136
+ #endif
1137
+ assert (insn );
1138
+
1139
+ /* decode the instruction */
1140
+ if (!rv_decode (& ir , insn )) {
1141
+ rv -> compressed = is_compressed (insn );
1142
+ SET_CAUSE_AND_TVAL_THEN_TRAP (rv , ILLEGAL_INSN , insn );
1143
+ return ;
1144
+ }
1145
+
1146
+ ir .impl = dispatch_table [ir .opcode ];
1147
+ ir .pc = rv -> PC ;
1148
+ ir .next = NULL ;
1149
+ ir .impl (rv , & ir , rv -> csr_cycle , rv -> PC );
1150
+ return ;
1151
+ }
1152
+
1114
1153
#if RV32_HAS (SYSTEM )
1115
1154
static void __trap_handler (riscv_t * rv )
1116
1155
{
0 commit comments