diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-05 14:16:12 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-05 14:16:12 -0400 |
commit | 5f3d2f2e1a63679cf1c4a4210f2f1cc2f335bef6 (patch) | |
tree | 9189bd6c81fe5f982a7ae45d2f3d900176658509 /arch/powerpc/kvm | |
parent | 283dbd82055eb70ff3b469f812d9c695f18c9641 (diff) | |
parent | d900bd7366463fd96a907b2c212242e2b68b27d8 (diff) |
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
Pull powerpc updates from Benjamin Herrenschmidt:
"Some highlights in addition to the usual batch of fixes:
- 64TB address space support for 64-bit processes by Aneesh Kumar
- Gavin Shan did a major cleanup & re-organization of our EEH support
code (IBM fancy PCI error handling & recovery infrastructure) which
paves the way for supporting different platform backends, along
with some rework of the PCIe code for the PowerNV platform in order
to remove home made resource allocations and instead use the
generic code (which is possible after some small improvements to it
done by Gavin).
- Uprobes support by Ananth N Mavinakayanahalli
- A pile of embedded updates from Freescale folks, including new SoC
and board supports, more KVM stuff including preparing for 64-bit
BookE KVM support, ePAPR 1.1 updates, etc..."
Fixup trivial conflicts in drivers/scsi/ipr.c
* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (146 commits)
powerpc/iommu: Fix multiple issues with IOMMU pools code
powerpc: Fix VMX fix for memcpy case
driver/mtd:IFC NAND:Initialise internal SRAM before any write
powerpc/fsl-pci: use 'Header Type' to identify PCIE mode
powerpc/eeh: Don't release eeh_mutex in eeh_phb_pe_get
powerpc: Remove tlb batching hack for nighthawk
powerpc: Set paca->data_offset = 0 for boot cpu
powerpc/perf: Sample only if SIAR-Valid bit is set in P7+
powerpc/fsl-pci: fix warning when CONFIG_SWIOTLB is disabled
powerpc/mpc85xx: Update interrupt handling for IFC controller
powerpc/85xx: Enable USB support in p1023rds_defconfig
powerpc/smp: Do not disable IPI interrupts during suspend
powerpc/eeh: Fix crash on converting OF node to edev
powerpc/eeh: Lock module while handling EEH event
powerpc/kprobe: Don't emulate store when kprobe stwu r1
powerpc/kprobe: Complete kprobe and migrate exception frame
powerpc/kprobe: Introduce a new thread flag
powerpc: Remove unused __get_user64() and __put_user64()
powerpc/eeh: Global mutex to protect PE tree
powerpc/eeh: Remove EEH PE for normal PCI hotplug
...
Diffstat (limited to 'arch/powerpc/kvm')
-rw-r--r-- | arch/powerpc/kvm/book3s_32_mmu_host.c | 8 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_64_mmu_host.c | 17 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_hv_rmhandlers.S | 2 | ||||
-rw-r--r-- | arch/powerpc/kvm/trace.h | 14 |
4 files changed, 22 insertions, 19 deletions
diff --git a/arch/powerpc/kvm/book3s_32_mmu_host.c b/arch/powerpc/kvm/book3s_32_mmu_host.c index 837f13e7b6bf..00aa61268e0d 100644 --- a/arch/powerpc/kvm/book3s_32_mmu_host.c +++ b/arch/powerpc/kvm/book3s_32_mmu_host.c | |||
@@ -141,7 +141,7 @@ extern char etext[]; | |||
141 | int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte) | 141 | int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte) |
142 | { | 142 | { |
143 | pfn_t hpaddr; | 143 | pfn_t hpaddr; |
144 | u64 va; | 144 | u64 vpn; |
145 | u64 vsid; | 145 | u64 vsid; |
146 | struct kvmppc_sid_map *map; | 146 | struct kvmppc_sid_map *map; |
147 | volatile u32 *pteg; | 147 | volatile u32 *pteg; |
@@ -173,7 +173,7 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte) | |||
173 | BUG_ON(!map); | 173 | BUG_ON(!map); |
174 | 174 | ||
175 | vsid = map->host_vsid; | 175 | vsid = map->host_vsid; |
176 | va = (vsid << SID_SHIFT) | (eaddr & ~ESID_MASK); | 176 | vpn = (vsid << (SID_SHIFT - VPN_SHIFT)) | ((eaddr & ~ESID_MASK) >> VPN_SHIFT) |
177 | 177 | ||
178 | next_pteg: | 178 | next_pteg: |
179 | if (rr == 16) { | 179 | if (rr == 16) { |
@@ -244,11 +244,11 @@ next_pteg: | |||
244 | dprintk_mmu("KVM: %c%c Map 0x%llx: [%lx] 0x%llx (0x%llx) -> %lx\n", | 244 | dprintk_mmu("KVM: %c%c Map 0x%llx: [%lx] 0x%llx (0x%llx) -> %lx\n", |
245 | orig_pte->may_write ? 'w' : '-', | 245 | orig_pte->may_write ? 'w' : '-', |
246 | orig_pte->may_execute ? 'x' : '-', | 246 | orig_pte->may_execute ? 'x' : '-', |
247 | orig_pte->eaddr, (ulong)pteg, va, | 247 | orig_pte->eaddr, (ulong)pteg, vpn, |
248 | orig_pte->vpage, hpaddr); | 248 | orig_pte->vpage, hpaddr); |
249 | 249 | ||
250 | pte->slot = (ulong)&pteg[rr]; | 250 | pte->slot = (ulong)&pteg[rr]; |
251 | pte->host_va = va; | 251 | pte->host_vpn = vpn; |
252 | pte->pte = *orig_pte; | 252 | pte->pte = *orig_pte; |
253 | pte->pfn = hpaddr >> PAGE_SHIFT; | 253 | pte->pfn = hpaddr >> PAGE_SHIFT; |
254 | 254 | ||
diff --git a/arch/powerpc/kvm/book3s_64_mmu_host.c b/arch/powerpc/kvm/book3s_64_mmu_host.c index 0688b6b39585..4d72f9ebc554 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_host.c +++ b/arch/powerpc/kvm/book3s_64_mmu_host.c | |||
@@ -33,7 +33,7 @@ | |||
33 | 33 | ||
34 | void kvmppc_mmu_invalidate_pte(struct kvm_vcpu *vcpu, struct hpte_cache *pte) | 34 | void kvmppc_mmu_invalidate_pte(struct kvm_vcpu *vcpu, struct hpte_cache *pte) |
35 | { | 35 | { |
36 | ppc_md.hpte_invalidate(pte->slot, pte->host_va, | 36 | ppc_md.hpte_invalidate(pte->slot, pte->host_vpn, |
37 | MMU_PAGE_4K, MMU_SEGSIZE_256M, | 37 | MMU_PAGE_4K, MMU_SEGSIZE_256M, |
38 | false); | 38 | false); |
39 | } | 39 | } |
@@ -80,8 +80,9 @@ static struct kvmppc_sid_map *find_sid_vsid(struct kvm_vcpu *vcpu, u64 gvsid) | |||
80 | 80 | ||
81 | int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte) | 81 | int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte) |
82 | { | 82 | { |
83 | unsigned long vpn; | ||
83 | pfn_t hpaddr; | 84 | pfn_t hpaddr; |
84 | ulong hash, hpteg, va; | 85 | ulong hash, hpteg; |
85 | u64 vsid; | 86 | u64 vsid; |
86 | int ret; | 87 | int ret; |
87 | int rflags = 0x192; | 88 | int rflags = 0x192; |
@@ -117,7 +118,7 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte) | |||
117 | } | 118 | } |
118 | 119 | ||
119 | vsid = map->host_vsid; | 120 | vsid = map->host_vsid; |
120 | va = hpt_va(orig_pte->eaddr, vsid, MMU_SEGSIZE_256M); | 121 | vpn = hpt_vpn(orig_pte->eaddr, vsid, MMU_SEGSIZE_256M); |
121 | 122 | ||
122 | if (!orig_pte->may_write) | 123 | if (!orig_pte->may_write) |
123 | rflags |= HPTE_R_PP; | 124 | rflags |= HPTE_R_PP; |
@@ -129,7 +130,7 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte) | |||
129 | else | 130 | else |
130 | kvmppc_mmu_flush_icache(hpaddr >> PAGE_SHIFT); | 131 | kvmppc_mmu_flush_icache(hpaddr >> PAGE_SHIFT); |
131 | 132 | ||
132 | hash = hpt_hash(va, PTE_SIZE, MMU_SEGSIZE_256M); | 133 | hash = hpt_hash(vpn, PTE_SIZE, MMU_SEGSIZE_256M); |
133 | 134 | ||
134 | map_again: | 135 | map_again: |
135 | hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP); | 136 | hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP); |
@@ -141,7 +142,8 @@ map_again: | |||
141 | goto out; | 142 | goto out; |
142 | } | 143 | } |
143 | 144 | ||
144 | ret = ppc_md.hpte_insert(hpteg, va, hpaddr, rflags, vflags, MMU_PAGE_4K, MMU_SEGSIZE_256M); | 145 | ret = ppc_md.hpte_insert(hpteg, vpn, hpaddr, rflags, vflags, |
146 | MMU_PAGE_4K, MMU_SEGSIZE_256M); | ||
145 | 147 | ||
146 | if (ret < 0) { | 148 | if (ret < 0) { |
147 | /* If we couldn't map a primary PTE, try a secondary */ | 149 | /* If we couldn't map a primary PTE, try a secondary */ |
@@ -152,7 +154,8 @@ map_again: | |||
152 | } else { | 154 | } else { |
153 | struct hpte_cache *pte = kvmppc_mmu_hpte_cache_next(vcpu); | 155 | struct hpte_cache *pte = kvmppc_mmu_hpte_cache_next(vcpu); |
154 | 156 | ||
155 | trace_kvm_book3s_64_mmu_map(rflags, hpteg, va, hpaddr, orig_pte); | 157 | trace_kvm_book3s_64_mmu_map(rflags, hpteg, |
158 | vpn, hpaddr, orig_pte); | ||
156 | 159 | ||
157 | /* The ppc_md code may give us a secondary entry even though we | 160 | /* The ppc_md code may give us a secondary entry even though we |
158 | asked for a primary. Fix up. */ | 161 | asked for a primary. Fix up. */ |
@@ -162,7 +165,7 @@ map_again: | |||
162 | } | 165 | } |
163 | 166 | ||
164 | pte->slot = hpteg + (ret & 7); | 167 | pte->slot = hpteg + (ret & 7); |
165 | pte->host_va = va; | 168 | pte->host_vpn = vpn; |
166 | pte->pte = *orig_pte; | 169 | pte->pte = *orig_pte; |
167 | pte->pfn = hpaddr >> PAGE_SHIFT; | 170 | pte->pfn = hpaddr >> PAGE_SHIFT; |
168 | 171 | ||
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index 44b72feaff7d..74a24bbb9637 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
@@ -1065,7 +1065,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206) | |||
1065 | mtspr SPRN_DABRX,r6 | 1065 | mtspr SPRN_DABRX,r6 |
1066 | 1066 | ||
1067 | /* Restore SPRG3 */ | 1067 | /* Restore SPRG3 */ |
1068 | ld r3,HSTATE_SPRG3(r13) | 1068 | ld r3,PACA_SPRG3(r13) |
1069 | mtspr SPRN_SPRG3,r3 | 1069 | mtspr SPRN_SPRG3,r3 |
1070 | 1070 | ||
1071 | /* | 1071 | /* |
diff --git a/arch/powerpc/kvm/trace.h b/arch/powerpc/kvm/trace.h index 877186b7b1c3..ddb6a2149d44 100644 --- a/arch/powerpc/kvm/trace.h +++ b/arch/powerpc/kvm/trace.h | |||
@@ -189,7 +189,7 @@ TRACE_EVENT(kvm_book3s_mmu_map, | |||
189 | TP_ARGS(pte), | 189 | TP_ARGS(pte), |
190 | 190 | ||
191 | TP_STRUCT__entry( | 191 | TP_STRUCT__entry( |
192 | __field( u64, host_va ) | 192 | __field( u64, host_vpn ) |
193 | __field( u64, pfn ) | 193 | __field( u64, pfn ) |
194 | __field( ulong, eaddr ) | 194 | __field( ulong, eaddr ) |
195 | __field( u64, vpage ) | 195 | __field( u64, vpage ) |
@@ -198,7 +198,7 @@ TRACE_EVENT(kvm_book3s_mmu_map, | |||
198 | ), | 198 | ), |
199 | 199 | ||
200 | TP_fast_assign( | 200 | TP_fast_assign( |
201 | __entry->host_va = pte->host_va; | 201 | __entry->host_vpn = pte->host_vpn; |
202 | __entry->pfn = pte->pfn; | 202 | __entry->pfn = pte->pfn; |
203 | __entry->eaddr = pte->pte.eaddr; | 203 | __entry->eaddr = pte->pte.eaddr; |
204 | __entry->vpage = pte->pte.vpage; | 204 | __entry->vpage = pte->pte.vpage; |
@@ -208,8 +208,8 @@ TRACE_EVENT(kvm_book3s_mmu_map, | |||
208 | (pte->pte.may_execute ? 0x1 : 0); | 208 | (pte->pte.may_execute ? 0x1 : 0); |
209 | ), | 209 | ), |
210 | 210 | ||
211 | TP_printk("Map: hva=%llx pfn=%llx ea=%lx vp=%llx ra=%lx [%x]", | 211 | TP_printk("Map: hvpn=%llx pfn=%llx ea=%lx vp=%llx ra=%lx [%x]", |
212 | __entry->host_va, __entry->pfn, __entry->eaddr, | 212 | __entry->host_vpn, __entry->pfn, __entry->eaddr, |
213 | __entry->vpage, __entry->raddr, __entry->flags) | 213 | __entry->vpage, __entry->raddr, __entry->flags) |
214 | ); | 214 | ); |
215 | 215 | ||
@@ -218,7 +218,7 @@ TRACE_EVENT(kvm_book3s_mmu_invalidate, | |||
218 | TP_ARGS(pte), | 218 | TP_ARGS(pte), |
219 | 219 | ||
220 | TP_STRUCT__entry( | 220 | TP_STRUCT__entry( |
221 | __field( u64, host_va ) | 221 | __field( u64, host_vpn ) |
222 | __field( u64, pfn ) | 222 | __field( u64, pfn ) |
223 | __field( ulong, eaddr ) | 223 | __field( ulong, eaddr ) |
224 | __field( u64, vpage ) | 224 | __field( u64, vpage ) |
@@ -227,7 +227,7 @@ TRACE_EVENT(kvm_book3s_mmu_invalidate, | |||
227 | ), | 227 | ), |
228 | 228 | ||
229 | TP_fast_assign( | 229 | TP_fast_assign( |
230 | __entry->host_va = pte->host_va; | 230 | __entry->host_vpn = pte->host_vpn; |
231 | __entry->pfn = pte->pfn; | 231 | __entry->pfn = pte->pfn; |
232 | __entry->eaddr = pte->pte.eaddr; | 232 | __entry->eaddr = pte->pte.eaddr; |
233 | __entry->vpage = pte->pte.vpage; | 233 | __entry->vpage = pte->pte.vpage; |
@@ -238,7 +238,7 @@ TRACE_EVENT(kvm_book3s_mmu_invalidate, | |||
238 | ), | 238 | ), |
239 | 239 | ||
240 | TP_printk("Flush: hva=%llx pfn=%llx ea=%lx vp=%llx ra=%lx [%x]", | 240 | TP_printk("Flush: hva=%llx pfn=%llx ea=%lx vp=%llx ra=%lx [%x]", |
241 | __entry->host_va, __entry->pfn, __entry->eaddr, | 241 | __entry->host_vpn, __entry->pfn, __entry->eaddr, |
242 | __entry->vpage, __entry->raddr, __entry->flags) | 242 | __entry->vpage, __entry->raddr, __entry->flags) |
243 | ); | 243 | ); |
244 | 244 | ||