Skip to content

Commit b1fbd5b

Browse files
committed
Fix memory protection interrupt masking
Minor optimizations and clean up
1 parent afb9f60 commit b1fbd5b

3 files changed

Lines changed: 17 additions & 16 deletions

File tree

include/ogc/irq.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
irq.h -- Interrupt subsystem
44
5-
Copyright (C) 2004 - 2025
5+
Copyright (C) 2004 - 2026
66
Michael Wiedenbauer (shagkur)
77
Dave Murphy (WinterMute)
88
Extrems' Corner.org
@@ -72,7 +72,7 @@ distribution.
7272
#endif
7373
#define IRQ_MAX 32
7474

75-
#define IRQMASK(irq) (0x80000000u>>irq)
75+
#define IRQMASK(irq) (0x80000000u>>(irq))
7676

7777
#define IM_MEM0 IRQMASK(IRQ_MEM0)
7878
#define IM_MEM1 IRQMASK(IRQ_MEM1)

libogc/exi.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
exi.c -- EXI subsystem
44
5-
Copyright (C) 2004 - 2025
5+
Copyright (C) 2004 - 2026
66
Michael Wiedenbauer (shagkur)
77
Dave Murphy (WinterMute)
88
Extrems' Corner.org
@@ -130,9 +130,9 @@ static __inline__ void __exi_setinterrupts(s32 nChn,exibus_priv *exi)
130130
printf("__exi_setinterrupts(%d,%p)\n",nChn,exi);
131131
#endif
132132
if(nChn==EXI_CHANNEL_0) {
133-
__MaskIrq((IRQMASK(IRQ_EXI0_EXI)|IRQMASK(IRQ_EXI2_EXI)));
133+
__MaskIrq(IRQMASK(IRQ_EXI0_EXI)|IRQMASK(IRQ_EXI2_EXI));
134134
if(!(exi->flags&EXI_FLAG_LOCKED) && (exi->CallbackEXI || pexi->CallbackEXI))
135-
__UnmaskIrq((IRQMASK(IRQ_EXI0_EXI)|IRQMASK(IRQ_EXI2_EXI)));
135+
__UnmaskIrq(IRQMASK(IRQ_EXI0_EXI)|IRQMASK(IRQ_EXI2_EXI));
136136
} else if(nChn==EXI_CHANNEL_1) {
137137
__MaskIrq(IRQMASK(IRQ_EXI1_EXI));
138138
if(!(exi->flags&EXI_FLAG_LOCKED) && exi->CallbackEXI) __UnmaskIrq(IRQMASK(IRQ_EXI1_EXI));
@@ -227,7 +227,7 @@ static s32 __exi_attach(s32 nChn,EXICallback ext_cb)
227227
if(__exi_probe(nChn)==1) {
228228
__exi_clearirqs(nChn,1,0,0);
229229
exi->CallbackEXT = ext_cb;
230-
__UnmaskIrq(((IRQMASK(IRQ_EXI0_EXT))>>(nChn*3)));
230+
__UnmaskIrq(IRQMASK(IRQ_EXI0_EXT)>>(nChn*3));
231231
exi->flags |= EXI_FLAG_ATTACH;
232232
ret = 1;
233233
}
@@ -575,7 +575,7 @@ s32 EXI_Imm(s32 nChn,void *pData,u32 nLen,u32 nMode,EXICallback tc_cb)
575575
exi->CallbackTC = tc_cb;
576576
if(tc_cb) {
577577
__exi_clearirqs(nChn,0,1,0);
578-
__UnmaskIrq(IRQMASK((IRQ_EXI0_TC+(nChn*3))));
578+
__UnmaskIrq(IRQMASK(IRQ_EXI0_TC)>>(nChn*3));
579579
}
580580
exi->flags |= EXI_FLAG_IMM;
581581

@@ -632,7 +632,7 @@ s32 EXI_Dma(s32 nChn,void *pData,u32 nLen,u32 nMode,EXICallback tc_cb)
632632
exi->CallbackTC = tc_cb;
633633
if(tc_cb) {
634634
__exi_clearirqs(nChn,0,1,0);
635-
__UnmaskIrq((IRQMASK((IRQ_EXI0_TC+(nChn*3)))));
635+
__UnmaskIrq(IRQMASK(IRQ_EXI0_TC)>>(nChn*3));
636636
}
637637
exi->flags |= EXI_FLAG_DMA;
638638

@@ -923,7 +923,7 @@ s32 EXI_Detach(s32 nChn)
923923
if(exi->flags&EXI_FLAG_LOCKED && exi->lockeddev==EXI_DEVICE_0) ret = 0;
924924
else {
925925
exi->flags &= ~EXI_FLAG_ATTACH;
926-
__MaskIrq(((IRQMASK(IRQ_EXI0_EXI)|IRQMASK(IRQ_EXI0_EXT))>>(nChn*3)));
926+
__MaskIrq((IRQMASK(IRQ_EXI0_EXI)|IRQMASK(IRQ_EXI0_EXT))>>(nChn*3));
927927
}
928928
}
929929
_CPU_ISR_Restore(level);
@@ -1081,7 +1081,7 @@ void __ext_irq_handler(u32 nIrq,frame_context *pCtx)
10811081

