-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
KVM: ARM: Initial skeleton to compile KVM support
Targets KVM support for Cortex A-15 processors. Contains all the framework components, make files, header files, some tracing functionality, and basic user space API. Only supported core is Cortex-A15 for now. Most functionality is in arch/arm/kvm/* or arch/arm/include/asm/kvm_*.h. Reviewed-by: Will Deacon <will.deacon@arm.com> Reviewed-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Christoffer Dall <c.dall@virtualopensystems.com>
- Loading branch information
Christoffer Dall
committed
Jan 23, 2013
1 parent
9e9a367
commit 749cf76
Showing
21 changed files
with
1,445 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2322,3 +2322,5 @@ source "security/Kconfig" | |
source "crypto/Kconfig" | ||
|
||
source "lib/Kconfig" | ||
|
||
source "arch/arm/kvm/Kconfig" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
/* | ||
* Copyright (C) 2012 - Virtual Open Systems and Columbia University | ||
* Author: Christoffer Dall <c.dall@virtualopensystems.com> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License, version 2, as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||
*/ | ||
|
||
#ifndef __ARM_KVM_ARM_H__ | ||
#define __ARM_KVM_ARM_H__ | ||
|
||
#include <linux/types.h> | ||
|
||
#endif /* __ARM_KVM_ARM_H__ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
/* | ||
* Copyright (C) 2012 - Virtual Open Systems and Columbia University | ||
* Author: Christoffer Dall <c.dall@virtualopensystems.com> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License, version 2, as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||
*/ | ||
|
||
#ifndef __ARM_KVM_ASM_H__ | ||
#define __ARM_KVM_ASM_H__ | ||
|
||
/* 0 is reserved as an invalid value. */ | ||
#define c0_MPIDR 1 /* MultiProcessor ID Register */ | ||
#define c0_CSSELR 2 /* Cache Size Selection Register */ | ||
#define c1_SCTLR 3 /* System Control Register */ | ||
#define c1_ACTLR 4 /* Auxilliary Control Register */ | ||
#define c1_CPACR 5 /* Coprocessor Access Control */ | ||
#define c2_TTBR0 6 /* Translation Table Base Register 0 */ | ||
#define c2_TTBR0_high 7 /* TTBR0 top 32 bits */ | ||
#define c2_TTBR1 8 /* Translation Table Base Register 1 */ | ||
#define c2_TTBR1_high 9 /* TTBR1 top 32 bits */ | ||
#define c2_TTBCR 10 /* Translation Table Base Control R. */ | ||
#define c3_DACR 11 /* Domain Access Control Register */ | ||
#define c5_DFSR 12 /* Data Fault Status Register */ | ||
#define c5_IFSR 13 /* Instruction Fault Status Register */ | ||
#define c5_ADFSR 14 /* Auxilary Data Fault Status R */ | ||
#define c5_AIFSR 15 /* Auxilary Instrunction Fault Status R */ | ||
#define c6_DFAR 16 /* Data Fault Address Register */ | ||
#define c6_IFAR 17 /* Instruction Fault Address Register */ | ||
#define c9_L2CTLR 18 /* Cortex A15 L2 Control Register */ | ||
#define c10_PRRR 19 /* Primary Region Remap Register */ | ||
#define c10_NMRR 20 /* Normal Memory Remap Register */ | ||
#define c12_VBAR 21 /* Vector Base Address Register */ | ||
#define c13_CID 22 /* Context ID Register */ | ||
#define c13_TID_URW 23 /* Thread ID, User R/W */ | ||
#define c13_TID_URO 24 /* Thread ID, User R/O */ | ||
#define c13_TID_PRIV 25 /* Thread ID, Privileged */ | ||
#define NR_CP15_REGS 26 /* Number of regs (incl. invalid) */ | ||
|
||
#define ARM_EXCEPTION_RESET 0 | ||
#define ARM_EXCEPTION_UNDEFINED 1 | ||
#define ARM_EXCEPTION_SOFTWARE 2 | ||
#define ARM_EXCEPTION_PREF_ABORT 3 | ||
#define ARM_EXCEPTION_DATA_ABORT 4 | ||
#define ARM_EXCEPTION_IRQ 5 | ||
#define ARM_EXCEPTION_FIQ 6 | ||
|
||
#endif /* __ARM_KVM_ASM_H__ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
/* | ||
* Copyright (C) 2012 Rusty Russell IBM Corporation | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License, version 2, as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||
*/ | ||
|
||
#ifndef __ARM_KVM_COPROC_H__ | ||
#define __ARM_KVM_COPROC_H__ | ||
#include <linux/kvm_host.h> | ||
|
||
void kvm_reset_coprocs(struct kvm_vcpu *vcpu); | ||
|
||
#endif /* __ARM_KVM_COPROC_H__ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
/* | ||
* Copyright (C) 2012 - Virtual Open Systems and Columbia University | ||
* Author: Christoffer Dall <c.dall@virtualopensystems.com> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License, version 2, as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||
*/ | ||
|
||
#ifndef __ARM_KVM_EMULATE_H__ | ||
#define __ARM_KVM_EMULATE_H__ | ||
|
||
#include <linux/kvm_host.h> | ||
#include <asm/kvm_asm.h> | ||
|
||
u32 *vcpu_reg(struct kvm_vcpu *vcpu, u8 reg_num); | ||
u32 *vcpu_spsr(struct kvm_vcpu *vcpu); | ||
|
||
static inline u32 *vcpu_pc(struct kvm_vcpu *vcpu) | ||
{ | ||
return (u32 *)&vcpu->arch.regs.usr_regs.ARM_pc; | ||
} | ||
|
||
static inline u32 *vcpu_cpsr(struct kvm_vcpu *vcpu) | ||
{ | ||
return (u32 *)&vcpu->arch.regs.usr_regs.ARM_cpsr; | ||
} | ||
|
||
static inline bool mode_has_spsr(struct kvm_vcpu *vcpu) | ||
{ | ||
unsigned long cpsr_mode = vcpu->arch.regs.usr_regs.ARM_cpsr & MODE_MASK; | ||
return (cpsr_mode > USR_MODE && cpsr_mode < SYSTEM_MODE); | ||
} | ||
|
||
static inline bool vcpu_mode_priv(struct kvm_vcpu *vcpu) | ||
{ | ||
unsigned long cpsr_mode = vcpu->arch.regs.usr_regs.ARM_cpsr & MODE_MASK; | ||
return cpsr_mode > USR_MODE;; | ||
} | ||
|
||
#endif /* __ARM_KVM_EMULATE_H__ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
/* | ||
* Copyright (C) 2012 - Virtual Open Systems and Columbia University | ||
* Author: Christoffer Dall <c.dall@virtualopensystems.com> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License, version 2, as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||
*/ | ||
|
||
#ifndef __ARM_KVM_HOST_H__ | ||
#define __ARM_KVM_HOST_H__ | ||
|
||
#include <asm/kvm.h> | ||
#include <asm/kvm_asm.h> | ||
|
||
#define KVM_MAX_VCPUS CONFIG_KVM_ARM_MAX_VCPUS | ||
#define KVM_MEMORY_SLOTS 32 | ||
#define KVM_PRIVATE_MEM_SLOTS 4 | ||
#define KVM_COALESCED_MMIO_PAGE_OFFSET 1 | ||
|
||
#define KVM_VCPU_MAX_FEATURES 0 | ||
|
||
/* We don't currently support large pages. */ | ||
#define KVM_HPAGE_GFN_SHIFT(x) 0 | ||
#define KVM_NR_PAGE_SIZES 1 | ||
#define KVM_PAGES_PER_HPAGE(x) (1UL<<31) | ||
|
||
struct kvm_vcpu; | ||
u32 *kvm_vcpu_reg(struct kvm_vcpu *vcpu, u8 reg_num, u32 mode); | ||
int kvm_target_cpu(void); | ||
int kvm_reset_vcpu(struct kvm_vcpu *vcpu); | ||
void kvm_reset_coprocs(struct kvm_vcpu *vcpu); | ||
|
||
struct kvm_arch { | ||
/* VTTBR value associated with below pgd and vmid */ | ||
u64 vttbr; | ||
|
||
/* | ||
* Anything that is not used directly from assembly code goes | ||
* here. | ||
*/ | ||
|
||
/* The VMID generation used for the virt. memory system */ | ||
u64 vmid_gen; | ||
u32 vmid; | ||
|
||
/* Stage-2 page table */ | ||
pgd_t *pgd; | ||
}; | ||
|
||
#define KVM_NR_MEM_OBJS 40 | ||
|
||
/* | ||
* We don't want allocation failures within the mmu code, so we preallocate | ||
* enough memory for a single page fault in a cache. | ||
*/ | ||
struct kvm_mmu_memory_cache { | ||
int nobjs; | ||
void *objects[KVM_NR_MEM_OBJS]; | ||
}; | ||
|
||
struct kvm_vcpu_arch { | ||
struct kvm_regs regs; | ||
|
||
int target; /* Processor target */ | ||
DECLARE_BITMAP(features, KVM_VCPU_MAX_FEATURES); | ||
|
||
/* System control coprocessor (cp15) */ | ||
u32 cp15[NR_CP15_REGS]; | ||
|
||
/* The CPU type we expose to the VM */ | ||
u32 midr; | ||
|
||
/* Exception Information */ | ||
u32 hsr; /* Hyp Syndrome Register */ | ||
u32 hxfar; /* Hyp Data/Inst Fault Address Register */ | ||
u32 hpfar; /* Hyp IPA Fault Address Register */ | ||
|
||
/* Interrupt related fields */ | ||
u32 irq_lines; /* IRQ and FIQ levels */ | ||
|
||
/* Hyp exception information */ | ||
u32 hyp_pc; /* PC when exception was taken from Hyp mode */ | ||
|
||
/* Cache some mmu pages needed inside spinlock regions */ | ||
struct kvm_mmu_memory_cache mmu_page_cache; | ||
}; | ||
|
||
struct kvm_vm_stat { | ||
u32 remote_tlb_flush; | ||
}; | ||
|
||
struct kvm_vcpu_stat { | ||
u32 halt_wakeup; | ||
}; | ||
|
||
struct kvm_vcpu_init; | ||
int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, | ||
const struct kvm_vcpu_init *init); | ||
unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu); | ||
int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *indices); | ||
struct kvm_one_reg; | ||
int kvm_arm_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg); | ||
int kvm_arm_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg); | ||
#endif /* __ARM_KVM_HOST_H__ */ |
Oops, something went wrong.