diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2013-10-28 08:15:55 -0400 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2013-10-28 08:15:55 -0400 |
commit | 5bb3398dd2df2c26261b2156c98cf4c95b3f91fe (patch) | |
tree | 526d914e0e1cc62249b4a0d2fea31558cc17fcd7 /arch/arm/include | |
parent | e0230e1327fb862c9b6cde24ae62d55f9db62c9b (diff) | |
parent | 9b5fdb9781f74fb15827e465bfb5aa63211953c8 (diff) |
Merge tag 'kvm-arm-for-3.13-2' of git://git.linaro.org/people/cdall/linux-kvm-arm into kvm-queue
Updates for KVM/ARM, take 2 including:
- Transparent Huge Pages and hugetlbfs support for KVM/ARM
- Yield CPU when guest executes WFE to speed up CPU overcommit
Diffstat (limited to 'arch/arm/include')
-rw-r--r-- | arch/arm/include/asm/kvm_arm.h | 5 | ||||
-rw-r--r-- | arch/arm/include/asm/kvm_mmu.h | 17 | ||||
-rw-r--r-- | arch/arm/include/asm/pgtable-3level.h | 2 |
3 files changed, 20 insertions, 4 deletions
diff --git a/arch/arm/include/asm/kvm_arm.h b/arch/arm/include/asm/kvm_arm.h index d556f03bca17..1d3153c7eb41 100644 --- a/arch/arm/include/asm/kvm_arm.h +++ b/arch/arm/include/asm/kvm_arm.h | |||
@@ -57,6 +57,7 @@ | |||
57 | * TSC: Trap SMC | 57 | * TSC: Trap SMC |
58 | * TSW: Trap cache operations by set/way | 58 | * TSW: Trap cache operations by set/way |
59 | * TWI: Trap WFI | 59 | * TWI: Trap WFI |
60 | * TWE: Trap WFE | ||
60 | * TIDCP: Trap L2CTLR/L2ECTLR | 61 | * TIDCP: Trap L2CTLR/L2ECTLR |
61 | * BSU_IS: Upgrade barriers to the inner shareable domain | 62 | * BSU_IS: Upgrade barriers to the inner shareable domain |
62 | * FB: Force broadcast of all maintainance operations | 63 | * FB: Force broadcast of all maintainance operations |
@@ -67,7 +68,7 @@ | |||
67 | */ | 68 | */ |
68 | #define HCR_GUEST_MASK (HCR_TSC | HCR_TSW | HCR_TWI | HCR_VM | HCR_BSU_IS | \ | 69 | #define HCR_GUEST_MASK (HCR_TSC | HCR_TSW | HCR_TWI | HCR_VM | HCR_BSU_IS | \ |
69 | HCR_FB | HCR_TAC | HCR_AMO | HCR_IMO | HCR_FMO | \ | 70 | HCR_FB | HCR_TAC | HCR_AMO | HCR_IMO | HCR_FMO | \ |
70 | HCR_SWIO | HCR_TIDCP) | 71 | HCR_TWE | HCR_SWIO | HCR_TIDCP) |
71 | #define HCR_VIRT_EXCP_MASK (HCR_VA | HCR_VI | HCR_VF) | 72 | #define HCR_VIRT_EXCP_MASK (HCR_VA | HCR_VI | HCR_VF) |
72 | 73 | ||
73 | /* System Control Register (SCTLR) bits */ | 74 | /* System Control Register (SCTLR) bits */ |
@@ -208,6 +209,8 @@ | |||
208 | #define HSR_EC_DABT (0x24) | 209 | #define HSR_EC_DABT (0x24) |
209 | #define HSR_EC_DABT_HYP (0x25) | 210 | #define HSR_EC_DABT_HYP (0x25) |
210 | 211 | ||
212 | #define HSR_WFI_IS_WFE (1U << 0) | ||
213 | |||
211 | #define HSR_HVC_IMM_MASK ((1UL << 16) - 1) | 214 | #define HSR_HVC_IMM_MASK ((1UL << 16) - 1) |
212 | 215 | ||
213 | #define HSR_DABT_S1PTW (1U << 7) | 216 | #define HSR_DABT_S1PTW (1U << 7) |
diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h index 9b28c41f4ba9..77de4a41cc50 100644 --- a/arch/arm/include/asm/kvm_mmu.h +++ b/arch/arm/include/asm/kvm_mmu.h | |||
@@ -62,6 +62,12 @@ phys_addr_t kvm_get_idmap_vector(void); | |||
62 | int kvm_mmu_init(void); | 62 | int kvm_mmu_init(void); |
63 | void kvm_clear_hyp_idmap(void); | 63 | void kvm_clear_hyp_idmap(void); |
64 | 64 | ||
65 | static inline void kvm_set_pmd(pmd_t *pmd, pmd_t new_pmd) | ||
66 | { | ||
67 | *pmd = new_pmd; | ||
68 | flush_pmd_entry(pmd); | ||
69 | } | ||
70 | |||
65 | static inline void kvm_set_pte(pte_t *pte, pte_t new_pte) | 71 | static inline void kvm_set_pte(pte_t *pte, pte_t new_pte) |
66 | { | 72 | { |
67 | *pte = new_pte; | 73 | *pte = new_pte; |
@@ -103,9 +109,15 @@ static inline void kvm_set_s2pte_writable(pte_t *pte) | |||
103 | pte_val(*pte) |= L_PTE_S2_RDWR; | 109 | pte_val(*pte) |= L_PTE_S2_RDWR; |
104 | } | 110 | } |
105 | 111 | ||
112 | static inline void kvm_set_s2pmd_writable(pmd_t *pmd) | ||
113 | { | ||
114 | pmd_val(*pmd) |= L_PMD_S2_RDWR; | ||
115 | } | ||
116 | |||
106 | struct kvm; | 117 | struct kvm; |
107 | 118 | ||
108 | static inline void coherent_icache_guest_page(struct kvm *kvm, gfn_t gfn) | 119 | static inline void coherent_icache_guest_page(struct kvm *kvm, hva_t hva, |
120 | unsigned long size) | ||
109 | { | 121 | { |
110 | /* | 122 | /* |
111 | * If we are going to insert an instruction page and the icache is | 123 | * If we are going to insert an instruction page and the icache is |
@@ -120,8 +132,7 @@ static inline void coherent_icache_guest_page(struct kvm *kvm, gfn_t gfn) | |||
120 | * need any kind of flushing (DDI 0406C.b - Page B3-1392). | 132 | * need any kind of flushing (DDI 0406C.b - Page B3-1392). |
121 | */ | 133 | */ |
122 | if (icache_is_pipt()) { | 134 | if (icache_is_pipt()) { |
123 | unsigned long hva = gfn_to_hva(kvm, gfn); | 135 | __cpuc_coherent_user_range(hva, hva + size); |
124 | __cpuc_coherent_user_range(hva, hva + PAGE_SIZE); | ||
125 | } else if (!icache_is_vivt_asid_tagged()) { | 136 | } else if (!icache_is_vivt_asid_tagged()) { |
126 | /* any kind of VIPT cache */ | 137 | /* any kind of VIPT cache */ |
127 | __flush_icache_all(); | 138 | __flush_icache_all(); |
diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h index 5689c18c85f5..a331d2527342 100644 --- a/arch/arm/include/asm/pgtable-3level.h +++ b/arch/arm/include/asm/pgtable-3level.h | |||
@@ -126,6 +126,8 @@ | |||
126 | #define L_PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[1] */ | 126 | #define L_PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[1] */ |
127 | #define L_PTE_S2_RDWR (_AT(pteval_t, 3) << 6) /* HAP[2:1] */ | 127 | #define L_PTE_S2_RDWR (_AT(pteval_t, 3) << 6) /* HAP[2:1] */ |
128 | 128 | ||
129 | #define L_PMD_S2_RDWR (_AT(pmdval_t, 3) << 6) /* HAP[2:1] */ | ||
130 | |||
129 | /* | 131 | /* |
130 | * Hyp-mode PL2 PTE definitions for LPAE. | 132 | * Hyp-mode PL2 PTE definitions for LPAE. |
131 | */ | 133 | */ |