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