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