From: kub Date: Thu, 9 Jul 2020 06:40:35 +0000 (+0200) Subject: sh2, fix for interpreter crash if drc is compiled in too X-Git-Tag: v2.00~718 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b1ccc271095484c0356dde19b30bccdc103dd7f0;p=picodrive.git sh2, fix for interpreter crash if drc is compiled in too --- 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;