1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2/* 3 * Copyright (C) 2020-2023 Loongson Technology Corporation Limited 4 */ 5 6#ifndef __UAPI_ASM_LOONGARCH_KVM_H 7#define __UAPI_ASM_LOONGARCH_KVM_H 8 9#include <linux/types.h> 10 11/* 12 * KVM LoongArch specific structures and definitions. 13 * 14 * Some parts derived from the x86 version of this file. 15 */ 16 17#define KVM_COALESCED_MMIO_PAGE_OFFSET 1 18#define KVM_DIRTY_LOG_PAGE_OFFSET 64 19 20/* 21 * for KVM_GET_REGS and KVM_SET_REGS 22 */ 23struct kvm_regs { 24 /* out (KVM_GET_REGS) / in (KVM_SET_REGS) */ 25 __u64 gpr[32]; 26 __u64 pc; 27}; 28 29/* 30 * for KVM_GET_FPU and KVM_SET_FPU 31 */ 32struct kvm_fpu { 33 __u32 fcsr; 34 __u64 fcc; /* 8x8 */ 35 struct kvm_fpureg { 36 __u64 val64[4]; 37 } fpr[32]; 38}; 39 40/* 41 * For LoongArch, we use KVM_SET_ONE_REG and KVM_GET_ONE_REG to access various 42 * registers. The id field is broken down as follows: 43 * 44 * bits[63..52] - As per linux/kvm.h 45 * bits[51..32] - Must be zero. 46 * bits[31..16] - Register set. 47 * 48 * Register set = 0: GP registers from kvm_regs (see definitions below). 49 * 50 * Register set = 1: CSR registers. 51 * 52 * Register set = 2: KVM specific registers (see definitions below). 53 * 54 * Register set = 3: FPU / SIMD registers (see definitions below). 55 * 56 * Other sets registers may be added in the future. Each set would 57 * have its own identifier in bits[31..16]. 58 */ 59 60#define KVM_REG_LOONGARCH_GPR (KVM_REG_LOONGARCH | 0x00000ULL) 61#define KVM_REG_LOONGARCH_CSR (KVM_REG_LOONGARCH | 0x10000ULL) 62#define KVM_REG_LOONGARCH_KVM (KVM_REG_LOONGARCH | 0x20000ULL) 63#define KVM_REG_LOONGARCH_FPSIMD (KVM_REG_LOONGARCH | 0x30000ULL) 64#define KVM_REG_LOONGARCH_CPUCFG (KVM_REG_LOONGARCH | 0x40000ULL) 65#define KVM_REG_LOONGARCH_MASK (KVM_REG_LOONGARCH | 0x70000ULL) 66#define KVM_CSR_IDX_MASK 0x7fff 67#define KVM_CPUCFG_IDX_MASK 0x7fff 68 69/* 70 * KVM_REG_LOONGARCH_KVM - KVM specific control registers. 71 */ 72 73#define KVM_REG_LOONGARCH_COUNTER (KVM_REG_LOONGARCH_KVM | KVM_REG_SIZE_U64 | 1) 74#define KVM_REG_LOONGARCH_VCPU_RESET (KVM_REG_LOONGARCH_KVM | KVM_REG_SIZE_U64 | 2) 75 76#define LOONGARCH_REG_SHIFT 3 77#define LOONGARCH_REG_64(TYPE, REG) (TYPE | KVM_REG_SIZE_U64 | (REG << LOONGARCH_REG_SHIFT)) 78#define KVM_IOC_CSRID(REG) LOONGARCH_REG_64(KVM_REG_LOONGARCH_CSR, REG) 79#define KVM_IOC_CPUCFG(REG) LOONGARCH_REG_64(KVM_REG_LOONGARCH_CPUCFG, REG) 80#define KVM_LOONGARCH_VCPU_CPUCFG 0 81 82struct kvm_debug_exit_arch { 83}; 84 85/* for KVM_SET_GUEST_DEBUG */ 86struct kvm_guest_debug_arch { 87}; 88 89/* definition of registers in kvm_run */ 90struct kvm_sync_regs { 91}; 92 93/* dummy definition */ 94struct kvm_sregs { 95}; 96 97struct kvm_iocsr_entry { 98 __u32 addr; 99 __u32 pad; 100 __u64 data; 101}; 102 103#define KVM_NR_IRQCHIPS 1 104#define KVM_IRQCHIP_NUM_PINS 64 105#define KVM_MAX_CORES 256 106 107#endif /* __UAPI_ASM_LOONGARCH_KVM_H */ 108