diff options
Diffstat (limited to 'riscv/include/uapi/asm')
| -rw-r--r-- | riscv/include/uapi/asm/Kbuild | 1 | ||||
| -rw-r--r-- | riscv/include/uapi/asm/auxvec.h | 40 | ||||
| -rw-r--r-- | riscv/include/uapi/asm/bitsperlong.h | 14 | ||||
| -rw-r--r-- | riscv/include/uapi/asm/bpf_perf_event.h | 9 | ||||
| -rw-r--r-- | riscv/include/uapi/asm/byteorder.h | 12 | ||||
| -rw-r--r-- | riscv/include/uapi/asm/elf.h | 101 | ||||
| -rw-r--r-- | riscv/include/uapi/asm/hwcap.h | 26 | ||||
| -rw-r--r-- | riscv/include/uapi/asm/hwprobe.h | 43 | ||||
| -rw-r--r-- | riscv/include/uapi/asm/kvm.h | 317 | ||||
| -rw-r--r-- | riscv/include/uapi/asm/perf_regs.h | 42 | ||||
| -rw-r--r-- | riscv/include/uapi/asm/ptrace.h | 132 | ||||
| -rw-r--r-- | riscv/include/uapi/asm/setup.h | 8 | ||||
| -rw-r--r-- | riscv/include/uapi/asm/sigcontext.h | 40 | ||||
| -rw-r--r-- | riscv/include/uapi/asm/ucontext.h | 38 | ||||
| -rw-r--r-- | riscv/include/uapi/asm/unistd.h | 54 | 
15 files changed, 877 insertions, 0 deletions
| diff --git a/riscv/include/uapi/asm/Kbuild b/riscv/include/uapi/asm/Kbuild new file mode 100644 index 0000000..f66554c --- /dev/null +++ b/riscv/include/uapi/asm/Kbuild @@ -0,0 +1 @@ +# SPDX-License-Identifier: GPL-2.0 diff --git a/riscv/include/uapi/asm/auxvec.h b/riscv/include/uapi/asm/auxvec.h new file mode 100644 index 0000000..10aaa83 --- /dev/null +++ b/riscv/include/uapi/asm/auxvec.h @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ +/* + * Copyright (C) 2012 ARM Ltd. + * Copyright (C) 2015 Regents of the University of California + */ + +#ifndef _UAPI_ASM_RISCV_AUXVEC_H +#define _UAPI_ASM_RISCV_AUXVEC_H + +/* vDSO location */ +#define AT_SYSINFO_EHDR 33 + +/* + * The set of entries below represent more extensive information + * about the caches, in the form of two entry per cache type, + * one entry containing the cache size in bytes, and the other + * containing the cache line size in bytes in the bottom 16 bits + * and the cache associativity in the next 16 bits. + * + * The associativity is such that if N is the 16-bit value, the + * cache is N way set associative. A value if 0xffff means fully + * associative, a value of 1 means directly mapped. + * + * For all these fields, a value of 0 means that the information + * is not known. + */ +#define AT_L1I_CACHESIZE	40 +#define AT_L1I_CACHEGEOMETRY	41 +#define AT_L1D_CACHESIZE	42 +#define AT_L1D_CACHEGEOMETRY	43 +#define AT_L2_CACHESIZE		44 +#define AT_L2_CACHEGEOMETRY	45 +#define AT_L3_CACHESIZE		46 +#define AT_L3_CACHEGEOMETRY	47 + +/* entries in ARCH_DLINFO */ +#define AT_VECTOR_SIZE_ARCH	9 +#define AT_MINSIGSTKSZ		51 + +#endif /* _UAPI_ASM_RISCV_AUXVEC_H */ diff --git a/riscv/include/uapi/asm/bitsperlong.h b/riscv/include/uapi/asm/bitsperlong.h new file mode 100644 index 0000000..7d0b32e --- /dev/null +++ b/riscv/include/uapi/asm/bitsperlong.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ +/* + * Copyright (C) 2012 ARM Ltd. + * Copyright (C) 2015 Regents of the University of California + */ + +#ifndef _UAPI_ASM_RISCV_BITSPERLONG_H +#define _UAPI_ASM_RISCV_BITSPERLONG_H + +#define __BITS_PER_LONG (__SIZEOF_POINTER__ * 8) + +#include <asm-generic/bitsperlong.h> + +#endif /* _UAPI_ASM_RISCV_BITSPERLONG_H */ diff --git a/riscv/include/uapi/asm/bpf_perf_event.h b/riscv/include/uapi/asm/bpf_perf_event.h new file mode 100644 index 0000000..6cb1c28 --- /dev/null +++ b/riscv/include/uapi/asm/bpf_perf_event.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI__ASM_BPF_PERF_EVENT_H__ +#define _UAPI__ASM_BPF_PERF_EVENT_H__ + +#include <asm/ptrace.h> + +typedef struct user_regs_struct bpf_user_pt_regs_t; + +#endif /* _UAPI__ASM_BPF_PERF_EVENT_H__ */ diff --git a/riscv/include/uapi/asm/byteorder.h b/riscv/include/uapi/asm/byteorder.h new file mode 100644 index 0000000..f671e16 --- /dev/null +++ b/riscv/include/uapi/asm/byteorder.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ +/* + * Copyright (C) 2012 ARM Ltd. + * Copyright (C) 2015 Regents of the University of California + */ + +#ifndef _UAPI_ASM_RISCV_BYTEORDER_H +#define _UAPI_ASM_RISCV_BYTEORDER_H + +#include <linux/byteorder/little_endian.h> + +#endif /* _UAPI_ASM_RISCV_BYTEORDER_H */ diff --git a/riscv/include/uapi/asm/elf.h b/riscv/include/uapi/asm/elf.h new file mode 100644 index 0000000..11a71b8 --- /dev/null +++ b/riscv/include/uapi/asm/elf.h @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com> + * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se> + * Copyright (C) 2012 Regents of the University of California + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#ifndef _UAPI_ASM_RISCV_ELF_H +#define _UAPI_ASM_RISCV_ELF_H + +#include <asm/ptrace.h> + +/* ELF register definitions */ +typedef unsigned long elf_greg_t; +typedef struct user_regs_struct elf_gregset_t; +#define ELF_NGREG (sizeof(elf_gregset_t) / sizeof(elf_greg_t)) + +/* We don't support f without d, or q.  */ +typedef __u64 elf_fpreg_t; +typedef union __riscv_fp_state elf_fpregset_t; +#define ELF_NFPREG (sizeof(struct __riscv_d_ext_state) / sizeof(elf_fpreg_t)) + +#if __riscv_xlen == 64 +#define ELF_RISCV_R_SYM(r_info)		ELF64_R_SYM(r_info) +#define ELF_RISCV_R_TYPE(r_info)	ELF64_R_TYPE(r_info) +#else +#define ELF_RISCV_R_SYM(r_info)		ELF32_R_SYM(r_info) +#define ELF_RISCV_R_TYPE(r_info)	ELF32_R_TYPE(r_info) +#endif + +/* + * RISC-V relocation types + */ + +/* Relocation types used by the dynamic linker */ +#define R_RISCV_NONE		0 +#define R_RISCV_32		1 +#define R_RISCV_64		2 +#define R_RISCV_RELATIVE	3 +#define R_RISCV_COPY		4 +#define R_RISCV_JUMP_SLOT	5 +#define R_RISCV_TLS_DTPMOD32	6 +#define R_RISCV_TLS_DTPMOD64	7 +#define R_RISCV_TLS_DTPREL32	8 +#define R_RISCV_TLS_DTPREL64	9 +#define R_RISCV_TLS_TPREL32	10 +#define R_RISCV_TLS_TPREL64	11 +#define R_RISCV_IRELATIVE	58 + +/* Relocation types not used by the dynamic linker */ +#define R_RISCV_BRANCH		16 +#define R_RISCV_JAL		17 +#define R_RISCV_CALL		18 +#define R_RISCV_CALL_PLT	19 +#define R_RISCV_GOT_HI20	20 +#define R_RISCV_TLS_GOT_HI20	21 +#define R_RISCV_TLS_GD_HI20	22 +#define R_RISCV_PCREL_HI20	23 +#define R_RISCV_PCREL_LO12_I	24 +#define R_RISCV_PCREL_LO12_S	25 +#define R_RISCV_HI20		26 +#define R_RISCV_LO12_I		27 +#define R_RISCV_LO12_S		28 +#define R_RISCV_TPREL_HI20	29 +#define R_RISCV_TPREL_LO12_I	30 +#define R_RISCV_TPREL_LO12_S	31 +#define R_RISCV_TPREL_ADD	32 +#define R_RISCV_ADD8		33 +#define R_RISCV_ADD16		34 +#define R_RISCV_ADD32		35 +#define R_RISCV_ADD64		36 +#define R_RISCV_SUB8		37 +#define R_RISCV_SUB16		38 +#define R_RISCV_SUB32		39 +#define R_RISCV_SUB64		40 +#define R_RISCV_GNU_VTINHERIT	41 +#define R_RISCV_GNU_VTENTRY	42 +#define R_RISCV_ALIGN		43 +#define R_RISCV_RVC_BRANCH	44 +#define R_RISCV_RVC_JUMP	45 +#define R_RISCV_GPREL_I		47 +#define R_RISCV_GPREL_S		48 +#define R_RISCV_TPREL_I		49 +#define R_RISCV_TPREL_S		50 +#define R_RISCV_RELAX		51 +#define R_RISCV_SUB6		52 +#define R_RISCV_SET6		53 +#define R_RISCV_SET8		54 +#define R_RISCV_SET16		55 +#define R_RISCV_SET32		56 +#define R_RISCV_32_PCREL	57 +#define R_RISCV_PLT32		59 +#define R_RISCV_SET_ULEB128	60 +#define R_RISCV_SUB_ULEB128	61 + + +#endif /* _UAPI_ASM_RISCV_ELF_H */ diff --git a/riscv/include/uapi/asm/hwcap.h b/riscv/include/uapi/asm/hwcap.h new file mode 100644 index 0000000..c52bb7b --- /dev/null +++ b/riscv/include/uapi/asm/hwcap.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ +/* + * Copied from arch/arm64/include/asm/hwcap.h + * + * Copyright (C) 2012 ARM Ltd. + * Copyright (C) 2017 SiFive + */ +#ifndef _UAPI_ASM_RISCV_HWCAP_H +#define _UAPI_ASM_RISCV_HWCAP_H + +/* + * Linux saves the floating-point registers according to the ISA Linux is + * executing on, as opposed to the ISA the user program is compiled for.  This + * is necessary for a handful of esoteric use cases: for example, userspace + * threading libraries must be able to examine the actual machine state in + * order to fully reconstruct the state of a thread. + */ +#define COMPAT_HWCAP_ISA_I	(1 << ('I' - 'A')) +#define COMPAT_HWCAP_ISA_M	(1 << ('M' - 'A')) +#define COMPAT_HWCAP_ISA_A	(1 << ('A' - 'A')) +#define COMPAT_HWCAP_ISA_F	(1 << ('F' - 'A')) +#define COMPAT_HWCAP_ISA_D	(1 << ('D' - 'A')) +#define COMPAT_HWCAP_ISA_C	(1 << ('C' - 'A')) +#define COMPAT_HWCAP_ISA_V	(1 << ('V' - 'A')) + +#endif /* _UAPI_ASM_RISCV_HWCAP_H */ diff --git a/riscv/include/uapi/asm/hwprobe.h b/riscv/include/uapi/asm/hwprobe.h new file mode 100644 index 0000000..b659ffc --- /dev/null +++ b/riscv/include/uapi/asm/hwprobe.h @@ -0,0 +1,43 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * Copyright 2023 Rivos, Inc + */ + +#ifndef _UAPI_ASM_HWPROBE_H +#define _UAPI_ASM_HWPROBE_H + +#include <linux/types.h> + +/* + * Interface for probing hardware capabilities from userspace, see + * Documentation/arch/riscv/hwprobe.rst for more information. + */ +struct riscv_hwprobe { +	__s64 key; +	__u64 value; +}; + +#define RISCV_HWPROBE_KEY_MVENDORID	0 +#define RISCV_HWPROBE_KEY_MARCHID	1 +#define RISCV_HWPROBE_KEY_MIMPID	2 +#define RISCV_HWPROBE_KEY_BASE_BEHAVIOR	3 +#define		RISCV_HWPROBE_BASE_BEHAVIOR_IMA	(1 << 0) +#define RISCV_HWPROBE_KEY_IMA_EXT_0	4 +#define		RISCV_HWPROBE_IMA_FD		(1 << 0) +#define		RISCV_HWPROBE_IMA_C		(1 << 1) +#define		RISCV_HWPROBE_IMA_V		(1 << 2) +#define		RISCV_HWPROBE_EXT_ZBA		(1 << 3) +#define		RISCV_HWPROBE_EXT_ZBB		(1 << 4) +#define		RISCV_HWPROBE_EXT_ZBS		(1 << 5) +#define		RISCV_HWPROBE_EXT_ZICBOZ	(1 << 6) +#define RISCV_HWPROBE_KEY_CPUPERF_0	5 +#define		RISCV_HWPROBE_MISALIGNED_UNKNOWN	(0 << 0) +#define		RISCV_HWPROBE_MISALIGNED_EMULATED	(1 << 0) +#define		RISCV_HWPROBE_MISALIGNED_SLOW		(2 << 0) +#define		RISCV_HWPROBE_MISALIGNED_FAST		(3 << 0) +#define		RISCV_HWPROBE_MISALIGNED_UNSUPPORTED	(4 << 0) +#define		RISCV_HWPROBE_MISALIGNED_MASK		(7 << 0) +#define RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE	6 +/* Increase RISCV_HWPROBE_MAX_KEY when adding items. */ + +#endif diff --git a/riscv/include/uapi/asm/kvm.h b/riscv/include/uapi/asm/kvm.h new file mode 100644 index 0000000..60d3b21 --- /dev/null +++ b/riscv/include/uapi/asm/kvm.h @@ -0,0 +1,317 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * Copyright (C) 2019 Western Digital Corporation or its affiliates. + * + * Authors: + *     Anup Patel <anup.patel@wdc.com> + */ + +#ifndef __LINUX_KVM_RISCV_H +#define __LINUX_KVM_RISCV_H + +#ifndef __ASSEMBLY__ + +#include <linux/types.h> +#include <asm/bitsperlong.h> +#include <asm/ptrace.h> + +#define __KVM_HAVE_IRQ_LINE +#define __KVM_HAVE_READONLY_MEM + +#define KVM_COALESCED_MMIO_PAGE_OFFSET 1 + +#define KVM_INTERRUPT_SET	-1U +#define KVM_INTERRUPT_UNSET	-2U + +/* for KVM_GET_REGS and KVM_SET_REGS */ +struct kvm_regs { +}; + +/* for KVM_GET_FPU and KVM_SET_FPU */ +struct kvm_fpu { +}; + +/* KVM Debug exit structure */ +struct kvm_debug_exit_arch { +}; + +/* for KVM_SET_GUEST_DEBUG */ +struct kvm_guest_debug_arch { +}; + +/* definition of registers in kvm_run */ +struct kvm_sync_regs { +}; + +/* for KVM_GET_SREGS and KVM_SET_SREGS */ +struct kvm_sregs { +}; + +/* CONFIG registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */ +struct kvm_riscv_config { +	unsigned long isa; +	unsigned long zicbom_block_size; +	unsigned long mvendorid; +	unsigned long marchid; +	unsigned long mimpid; +	unsigned long zicboz_block_size; +	unsigned long satp_mode; +}; + +/* CORE registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */ +struct kvm_riscv_core { +	struct user_regs_struct regs; +	unsigned long mode; +}; + +/* Possible privilege modes for kvm_riscv_core */ +#define KVM_RISCV_MODE_S	1 +#define KVM_RISCV_MODE_U	0 + +/* General CSR registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */ +struct kvm_riscv_csr { +	unsigned long sstatus; +	unsigned long sie; +	unsigned long stvec; +	unsigned long sscratch; +	unsigned long sepc; +	unsigned long scause; +	unsigned long stval; +	unsigned long sip; +	unsigned long satp; +	unsigned long scounteren; +	unsigned long senvcfg; +}; + +/* AIA CSR registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */ +struct kvm_riscv_aia_csr { +	unsigned long siselect; +	unsigned long iprio1; +	unsigned long iprio2; +	unsigned long sieh; +	unsigned long siph; +	unsigned long iprio1h; +	unsigned long iprio2h; +}; + +/* Smstateen CSR for KVM_GET_ONE_REG and KVM_SET_ONE_REG */ +struct kvm_riscv_smstateen_csr { +	unsigned long sstateen0; +}; + +/* TIMER registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */ +struct kvm_riscv_timer { +	__u64 frequency; +	__u64 time; +	__u64 compare; +	__u64 state; +}; + +/* + * ISA extension IDs specific to KVM. This is not the same as the host ISA + * extension IDs as that is internal to the host and should not be exposed + * to the guest. This should always be contiguous to keep the mapping simple + * in KVM implementation. + */ +enum KVM_RISCV_ISA_EXT_ID { +	KVM_RISCV_ISA_EXT_A = 0, +	KVM_RISCV_ISA_EXT_C, +	KVM_RISCV_ISA_EXT_D, +	KVM_RISCV_ISA_EXT_F, +	KVM_RISCV_ISA_EXT_H, +	KVM_RISCV_ISA_EXT_I, +	KVM_RISCV_ISA_EXT_M, +	KVM_RISCV_ISA_EXT_SVPBMT, +	KVM_RISCV_ISA_EXT_SSTC, +	KVM_RISCV_ISA_EXT_SVINVAL, +	KVM_RISCV_ISA_EXT_ZIHINTPAUSE, +	KVM_RISCV_ISA_EXT_ZICBOM, +	KVM_RISCV_ISA_EXT_ZICBOZ, +	KVM_RISCV_ISA_EXT_ZBB, +	KVM_RISCV_ISA_EXT_SSAIA, +	KVM_RISCV_ISA_EXT_V, +	KVM_RISCV_ISA_EXT_SVNAPOT, +	KVM_RISCV_ISA_EXT_ZBA, +	KVM_RISCV_ISA_EXT_ZBS, +	KVM_RISCV_ISA_EXT_ZICNTR, +	KVM_RISCV_ISA_EXT_ZICSR, +	KVM_RISCV_ISA_EXT_ZIFENCEI, +	KVM_RISCV_ISA_EXT_ZIHPM, +	KVM_RISCV_ISA_EXT_SMSTATEEN, +	KVM_RISCV_ISA_EXT_ZICOND, +	KVM_RISCV_ISA_EXT_MAX, +}; + +/* + * SBI extension IDs specific to KVM. This is not the same as the SBI + * extension IDs defined by the RISC-V SBI specification. + */ +enum KVM_RISCV_SBI_EXT_ID { +	KVM_RISCV_SBI_EXT_V01 = 0, +	KVM_RISCV_SBI_EXT_TIME, +	KVM_RISCV_SBI_EXT_IPI, +	KVM_RISCV_SBI_EXT_RFENCE, +	KVM_RISCV_SBI_EXT_SRST, +	KVM_RISCV_SBI_EXT_HSM, +	KVM_RISCV_SBI_EXT_PMU, +	KVM_RISCV_SBI_EXT_EXPERIMENTAL, +	KVM_RISCV_SBI_EXT_VENDOR, +	KVM_RISCV_SBI_EXT_DBCN, +	KVM_RISCV_SBI_EXT_MAX, +}; + +/* Possible states for kvm_riscv_timer */ +#define KVM_RISCV_TIMER_STATE_OFF	0 +#define KVM_RISCV_TIMER_STATE_ON	1 + +#define KVM_REG_SIZE(id)		\ +	(1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT)) + +/* If you need to interpret the index values, here is the key: */ +#define KVM_REG_RISCV_TYPE_MASK		0x00000000FF000000 +#define KVM_REG_RISCV_TYPE_SHIFT	24 +#define KVM_REG_RISCV_SUBTYPE_MASK	0x0000000000FF0000 +#define KVM_REG_RISCV_SUBTYPE_SHIFT	16 + +/* Config registers are mapped as type 1 */ +#define KVM_REG_RISCV_CONFIG		(0x01 << KVM_REG_RISCV_TYPE_SHIFT) +#define KVM_REG_RISCV_CONFIG_REG(name)	\ +	(offsetof(struct kvm_riscv_config, name) / sizeof(unsigned long)) + +/* Core registers are mapped as type 2 */ +#define KVM_REG_RISCV_CORE		(0x02 << KVM_REG_RISCV_TYPE_SHIFT) +#define KVM_REG_RISCV_CORE_REG(name)	\ +		(offsetof(struct kvm_riscv_core, name) / sizeof(unsigned long)) + +/* Control and status registers are mapped as type 3 */ +#define KVM_REG_RISCV_CSR		(0x03 << KVM_REG_RISCV_TYPE_SHIFT) +#define KVM_REG_RISCV_CSR_GENERAL	(0x0 << KVM_REG_RISCV_SUBTYPE_SHIFT) +#define KVM_REG_RISCV_CSR_AIA		(0x1 << KVM_REG_RISCV_SUBTYPE_SHIFT) +#define KVM_REG_RISCV_CSR_SMSTATEEN	(0x2 << KVM_REG_RISCV_SUBTYPE_SHIFT) +#define KVM_REG_RISCV_CSR_REG(name)	\ +		(offsetof(struct kvm_riscv_csr, name) / sizeof(unsigned long)) +#define KVM_REG_RISCV_CSR_AIA_REG(name)	\ +	(offsetof(struct kvm_riscv_aia_csr, name) / sizeof(unsigned long)) +#define KVM_REG_RISCV_CSR_SMSTATEEN_REG(name)  \ +	(offsetof(struct kvm_riscv_smstateen_csr, name) / sizeof(unsigned long)) + +/* Timer registers are mapped as type 4 */ +#define KVM_REG_RISCV_TIMER		(0x04 << KVM_REG_RISCV_TYPE_SHIFT) +#define KVM_REG_RISCV_TIMER_REG(name)	\ +		(offsetof(struct kvm_riscv_timer, name) / sizeof(__u64)) + +/* F extension registers are mapped as type 5 */ +#define KVM_REG_RISCV_FP_F		(0x05 << KVM_REG_RISCV_TYPE_SHIFT) +#define KVM_REG_RISCV_FP_F_REG(name)	\ +		(offsetof(struct __riscv_f_ext_state, name) / sizeof(__u32)) + +/* D extension registers are mapped as type 6 */ +#define KVM_REG_RISCV_FP_D		(0x06 << KVM_REG_RISCV_TYPE_SHIFT) +#define KVM_REG_RISCV_FP_D_REG(name)	\ +		(offsetof(struct __riscv_d_ext_state, name) / sizeof(__u64)) + +/* ISA Extension registers are mapped as type 7 */ +#define KVM_REG_RISCV_ISA_EXT		(0x07 << KVM_REG_RISCV_TYPE_SHIFT) +#define KVM_REG_RISCV_ISA_SINGLE	(0x0 << KVM_REG_RISCV_SUBTYPE_SHIFT) +#define KVM_REG_RISCV_ISA_MULTI_EN	(0x1 << KVM_REG_RISCV_SUBTYPE_SHIFT) +#define KVM_REG_RISCV_ISA_MULTI_DIS	(0x2 << KVM_REG_RISCV_SUBTYPE_SHIFT) +#define KVM_REG_RISCV_ISA_MULTI_REG(__ext_id)	\ +		((__ext_id) / __BITS_PER_LONG) +#define KVM_REG_RISCV_ISA_MULTI_MASK(__ext_id)	\ +		(1UL << ((__ext_id) % __BITS_PER_LONG)) +#define KVM_REG_RISCV_ISA_MULTI_REG_LAST	\ +		KVM_REG_RISCV_ISA_MULTI_REG(KVM_RISCV_ISA_EXT_MAX - 1) + +/* SBI extension registers are mapped as type 8 */ +#define KVM_REG_RISCV_SBI_EXT		(0x08 << KVM_REG_RISCV_TYPE_SHIFT) +#define KVM_REG_RISCV_SBI_SINGLE	(0x0 << KVM_REG_RISCV_SUBTYPE_SHIFT) +#define KVM_REG_RISCV_SBI_MULTI_EN	(0x1 << KVM_REG_RISCV_SUBTYPE_SHIFT) +#define KVM_REG_RISCV_SBI_MULTI_DIS	(0x2 << KVM_REG_RISCV_SUBTYPE_SHIFT) +#define KVM_REG_RISCV_SBI_MULTI_REG(__ext_id)	\ +		((__ext_id) / __BITS_PER_LONG) +#define KVM_REG_RISCV_SBI_MULTI_MASK(__ext_id)	\ +		(1UL << ((__ext_id) % __BITS_PER_LONG)) +#define KVM_REG_RISCV_SBI_MULTI_REG_LAST	\ +		KVM_REG_RISCV_SBI_MULTI_REG(KVM_RISCV_SBI_EXT_MAX - 1) + +/* V extension registers are mapped as type 9 */ +#define KVM_REG_RISCV_VECTOR		(0x09 << KVM_REG_RISCV_TYPE_SHIFT) +#define KVM_REG_RISCV_VECTOR_CSR_REG(name)	\ +		(offsetof(struct __riscv_v_ext_state, name) / sizeof(unsigned long)) +#define KVM_REG_RISCV_VECTOR_REG(n)	\ +		((n) + sizeof(struct __riscv_v_ext_state) / sizeof(unsigned long)) + +/* Device Control API: RISC-V AIA */ +#define KVM_DEV_RISCV_APLIC_ALIGN		0x1000 +#define KVM_DEV_RISCV_APLIC_SIZE		0x4000 +#define KVM_DEV_RISCV_APLIC_MAX_HARTS		0x4000 +#define KVM_DEV_RISCV_IMSIC_ALIGN		0x1000 +#define KVM_DEV_RISCV_IMSIC_SIZE		0x1000 + +#define KVM_DEV_RISCV_AIA_GRP_CONFIG		0 +#define KVM_DEV_RISCV_AIA_CONFIG_MODE		0 +#define KVM_DEV_RISCV_AIA_CONFIG_IDS		1 +#define KVM_DEV_RISCV_AIA_CONFIG_SRCS		2 +#define KVM_DEV_RISCV_AIA_CONFIG_GROUP_BITS	3 +#define KVM_DEV_RISCV_AIA_CONFIG_GROUP_SHIFT	4 +#define KVM_DEV_RISCV_AIA_CONFIG_HART_BITS	5 +#define KVM_DEV_RISCV_AIA_CONFIG_GUEST_BITS	6 + +/* + * Modes of RISC-V AIA device: + * 1) EMUL (aka Emulation): Trap-n-emulate IMSIC + * 2) HWACCEL (aka HW Acceleration): Virtualize IMSIC using IMSIC guest files + * 3) AUTO (aka Automatic): Virtualize IMSIC using IMSIC guest files whenever + *    available otherwise fallback to trap-n-emulation + */ +#define KVM_DEV_RISCV_AIA_MODE_EMUL		0 +#define KVM_DEV_RISCV_AIA_MODE_HWACCEL		1 +#define KVM_DEV_RISCV_AIA_MODE_AUTO		2 + +#define KVM_DEV_RISCV_AIA_IDS_MIN		63 +#define KVM_DEV_RISCV_AIA_IDS_MAX		2048 +#define KVM_DEV_RISCV_AIA_SRCS_MAX		1024 +#define KVM_DEV_RISCV_AIA_GROUP_BITS_MAX	8 +#define KVM_DEV_RISCV_AIA_GROUP_SHIFT_MIN	24 +#define KVM_DEV_RISCV_AIA_GROUP_SHIFT_MAX	56 +#define KVM_DEV_RISCV_AIA_HART_BITS_MAX		16 +#define KVM_DEV_RISCV_AIA_GUEST_BITS_MAX	8 + +#define KVM_DEV_RISCV_AIA_GRP_ADDR		1 +#define KVM_DEV_RISCV_AIA_ADDR_APLIC		0 +#define KVM_DEV_RISCV_AIA_ADDR_IMSIC(__vcpu)	(1 + (__vcpu)) +#define KVM_DEV_RISCV_AIA_ADDR_MAX		\ +		(1 + KVM_DEV_RISCV_APLIC_MAX_HARTS) + +#define KVM_DEV_RISCV_AIA_GRP_CTRL		2 +#define KVM_DEV_RISCV_AIA_CTRL_INIT		0 + +/* + * The device attribute type contains the memory mapped offset of the + * APLIC register (range 0x0000-0x3FFF) and it must be 4-byte aligned. + */ +#define KVM_DEV_RISCV_AIA_GRP_APLIC		3 + +/* + * The lower 12-bits of the device attribute type contains the iselect + * value of the IMSIC register (range 0x70-0xFF) whereas the higher order + * bits contains the VCPU id. + */ +#define KVM_DEV_RISCV_AIA_GRP_IMSIC		4 +#define KVM_DEV_RISCV_AIA_IMSIC_ISEL_BITS	12 +#define KVM_DEV_RISCV_AIA_IMSIC_ISEL_MASK	\ +		((1U << KVM_DEV_RISCV_AIA_IMSIC_ISEL_BITS) - 1) +#define KVM_DEV_RISCV_AIA_IMSIC_MKATTR(__vcpu, __isel)	\ +		(((__vcpu) << KVM_DEV_RISCV_AIA_IMSIC_ISEL_BITS) | \ +		 ((__isel) & KVM_DEV_RISCV_AIA_IMSIC_ISEL_MASK)) +#define KVM_DEV_RISCV_AIA_IMSIC_GET_ISEL(__attr)	\ +		((__attr) & KVM_DEV_RISCV_AIA_IMSIC_ISEL_MASK) +#define KVM_DEV_RISCV_AIA_IMSIC_GET_VCPU(__attr)	\ +		((__attr) >> KVM_DEV_RISCV_AIA_IMSIC_ISEL_BITS) + +/* One single KVM irqchip, ie. the AIA */ +#define KVM_NR_IRQCHIPS			1 + +#endif + +#endif /* __LINUX_KVM_RISCV_H */ diff --git a/riscv/include/uapi/asm/perf_regs.h b/riscv/include/uapi/asm/perf_regs.h new file mode 100644 index 0000000..196f964 --- /dev/null +++ b/riscv/include/uapi/asm/perf_regs.h @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd. */ + +#ifndef _ASM_RISCV_PERF_REGS_H +#define _ASM_RISCV_PERF_REGS_H + +enum perf_event_riscv_regs { +	PERF_REG_RISCV_PC, +	PERF_REG_RISCV_RA, +	PERF_REG_RISCV_SP, +	PERF_REG_RISCV_GP, +	PERF_REG_RISCV_TP, +	PERF_REG_RISCV_T0, +	PERF_REG_RISCV_T1, +	PERF_REG_RISCV_T2, +	PERF_REG_RISCV_S0, +	PERF_REG_RISCV_S1, +	PERF_REG_RISCV_A0, +	PERF_REG_RISCV_A1, +	PERF_REG_RISCV_A2, +	PERF_REG_RISCV_A3, +	PERF_REG_RISCV_A4, +	PERF_REG_RISCV_A5, +	PERF_REG_RISCV_A6, +	PERF_REG_RISCV_A7, +	PERF_REG_RISCV_S2, +	PERF_REG_RISCV_S3, +	PERF_REG_RISCV_S4, +	PERF_REG_RISCV_S5, +	PERF_REG_RISCV_S6, +	PERF_REG_RISCV_S7, +	PERF_REG_RISCV_S8, +	PERF_REG_RISCV_S9, +	PERF_REG_RISCV_S10, +	PERF_REG_RISCV_S11, +	PERF_REG_RISCV_T3, +	PERF_REG_RISCV_T4, +	PERF_REG_RISCV_T5, +	PERF_REG_RISCV_T6, +	PERF_REG_RISCV_MAX, +}; +#endif /* _ASM_RISCV_PERF_REGS_H */ diff --git a/riscv/include/uapi/asm/ptrace.h b/riscv/include/uapi/asm/ptrace.h new file mode 100644 index 0000000..a38268b --- /dev/null +++ b/riscv/include/uapi/asm/ptrace.h @@ -0,0 +1,132 @@ +/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ +/* + * Copyright (C) 2012 Regents of the University of California + */ + +#ifndef _UAPI_ASM_RISCV_PTRACE_H +#define _UAPI_ASM_RISCV_PTRACE_H + +#ifndef __ASSEMBLY__ + +#include <linux/types.h> + +#define PTRACE_GETFDPIC		33 + +#define PTRACE_GETFDPIC_EXEC	0 +#define PTRACE_GETFDPIC_INTERP	1 + +/* + * User-mode register state for core dumps, ptrace, sigcontext + * + * This decouples struct pt_regs from the userspace ABI. + * struct user_regs_struct must form a prefix of struct pt_regs. + */ +struct user_regs_struct { +	unsigned long pc; +	unsigned long ra; +	unsigned long sp; +	unsigned long gp; +	unsigned long tp; +	unsigned long t0; +	unsigned long t1; +	unsigned long t2; +	unsigned long s0; +	unsigned long s1; +	unsigned long a0; +	unsigned long a1; +	unsigned long a2; +	unsigned long a3; +	unsigned long a4; +	unsigned long a5; +	unsigned long a6; +	unsigned long a7; +	unsigned long s2; +	unsigned long s3; +	unsigned long s4; +	unsigned long s5; +	unsigned long s6; +	unsigned long s7; +	unsigned long s8; +	unsigned long s9; +	unsigned long s10; +	unsigned long s11; +	unsigned long t3; +	unsigned long t4; +	unsigned long t5; +	unsigned long t6; +}; + +struct __riscv_f_ext_state { +	__u32 f[32]; +	__u32 fcsr; +}; + +struct __riscv_d_ext_state { +	__u64 f[32]; +	__u32 fcsr; +}; + +struct __riscv_q_ext_state { +	__u64 f[64] __attribute__((aligned(16))); +	__u32 fcsr; +	/* +	 * Reserved for expansion of sigcontext structure.  Currently zeroed +	 * upon signal, and must be zero upon sigreturn. +	 */ +	__u32 reserved[3]; +}; + +struct __riscv_ctx_hdr { +	__u32 magic; +	__u32 size; +}; + +struct __riscv_extra_ext_header { +	__u32 __padding[129] __attribute__((aligned(16))); +	/* +	 * Reserved for expansion of sigcontext structure.  Currently zeroed +	 * upon signal, and must be zero upon sigreturn. +	 */ +	__u32 reserved; +	struct __riscv_ctx_hdr hdr; +}; + +union __riscv_fp_state { +	struct __riscv_f_ext_state f; +	struct __riscv_d_ext_state d; +	struct __riscv_q_ext_state q; +}; + +struct __riscv_v_ext_state { +	unsigned long vstart; +	unsigned long vl; +	unsigned long vtype; +	unsigned long vcsr; +	unsigned long vlenb; +	void *datap; +	/* +	 * In signal handler, datap will be set a correct user stack offset +	 * and vector registers will be copied to the address of datap +	 * pointer. +	 */ +}; + +struct __riscv_v_regset_state { +	unsigned long vstart; +	unsigned long vl; +	unsigned long vtype; +	unsigned long vcsr; +	unsigned long vlenb; +	char vreg[]; +}; + +/* + * According to spec: The number of bits in a single vector register, + * VLEN >= ELEN, which must be a power of 2, and must be no greater than + * 2^16 = 65536bits = 8192bytes + */ +#define RISCV_MAX_VLENB (8192) + +#endif /* __ASSEMBLY__ */ + +#endif /* _UAPI_ASM_RISCV_PTRACE_H */ diff --git a/riscv/include/uapi/asm/setup.h b/riscv/include/uapi/asm/setup.h new file mode 100644 index 0000000..66b13a5 --- /dev/null +++ b/riscv/include/uapi/asm/setup.h @@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ + +#ifndef _UAPI_ASM_RISCV_SETUP_H +#define _UAPI_ASM_RISCV_SETUP_H + +#define COMMAND_LINE_SIZE	1024 + +#endif /* _UAPI_ASM_RISCV_SETUP_H */ diff --git a/riscv/include/uapi/asm/sigcontext.h b/riscv/include/uapi/asm/sigcontext.h new file mode 100644 index 0000000..cd4f175 --- /dev/null +++ b/riscv/include/uapi/asm/sigcontext.h @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ +/* + * Copyright (C) 2012 Regents of the University of California + */ + +#ifndef _UAPI_ASM_RISCV_SIGCONTEXT_H +#define _UAPI_ASM_RISCV_SIGCONTEXT_H + +#include <asm/ptrace.h> + +/* The Magic number for signal context frame header. */ +#define RISCV_V_MAGIC	0x53465457 +#define END_MAGIC	0x0 + +/* The size of END signal context header. */ +#define END_HDR_SIZE	0x0 + +#ifndef __ASSEMBLY__ + +struct __sc_riscv_v_state { +	struct __riscv_v_ext_state v_state; +} __attribute__((aligned(16))); + +/* + * Signal context structure + * + * This contains the context saved before a signal handler is invoked; + * it is restored by sys_rt_sigreturn. + */ +struct sigcontext { +	struct user_regs_struct sc_regs; +	union { +		union __riscv_fp_state sc_fpregs; +		struct __riscv_extra_ext_header sc_extdesc; +	}; +}; + +#endif /*!__ASSEMBLY__*/ + +#endif /* _UAPI_ASM_RISCV_SIGCONTEXT_H */ diff --git a/riscv/include/uapi/asm/ucontext.h b/riscv/include/uapi/asm/ucontext.h new file mode 100644 index 0000000..516bd0b --- /dev/null +++ b/riscv/include/uapi/asm/ucontext.h @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ +/* + * Copyright (C) 2012 ARM Ltd. + * Copyright (C) 2017 SiFive, Inc. + * + * This file was copied from arch/arm64/include/uapi/asm/ucontext.h + */ +#ifndef _UAPI_ASM_RISCV_UCONTEXT_H +#define _UAPI_ASM_RISCV_UCONTEXT_H + +#include <linux/types.h> + +struct ucontext { +	unsigned long	  uc_flags; +	struct ucontext	 *uc_link; +	stack_t		  uc_stack; +	sigset_t	  uc_sigmask; +	/* +	 * There's some padding here to allow sigset_t to be expanded in the +	 * future.  Though this is unlikely, other architectures put uc_sigmask +	 * at the end of this structure and explicitly state it can be +	 * expanded, so we didn't want to box ourselves in here. +	 */ +	__u8		  __unused[1024 / 8 - sizeof(sigset_t)]; +	/* +	 * We can't put uc_sigmask at the end of this structure because we need +	 * to be able to expand sigcontext in the future.  For example, the +	 * vector ISA extension will almost certainly add ISA state.  We want +	 * to ensure all user-visible ISA state can be saved and restored via a +	 * ucontext, so we're putting this at the end in order to allow for +	 * infinite extensibility.  Since we know this will be extended and we +	 * assume sigset_t won't be extended an extreme amount, we're +	 * prioritizing this. +	 */ +	struct sigcontext uc_mcontext; +}; + +#endif /* _UAPI_ASM_RISCV_UCONTEXT_H */ diff --git a/riscv/include/uapi/asm/unistd.h b/riscv/include/uapi/asm/unistd.h new file mode 100644 index 0000000..950ab3f --- /dev/null +++ b/riscv/include/uapi/asm/unistd.h @@ -0,0 +1,54 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * Copyright (C) 2018 David Abdurachmanov <david.abdurachmanov@gmail.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <https://www.gnu.org/licenses/>. + */ + +#if defined(__LP64__) && !defined(__SYSCALL_COMPAT) +#define __ARCH_WANT_NEW_STAT +#define __ARCH_WANT_SET_GET_RLIMIT +#endif /* __LP64__ */ + +#define __ARCH_WANT_SYS_CLONE3 +#define __ARCH_WANT_MEMFD_SECRET + +#include <asm-generic/unistd.h> + +/* + * Allows the instruction cache to be flushed from userspace.  Despite RISC-V + * having a direct 'fence.i' instruction available to userspace (which we + * can't trap!), that's not actually viable when running on Linux because the + * kernel might schedule a process on another hart.  There is no way for + * userspace to handle this without invoking the kernel (as it doesn't know the + * thread->hart mappings), so we've defined a RISC-V specific system call to + * flush the instruction cache. + * + * __NR_riscv_flush_icache is defined to flush the instruction cache over an + * address range, with the flush applying to either all threads or just the + * caller.  We don't currently do anything with the address range, that's just + * in there for forwards compatibility. + */ +#ifndef __NR_riscv_flush_icache +#define __NR_riscv_flush_icache (__NR_arch_specific_syscall + 15) +#endif +__SYSCALL(__NR_riscv_flush_icache, sys_riscv_flush_icache) + +/* + * Allows userspace to query the kernel for CPU architecture and + * microarchitecture details across a given set of CPUs. + */ +#ifndef __NR_riscv_hwprobe +#define __NR_riscv_hwprobe (__NR_arch_specific_syscall + 14) +#endif +__SYSCALL(__NR_riscv_hwprobe, sys_riscv_hwprobe) | 
