From b1ccc271095484c0356dde19b30bccdc103dd7f0 Mon Sep 17 00:00:00 2001 From: kub Date: Thu, 9 Jul 2020 08:40:35 +0200 Subject: [PATCH] sh2, fix for interpreter crash if drc is compiled in too --- cpu/sh2/compiler.c | 3 +++ cpu/sh2/compiler.h | 4 ++-- cpu/sh2/sh2.h | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cpu/sh2/compiler.c b/cpu/sh2/compiler.c index c8940432..085a6179 100644 --- a/cpu/sh2/compiler.c +++ b/cpu/sh2/compiler.c @@ -5392,7 +5392,10 @@ int sh2_execute_drc(SH2 *sh2c, int cycles) // others are usual SH2 flags sh2c->sr &= 0x3f3; sh2c->sr |= cycles << 12; + + sh2c->state |= SH2_IN_DRC; sh2_drc_entry(sh2c); + sh2c->state &= ~SH2_IN_DRC; // TODO: irq cycles ret_cycles = (int32_t)sh2c->sr >> 12; diff --git a/cpu/sh2/compiler.h b/cpu/sh2/compiler.h index 76b44552..9642492d 100644 --- a/cpu/sh2/compiler.h +++ b/cpu/sh2/compiler.h @@ -72,11 +72,11 @@ extern void REGPARM(1) (*sh2_drc_restore_sr)(SH2 *sh2); #define DRC_DECLARE_SR register long _sh2_sr asm(DRC_SR_REG) #endif #define DRC_SAVE_SR(sh2) \ - if (likely((sh2->state&(SH2_STATE_RUN|SH2_STATE_SLEEP)) == SH2_STATE_RUN)) \ + if (likely(sh2->state & SH2_IN_DRC)) \ sh2->sr = (s32)_sh2_sr // sh2_drc_save_sr(sh2) #define DRC_RESTORE_SR(sh2) \ - if (likely((sh2->state&(SH2_STATE_RUN|SH2_STATE_SLEEP)) == SH2_STATE_RUN)) \ + if (likely(sh2->state & SH2_IN_DRC)) \ _sh2_sr = (s32)sh2->sr // sh2_drc_restore_sr(sh2) #else diff --git a/cpu/sh2/sh2.h b/cpu/sh2/sh2.h index 4b0b3384..b9267d74 100644 --- a/cpu/sh2/sh2.h +++ b/cpu/sh2/sh2.h @@ -48,7 +48,8 @@ typedef struct SH2_ #define SH2_STATE_CPOLL (1 << 2) // polling comm regs #define SH2_STATE_VPOLL (1 << 3) // polling VDP #define SH2_STATE_RPOLL (1 << 4) // polling address in SDRAM -#define SH2_TIMER_RUN (1 << 8) // SOC WDT timer is running +#define SH2_TIMER_RUN (1 << 7) // SOC WDT timer is running +#define SH2_IN_DRC (1 << 8) // DRC in use unsigned int state; uint32_t poll_addr; int poll_cycles; -- 2.39.2