1198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris/*
2198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * This file is subject to the terms and conditions of the GNU General Public
3198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * License.  See the file "COPYING" in the main directory of this archive
4198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * for more details.
5198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris *
6198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * Copyright (C) 2012  MIPS Technologies, Inc.  All rights reserved.
7198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * Copyright (C) 2013 Cavium, Inc.
8198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * Authors: Sanjay Lal <sanjayl@kymasys.com>
9198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris */
10198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris
11198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#ifndef __LINUX_KVM_MIPS_H
12198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define __LINUX_KVM_MIPS_H
13198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris
14198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#include <linux/types.h>
15198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris
16198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris/*
17198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * KVM MIPS specific structures and definitions.
18198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris *
19198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * Some parts derived from the x86 version of this file.
20198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris */
21198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris
22198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris/*
23198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * for KVM_GET_REGS and KVM_SET_REGS
24198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris *
25198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * If Config[AT] is zero (32-bit CPU), the register contents are
26198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * stored in the lower 32-bits of the struct kvm_regs fields and sign
27198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * extended to 64-bits.
28198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris */
29198084289b68143fd4ea72dec91515eec00d700fChristopher Ferrisstruct kvm_regs {
30198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	/* out (KVM_GET_REGS) / in (KVM_SET_REGS) */
31198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	__u64 gpr[32];
32198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	__u64 hi;
33198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	__u64 lo;
34198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	__u64 pc;
35198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris};
36198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris
37198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris/*
38198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * for KVM_GET_FPU and KVM_SET_FPU
39198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris *
40198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * If Status[FR] is zero (32-bit FPU), the upper 32-bits of the FPRs
41198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * are zero filled.
42198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris */
43198084289b68143fd4ea72dec91515eec00d700fChristopher Ferrisstruct kvm_fpu {
44198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	__u64 fpr[32];
45198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	__u32 fir;
46198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	__u32 fccr;
47198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	__u32 fexr;
48198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	__u32 fenr;
49198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	__u32 fcsr;
50198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	__u32 pad;
51198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris};
52198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris
53198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris
54198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris/*
55198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * For MIPS, we use KVM_SET_ONE_REG and KVM_GET_ONE_REG to access CP0
56198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * registers.  The id field is broken down as follows:
57198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris *
58198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris *  bits[2..0]   - Register 'sel' index.
59198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris *  bits[7..3]   - Register 'rd'  index.
60198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris *  bits[15..8]  - Must be zero.
61198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris *  bits[31..16] - 1 -> CP0 registers.
62198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris *  bits[51..32] - Must be zero.
63198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris *  bits[63..52] - As per linux/kvm.h
64198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris *
65198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * Other sets registers may be added in the future.  Each set would
66198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * have its own identifier in bits[31..16].
67198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris *
68198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * The registers defined in struct kvm_regs are also accessible, the
69198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * id values for these are below.
70198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris */
71198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris
72198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R0 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 0)
73198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R1 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 1)
74198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R2 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 2)
75198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R3 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 3)
76198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R4 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 4)
77198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R5 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 5)
78198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R6 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 6)
79198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R7 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 7)
80198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R8 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 8)
81198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R9 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 9)
82198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R10 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 10)
83198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R11 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 11)
84198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R12 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 12)
85198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R13 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 13)
86198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R14 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 14)
87198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R15 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 15)
88198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R16 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 16)
89198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R17 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 17)
90198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R18 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 18)
91198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R19 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 19)
92198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R20 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 20)
93198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R21 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 21)
94198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R22 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 22)
95198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R23 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 23)
96198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R24 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 24)
97198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R25 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 25)
98198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R26 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 26)
99198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R27 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 27)
100198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R28 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 28)
101198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R29 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 29)
102198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R30 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 30)
103198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_R31 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 31)
104198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris
105198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_HI (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 32)
106198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_LO (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 33)
107198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#define KVM_REG_MIPS_PC (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 34)
108198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris
109314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris/* KVM specific control registers */
110314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris
111314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris/*
112314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris * CP0_Count control
113314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris * DC:    Set 0: Master disable CP0_Count and set COUNT_RESUME to now
114314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris *        Set 1: Master re-enable CP0_Count with unchanged bias, handling timer
115314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris *               interrupts since COUNT_RESUME
116314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris *        This can be used to freeze the timer to get a consistent snapshot of
117314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris *        the CP0_Count and timer interrupt pending state, while also resuming
118314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris *        safely without losing time or guest timer interrupts.
119314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris * Other: Reserved, do not change.
120314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris */
121314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris#define KVM_REG_MIPS_COUNT_CTL		(KVM_REG_MIPS | KVM_REG_SIZE_U64 | \
122314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris					 0x20000 | 0)
123314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris#define KVM_REG_MIPS_COUNT_CTL_DC	0x00000001
124314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris
125314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris/*
126314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris * CP0_Count resume monotonic nanoseconds
127314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris * The monotonic nanosecond time of the last set of COUNT_CTL.DC (master
128314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris * disable). Any reads and writes of Count related registers while
129314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris * COUNT_CTL.DC=1 will appear to occur at this time. When COUNT_CTL.DC is
130314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris * cleared again (master enable) any timer interrupts since this time will be
131314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris * emulated.
132314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris * Modifications to times in the future are rejected.
133314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris */
134314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris#define KVM_REG_MIPS_COUNT_RESUME	(KVM_REG_MIPS | KVM_REG_SIZE_U64 | \
135314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris					 0x20000 | 1)
136314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris/*
137314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris * CP0_Count rate in Hz
138314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris * Specifies the rate of the CP0_Count timer in Hz. Modifications occur without
139314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris * discontinuities in CP0_Count.
140314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris */
141314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris#define KVM_REG_MIPS_COUNT_HZ		(KVM_REG_MIPS | KVM_REG_SIZE_U64 | \
142314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris					 0x20000 | 2)
143314752488cb92b9f86028836d0b8eabd8acb6a7cChristopher Ferris
144198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris/*
145198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris * KVM MIPS specific structures and definitions
146198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris *
147198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris */
148198084289b68143fd4ea72dec91515eec00d700fChristopher Ferrisstruct kvm_debug_exit_arch {
149198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	__u64 epc;
150198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris};
151198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris
152198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris/* for KVM_SET_GUEST_DEBUG */
153198084289b68143fd4ea72dec91515eec00d700fChristopher Ferrisstruct kvm_guest_debug_arch {
154198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris};
155198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris
156198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris/* definition of registers in kvm_run */
157198084289b68143fd4ea72dec91515eec00d700fChristopher Ferrisstruct kvm_sync_regs {
158198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris};
159198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris
160198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris/* dummy definition */
161198084289b68143fd4ea72dec91515eec00d700fChristopher Ferrisstruct kvm_sregs {
162198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris};
163198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris
164198084289b68143fd4ea72dec91515eec00d700fChristopher Ferrisstruct kvm_mips_interrupt {
165198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	/* in */
166198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	__u32 cpu;
167198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris	__u32 irq;
168198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris};
169198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris
170198084289b68143fd4ea72dec91515eec00d700fChristopher Ferris#endif /* __LINUX_KVM_MIPS_H */
171