diff options
author | Laurent Dufour <ldufour@linux.vnet.ibm.com> | 2014-02-21 10:31:10 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2014-03-26 08:34:27 -0400 |
commit | 69e9fbb278af8de3059f1d1017b52a32b5f9f0bd (patch) | |
tree | 7b96728fb8533860aca4cf607417a5f1ab332ad4 /arch | |
parent | e59d24e61269de34d79d2f39d3d581c219ac7a94 (diff) |
KVM: PPC: Book3S: Introduce hypervisor call H_GET_TCE
This introduces the H_GET_TCE hypervisor call, which is basically the
reverse of H_PUT_TCE, as defined in the Power Architecture Platform
Requirements (PAPR).
The hcall H_GET_TCE is required by the kdump kernel, which uses it to
retrieve TCEs set up by the previous (panicked) kernel.
Signed-off-by: Laurent Dufour <ldufour@linux.vnet.ibm.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/include/asm/kvm_ppc.h | 2 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_64_vio_hv.c | 28 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_hv_rmhandlers.S | 2 |
3 files changed, 31 insertions, 1 deletions
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h index fcd53f0d34ba..4096f16502a9 100644 --- a/arch/powerpc/include/asm/kvm_ppc.h +++ b/arch/powerpc/include/asm/kvm_ppc.h | |||
@@ -129,6 +129,8 @@ extern long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm, | |||
129 | struct kvm_create_spapr_tce *args); | 129 | struct kvm_create_spapr_tce *args); |
130 | extern long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, | 130 | extern long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, |
131 | unsigned long ioba, unsigned long tce); | 131 | unsigned long ioba, unsigned long tce); |
132 | extern long kvmppc_h_get_tce(struct kvm_vcpu *vcpu, unsigned long liobn, | ||
133 | unsigned long ioba); | ||
132 | extern struct kvm_rma_info *kvm_alloc_rma(void); | 134 | extern struct kvm_rma_info *kvm_alloc_rma(void); |
133 | extern void kvm_release_rma(struct kvm_rma_info *ri); | 135 | extern void kvm_release_rma(struct kvm_rma_info *ri); |
134 | extern struct page *kvm_alloc_hpt(unsigned long nr_pages); | 136 | extern struct page *kvm_alloc_hpt(unsigned long nr_pages); |
diff --git a/arch/powerpc/kvm/book3s_64_vio_hv.c b/arch/powerpc/kvm/book3s_64_vio_hv.c index 2c25f5412bdb..89e96b3e0039 100644 --- a/arch/powerpc/kvm/book3s_64_vio_hv.c +++ b/arch/powerpc/kvm/book3s_64_vio_hv.c | |||
@@ -75,3 +75,31 @@ long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, | |||
75 | return H_TOO_HARD; | 75 | return H_TOO_HARD; |
76 | } | 76 | } |
77 | EXPORT_SYMBOL_GPL(kvmppc_h_put_tce); | 77 | EXPORT_SYMBOL_GPL(kvmppc_h_put_tce); |
78 | |||
79 | long kvmppc_h_get_tce(struct kvm_vcpu *vcpu, unsigned long liobn, | ||
80 | unsigned long ioba) | ||
81 | { | ||
82 | struct kvm *kvm = vcpu->kvm; | ||
83 | struct kvmppc_spapr_tce_table *stt; | ||
84 | |||
85 | list_for_each_entry(stt, &kvm->arch.spapr_tce_tables, list) { | ||
86 | if (stt->liobn == liobn) { | ||
87 | unsigned long idx = ioba >> SPAPR_TCE_SHIFT; | ||
88 | struct page *page; | ||
89 | u64 *tbl; | ||
90 | |||
91 | if (ioba >= stt->window_size) | ||
92 | return H_PARAMETER; | ||
93 | |||
94 | page = stt->pages[idx / TCES_PER_PAGE]; | ||
95 | tbl = (u64 *)page_address(page); | ||
96 | |||
97 | vcpu->arch.gpr[4] = tbl[idx % TCES_PER_PAGE]; | ||
98 | return H_SUCCESS; | ||
99 | } | ||
100 | } | ||
101 | |||
102 | /* Didn't find the liobn, punt it to userspace */ | ||
103 | return H_TOO_HARD; | ||
104 | } | ||
105 | EXPORT_SYMBOL_GPL(kvmppc_h_get_tce); | ||
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index 818dce344e82..7c5788c735c9 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
@@ -1691,7 +1691,7 @@ hcall_real_table: | |||
1691 | .long 0 /* 0x10 - H_CLEAR_MOD */ | 1691 | .long 0 /* 0x10 - H_CLEAR_MOD */ |
1692 | .long 0 /* 0x14 - H_CLEAR_REF */ | 1692 | .long 0 /* 0x14 - H_CLEAR_REF */ |
1693 | .long .kvmppc_h_protect - hcall_real_table | 1693 | .long .kvmppc_h_protect - hcall_real_table |
1694 | .long 0 /* 0x1c - H_GET_TCE */ | 1694 | .long .kvmppc_h_get_tce - hcall_real_table |
1695 | .long .kvmppc_h_put_tce - hcall_real_table | 1695 | .long .kvmppc_h_put_tce - hcall_real_table |
1696 | .long 0 /* 0x24 - H_SET_SPRG0 */ | 1696 | .long 0 /* 0x24 - H_SET_SPRG0 */ |
1697 | .long .kvmppc_h_set_dabr - hcall_real_table | 1697 | .long .kvmppc_h_set_dabr - hcall_real_table |