1292407Sbr/*- 2295972Sbr * Copyright (c) 2015-2016 Ruslan Bukin <br@bsdpad.com> 3292407Sbr * All rights reserved. 4292407Sbr * 5292407Sbr * Portions of this software were developed by SRI International and the 6292407Sbr * University of Cambridge Computer Laboratory under DARPA/AFRL contract 7292407Sbr * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme. 8292407Sbr * 9292407Sbr * Portions of this software were developed by the University of Cambridge 10292407Sbr * Computer Laboratory as part of the CTSRD Project, with support from the 11292407Sbr * UK Higher Education Innovation Fund (HEIF). 12292407Sbr * 13292407Sbr * Redistribution and use in source and binary forms, with or without 14292407Sbr * modification, are permitted provided that the following conditions 15292407Sbr * are met: 16292407Sbr * 1. Redistributions of source code must retain the above copyright 17292407Sbr * notice, this list of conditions and the following disclaimer. 18292407Sbr * 2. Redistributions in binary form must reproduce the above copyright 19292407Sbr * notice, this list of conditions and the following disclaimer in the 20292407Sbr * documentation and/or other materials provided with the distribution. 21292407Sbr * 22292407Sbr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 23292407Sbr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24292407Sbr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25292407Sbr * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 26292407Sbr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27292407Sbr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28292407Sbr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29292407Sbr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30292407Sbr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31292407Sbr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32292407Sbr * SUCH DAMAGE. 33292407Sbr * 34292407Sbr * $FreeBSD$ 35292407Sbr */ 36292407Sbr 37292407Sbr#ifndef _MACHINE_RISCVREG_H_ 38292407Sbr#define _MACHINE_RISCVREG_H_ 39292407Sbr 40292407Sbr/* Machine mode requests */ 41295972Sbr#define ECALL_MTIMECMP 0x01 42295972Sbr#define ECALL_CLEAR_PENDING 0x02 43295972Sbr#define ECALL_HTIF_CMD 0x03 44295972Sbr#define ECALL_HTIF_GET_ENTRY 0x04 45295972Sbr#define ECALL_MCPUID_GET 0x05 46295972Sbr#define ECALL_MIMPID_GET 0x06 47295972Sbr#define ECALL_SEND_IPI 0x07 48295972Sbr#define ECALL_CLEAR_IPI 0x08 49295972Sbr#define ECALL_HTIF_LOWPUTC 0x09 50298636Sbr#define ECALL_MIE_SET 0x0a 51298636Sbr#define ECALL_IO_IRQ_MASK 0x0b 52292407Sbr 53292407Sbr#define EXCP_SHIFT 0 54292407Sbr#define EXCP_MASK (0xf << EXCP_SHIFT) 55292407Sbr#define EXCP_INSTR_ADDR_MISALIGNED 0 56292407Sbr#define EXCP_INSTR_ACCESS_FAULT 1 57292407Sbr#define EXCP_INSTR_ILLEGAL 2 58292407Sbr#define EXCP_INSTR_BREAKPOINT 3 59294282Sbr#define EXCP_LOAD_ADDR_MISALIGNED 4 60292407Sbr#define EXCP_LOAD_ACCESS_FAULT 5 61294282Sbr#define EXCP_STORE_ADDR_MISALIGNED 6 62292407Sbr#define EXCP_STORE_ACCESS_FAULT 7 63294282Sbr#define EXCP_UMODE_ENV_CALL 8 64294282Sbr#define EXCP_SMODE_ENV_CALL 9 65294282Sbr#define EXCP_HMODE_ENV_CALL 10 66294282Sbr#define EXCP_MMODE_ENV_CALL 11 67292407Sbr#define EXCP_INTR (1 << 31) 68292407Sbr#define EXCP_INTR_SOFTWARE 0 69292407Sbr#define EXCP_INTR_TIMER 1 70292407Sbr#define EXCP_INTR_HTIF 2 71292407Sbr 72292407Sbr#define SSTATUS_IE (1 << 0) 73292407Sbr#define SSTATUS_PIE (1 << 3) 74292407Sbr#define SSTATUS_PS (1 << 4) 75292407Sbr 76292407Sbr#define MSTATUS_MPRV (1 << 16) 77292407Sbr#define MSTATUS_PRV_SHIFT 1 78292407Sbr#define MSTATUS_PRV1_SHIFT 4 79292407Sbr#define MSTATUS_PRV2_SHIFT 7 80292407Sbr#define MSTATUS_PRV_MASK (0x3 << MSTATUS_PRV_SHIFT) 81292407Sbr#define MSTATUS_PRV_U 0 /* user */ 82292407Sbr#define MSTATUS_PRV_S 1 /* supervisor */ 83292407Sbr#define MSTATUS_PRV_H 2 /* hypervisor */ 84292407Sbr#define MSTATUS_PRV_M 3 /* machine */ 85292407Sbr 86292407Sbr#define MSTATUS_VM_SHIFT 17 87292407Sbr#define MSTATUS_VM_MASK 0x1f 88292407Sbr#define MSTATUS_VM_MBARE 0 89292407Sbr#define MSTATUS_VM_MBB 1 90292407Sbr#define MSTATUS_VM_MBBID 2 91292407Sbr#define MSTATUS_VM_SV32 8 92292407Sbr#define MSTATUS_VM_SV39 9 93292407Sbr#define MSTATUS_VM_SV48 10 94292407Sbr 95292407Sbr#define MIE_SSIE (1 << 1) 96292407Sbr#define MIE_HSIE (1 << 2) 97292407Sbr#define MIE_MSIE (1 << 3) 98292407Sbr#define MIE_STIE (1 << 5) 99292407Sbr#define MIE_HTIE (1 << 6) 100292407Sbr#define MIE_MTIE (1 << 7) 101292407Sbr 102292407Sbr#define MIP_SSIP (1 << 1) 103292407Sbr#define MIP_HSIP (1 << 2) 104292407Sbr#define MIP_MSIP (1 << 3) 105292407Sbr#define MIP_STIP (1 << 5) 106292407Sbr#define MIP_HTIP (1 << 6) 107292407Sbr#define MIP_MTIP (1 << 7) 108292407Sbr 109292407Sbr#define SR_IE (1 << 0) 110292407Sbr#define SR_IE1 (1 << 3) 111292407Sbr#define SR_IE2 (1 << 6) 112292407Sbr#define SR_IE3 (1 << 9) 113292407Sbr 114292407Sbr#define SIE_SSIE (1 << 1) 115292407Sbr#define SIE_STIE (1 << 5) 116292407Sbr 117295972Sbr/* Note: sip register has no SIP_STIP bit in Spike simulator */ 118295972Sbr#define SIP_SSIP (1 << 1) 119292407Sbr#define SIP_STIP (1 << 5) 120292407Sbr 121296614Sbr#define NCSRS 4096 122296614Sbr#define CSR_IPI 0x783 123298636Sbr#define CSR_IO_IRQ 0x7c0 /* lowRISC only? */ 124296614Sbr#define XLEN 8 125296614Sbr#define INSN_SIZE 4 126295972Sbr 127300618Sbr#define RISCV_INSN_NOP 0x00000013 128300618Sbr#define RISCV_INSN_BREAK 0x00100073 129300618Sbr#define RISCV_INSN_RET 0x00008067 130300618Sbr 131292407Sbr#define CSR_ZIMM(val) \ 132292407Sbr (__builtin_constant_p(val) && ((u_long)(val) < 32)) 133292407Sbr 134292407Sbr#define csr_swap(csr, val) \ 135292407Sbr({ if (CSR_ZIMM(val)) \ 136292407Sbr __asm __volatile("csrrwi %0, " #csr ", %1" \ 137292407Sbr : "=r" (val) : "i" (val)); \ 138292407Sbr else \ 139292407Sbr __asm __volatile("csrrw %0, " #csr ", %1" \ 140292407Sbr : "=r" (val) : "r" (val)); \ 141292407Sbr val; \ 142292407Sbr}) 143292407Sbr 144292407Sbr#define csr_write(csr, val) \ 145292407Sbr({ if (CSR_ZIMM(val)) \ 146292407Sbr __asm __volatile("csrwi " #csr ", %0" :: "i" (val)); \ 147292407Sbr else \ 148292407Sbr __asm __volatile("csrw " #csr ", %0" :: "r" (val)); \ 149292407Sbr}) 150292407Sbr 151292407Sbr#define csr_set(csr, val) \ 152292407Sbr({ if (CSR_ZIMM(val)) \ 153292407Sbr __asm __volatile("csrsi " #csr ", %0" :: "i" (val)); \ 154292407Sbr else \ 155292407Sbr __asm __volatile("csrs " #csr ", %0" :: "r" (val)); \ 156292407Sbr}) 157292407Sbr 158292407Sbr#define csr_clear(csr, val) \ 159292407Sbr({ if (CSR_ZIMM(val)) \ 160292407Sbr __asm __volatile("csrci " #csr ", %0" :: "i" (val)); \ 161292407Sbr else \ 162292407Sbr __asm __volatile("csrc " #csr ", %0" :: "r" (val)); \ 163292407Sbr}) 164292407Sbr 165292407Sbr#define csr_read(csr) \ 166292407Sbr({ u_long val; \ 167292407Sbr __asm __volatile("csrr %0, " #csr : "=r" (val)); \ 168292407Sbr val; \ 169292407Sbr}) 170292407Sbr 171292407Sbr#endif /* !_MACHINE_RISCVREG_H_ */ 172