18d7e7a98SRuslan Bukin /*- 2e29afe64SRuslan Bukin * Copyright (c) 2015-2024 Ruslan Bukin <br@bsdpad.com> 38d7e7a98SRuslan Bukin * All rights reserved. 48d7e7a98SRuslan Bukin * 58d7e7a98SRuslan Bukin * Portions of this software were developed by SRI International and the 68d7e7a98SRuslan Bukin * University of Cambridge Computer Laboratory under DARPA/AFRL contract 78d7e7a98SRuslan Bukin * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme. 88d7e7a98SRuslan Bukin * 98d7e7a98SRuslan Bukin * Portions of this software were developed by the University of Cambridge 108d7e7a98SRuslan Bukin * Computer Laboratory as part of the CTSRD Project, with support from the 118d7e7a98SRuslan Bukin * UK Higher Education Innovation Fund (HEIF). 128d7e7a98SRuslan Bukin * 138d7e7a98SRuslan Bukin * Redistribution and use in source and binary forms, with or without 148d7e7a98SRuslan Bukin * modification, are permitted provided that the following conditions 158d7e7a98SRuslan Bukin * are met: 168d7e7a98SRuslan Bukin * 1. Redistributions of source code must retain the above copyright 178d7e7a98SRuslan Bukin * notice, this list of conditions and the following disclaimer. 188d7e7a98SRuslan Bukin * 2. Redistributions in binary form must reproduce the above copyright 198d7e7a98SRuslan Bukin * notice, this list of conditions and the following disclaimer in the 208d7e7a98SRuslan Bukin * documentation and/or other materials provided with the distribution. 218d7e7a98SRuslan Bukin * 228d7e7a98SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 238d7e7a98SRuslan Bukin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 248d7e7a98SRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 258d7e7a98SRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 268d7e7a98SRuslan Bukin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 278d7e7a98SRuslan Bukin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 288d7e7a98SRuslan Bukin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 298d7e7a98SRuslan Bukin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 308d7e7a98SRuslan Bukin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 318d7e7a98SRuslan Bukin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 328d7e7a98SRuslan Bukin * SUCH DAMAGE. 338d7e7a98SRuslan Bukin */ 348d7e7a98SRuslan Bukin 358d7e7a98SRuslan Bukin #ifndef _MACHINE_RISCVREG_H_ 368d7e7a98SRuslan Bukin #define _MACHINE_RISCVREG_H_ 378d7e7a98SRuslan Bukin 38cb8e0678SMitchell Horne #define SCAUSE_INTR (1ul << 63) 39cb8e0678SMitchell Horne #define SCAUSE_CODE (~SCAUSE_INTR) 40cb8e0678SMitchell Horne #define SCAUSE_INST_MISALIGNED 0 41cb8e0678SMitchell Horne #define SCAUSE_INST_ACCESS_FAULT 1 42cb8e0678SMitchell Horne #define SCAUSE_ILLEGAL_INSTRUCTION 2 43cb8e0678SMitchell Horne #define SCAUSE_BREAKPOINT 3 44cb8e0678SMitchell Horne #define SCAUSE_LOAD_MISALIGNED 4 45cb8e0678SMitchell Horne #define SCAUSE_LOAD_ACCESS_FAULT 5 46cb8e0678SMitchell Horne #define SCAUSE_STORE_MISALIGNED 6 47cb8e0678SMitchell Horne #define SCAUSE_STORE_ACCESS_FAULT 7 48cb8e0678SMitchell Horne #define SCAUSE_ECALL_USER 8 49cb8e0678SMitchell Horne #define SCAUSE_ECALL_SUPERVISOR 9 50*d3916eacSRuslan Bukin #define SCAUSE_VIRTUAL_SUPERVISOR_ECALL 10 51*d3916eacSRuslan Bukin #define SCAUSE_MACHINE_ECALL 11 52cb8e0678SMitchell Horne #define SCAUSE_INST_PAGE_FAULT 12 53cb8e0678SMitchell Horne #define SCAUSE_LOAD_PAGE_FAULT 13 54cb8e0678SMitchell Horne #define SCAUSE_STORE_PAGE_FAULT 15 55*d3916eacSRuslan Bukin #define SCAUSE_FETCH_GUEST_PAGE_FAULT 20 56*d3916eacSRuslan Bukin #define SCAUSE_LOAD_GUEST_PAGE_FAULT 21 57*d3916eacSRuslan Bukin #define SCAUSE_VIRTUAL_INSTRUCTION 22 58*d3916eacSRuslan Bukin #define SCAUSE_STORE_GUEST_PAGE_FAULT 23 598d7e7a98SRuslan Bukin 6098f50c44SRuslan Bukin #define SSTATUS_UIE (1 << 0) 6198f50c44SRuslan Bukin #define SSTATUS_SIE (1 << 1) 6298f50c44SRuslan Bukin #define SSTATUS_UPIE (1 << 4) 6398f50c44SRuslan Bukin #define SSTATUS_SPIE (1 << 5) 6498f50c44SRuslan Bukin #define SSTATUS_SPIE_SHIFT 5 6598f50c44SRuslan Bukin #define SSTATUS_SPP (1 << 8) 6698f50c44SRuslan Bukin #define SSTATUS_SPP_SHIFT 8 6798f50c44SRuslan Bukin #define SSTATUS_FS_SHIFT 13 687804dd52SRuslan Bukin #define SSTATUS_FS_OFF (0x0 << SSTATUS_FS_SHIFT) 697804dd52SRuslan Bukin #define SSTATUS_FS_INITIAL (0x1 << SSTATUS_FS_SHIFT) 707804dd52SRuslan Bukin #define SSTATUS_FS_CLEAN (0x2 << SSTATUS_FS_SHIFT) 717804dd52SRuslan Bukin #define SSTATUS_FS_DIRTY (0x3 << SSTATUS_FS_SHIFT) 727804dd52SRuslan Bukin #define SSTATUS_FS_MASK (0x3 << SSTATUS_FS_SHIFT) 7398f50c44SRuslan Bukin #define SSTATUS_XS_SHIFT 15 747804dd52SRuslan Bukin #define SSTATUS_XS_MASK (0x3 << SSTATUS_XS_SHIFT) 75af19cc59SRuslan Bukin #define SSTATUS_SUM (1 << 18) 76741ba007SMitchell Horne #if __riscv_xlen == 64 77cca117a1SJohn Baldwin #define SSTATUS_SD (1ul << 63) 78741ba007SMitchell Horne #else 79741ba007SMitchell Horne #define SSTATUS_SD (1 << 31) 80741ba007SMitchell Horne #endif 818d7e7a98SRuslan Bukin 8298f50c44SRuslan Bukin #define MSTATUS_UIE (1 << 0) 8398f50c44SRuslan Bukin #define MSTATUS_SIE (1 << 1) 8498f50c44SRuslan Bukin #define MSTATUS_HIE (1 << 2) 8598f50c44SRuslan Bukin #define MSTATUS_MIE (1 << 3) 8698f50c44SRuslan Bukin #define MSTATUS_UPIE (1 << 4) 8798f50c44SRuslan Bukin #define MSTATUS_SPIE (1 << 5) 8898f50c44SRuslan Bukin #define MSTATUS_SPIE_SHIFT 5 8998f50c44SRuslan Bukin #define MSTATUS_HPIE (1 << 6) 9098f50c44SRuslan Bukin #define MSTATUS_MPIE (1 << 7) 9198f50c44SRuslan Bukin #define MSTATUS_MPIE_SHIFT 7 9298f50c44SRuslan Bukin #define MSTATUS_SPP (1 << 8) 9398f50c44SRuslan Bukin #define MSTATUS_SPP_SHIFT 8 9498f50c44SRuslan Bukin #define MSTATUS_HPP_MASK 0x3 9598f50c44SRuslan Bukin #define MSTATUS_HPP_SHIFT 9 9698f50c44SRuslan Bukin #define MSTATUS_MPP_MASK 0x3 9798f50c44SRuslan Bukin #define MSTATUS_MPP_SHIFT 11 9898f50c44SRuslan Bukin #define MSTATUS_FS_MASK 0x3 9998f50c44SRuslan Bukin #define MSTATUS_FS_SHIFT 13 10098f50c44SRuslan Bukin #define MSTATUS_XS_MASK 0x3 10198f50c44SRuslan Bukin #define MSTATUS_XS_SHIFT 15 10298f50c44SRuslan Bukin #define MSTATUS_MPRV (1 << 17) 10398f50c44SRuslan Bukin #define MSTATUS_PUM (1 << 18) 1048d7e7a98SRuslan Bukin #define MSTATUS_VM_MASK 0x1f 10598f50c44SRuslan Bukin #define MSTATUS_VM_SHIFT 24 1068d7e7a98SRuslan Bukin #define MSTATUS_VM_MBARE 0 1078d7e7a98SRuslan Bukin #define MSTATUS_VM_MBB 1 1088d7e7a98SRuslan Bukin #define MSTATUS_VM_MBBID 2 1098d7e7a98SRuslan Bukin #define MSTATUS_VM_SV32 8 1108d7e7a98SRuslan Bukin #define MSTATUS_VM_SV39 9 1118d7e7a98SRuslan Bukin #define MSTATUS_VM_SV48 10 11298f50c44SRuslan Bukin #define MSTATUS_VM_SV57 11 11398f50c44SRuslan Bukin #define MSTATUS_VM_SV64 12 114cca117a1SJohn Baldwin #if __riscv_xlen == 64 115cca117a1SJohn Baldwin #define MSTATUS_SD (1ul << 63) 116cca117a1SJohn Baldwin #else 117cca117a1SJohn Baldwin #define MSTATUS_SD (1 << 31) 118cca117a1SJohn Baldwin #endif 1198d7e7a98SRuslan Bukin 12098f50c44SRuslan Bukin #define MSTATUS_PRV_U 0 /* user */ 12198f50c44SRuslan Bukin #define MSTATUS_PRV_S 1 /* supervisor */ 12298f50c44SRuslan Bukin #define MSTATUS_PRV_H 2 /* hypervisor */ 12398f50c44SRuslan Bukin #define MSTATUS_PRV_M 3 /* machine */ 12498f50c44SRuslan Bukin 125*d3916eacSRuslan Bukin #define HSTATUS_VSBE (1 << 5) 126*d3916eacSRuslan Bukin #define HSTATUS_GVA (1 << 6) 127*d3916eacSRuslan Bukin #define HSTATUS_SPV (1 << 7) 128*d3916eacSRuslan Bukin #define HSTATUS_SPVP (1 << 8) 129*d3916eacSRuslan Bukin #define HSTATUS_HU (1 << 9) 130*d3916eacSRuslan Bukin #define HSTATUS_VGEIN_S 12 131*d3916eacSRuslan Bukin #define HSTATUS_VGEIN_M (0xf << HSTATUS_VGEIN_S) 132*d3916eacSRuslan Bukin #define HSTATUS_VTVM (1 << 20) 133*d3916eacSRuslan Bukin #define HSTATUS_VTW (1 << 21) 134*d3916eacSRuslan Bukin #define HSTATUS_VTSR (1 << 22) 135*d3916eacSRuslan Bukin 13698f50c44SRuslan Bukin #define MIE_USIE (1 << 0) 1378d7e7a98SRuslan Bukin #define MIE_SSIE (1 << 1) 1388d7e7a98SRuslan Bukin #define MIE_HSIE (1 << 2) 1398d7e7a98SRuslan Bukin #define MIE_MSIE (1 << 3) 14098f50c44SRuslan Bukin #define MIE_UTIE (1 << 4) 1418d7e7a98SRuslan Bukin #define MIE_STIE (1 << 5) 1428d7e7a98SRuslan Bukin #define MIE_HTIE (1 << 6) 1438d7e7a98SRuslan Bukin #define MIE_MTIE (1 << 7) 1448d7e7a98SRuslan Bukin 14598f50c44SRuslan Bukin #define MIP_USIP (1 << 0) 1468d7e7a98SRuslan Bukin #define MIP_SSIP (1 << 1) 1478d7e7a98SRuslan Bukin #define MIP_HSIP (1 << 2) 1488d7e7a98SRuslan Bukin #define MIP_MSIP (1 << 3) 14998f50c44SRuslan Bukin #define MIP_UTIP (1 << 4) 1508d7e7a98SRuslan Bukin #define MIP_STIP (1 << 5) 1518d7e7a98SRuslan Bukin #define MIP_HTIP (1 << 6) 1528d7e7a98SRuslan Bukin #define MIP_MTIP (1 << 7) 1538d7e7a98SRuslan Bukin 15498f50c44SRuslan Bukin #define SIE_USIE (1 << 0) 1558d7e7a98SRuslan Bukin #define SIE_SSIE (1 << 1) 15698f50c44SRuslan Bukin #define SIE_UTIE (1 << 4) 1578d7e7a98SRuslan Bukin #define SIE_STIE (1 << 5) 1582d53a67cSRuslan Bukin #define SIE_UEIE (1 << 8) 1592d53a67cSRuslan Bukin #define SIE_SEIE (1 << 9) 1608d7e7a98SRuslan Bukin 16198f50c44SRuslan Bukin #define MIP_SEIP (1 << 9) 16298f50c44SRuslan Bukin 163*d3916eacSRuslan Bukin #define HVIP_VSSIP (1 << 2) 164*d3916eacSRuslan Bukin #define HVIP_VSTIP (1 << 6) 165*d3916eacSRuslan Bukin #define HVIP_VSEIP (1 << 10) 166*d3916eacSRuslan Bukin 167*d3916eacSRuslan Bukin #define HIE_VSSIE (1 << 2) 168*d3916eacSRuslan Bukin #define HIE_VSTIE (1 << 6) 169*d3916eacSRuslan Bukin #define HIE_VSEIE (1 << 10) 170*d3916eacSRuslan Bukin #define HIE_SGEIE (1 << 12) 171*d3916eacSRuslan Bukin 17217696c12SRuslan Bukin /* Note: sip register has no SIP_STIP bit in Spike simulator */ 17317696c12SRuslan Bukin #define SIP_SSIP (1 << 1) 1748d7e7a98SRuslan Bukin #define SIP_STIP (1 << 5) 1758d7e7a98SRuslan Bukin 176*d3916eacSRuslan Bukin #define HENVCFG_STCE (1UL << 63) 177*d3916eacSRuslan Bukin #define HENVCFG_PBMTE (1UL << 62) 178*d3916eacSRuslan Bukin #define HENVCFG_CBZE (1UL << 7) 179*d3916eacSRuslan Bukin #define HENVCFG_CBCFE (1UL << 6) 180*d3916eacSRuslan Bukin #define HENVCFG_CBIE_S 4 181*d3916eacSRuslan Bukin #define HENVCFG_CBIE_M (0x3 << HENVCFG_CBIE_S) 182*d3916eacSRuslan Bukin #define HENVCFG_FIOM (1UL << 0) 183*d3916eacSRuslan Bukin 184*d3916eacSRuslan Bukin #define HCOUNTEREN_CY (1UL << 0) /* Cycle */ 185*d3916eacSRuslan Bukin #define HCOUNTEREN_TM (1UL << 1) /* Time */ 186*d3916eacSRuslan Bukin #define HCOUNTEREN_IR (1UL << 2) /* Instret */ 187*d3916eacSRuslan Bukin 188af19cc59SRuslan Bukin #define SATP_PPN_S 0 18931218f32SMark Johnston #define SATP_PPN_M (0xfffffffffffUL << SATP_PPN_S) 190af19cc59SRuslan Bukin #define SATP_ASID_S 44 19131218f32SMark Johnston #define SATP_ASID_M (0xffffUL << SATP_ASID_S) 192af19cc59SRuslan Bukin #define SATP_MODE_S 60 19331218f32SMark Johnston #define SATP_MODE_M (0xfUL << SATP_MODE_S) 194af19cc59SRuslan Bukin #define SATP_MODE_SV39 (8ULL << SATP_MODE_S) 195af19cc59SRuslan Bukin #define SATP_MODE_SV48 (9ULL << SATP_MODE_S) 196af19cc59SRuslan Bukin 19780fe2359SMark Johnston #define XLEN __riscv_xlen 19880fe2359SMark Johnston #define XLEN_BYTES (XLEN / 8) 199d52d6d7cSRuslan Bukin #define INSN_SIZE 4 200378a4956SRuslan Bukin #define INSN_C_SIZE 2 20117696c12SRuslan Bukin 202378a4956SRuslan Bukin #define X_RA 1 203378a4956SRuslan Bukin #define X_SP 2 204378a4956SRuslan Bukin #define X_GP 3 205378a4956SRuslan Bukin #define X_TP 4 206378a4956SRuslan Bukin #define X_T0 5 207378a4956SRuslan Bukin #define X_T1 6 208378a4956SRuslan Bukin #define X_T2 7 209378a4956SRuslan Bukin #define X_T3 28 210378a4956SRuslan Bukin 211378a4956SRuslan Bukin #define RD_SHIFT 7 212378a4956SRuslan Bukin #define RD_MASK (0x1f << RD_SHIFT) 213378a4956SRuslan Bukin #define RS1_SHIFT 15 214378a4956SRuslan Bukin #define RS1_MASK (0x1f << RS1_SHIFT) 215378a4956SRuslan Bukin #define RS1_SP (X_SP << RS1_SHIFT) 216378a4956SRuslan Bukin #define RS2_SHIFT 20 217378a4956SRuslan Bukin #define RS2_MASK (0x1f << RS2_SHIFT) 218378a4956SRuslan Bukin #define RS2_RA (X_RA << RS2_SHIFT) 219378a4956SRuslan Bukin #define IMM_SHIFT 20 220378a4956SRuslan Bukin #define IMM_MASK (0xfff << IMM_SHIFT) 221378a4956SRuslan Bukin 222378a4956SRuslan Bukin #define RS2_C_SHIFT 2 223378a4956SRuslan Bukin #define RS2_C_MASK (0x1f << RS2_C_SHIFT) 224378a4956SRuslan Bukin #define RS2_C_RA (X_RA << RS2_C_SHIFT) 225fed1ca4bSRuslan Bukin 2268d7e7a98SRuslan Bukin #define CSR_ZIMM(val) \ 2278d7e7a98SRuslan Bukin (__builtin_constant_p(val) && ((u_long)(val) < 32)) 2288d7e7a98SRuslan Bukin 2298d7e7a98SRuslan Bukin #define csr_swap(csr, val) \ 230e29afe64SRuslan Bukin ({ u_long ret; \ 231e29afe64SRuslan Bukin if (CSR_ZIMM(val)) \ 2328d7e7a98SRuslan Bukin __asm __volatile("csrrwi %0, " #csr ", %1" \ 233e29afe64SRuslan Bukin : "=r" (ret) : "i" (val)); \ 2348d7e7a98SRuslan Bukin else \ 2358d7e7a98SRuslan Bukin __asm __volatile("csrrw %0, " #csr ", %1" \ 236e29afe64SRuslan Bukin : "=r" (ret) : "r" (val)); \ 237e29afe64SRuslan Bukin ret; \ 2388d7e7a98SRuslan Bukin }) 2398d7e7a98SRuslan Bukin 2408d7e7a98SRuslan Bukin #define csr_write(csr, val) \ 2418d7e7a98SRuslan Bukin ({ if (CSR_ZIMM(val)) \ 2428d7e7a98SRuslan Bukin __asm __volatile("csrwi " #csr ", %0" :: "i" (val)); \ 2438d7e7a98SRuslan Bukin else \ 2448d7e7a98SRuslan Bukin __asm __volatile("csrw " #csr ", %0" :: "r" (val)); \ 2458d7e7a98SRuslan Bukin }) 2468d7e7a98SRuslan Bukin 2478d7e7a98SRuslan Bukin #define csr_set(csr, val) \ 2488d7e7a98SRuslan Bukin ({ if (CSR_ZIMM(val)) \ 2498d7e7a98SRuslan Bukin __asm __volatile("csrsi " #csr ", %0" :: "i" (val)); \ 2508d7e7a98SRuslan Bukin else \ 2518d7e7a98SRuslan Bukin __asm __volatile("csrs " #csr ", %0" :: "r" (val)); \ 2528d7e7a98SRuslan Bukin }) 2538d7e7a98SRuslan Bukin 2548d7e7a98SRuslan Bukin #define csr_clear(csr, val) \ 2558d7e7a98SRuslan Bukin ({ if (CSR_ZIMM(val)) \ 2568d7e7a98SRuslan Bukin __asm __volatile("csrci " #csr ", %0" :: "i" (val)); \ 2578d7e7a98SRuslan Bukin else \ 2588d7e7a98SRuslan Bukin __asm __volatile("csrc " #csr ", %0" :: "r" (val)); \ 2598d7e7a98SRuslan Bukin }) 2608d7e7a98SRuslan Bukin 2618d7e7a98SRuslan Bukin #define csr_read(csr) \ 2628d7e7a98SRuslan Bukin ({ u_long val; \ 2638d7e7a98SRuslan Bukin __asm __volatile("csrr %0, " #csr : "=r" (val)); \ 2648d7e7a98SRuslan Bukin val; \ 2658d7e7a98SRuslan Bukin }) 2668d7e7a98SRuslan Bukin 2671e2ceeb1SMark Johnston #if __riscv_xlen == 32 2681e2ceeb1SMark Johnston #define csr_read64(csr) \ 2691e2ceeb1SMark Johnston ({ uint64_t val; \ 2701e2ceeb1SMark Johnston uint32_t high, low; \ 2711e2ceeb1SMark Johnston __asm __volatile("1: " \ 2721e2ceeb1SMark Johnston "csrr t0, " #csr "h\n" \ 2731e2ceeb1SMark Johnston "csrr %0, " #csr "\n" \ 2741e2ceeb1SMark Johnston "csrr %1, " #csr "h\n" \ 2751e2ceeb1SMark Johnston "bne t0, %1, 1b" \ 2761e2ceeb1SMark Johnston : "=r" (low), "=r" (high) \ 2771e2ceeb1SMark Johnston : \ 2781e2ceeb1SMark Johnston : "t0"); \ 2791e2ceeb1SMark Johnston val = (low | ((uint64_t)high << 32)); \ 2801e2ceeb1SMark Johnston val; \ 2811e2ceeb1SMark Johnston }) 2821e2ceeb1SMark Johnston #else 2831e2ceeb1SMark Johnston #define csr_read64(csr) ((uint64_t)csr_read(csr)) 2841e2ceeb1SMark Johnston #endif 2851e2ceeb1SMark Johnston 2868d7e7a98SRuslan Bukin #endif /* !_MACHINE_RISCVREG_H_ */ 287