Skip to content

Commit 8fc5146

Browse files
authored
ogc: Cleanup and add memory clobbers to ISR operations (#104)
* ogc: Cleanup and add memory clobbers to ISR operations * ogc: Use do while 0 for blocks
1 parent 5cf144f commit 8fc5146

File tree

2 files changed

+55
-47
lines changed

2 files changed

+55
-47
lines changed

gc/ogc/machine/processor.h

Lines changed: 53 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -102,57 +102,65 @@
102102
{ __asm__ __volatile__ ("mtmsr %0" : "=&r" ((_msr_value)) : "0" ((_msr_value))); }
103103

104104
#define _CPU_ISR_Enable() \
105-
{ register u32 _val = 0; \
106-
__asm__ __volatile__ ( \
107-
"mfmsr %0\n" \
108-
"ori %0,%0,0x8000\n" \
109-
"mtmsr %0" \
110-
: "=&r" ((_val)) : "0" ((_val)) \
111-
); \
112-
}
105+
do { \
106+
register u32 _val = 0; \
107+
__asm__ __volatile__ ( \
108+
"mfmsr %0\n" \
109+
"ori %0,%0,0x8000\n" \
110+
"mtmsr %0" \
111+
: "=&r" ((_val)) : "0" ((_val)) \
112+
: : "memory" \
113+
); \
114+
} while (0)
113115

114116
#define _CPU_ISR_Disable( _isr_cookie ) \
115-
{ register u32 _disable_mask = 0; \
116-
_isr_cookie = 0; \
117-
__asm__ __volatile__ ( \
118-
"mfmsr %0\n" \
119-
"rlwinm %1,%0,0,17,15\n" \
120-
"mtmsr %1\n" \
121-
"extrwi %0,%0,1,16" \
122-
: "=&r" ((_isr_cookie)), "=&r" ((_disable_mask)) \
123-
: "0" ((_isr_cookie)), "1" ((_disable_mask)) \
124-
); \
125-
}
117+
do { \
118+
register u32 _disable_mask = 0; \
119+
_isr_cookie = 0; \
120+
__asm__ __volatile__ ( \
121+
"mfmsr %0\n" \
122+
"rlwinm %1,%0,0,17,15\n" \
123+
"mtmsr %1\n" \
124+
"extrwi %0,%0,1,16" \
125+
: "=&r" ((_isr_cookie)), "=&r" ((_disable_mask)) \
126+
: "0" ((_isr_cookie)), "1" ((_disable_mask)) \
127+
: "memory" \
128+
); \
129+
} while (0)
126130

127131
#define _CPU_ISR_Restore( _isr_cookie ) \
128-
{ register u32 _enable_mask = 0; \
129-
__asm__ __volatile__ ( \
130-
" cmpwi %0,0\n" \
131-
" beq 1f\n" \
132-
" mfmsr %1\n" \
133-
" ori %1,%1,0x8000\n" \
134-
" mtmsr %1\n" \
135-
"1:" \
136-
: "=r"((_isr_cookie)),"=&r" ((_enable_mask)) \
137-
: "0"((_isr_cookie)),"1" ((_enable_mask)) \
138-
); \
139-
}
132+
do { \
133+
register u32 _enable_mask = 0; \
134+
__asm__ __volatile__ ( \
135+
"cmpwi %0,0\n" \
136+
"beq 1f\n" \
137+
"mfmsr %1\n" \
138+
"ori %1,%1,0x8000\n" \
139+
"mtmsr %1\n" \
140+
"1:" \
141+
: "=r"((_isr_cookie)),"=&r" ((_enable_mask)) \
142+
: "0"((_isr_cookie)),"1" ((_enable_mask)) \
143+
: "memory" \
144+
); \
145+
} while (0)
140146

141147
#define _CPU_ISR_Flash( _isr_cookie ) \
142-
{ register u32 _flash_mask = 0; \
143-
__asm__ __volatile__ ( \
144-
" cmpwi %0,0\n" \
145-
" beq 1f\n" \
146-
" mfmsr %1\n" \
147-
" ori %1,%1,0x8000\n" \
148-
" mtmsr %1\n" \
149-
" rlwinm %1,%1,0,17,15\n" \
150-
" mtmsr %1\n" \
151-
"1:" \
152-
: "=r" ((_isr_cookie)), "=&r" ((_flash_mask)) \
153-
: "0" ((_isr_cookie)), "1" ((_flash_mask)) \
154-
); \
155-
}
148+
do { \
149+
register u32 _flash_mask = 0; \
150+
__asm__ __volatile__ ( \
151+
"cmpwi %0,0\n" \
152+
"beq 1f\n" \
153+
"mfmsr %1\n" \
154+
"ori %1,%1,0x8000\n" \
155+
"mtmsr %1\n" \
156+
"rlwinm %1,%1,0,17,15\n" \
157+
"mtmsr %1\n" \
158+
"1:" \
159+
: "=r" ((_isr_cookie)), "=&r" ((_flash_mask)) \
160+
: "0" ((_isr_cookie)), "1" ((_flash_mask)) \
161+
: "memory" \
162+
); \
163+
} while (0)
156164

157165
#define _CPU_FPR_Enable() \
158166
{ register u32 _val = 0; \

libogc/arqmgr.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ u32 ARQM_GetStackPointer(void)
136136
{
137137
u32 level,tmp;
138138

139-
_CPU_ISR_Disable(level)
139+
_CPU_ISR_Disable(level);
140140
tmp = __ARQMStackPointer[__ARQMStackLocation];
141141
_CPU_ISR_Restore(level);
142142

@@ -147,7 +147,7 @@ u32 ARQM_GetFreeSize(void)
147147
{
148148
u32 level,tmp;
149149

150-
_CPU_ISR_Disable(level)
150+
_CPU_ISR_Disable(level);
151151
tmp = __ARQMFreeBytes;
152152
_CPU_ISR_Restore(level);
153153

0 commit comments

Comments
 (0)