• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ----------------------------------------------------------------------------
2  * Copyright (c) Huawei Technologies Co., Ltd. 2022-2023. All rights reserved.
3  * Description : Intrinsics HeadFile
4  * Author: Huawei LiteOS Team
5  * Create : 2022-12-20
6  * Redistribution and use in source and binary forms, with or without modification,
7  * are permitted provided that the following conditions are met:
8  * 1. Redistributions of source code must retain the above copyright notice, this list of
9  * conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright notice, this list
11  * of conditions and the following disclaimer in the documentation and/or other materials
12  * provided with the distribution.
13  * 3. Neither the name of the copyright holder nor the names of its contributors may be used
14  * to endorse or promote products derived from this software without specific prior written
15  * permission.
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
20  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  * --------------------------------------------------------------------------- */
28 
29 #ifndef _ARCH_INTRINSICS_H
30 #define _ARCH_INTRINSICS_H
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif /* __cplusplus */
35 
36 #define PUSH_GPR_REG    __attribute__((context_push("gpr")))
37 #define POP_GPR_REG     __attribute__((context_pop("gpr")))
38 #define MRET            __attribute__((mret))
39 #define NORELAX         __attribute__((norelaxvar))
40 
41 #define RISCV_GET_TASK_STACK()   __builtin_get_context_base()
42 #define RISCV_CHG_TASK_STACK(a)  __builtin_chg_context_base(a)
43 
44 #define RISCV_ADDI_FROM_GP       __builtin_linx_addi_from_gp
45 #define RISCV_ADDI_FROM_RA       __builtin_linx_addi_from_ra
46 #define RISCV_ADDI_FROM_SP       __builtin_linx_addi_from_sp
47 #define RISCV_ADDI_TO_GP         __builtin_linx_addi_to_gp
48 #define RISCV_ADDI_TO_RA         __builtin_linx_addi_to_ra
49 #define RISCV_ADDI_TO_SP         __builtin_linx_addi_to_sp
50 
51 #define RISCV_ANDI               __builtin_linx_andi
52 
53 #define RISCV_CSRRWI_MSTATUS(a)  __builtin_linx_csrrwi(0b001100000000, a)
54 #define RISCV_CSRRWI_MTVEC(a)    __builtin_linx_csrrwi(0b001100000101, a)
55 
56 #define RISCV_CSRRC_MSCRATCH(a)  __builtin_linx_csrrc(0b001101000000, a)
57 #define RISCV_CSRRC_MEPC(a)      __builtin_linx_csrrc(0b001101000001, a)
58 #define RISCV_CSRRC_MCAUSE(a)    __builtin_linx_csrrc(0b001101000010, a)
59 #define RISCV_CSRRC_MTVAL(a)     __builtin_linx_csrrc(0b001101000011, a)
60 #define RISCV_CSRRC_MSTATUS(a)   __builtin_linx_csrrc(0b001100000000, a)
61 #define RISCV_CSRRC_MIE(a)       __builtin_linx_csrrc(0b001100000100, a)
62 #define RISCV_CSRRC_MTVEC(a)     __builtin_linx_csrrc(0b001100000101, a)
63 
64 #define RISCV_CSRRCI_MSCRATCH(a) __builtin_linx_csrrci(0b001101000000, a)
65 #define RISCV_CSRRCI_MEPC(a)     __builtin_linx_csrrci(0b001101000001, a)
66 #define RISCV_CSRRCI_MCAUSE(a)   __builtin_linx_csrrci(0b001101000010, a)
67 #define RISCV_CSRRCI_MTVAL(a)    __builtin_linx_csrrci(0b001101000011, a)
68 #define RISCV_CSRRCI_MSTATUS(a)  __builtin_linx_csrrci(0b001100000000, a)
69 #define RISCV_CSRRCI_MIE(a)      __builtin_linx_csrrci(0b001100000100, a)
70 #define RISCV_CSRRCI_MTVEC(a)    __builtin_linx_csrrci(0b001100000101, a)
71 
72 #define RISCV_CSRRS_MSCRATCH(a)  __builtin_linx_csrrs(0b001101000000, a)
73 #define RISCV_CSRRS_MEPC(a)      __builtin_linx_csrrs(0b001101000001, a)
74 #define RISCV_CSRRS_MCAUSE(a)    __builtin_linx_csrrs(0b001101000010, a)
75 #define RISCV_CSRRS_MTVAL(a)     __builtin_linx_csrrs(0b001101000011, a)
76 #define RISCV_CSRRS_MSTATUS(a)   __builtin_linx_csrrs(0b001100000000, a)
77 #define RISCV_CSRRS_MIE(a)       __builtin_linx_csrrs(0b001100000100, a)
78 #define RISCV_CSRRS_MTVEC(a)     __builtin_linx_csrrs(0b001100000101, a)
79 
80 #define RISCV_CSRRSI_MSCRATCH(a) __builtin_linx_csrrsi(0b001101000000, a)
81 #define RISCV_CSRRSI_MEPC(a)     __builtin_linx_csrrsi(0b001101000001, a)
82 #define RISCV_CSRRSI_MCAUSE(a)   __builtin_linx_csrrsi(0b001101000010, a)
83 #define RISCV_CSRRSI_MTVAL(a)    __builtin_linx_csrrsi(0b001101000011, a)
84 #define RISCV_CSRRSI_MSTATUS(a)  __builtin_linx_csrrsi(0b001100000000, a)
85 #define RISCV_CSRRSI_MIE(a)      __builtin_linx_csrrsi(0b001100000100, a)
86 #define RISCV_CSRRSI_MTVEC(a)    __builtin_linx_csrrsi(0b001100000101, a)
87 
88 #define RISCV_CSRRW_MSCRATCH(a)  __builtin_linx_csrrw(0b001101000000, a)
89 
90 #define RISCV_CSRRW_MEPC(a)      __builtin_linx_csrrw(0b001101000001, a)
91 #define RISCV_CSRRW_MEPC_MEPC_0(a) \
92     (unsigned int)(RISCV_CSRRW_MEPC((RISCV_CSRRS_MEPC(0) & ~1) | (a << 0)) & 1) >> 0
93 #define RISCV_CSRRW_MEPC_MEPC_MEPC(a) \
94     (unsigned int)(RISCV_CSRRW_MEPC((RISCV_CSRRS_MEPC(0) & ~4294967294) | (a << 1)) & 4294967294) >> 1
95 
96 #define RISCV_CSRRW_MCAUSE(a)    __builtin_linx_csrrw(0b001101000010, a)
97 #define RISCV_CSRRW_MCAUSE_MCAUSE_EXCCODE(a) \
98     (unsigned int)(RISCV_CSRRW_MCAUSE((RISCV_CSRRS_MCAUSE(0) & ~4095) | (a << 0)) & 4095) >> 0
99 #define RISCV_CSRRW_MCAUSE_MCAUSE_UOPCNT3TO0(a) \
100     (unsigned int)(RISCV_CSRRW_MCAUSE((RISCV_CSRRS_MCAUSE(0) & ~61440) | (a << 12)) & 61440) >> 12
101 #define RISCV_CSRRW_MCAUSE_MCAUSE_MPIL(a) \
102     (unsigned int)(RISCV_CSRRW_MCAUSE((RISCV_CSRRS_MCAUSE(0) & ~16711680) | (a << 16)) & 16711680) >> 16
103 #define RISCV_CSRRW_MCAUSE_MCAUSE_UOPCNT4(a) \
104     (unsigned int)(RISCV_CSRRW_MCAUSE((RISCV_CSRRS_MCAUSE(0) & ~16777216) | (a << 24)) & 16777216) >> 24
105 #define RISCV_CSRRW_MCAUSE_MCAUSE_RESERVED0(a) \
106     (unsigned int)(RISCV_CSRRW_MCAUSE((RISCV_CSRRS_MCAUSE(0) & ~100663296) | (a << 25)) & 100663296) >> 25
107 #define RISCV_CSRRW_MCAUSE_MCAUSE_MPIE(a) \
108     (unsigned int)(RISCV_CSRRW_MCAUSE((RISCV_CSRRS_MCAUSE(0) & ~134217728) | (a << 27)) & 134217728) >> 27
109 #define RISCV_CSRRW_MCAUSE_MCAUSE_MPP(a) \
110     (unsigned int)(RISCV_CSRRW_MCAUSE((RISCV_CSRRS_MCAUSE(0) & ~805306368) | (a << 28)) & 805306368) >> 28
111 #define RISCV_CSRRW_MCAUSE_MCAUSE_MINHV(a) \
112     (unsigned int)(RISCV_CSRRW_MCAUSE((RISCV_CSRRS_MCAUSE(0) & ~1073741824) | (a << 30)) & 1073741824) >> 30
113 #define RISCV_CSRRW_MCAUSE_MCAUSE_INTERRUPT(a) \
114     (unsigned int)(RISCV_CSRRW_MCAUSE((RISCV_CSRRS_MCAUSE(0) & ~2147483648) | (a << 31)) & 2147483648) >> 31
115 
116 #define RISCV_CSRRW_MTVAL(a)     __builtin_linx_csrrw(0b001101000011, a)
117 
118 #define RISCV_CSRRW_MSTATUS(a)   __builtin_linx_csrrw(0b001100000000, a)
119 #define RISCV_CSRRW_MSTATUS_MSTATUS_UIE(a) \
120     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~1) | (a << 0)) & 1) >> 0
121 #define RISCV_CSRRW_MSTATUS_MSTATUS_SIE(a) \
122     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~2) | (a << 1)) & 2) >> 1
123 #define RISCV_CSRRW_MSTATUS_MSTATUS_RESERVED0(a) \
124     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~4) | (a << 2)) & 4) >> 2
125 #define RISCV_CSRRW_MSTATUS_MSTATUS_MIE(a) \
126     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~8) | (a << 3)) & 8) >> 3
127 #define RISCV_CSRRW_MSTATUS_MSTATUS_UPIE(a) \
128     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~16) | (a << 4)) & 16) >> 4
129 #define RISCV_CSRRW_MSTATUS_MSTATUS_SPIE(a) \
130     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~32) | (a << 5)) & 32) >> 5
131 #define RISCV_CSRRW_MSTATUS_MSTATUS_RESERVED1(a) \
132     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~64) | (a << 6)) & 64) >> 6
133 #define RISCV_CSRRW_MSTATUS_MSTATUS_MPIE(a) \
134     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~128) | (a << 7)) & 128) >> 7
135 #define RISCV_CSRRW_MSTATUS_MSTATUS_SPP(a) \
136     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~256) | (a << 8)) & 256) >> 8
137 #define RISCV_CSRRW_MSTATUS_MSTATUS_VS(a) \
138     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~1536) | (a << 9)) & 1536) >> 9
139 #define RISCV_CSRRW_MSTATUS_MSTATUS_MPP(a) \
140     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~6144) | (a << 11)) & 6144) >> 11
141 #define RISCV_CSRRW_MSTATUS_MSTATUS_FS(a) \
142     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~24576) | (a << 13)) & 24576) >> 13
143 #define RISCV_CSRRW_MSTATUS_MSTATUS_XS(a) \
144     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~98304) | (a << 15)) & 98304) >> 15
145 #define RISCV_CSRRW_MSTATUS_MSTATUS_MPRV(a) \
146     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~131072) | (a << 17)) & 131072) >> 17
147 #define RISCV_CSRRW_MSTATUS_MSTATUS_SUM(a) \
148     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~262144) | (a << 18)) & 262144) >> 18
149 #define RISCV_CSRRW_MSTATUS_MSTATUS_MXR(a) \
150     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~524288) | (a << 19)) & 524288) >> 19
151 #define RISCV_CSRRW_MSTATUS_MSTATUS_TVM(a) \
152     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~1048576) | (a << 20)) & 1048576) >> 20
153 #define RISCV_CSRRW_MSTATUS_MSTATUS_TW(a) \
154     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~2097152) | (a << 21)) & 2097152) >> 21
155 #define RISCV_CSRRW_MSTATUS_MSTATUS_TSR(a) \
156     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~4194304) | (a << 22)) & 4194304) >> 22
157 #define RISCV_CSRRW_MSTATUS_MSTATUS_RESERVED2(a) \
158     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~2139095040) | (a << 23)) & 2139095040) >> 23
159 #define RISCV_CSRRW_MSTATUS_MSTATUS_SD(a) \
160     (unsigned int)(RISCV_CSRRW_MSTATUS((RISCV_CSRRS_MSTATUS(0) & ~2147483648) | (a << 31)) & 2147483648) >> 31
161 
162 #define RISCV_CSRRW_MIE(a)       __builtin_linx_csrrw(0b001100000100, a)
163 #define RISCV_CSRRW_MIE_MIE_USIE(a) \
164     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~1) | (a << 0)) & 1) >> 0
165 #define RISCV_CSRRW_MIE_MIE_SSIE(a) \
166     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~2) | (a << 1)) & 2) >> 1
167 #define RISCV_CSRRW_MIE_MIE_RESERVED0(a) \
168     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~4) | (a << 2)) & 4) >> 2
169 #define RISCV_CSRRW_MIE_MIE_MSIE(a) \
170     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~8) | (a << 3)) & 8) >> 3
171 #define RISCV_CSRRW_MIE_MIE_UTIE(a) \
172     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~16) | (a << 4)) & 16) >> 4
173 #define RISCV_CSRRW_MIE_MIE_STIE(a) \
174     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~32) | (a << 5)) & 32) >> 5
175 #define RISCV_CSRRW_MIE_MIE_RESERVED1(a) \
176     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~64) | (a << 6)) & 64) >> 6
177 #define RISCV_CSRRW_MIE_MIE_MTIE(a) \
178     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~128) | (a << 7)) & 128) >> 7
179 #define RISCV_CSRRW_MIE_MIE_UEIE(a) \
180     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~256) | (a << 8)) & 256) >> 8
181 #define RISCV_CSRRW_MIE_MIE_SEIE(a) \
182     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~512) | (a << 9)) & 512) >> 9
183 #define RISCV_CSRRW_MIE_MIE_RESERVED2(a) \
184     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~1024) | (a << 10)) & 1024) >> 10
185 #define RISCV_CSRRW_MIE_MIE_MEIE(a) \
186     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~2048) | (a << 11)) & 2048) >> 11
187 #define RISCV_CSRRW_MIE_MIE_RESERVED3(a) \
188     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~61440) | (a << 12)) & 61440) >> 12
189 #define RISCV_CSRRW_MIE_MIE_ULIE(a) \
190     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~65536) | (a << 16)) & 65536) >> 16
191 #define RISCV_CSRRW_MIE_MIE_SLIE(a) \
192     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~131072) | (a << 17)) & 131072) >> 17
193 #define RISCV_CSRRW_MIE_MIE_RESERVED4(a) \
194     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~262144) | (a << 18)) & 262144) >> 18
195 #define RISCV_CSRRW_MIE_MIE_MLIE(a) \
196     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~524288) | (a << 19)) & 524288) >> 19
197 #define RISCV_CSRRW_MIE_MIE_RESERVED5(a) \
198     (unsigned int)(RISCV_CSRRW_MIE((RISCV_CSRRS_MIE(0) & ~4293918720) | (a << 20)) & 4293918720) >> 20
199 
200 #define RISCV_CSRRW_MTVEC(a)     __builtin_linx_csrrw(0b001100000101, a)
201 #define RISCV_CSRRW_MTVEC_MTVEC_MODE(a) \
202     (unsigned int)(RISCV_CSRRW_MTVEC((RISCV_CSRRS_MTVEC(0) & ~63) | (a << 0)) & 63) >> 0
203 #define RISCV_CSRRW_MTVEC_MTVEC_BASE(a) \
204     (unsigned int)(RISCV_CSRRW_MTVEC((RISCV_CSRRS_MTVEC(0) & ~4294967232) | (a << 6)) & 4294967232) >> 6
205 
206 #define RISCV_CSRRWI_MSTATUS(a)  __builtin_linx_csrrwi(0b001100000000, a)
207 #define RISCV_CSRRWI_MIE(a)      __builtin_linx_csrrwi(0b001100000100, a)
208 #define RISCV_CSRRWI_MTVEC(a)    __builtin_linx_csrrwi(0b001100000101, a)
209 
210 #define RISCV_GET_MEPC()      RISCV_CSRRS_MEPC(0)
211 #define RISCV_SET_MEPC(a)     RISCV_CSRRW_MEPC(a)
212 #define RISCV_GET_MSCRATCH()  RISCV_CSRRS_MSCRATCH(0)
213 #define RISCV_SET_MSCRATCH(a) RISCV_CSRRW_MSCRATCH(a)
214 #define RISCV_GET_MTVAL()     RISCV_CSRRS_MTVAL(0)
215 #define RISCV_SET_MTVAL(a)    RISCV_CSRRW_MTVAL(a)
216 #define RISCV_GET_MIE()       RISCV_CSRRS_MIE(0)
217 #define RISCV_SET_MIE(a)      RISCV_CSRRW_MIE(a)
218 
219 #ifdef __cplusplus
220 }
221 #endif /* __cplusplus */
222 
223 #endif /* _ARCH_INTRINSICS_H */
224