aboutsummaryrefslogtreecommitdiffstats
path: root/linux-2.6-xen-sparse
diff options
context:
space:
mode:
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>2006-11-13 11:24:30 -0700
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>2006-11-13 11:24:30 -0700
commiteb5a644ce38bb93717f734ce391cd2e359dc5d06 (patch)
treebf0ade20acb5919f460e5c76dde472232a621f45 /linux-2.6-xen-sparse
parent6e20f30bec742bd048d0aa5f9c53fcfa4a1cf39c (diff)
downloadxen-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.c34
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