10821082
exi = &eximap[chan];
10831083
exi->flags &= ~EXI_FLAG_ATTACH;
1084-
__MaskIrq(((IRQMASK(IRQ_EXI0_EXI)|IRQMASK(IRQ_EXI0_EXT))>>(chan*3)));
1084+
__MaskIrq((IRQMASK(IRQ_EXI0_EXI)|IRQMASK(IRQ_EXI0_EXT))>>(chan*3));
10851085

10861086
cb = exi->CallbackEXT;
10871087
#ifdef _EXI_DEBUG

libogc/system.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@ void __SYS_ReadROM(void *buf,u32 len,u32 offset);
135135

136136
static s32 __sram_sync(void);
137137
static s32 __sram_writecallback(s32 chn,s32 dev);
138-
static s32 __mem_onreset(s32 final);
139138

140139
extern void __lwp_thread_coreinit(void);
141140
extern void __lwp_sysinit(void);
@@ -223,6 +222,8 @@ static const u32 _dsp_initcode[] =
223222
0x02FF02FF,0x00000000,0x00000000,0x00000000
224223
};
225224

225+
static s32 __mem_onreset(s32 final);
226+
226227
static sys_resetinfo mem_resetinfo = {
227228
{},
228229
__mem_onreset,
@@ -283,7 +284,7 @@ static s32 __mem_onreset(s32 final)
283284
{
284285
if(final==TRUE) {
285286
_memReg[8] = 255;
286-
__UnmaskIrq(IM_MEM0|IM_MEM1|IM_MEM2|IM_MEM3);
287+
__MaskIrq(IM_MEM0|IM_MEM1|IM_MEM2|IM_MEM3);
287288
}
288289
return 1;
289290
}
@@ -452,7 +453,7 @@ static void __memprotect_init(void)
452453

453454
_CPU_ISR_Disable(level);
454455

455-
__MaskIrq((IM_MEM0|IM_MEM1|IM_MEM2|IM_MEM3));
456+
__MaskIrq(IM_MEM0|IM_MEM1|IM_MEM2|IM_MEM3);
456457

457458
_memReg[16] = 0;
458459
_memReg[8] = 255;
@@ -1427,16 +1428,16 @@ void SYS_ProtectRange(u32 chan,void *addr,u32 bytes,u32 cntrl)
14271428

14281429
_CPU_ISR_Disable(level);
14291430

1430-
__UnmaskIrq(IRQMASK(chan));
1431+
__MaskIrq(IRQMASK(IRQ_MEM0+chan));
14311432
_memReg[chan<<2] = _SHIFTR(pstart,10,16);
14321433
_memReg[(chan<<2)+1] = _SHIFTR(pend,10,16);
14331434

14341435
rcntrl = _memReg[8];
14351436
rcntrl = (rcntrl&~(_SHIFTL(3,(chan<<1),2)))|(_SHIFTL(cntrl,(chan<<1),2));
14361437
_memReg[8] = rcntrl;
14371438

1438-
if(cntrl==SYS_PROTECTRDWR)
1439-
__MaskIrq(IRQMASK(chan));
1439+
if(cntrl!=SYS_PROTECTRDWR)
1440+
__UnmaskIrq(IRQMASK(IRQ_MEM0+chan));
14401441

14411442
_CPU_ISR_Restore(level);
14421443
}

0 commit comments

Comments
 (0)