dragoon  4383
 All Data Structures Functions Variables Typedefs Enumerations Enumerator Groups Pages
nrf_svc.h
1 /*
2  * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without modification,
6  * are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice, this
9  * list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form, except as embedded into a Nordic
12  * Semiconductor ASA integrated circuit in a product or a software update for
13  * such product, must reproduce the above copyright notice, this list of
14  * conditions and the following disclaimer in the documentation and/or other
15  * materials provided with the distribution.
16  *
17  * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
18  * contributors may be used to endorse or promote products derived from this
19  * software without specific prior written permission.
20  *
21  * 4. This software, with or without modification, must only be used with a
22  * Nordic Semiconductor ASA integrated circuit.
23  *
24  * 5. Any software provided in binary form under this license must not be reverse
25  * engineered, decompiled, modified and/or disassembled.
26  *
27  * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
28  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
29  * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
30  * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
31  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
33  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
36  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37  */
38 
39 #ifndef NRF_SVC__
40 #define NRF_SVC__
41 
42 #include "stdint.h"
43 
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47 
48 #ifdef SVCALL_AS_NORMAL_FUNCTION
49 #define SVCALL(number, return_type, signature) return_type signature
50 #else
51 
52 #ifndef SVCALL
53 #if defined (__CC_ARM)
54 #define SVCALL(number, return_type, signature) return_type __svc(number) signature
55 #elif defined (__GNUC__)
56 #ifdef __cplusplus
57 #define GCC_CAST_CPP (uint16_t)
58 #else
59 #define GCC_CAST_CPP
60 #endif
61 #define SVCALL(number, return_type, signature) \
62  _Pragma("GCC diagnostic push") \
63  _Pragma("GCC diagnostic ignored \"-Wreturn-type\"") \
64  __attribute__((naked)) \
65  __attribute__((unused)) \
66  static return_type signature \
67  { \
68  __asm( \
69  "svc %0\n" \
70  "bx r14" : : "I" (GCC_CAST_CPP number) : "r0" \
71  ); \
72  } \
73  _Pragma("GCC diagnostic pop")
74 
75 #elif defined (__ICCARM__)
76 #define PRAGMA(x) _Pragma(#x)
77 #define SVCALL(number, return_type, signature) \
78 PRAGMA(swi_number = (number)) \
79  __swi return_type signature;
80 #else
81 #define SVCALL(number, return_type, signature) return_type signature
82 #endif
83 #endif // SVCALL
84 
85 #endif // SVCALL_AS_NORMAL_FUNCTION
86 
87 #ifdef __cplusplus
88 }
89 #endif
90 #endif // NRF_SVC__