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