xref: /qemu/linux-headers/asm-mips/kvm.h (revision c5daeae1b4ddff97d605bd954a7c2a2b2cf6040f)
1e098b453SAlexey Kardashevskiy /*
2e098b453SAlexey Kardashevskiy  * This file is subject to the terms and conditions of the GNU General Public
3e098b453SAlexey Kardashevskiy  * License.  See the file "COPYING" in the main directory of this archive
4e098b453SAlexey Kardashevskiy  * for more details.
5e098b453SAlexey Kardashevskiy  *
6e098b453SAlexey Kardashevskiy  * Copyright (C) 2012  MIPS Technologies, Inc.  All rights reserved.
7e098b453SAlexey Kardashevskiy  * Copyright (C) 2013 Cavium, Inc.
8e098b453SAlexey Kardashevskiy  * Authors: Sanjay Lal <sanjayl@kymasys.com>
9e098b453SAlexey Kardashevskiy  */
10e098b453SAlexey Kardashevskiy 
11e098b453SAlexey Kardashevskiy #ifndef __LINUX_KVM_MIPS_H
12e098b453SAlexey Kardashevskiy #define __LINUX_KVM_MIPS_H
13e098b453SAlexey Kardashevskiy 
14e098b453SAlexey Kardashevskiy #include <linux/types.h>
15e098b453SAlexey Kardashevskiy 
16e098b453SAlexey Kardashevskiy /*
17e098b453SAlexey Kardashevskiy  * KVM MIPS specific structures and definitions.
18e098b453SAlexey Kardashevskiy  *
19e098b453SAlexey Kardashevskiy  * Some parts derived from the x86 version of this file.
20e098b453SAlexey Kardashevskiy  */
21e098b453SAlexey Kardashevskiy 
22e098b453SAlexey Kardashevskiy /*
23e098b453SAlexey Kardashevskiy  * for KVM_GET_REGS and KVM_SET_REGS
24e098b453SAlexey Kardashevskiy  *
25e098b453SAlexey Kardashevskiy  * If Config[AT] is zero (32-bit CPU), the register contents are
26e098b453SAlexey Kardashevskiy  * stored in the lower 32-bits of the struct kvm_regs fields and sign
27e098b453SAlexey Kardashevskiy  * extended to 64-bits.
28e098b453SAlexey Kardashevskiy  */
29e098b453SAlexey Kardashevskiy struct kvm_regs {
30e098b453SAlexey Kardashevskiy 	/* out (KVM_GET_REGS) / in (KVM_SET_REGS) */
31e098b453SAlexey Kardashevskiy 	__u64 gpr[32];
32e098b453SAlexey Kardashevskiy 	__u64 hi;
33e098b453SAlexey Kardashevskiy 	__u64 lo;
34e098b453SAlexey Kardashevskiy 	__u64 pc;
35e098b453SAlexey Kardashevskiy };
36e098b453SAlexey Kardashevskiy 
37e098b453SAlexey Kardashevskiy /*
38e098b453SAlexey Kardashevskiy  * for KVM_GET_FPU and KVM_SET_FPU
39e098b453SAlexey Kardashevskiy  *
40e098b453SAlexey Kardashevskiy  * If Status[FR] is zero (32-bit FPU), the upper 32-bits of the FPRs
41e098b453SAlexey Kardashevskiy  * are zero filled.
42e098b453SAlexey Kardashevskiy  */
43e098b453SAlexey Kardashevskiy struct kvm_fpu {
44e098b453SAlexey Kardashevskiy 	__u64 fpr[32];
45e098b453SAlexey Kardashevskiy 	__u32 fir;
46e098b453SAlexey Kardashevskiy 	__u32 fccr;
47e098b453SAlexey Kardashevskiy 	__u32 fexr;
48e098b453SAlexey Kardashevskiy 	__u32 fenr;
49e098b453SAlexey Kardashevskiy 	__u32 fcsr;
50e098b453SAlexey Kardashevskiy 	__u32 pad;
51e098b453SAlexey Kardashevskiy };
52e098b453SAlexey Kardashevskiy 
53e098b453SAlexey Kardashevskiy 
54e098b453SAlexey Kardashevskiy /*
55e098b453SAlexey Kardashevskiy  * For MIPS, we use KVM_SET_ONE_REG and KVM_GET_ONE_REG to access CP0
56e098b453SAlexey Kardashevskiy  * registers.  The id field is broken down as follows:
57e098b453SAlexey Kardashevskiy  *
58e098b453SAlexey Kardashevskiy  *  bits[2..0]   - Register 'sel' index.
59e098b453SAlexey Kardashevskiy  *  bits[7..3]   - Register 'rd'  index.
60e098b453SAlexey Kardashevskiy  *  bits[15..8]  - Must be zero.
61*c5daeae1SAlexey Kardashevskiy  *  bits[31..16] - 1 -> CP0 registers.
62*c5daeae1SAlexey Kardashevskiy  *  bits[51..32] - Must be zero.
63*c5daeae1SAlexey Kardashevskiy  *  bits[63..52] - As per linux/kvm.h
64e098b453SAlexey Kardashevskiy  *
65e098b453SAlexey Kardashevskiy  * Other sets registers may be added in the future.  Each set would
66*c5daeae1SAlexey Kardashevskiy  * have its own identifier in bits[31..16].
67e098b453SAlexey Kardashevskiy  *
68e098b453SAlexey Kardashevskiy  * The registers defined in struct kvm_regs are also accessible, the
69e098b453SAlexey Kardashevskiy  * id values for these are below.
70e098b453SAlexey Kardashevskiy  */
71e098b453SAlexey Kardashevskiy 
72*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R0 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 0)
73*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R1 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 1)
74*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R2 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 2)
75*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R3 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 3)
76*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R4 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 4)
77*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R5 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 5)
78*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R6 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 6)
79*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R7 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 7)
80*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R8 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 8)
81*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R9 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 9)
82*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R10 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 10)
83*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R11 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 11)
84*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R12 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 12)
85*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R13 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 13)
86*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R14 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 14)
87*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R15 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 15)
88*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R16 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 16)
89*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R17 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 17)
90*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R18 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 18)
91*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R19 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 19)
92*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R20 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 20)
93*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R21 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 21)
94*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R22 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 22)
95*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R23 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 23)
96*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R24 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 24)
97*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R25 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 25)
98*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R26 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 26)
99*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R27 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 27)
100*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R28 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 28)
101*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R29 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 29)
102*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R30 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 30)
103*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_R31 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 31)
104e098b453SAlexey Kardashevskiy 
105*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_HI (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 32)
106*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_LO (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 33)
107*c5daeae1SAlexey Kardashevskiy #define KVM_REG_MIPS_PC (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 34)
108e098b453SAlexey Kardashevskiy 
109e098b453SAlexey Kardashevskiy /*
110e098b453SAlexey Kardashevskiy  * KVM MIPS specific structures and definitions
111e098b453SAlexey Kardashevskiy  *
112e098b453SAlexey Kardashevskiy  */
113e098b453SAlexey Kardashevskiy struct kvm_debug_exit_arch {
114e098b453SAlexey Kardashevskiy 	__u64 epc;
115e098b453SAlexey Kardashevskiy };
116e098b453SAlexey Kardashevskiy 
117e098b453SAlexey Kardashevskiy /* for KVM_SET_GUEST_DEBUG */
118e098b453SAlexey Kardashevskiy struct kvm_guest_debug_arch {
119e098b453SAlexey Kardashevskiy };
120e098b453SAlexey Kardashevskiy 
121e098b453SAlexey Kardashevskiy /* definition of registers in kvm_run */
122e098b453SAlexey Kardashevskiy struct kvm_sync_regs {
123e098b453SAlexey Kardashevskiy };
124e098b453SAlexey Kardashevskiy 
125e098b453SAlexey Kardashevskiy /* dummy definition */
126e098b453SAlexey Kardashevskiy struct kvm_sregs {
127e098b453SAlexey Kardashevskiy };
128e098b453SAlexey Kardashevskiy 
129e098b453SAlexey Kardashevskiy struct kvm_mips_interrupt {
130e098b453SAlexey Kardashevskiy 	/* in */
131e098b453SAlexey Kardashevskiy 	__u32 cpu;
132e098b453SAlexey Kardashevskiy 	__u32 irq;
133e098b453SAlexey Kardashevskiy };
134e098b453SAlexey Kardashevskiy 
135e098b453SAlexey Kardashevskiy #endif /* __LINUX_KVM_MIPS_H */
136