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