xref: /btstack/port/msp432p401lp-cc256x/ti/devices/msp432p4xx/driverlib/cpu.c (revision 5fd0122a3e19d95e11e1f3eb8a08a2b2acb2557e)
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