1*5fd0122aSMatthias Ringwald /* --COPYRIGHT--,BSD
2*5fd0122aSMatthias Ringwald * Copyright (c) 2017, Texas Instruments Incorporated
3*5fd0122aSMatthias Ringwald * All rights reserved.
4*5fd0122aSMatthias Ringwald *
5*5fd0122aSMatthias Ringwald * Redistribution and use in source and binary forms, with or without
6*5fd0122aSMatthias Ringwald * modification, are permitted provided that the following conditions
7*5fd0122aSMatthias Ringwald * are met:
8*5fd0122aSMatthias Ringwald *
9*5fd0122aSMatthias Ringwald * * Redistributions of source code must retain the above copyright
10*5fd0122aSMatthias Ringwald * notice, this list of conditions and the following disclaimer.
11*5fd0122aSMatthias Ringwald *
12*5fd0122aSMatthias Ringwald * * Redistributions in binary form must reproduce the above copyright
13*5fd0122aSMatthias Ringwald * notice, this list of conditions and the following disclaimer in the
14*5fd0122aSMatthias Ringwald * documentation and/or other materials provided with the distribution.
15*5fd0122aSMatthias Ringwald *
16*5fd0122aSMatthias Ringwald * * Neither the name of Texas Instruments Incorporated nor the names of
17*5fd0122aSMatthias Ringwald * its contributors may be used to endorse or promote products derived
18*5fd0122aSMatthias Ringwald * from this software without specific prior written permission.
19*5fd0122aSMatthias Ringwald *
20*5fd0122aSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21*5fd0122aSMatthias Ringwald * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22*5fd0122aSMatthias Ringwald * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23*5fd0122aSMatthias Ringwald * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24*5fd0122aSMatthias Ringwald * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*5fd0122aSMatthias Ringwald * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26*5fd0122aSMatthias Ringwald * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27*5fd0122aSMatthias Ringwald * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28*5fd0122aSMatthias Ringwald * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29*5fd0122aSMatthias Ringwald * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30*5fd0122aSMatthias Ringwald * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*5fd0122aSMatthias Ringwald * --/COPYRIGHT--*/
32*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/cpu.h>
33*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/inc/msp.h>
34*5fd0122aSMatthias Ringwald #include <stdint.h>
35*5fd0122aSMatthias Ringwald
36*5fd0122aSMatthias Ringwald //*****************************************************************************
37*5fd0122aSMatthias Ringwald //
38*5fd0122aSMatthias Ringwald // Wrapper function for the CPSID instruction. Returns the state of PRIMASK
39*5fd0122aSMatthias Ringwald // on entry.
40*5fd0122aSMatthias Ringwald //
41*5fd0122aSMatthias Ringwald //*****************************************************************************
42*5fd0122aSMatthias Ringwald #if defined(__GNUC__)
CPU_cpsid(void)43*5fd0122aSMatthias Ringwald uint32_t __attribute__((naked)) CPU_cpsid(void)
44*5fd0122aSMatthias Ringwald {
45*5fd0122aSMatthias Ringwald uint32_t ret;
46*5fd0122aSMatthias Ringwald
47*5fd0122aSMatthias Ringwald //
48*5fd0122aSMatthias Ringwald // Read PRIMASK and disable interrupts.
49*5fd0122aSMatthias Ringwald //
50*5fd0122aSMatthias Ringwald __asm(" mrs r0, PRIMASK\n"
51*5fd0122aSMatthias Ringwald " cpsid i\n"
52*5fd0122aSMatthias Ringwald " bx lr\n"
53*5fd0122aSMatthias Ringwald : "=r" (ret));
54*5fd0122aSMatthias Ringwald
55*5fd0122aSMatthias Ringwald //
56*5fd0122aSMatthias Ringwald // The return is handled in the inline assembly, but the compiler will
57*5fd0122aSMatthias Ringwald // still complain if there is not an explicit return here (despite the fact
58*5fd0122aSMatthias Ringwald // that this does not result in any code being produced because of the
59*5fd0122aSMatthias Ringwald // naked attribute).
60*5fd0122aSMatthias Ringwald //
61*5fd0122aSMatthias Ringwald return(ret);
62*5fd0122aSMatthias Ringwald }
63*5fd0122aSMatthias Ringwald #endif
64*5fd0122aSMatthias Ringwald #if defined(__ICCARM__)
CPU_cpsid(void)65*5fd0122aSMatthias Ringwald uint32_t CPU_cpsid(void)
66*5fd0122aSMatthias Ringwald {
67*5fd0122aSMatthias Ringwald //
68*5fd0122aSMatthias Ringwald // Read PRIMASK and disable interrupts.
69*5fd0122aSMatthias Ringwald //
70*5fd0122aSMatthias Ringwald __asm(" mrs r0, PRIMASK\n"
71*5fd0122aSMatthias Ringwald " cpsid i\n");
72*5fd0122aSMatthias Ringwald
73*5fd0122aSMatthias Ringwald //
74*5fd0122aSMatthias Ringwald // "Warning[Pe940]: missing return statement at end of non-void function"
75*5fd0122aSMatthias Ringwald // is suppressed here to avoid putting a "bx lr" in the inline assembly
76*5fd0122aSMatthias Ringwald // above and a superfluous return statement here.
77*5fd0122aSMatthias Ringwald //
78*5fd0122aSMatthias Ringwald #pragma diag_suppress=Pe940
79*5fd0122aSMatthias Ringwald }
80*5fd0122aSMatthias Ringwald #pragma diag_default=Pe940
81*5fd0122aSMatthias Ringwald #endif
82*5fd0122aSMatthias Ringwald #if defined(__CC_ARM)
CPU_cpsid(void)83*5fd0122aSMatthias Ringwald __asm uint32_t CPU_cpsid(void)
84*5fd0122aSMatthias Ringwald {
85*5fd0122aSMatthias Ringwald //
86*5fd0122aSMatthias Ringwald // Read PRIMASK and disable interrupts.
87*5fd0122aSMatthias Ringwald //
88*5fd0122aSMatthias Ringwald mrs r0, PRIMASK;
89*5fd0122aSMatthias Ringwald cpsid i;
90*5fd0122aSMatthias Ringwald bx lr
91*5fd0122aSMatthias Ringwald }
92*5fd0122aSMatthias Ringwald #endif
93*5fd0122aSMatthias Ringwald #if defined(__TI_ARM__)
CPU_cpsid(void)94*5fd0122aSMatthias Ringwald uint32_t CPU_cpsid(void)
95*5fd0122aSMatthias Ringwald {
96*5fd0122aSMatthias Ringwald //
97*5fd0122aSMatthias Ringwald // Read PRIMASK and disable interrupts.
98*5fd0122aSMatthias Ringwald //
99*5fd0122aSMatthias Ringwald __asm(" mrs r0, PRIMASK\n"
100*5fd0122aSMatthias Ringwald " cpsid i\n"
101*5fd0122aSMatthias Ringwald " bx lr\n");
102*5fd0122aSMatthias Ringwald
103*5fd0122aSMatthias Ringwald //
104*5fd0122aSMatthias Ringwald // The following keeps the compiler happy, because it wants to see a
105*5fd0122aSMatthias Ringwald // return value from this function. It will generate code to return
106*5fd0122aSMatthias Ringwald // a zero. However, the real return is the "bx lr" above, so the
107*5fd0122aSMatthias Ringwald // return(0) is never executed and the function returns with the value
108*5fd0122aSMatthias Ringwald // you expect in R0.
109*5fd0122aSMatthias Ringwald //
110*5fd0122aSMatthias Ringwald return(0);
111*5fd0122aSMatthias Ringwald }
112*5fd0122aSMatthias Ringwald #endif
113*5fd0122aSMatthias Ringwald
114*5fd0122aSMatthias Ringwald //*****************************************************************************
115*5fd0122aSMatthias Ringwald //
116*5fd0122aSMatthias Ringwald // Wrapper function returning the state of PRIMASK (indicating whether
117*5fd0122aSMatthias Ringwald // interrupts are enabled or disabled).
118*5fd0122aSMatthias Ringwald //
119*5fd0122aSMatthias Ringwald //*****************************************************************************
120*5fd0122aSMatthias Ringwald #if defined(__GNUC__)
CPU_primask(void)121*5fd0122aSMatthias Ringwald uint32_t __attribute__((naked)) CPU_primask(void)
122*5fd0122aSMatthias Ringwald {
123*5fd0122aSMatthias Ringwald uint32_t ret;
124*5fd0122aSMatthias Ringwald
125*5fd0122aSMatthias Ringwald //
126*5fd0122aSMatthias Ringwald // Read PRIMASK and disable interrupts.
127*5fd0122aSMatthias Ringwald //
128*5fd0122aSMatthias Ringwald __asm(" mrs r0, PRIMASK\n"
129*5fd0122aSMatthias Ringwald " bx lr\n"
130*5fd0122aSMatthias Ringwald : "=r" (ret));
131*5fd0122aSMatthias Ringwald
132*5fd0122aSMatthias Ringwald //
133*5fd0122aSMatthias Ringwald // The return is handled in the inline assembly, but the compiler will
134*5fd0122aSMatthias Ringwald // still complain if there is not an explicit return here (despite the fact
135*5fd0122aSMatthias Ringwald // that this does not result in any code being produced because of the
136*5fd0122aSMatthias Ringwald // naked attribute).
137*5fd0122aSMatthias Ringwald //
138*5fd0122aSMatthias Ringwald return(ret);
139*5fd0122aSMatthias Ringwald }
140*5fd0122aSMatthias Ringwald #endif
141*5fd0122aSMatthias Ringwald #if defined(__ICCARM__)
CPU_primask(void)142*5fd0122aSMatthias Ringwald uint32_t CPU_primask(void)
143*5fd0122aSMatthias Ringwald {
144*5fd0122aSMatthias Ringwald //
145*5fd0122aSMatthias Ringwald // Read PRIMASK and disable interrupts.
146*5fd0122aSMatthias Ringwald //
147*5fd0122aSMatthias Ringwald __asm(" mrs r0, PRIMASK\n");
148*5fd0122aSMatthias Ringwald
149*5fd0122aSMatthias Ringwald //
150*5fd0122aSMatthias Ringwald // "Warning[Pe940]: missing return statement at end of non-void function"
151*5fd0122aSMatthias Ringwald // is suppressed here to avoid putting a "bx lr" in the inline assembly
152*5fd0122aSMatthias Ringwald // above and a superfluous return statement here.
153*5fd0122aSMatthias Ringwald //
154*5fd0122aSMatthias Ringwald #pragma diag_suppress=Pe940
155*5fd0122aSMatthias Ringwald }
156*5fd0122aSMatthias Ringwald #pragma diag_default=Pe940
157*5fd0122aSMatthias Ringwald #endif
158*5fd0122aSMatthias Ringwald #if defined(__CC_ARM)
CPU_primask(void)159*5fd0122aSMatthias Ringwald __asm uint32_t CPU_primask(void)
160*5fd0122aSMatthias Ringwald {
161*5fd0122aSMatthias Ringwald //
162*5fd0122aSMatthias Ringwald // Read PRIMASK and disable interrupts.
163*5fd0122aSMatthias Ringwald //
164*5fd0122aSMatthias Ringwald mrs r0, PRIMASK;
165*5fd0122aSMatthias Ringwald bx lr
166*5fd0122aSMatthias Ringwald }
167*5fd0122aSMatthias Ringwald #endif
168*5fd0122aSMatthias Ringwald #if defined(__TI_ARM__)
CPU_primask(void)169*5fd0122aSMatthias Ringwald uint32_t CPU_primask(void)
170*5fd0122aSMatthias Ringwald {
171*5fd0122aSMatthias Ringwald //
172*5fd0122aSMatthias Ringwald // Read PRIMASK and disable interrupts.
173*5fd0122aSMatthias Ringwald //
174*5fd0122aSMatthias Ringwald __asm(" mrs r0, PRIMASK\n"
175*5fd0122aSMatthias Ringwald " bx lr\n");
176*5fd0122aSMatthias Ringwald
177*5fd0122aSMatthias Ringwald //
178*5fd0122aSMatthias Ringwald // The following keeps the compiler happy, because it wants to see a
179*5fd0122aSMatthias Ringwald // return value from this function. It will generate code to return
180*5fd0122aSMatthias Ringwald // a zero. However, the real return is the "bx lr" above, so the
181*5fd0122aSMatthias Ringwald // return(0) is never executed and the function returns with the value
182*5fd0122aSMatthias Ringwald // you expect in R0.
183*5fd0122aSMatthias Ringwald //
184*5fd0122aSMatthias Ringwald return(0);
185*5fd0122aSMatthias Ringwald }
186*5fd0122aSMatthias Ringwald #endif
187*5fd0122aSMatthias Ringwald
188*5fd0122aSMatthias Ringwald //*****************************************************************************
189*5fd0122aSMatthias Ringwald //
190*5fd0122aSMatthias Ringwald // Wrapper function for the CPSIE instruction. Returns the state of PRIMASK
191*5fd0122aSMatthias Ringwald // on entry.
192*5fd0122aSMatthias Ringwald //
193*5fd0122aSMatthias Ringwald //*****************************************************************************
194*5fd0122aSMatthias Ringwald #if defined(__GNUC__)
CPU_cpsie(void)195*5fd0122aSMatthias Ringwald uint32_t __attribute__((naked)) CPU_cpsie(void)
196*5fd0122aSMatthias Ringwald {
197*5fd0122aSMatthias Ringwald uint32_t ret;
198*5fd0122aSMatthias Ringwald
199*5fd0122aSMatthias Ringwald //
200*5fd0122aSMatthias Ringwald // Read PRIMASK and enable interrupts.
201*5fd0122aSMatthias Ringwald //
202*5fd0122aSMatthias Ringwald __asm(" mrs r0, PRIMASK\n"
203*5fd0122aSMatthias Ringwald " cpsie i\n"
204*5fd0122aSMatthias Ringwald " bx lr\n"
205*5fd0122aSMatthias Ringwald : "=r" (ret));
206*5fd0122aSMatthias Ringwald
207*5fd0122aSMatthias Ringwald //
208*5fd0122aSMatthias Ringwald // The return is handled in the inline assembly, but the compiler will
209*5fd0122aSMatthias Ringwald // still complain if there is not an explicit return here (despite the fact
210*5fd0122aSMatthias Ringwald // that this does not result in any code being produced because of the
211*5fd0122aSMatthias Ringwald // naked attribute).
212*5fd0122aSMatthias Ringwald //
213*5fd0122aSMatthias Ringwald return(ret);
214*5fd0122aSMatthias Ringwald }
215*5fd0122aSMatthias Ringwald #endif
216*5fd0122aSMatthias Ringwald #if defined(__ICCARM__)
CPU_cpsie(void)217*5fd0122aSMatthias Ringwald uint32_t CPU_cpsie(void)
218*5fd0122aSMatthias Ringwald {
219*5fd0122aSMatthias Ringwald //
220*5fd0122aSMatthias Ringwald // Read PRIMASK and enable interrupts.
221*5fd0122aSMatthias Ringwald //
222*5fd0122aSMatthias Ringwald __asm(" mrs r0, PRIMASK\n"
223*5fd0122aSMatthias Ringwald " cpsie i\n");
224*5fd0122aSMatthias Ringwald
225*5fd0122aSMatthias Ringwald //
226*5fd0122aSMatthias Ringwald // "Warning[Pe940]: missing return statement at end of non-void function"
227*5fd0122aSMatthias Ringwald // is suppressed here to avoid putting a "bx lr" in the inline assembly
228*5fd0122aSMatthias Ringwald // above and a superfluous return statement here.
229*5fd0122aSMatthias Ringwald //
230*5fd0122aSMatthias Ringwald #pragma diag_suppress=Pe940
231*5fd0122aSMatthias Ringwald }
232*5fd0122aSMatthias Ringwald #pragma diag_default=Pe940
233*5fd0122aSMatthias Ringwald #endif
234*5fd0122aSMatthias Ringwald #if defined(__CC_ARM)
CPU_cpsie(void)235*5fd0122aSMatthias Ringwald __asm uint32_t CPU_cpsie(void)
236*5fd0122aSMatthias Ringwald {
237*5fd0122aSMatthias Ringwald //
238*5fd0122aSMatthias Ringwald // Read PRIMASK and enable interrupts.
239*5fd0122aSMatthias Ringwald //
240*5fd0122aSMatthias Ringwald mrs r0, PRIMASK;
241*5fd0122aSMatthias Ringwald cpsie i;
242*5fd0122aSMatthias Ringwald bx lr
243*5fd0122aSMatthias Ringwald }
244*5fd0122aSMatthias Ringwald #endif
245*5fd0122aSMatthias Ringwald #if defined(__TI_ARM__)
CPU_cpsie(void)246*5fd0122aSMatthias Ringwald uint32_t CPU_cpsie(void)
247*5fd0122aSMatthias Ringwald {
248*5fd0122aSMatthias Ringwald //
249*5fd0122aSMatthias Ringwald // Read PRIMASK and enable interrupts.
250*5fd0122aSMatthias Ringwald //
251*5fd0122aSMatthias Ringwald __asm(" mrs r0, PRIMASK\n"
252*5fd0122aSMatthias Ringwald " cpsie i\n"
253*5fd0122aSMatthias Ringwald " bx lr\n");
254*5fd0122aSMatthias Ringwald
255*5fd0122aSMatthias Ringwald //
256*5fd0122aSMatthias Ringwald // The following keeps the compiler happy, because it wants to see a
257*5fd0122aSMatthias Ringwald // return value from this function. It will generate code to return
258*5fd0122aSMatthias Ringwald // a zero. However, the real return is the "bx lr" above, so the
259*5fd0122aSMatthias Ringwald // return(0) is never executed and the function returns with the value
260*5fd0122aSMatthias Ringwald // you expect in R0.
261*5fd0122aSMatthias Ringwald //
262*5fd0122aSMatthias Ringwald return(0);
263*5fd0122aSMatthias Ringwald }
264*5fd0122aSMatthias Ringwald #endif
265*5fd0122aSMatthias Ringwald
266*5fd0122aSMatthias Ringwald //*****************************************************************************
267*5fd0122aSMatthias Ringwald //
268*5fd0122aSMatthias Ringwald // Wrapper function for the CPUWFI instruction.
269*5fd0122aSMatthias Ringwald //
270*5fd0122aSMatthias Ringwald //*****************************************************************************
271*5fd0122aSMatthias Ringwald #if defined(__GNUC__)
CPU_wfi(void)272*5fd0122aSMatthias Ringwald void __attribute__((naked)) CPU_wfi(void)
273*5fd0122aSMatthias Ringwald {
274*5fd0122aSMatthias Ringwald //
275*5fd0122aSMatthias Ringwald // Wait for the next interrupt.
276*5fd0122aSMatthias Ringwald //
277*5fd0122aSMatthias Ringwald __asm(" wfi\n"
278*5fd0122aSMatthias Ringwald " bx lr\n");
279*5fd0122aSMatthias Ringwald }
280*5fd0122aSMatthias Ringwald #endif
281*5fd0122aSMatthias Ringwald #if defined(__ICCARM__)
CPU_wfi(void)282*5fd0122aSMatthias Ringwald void CPU_wfi(void)
283*5fd0122aSMatthias Ringwald {
284*5fd0122aSMatthias Ringwald //
285*5fd0122aSMatthias Ringwald // Wait for the next interrupt.
286*5fd0122aSMatthias Ringwald //
287*5fd0122aSMatthias Ringwald __asm(" wfi\n");
288*5fd0122aSMatthias Ringwald }
289*5fd0122aSMatthias Ringwald #endif
290*5fd0122aSMatthias Ringwald #if defined(__CC_ARM)
CPU_wfi(void)291*5fd0122aSMatthias Ringwald __asm void CPU_wfi(void)
292*5fd0122aSMatthias Ringwald {
293*5fd0122aSMatthias Ringwald //
294*5fd0122aSMatthias Ringwald // Wait for the next interrupt.
295*5fd0122aSMatthias Ringwald //
296*5fd0122aSMatthias Ringwald wfi;
297*5fd0122aSMatthias Ringwald bx lr
298*5fd0122aSMatthias Ringwald }
299*5fd0122aSMatthias Ringwald #endif
300*5fd0122aSMatthias Ringwald #if defined(__TI_ARM__)
CPU_wfi(void)301*5fd0122aSMatthias Ringwald void CPU_wfi(void)
302*5fd0122aSMatthias Ringwald {
303*5fd0122aSMatthias Ringwald //
304*5fd0122aSMatthias Ringwald // Wait for the next interrupt.
305*5fd0122aSMatthias Ringwald //
306*5fd0122aSMatthias Ringwald __asm(" wfi\n");
307*5fd0122aSMatthias Ringwald }
308*5fd0122aSMatthias Ringwald #endif
309*5fd0122aSMatthias Ringwald
310*5fd0122aSMatthias Ringwald //*****************************************************************************
311*5fd0122aSMatthias Ringwald //
312*5fd0122aSMatthias Ringwald // Wrapper function for writing the BASEPRI register.
313*5fd0122aSMatthias Ringwald //
314*5fd0122aSMatthias Ringwald //*****************************************************************************
315*5fd0122aSMatthias Ringwald #if defined(__GNUC__)
CPU_basepriSet(uint32_t newBasepri)316*5fd0122aSMatthias Ringwald void __attribute__((naked)) CPU_basepriSet(uint32_t newBasepri)
317*5fd0122aSMatthias Ringwald {
318*5fd0122aSMatthias Ringwald //
319*5fd0122aSMatthias Ringwald // Set the BASEPRI register
320*5fd0122aSMatthias Ringwald //
321*5fd0122aSMatthias Ringwald __asm(" msr BASEPRI, r0\n"
322*5fd0122aSMatthias Ringwald " bx lr\n");
323*5fd0122aSMatthias Ringwald }
324*5fd0122aSMatthias Ringwald #endif
325*5fd0122aSMatthias Ringwald #if defined(__ICCARM__)
CPU_basepriSet(uint32_t newBasepri)326*5fd0122aSMatthias Ringwald void CPU_basepriSet(uint32_t newBasepri)
327*5fd0122aSMatthias Ringwald {
328*5fd0122aSMatthias Ringwald //
329*5fd0122aSMatthias Ringwald // Set the BASEPRI register
330*5fd0122aSMatthias Ringwald //
331*5fd0122aSMatthias Ringwald __asm(" msr BASEPRI, r0\n");
332*5fd0122aSMatthias Ringwald }
333*5fd0122aSMatthias Ringwald #endif
334*5fd0122aSMatthias Ringwald #if defined(__CC_ARM)
CPU_basepriSet(uint32_t newBasepri)335*5fd0122aSMatthias Ringwald __asm void CPU_basepriSet(uint32_t newBasepri)
336*5fd0122aSMatthias Ringwald {
337*5fd0122aSMatthias Ringwald //
338*5fd0122aSMatthias Ringwald // Set the BASEPRI register
339*5fd0122aSMatthias Ringwald //
340*5fd0122aSMatthias Ringwald msr BASEPRI, r0;
341*5fd0122aSMatthias Ringwald bx lr
342*5fd0122aSMatthias Ringwald }
343*5fd0122aSMatthias Ringwald #endif
344*5fd0122aSMatthias Ringwald #if defined(__TI_ARM__)
CPU_basepriSet(uint32_t newBasepri)345*5fd0122aSMatthias Ringwald void CPU_basepriSet(uint32_t newBasepri)
346*5fd0122aSMatthias Ringwald {
347*5fd0122aSMatthias Ringwald //
348*5fd0122aSMatthias Ringwald // Set the BASEPRI register
349*5fd0122aSMatthias Ringwald //
350*5fd0122aSMatthias Ringwald __asm(" msr BASEPRI, r0\n");
351*5fd0122aSMatthias Ringwald }
352*5fd0122aSMatthias Ringwald #endif
353*5fd0122aSMatthias Ringwald
354*5fd0122aSMatthias Ringwald //*****************************************************************************
355*5fd0122aSMatthias Ringwald //
356*5fd0122aSMatthias Ringwald // Wrapper function for reading the BASEPRI register.
357*5fd0122aSMatthias Ringwald //
358*5fd0122aSMatthias Ringwald //*****************************************************************************
359*5fd0122aSMatthias Ringwald #if defined(__GNUC__)
CPU_basepriGet(void)360*5fd0122aSMatthias Ringwald uint32_t __attribute__((naked)) CPU_basepriGet(void)
361*5fd0122aSMatthias Ringwald {
362*5fd0122aSMatthias Ringwald uint32_t ret;
363*5fd0122aSMatthias Ringwald
364*5fd0122aSMatthias Ringwald //
365*5fd0122aSMatthias Ringwald // Read BASEPRI
366*5fd0122aSMatthias Ringwald //
367*5fd0122aSMatthias Ringwald __asm(" mrs r0, BASEPRI\n"
368*5fd0122aSMatthias Ringwald " bx lr\n"
369*5fd0122aSMatthias Ringwald : "=r" (ret));
370*5fd0122aSMatthias Ringwald
371*5fd0122aSMatthias Ringwald //
372*5fd0122aSMatthias Ringwald // The return is handled in the inline assembly, but the compiler will
373*5fd0122aSMatthias Ringwald // still complain if there is not an explicit return here (despite the fact
374*5fd0122aSMatthias Ringwald // that this does not result in any code being produced because of the
375*5fd0122aSMatthias Ringwald // naked attribute).
376*5fd0122aSMatthias Ringwald //
377*5fd0122aSMatthias Ringwald return(ret);
378*5fd0122aSMatthias Ringwald }
379*5fd0122aSMatthias Ringwald #endif
380*5fd0122aSMatthias Ringwald #if defined(__ICCARM__)
CPU_basepriGet(void)381*5fd0122aSMatthias Ringwald uint32_t CPU_basepriGet(void)
382*5fd0122aSMatthias Ringwald {
383*5fd0122aSMatthias Ringwald //
384*5fd0122aSMatthias Ringwald // Read BASEPRI
385*5fd0122aSMatthias Ringwald //
386*5fd0122aSMatthias Ringwald __asm(" mrs r0, BASEPRI\n");
387*5fd0122aSMatthias Ringwald
388*5fd0122aSMatthias Ringwald //
389*5fd0122aSMatthias Ringwald // "Warning[Pe940]: missing return statement at end of non-void function"
390*5fd0122aSMatthias Ringwald // is suppressed here to avoid putting a "bx lr" in the inline assembly
391*5fd0122aSMatthias Ringwald // above and a superfluous return statement here.
392*5fd0122aSMatthias Ringwald //
393*5fd0122aSMatthias Ringwald #pragma diag_suppress=Pe940
394*5fd0122aSMatthias Ringwald }
395*5fd0122aSMatthias Ringwald #pragma diag_default=Pe940
396*5fd0122aSMatthias Ringwald #endif
397*5fd0122aSMatthias Ringwald #if defined(__CC_ARM)
CPU_basepriGet(void)398*5fd0122aSMatthias Ringwald __asm uint32_t CPU_basepriGet(void)
399*5fd0122aSMatthias Ringwald {
400*5fd0122aSMatthias Ringwald //
401*5fd0122aSMatthias Ringwald // Read BASEPRI
402*5fd0122aSMatthias Ringwald //
403*5fd0122aSMatthias Ringwald mrs r0, BASEPRI;
404*5fd0122aSMatthias Ringwald bx lr
405*5fd0122aSMatthias Ringwald }
406*5fd0122aSMatthias Ringwald #endif
407*5fd0122aSMatthias Ringwald #if defined(__TI_ARM__)
CPU_basepriGet(void)408*5fd0122aSMatthias Ringwald uint32_t CPU_basepriGet(void)
409*5fd0122aSMatthias Ringwald {
410*5fd0122aSMatthias Ringwald //
411*5fd0122aSMatthias Ringwald // Read BASEPRI
412*5fd0122aSMatthias Ringwald //
413*5fd0122aSMatthias Ringwald __asm(" mrs r0, BASEPRI\n"
414*5fd0122aSMatthias Ringwald " bx lr\n");
415*5fd0122aSMatthias Ringwald
416*5fd0122aSMatthias Ringwald //
417*5fd0122aSMatthias Ringwald // The following keeps the compiler happy, because it wants to see a
418*5fd0122aSMatthias Ringwald // return value from this function. It will generate code to return
419*5fd0122aSMatthias Ringwald // a zero. However, the real return is the "bx lr" above, so the
420*5fd0122aSMatthias Ringwald // return(0) is never executed and the function returns with the value
421*5fd0122aSMatthias Ringwald // you expect in R0.
422*5fd0122aSMatthias Ringwald //
423*5fd0122aSMatthias Ringwald return(0);
424*5fd0122aSMatthias Ringwald }
425*5fd0122aSMatthias Ringwald #endif
426