diff options
author | awilliam@xenbuild.aw <awilliam@xenbuild.aw> | 2006-11-13 11:24:30 -0700 |
---|---|---|
committer | awilliam@xenbuild.aw <awilliam@xenbuild.aw> | 2006-11-13 11:24:30 -0700 |
commit | eb5a644ce38bb93717f734ce391cd2e359dc5d06 (patch) | |
tree | bf0ade20acb5919f460e5c76dde472232a621f45 /linux-2.6-xen-sparse | |
parent | 6e20f30bec742bd048d0aa5f9c53fcfa4a1cf39c (diff) | |
download | xen-eb5a644ce38bb93717f734ce391cd2e359dc5d06.tar.gz xen-eb5a644ce38bb93717f734ce391cd2e359dc5d06.tar.bz2 xen-eb5a644ce38bb93717f734ce391cd2e359dc5d06.zip |
[IA64] Fix xencomm for xm mem-set command
This patch saves and restores the hypercall parameter within xencomm.
Signed-off-by: Masaki Kanno <kanno.masaki@jp.fujitsu.com>
Diffstat (limited to 'linux-2.6-xen-sparse')
-rw-r--r-- | linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c b/linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c index 01842ba34a..fda0a45ec5 100644 --- a/linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c +++ b/linux-2.6-xen-sparse/arch/ia64/xen/xcom_hcall.c @@ -221,10 +221,17 @@ xencommize_memory_reservation (xen_memory_reservation_t *mop) int xencomm_hypercall_memory_op(unsigned int cmd, void *arg) { + XEN_GUEST_HANDLE(xen_pfn_t) extent_start_va[2]; + xen_memory_reservation_t *xmr = NULL, *xme_in = NULL, *xme_out = NULL; + int rc; + switch (cmd) { case XENMEM_increase_reservation: case XENMEM_decrease_reservation: case XENMEM_populate_physmap: + xmr = (xen_memory_reservation_t *)arg; + xen_guest_handle(extent_start_va[0]) = + xen_guest_handle(xmr->extent_start); xencommize_memory_reservation((xen_memory_reservation_t *)arg); break; @@ -232,6 +239,12 @@ xencomm_hypercall_memory_op(unsigned int cmd, void *arg) break; case XENMEM_exchange: + xme_in = &((xen_memory_exchange_t *)arg)->in; + xme_out = &((xen_memory_exchange_t *)arg)->out; + xen_guest_handle(extent_start_va[0]) = + xen_guest_handle(xme_in->extent_start); + xen_guest_handle(extent_start_va[1]) = + xen_guest_handle(xme_out->extent_start); xencommize_memory_reservation (&((xen_memory_exchange_t *)arg)->in); xencommize_memory_reservation @@ -243,8 +256,25 @@ xencomm_hypercall_memory_op(unsigned int cmd, void *arg) return -ENOSYS; } - return xencomm_arch_hypercall_memory_op - (cmd, xencomm_create_inline(arg)); + rc = xencomm_arch_hypercall_memory_op(cmd, xencomm_create_inline(arg)); + + switch (cmd) { + case XENMEM_increase_reservation: + case XENMEM_decrease_reservation: + case XENMEM_populate_physmap: + xen_guest_handle(xmr->extent_start) = + xen_guest_handle(extent_start_va[0]); + break; + + case XENMEM_exchange: + xen_guest_handle(xme_in->extent_start) = + xen_guest_handle(extent_start_va[0]); + xen_guest_handle(xme_out->extent_start) = + xen_guest_handle(extent_start_va[1]); + break; + } + + return rc; } unsigned long |