Hollis,
I think I got this right, I need to make the priv hcall available for
the kernel as well. Does this look right to you?
Ignore the HYPERVISOR_multicall() for now.
---
diff -r 28208ae097cb arch/powerpc/platforms/xen/hcall.c
--- a/arch/powerpc/platforms/xen/hcall.c Mon Jun 05 16:55:22 2006 -0500
+++ b/arch/powerpc/platforms/xen/hcall.c Tue Jun 06 13:21:39 2006 -0400
@@ -179,6 +179,13 @@ int HYPERVISOR_grant_table_op(unsigned i
return rc;
}
EXPORT_SYMBOL(HYPERVISOR_grant_table_op);
+
+int HYPERVISOR_multicall(void *call_list, int nr_calls)
+{
+ BUG_ON(1);
+ return -ENOSYS;
+}
+EXPORT_SYMBOL(HYPERVISOR_multicall);
static int xenppc_privcmd_dom0_op(privcmd_hypercall_t *hypercall)
{
@@ -314,56 +321,83 @@ out:
return ret;
}
-static int xenppc_privcmd_memory_op(privcmd_hypercall_t *hypercall)
-{
- xen_memory_reservation_t kern_op;
- xen_memory_reservation_t __user *user_op;
+int HYPERVISOR_memory_op(unsigned int cmd, void *arg)
+{
+ int ret;
struct xencomm_desc *op_desc;
- const unsigned long cmd = hypercall->arg[0];
- int ret = 0;
-
- user_op = (xen_memory_reservation_t __user *)hypercall->arg[1];
- if (copy_from_user(&kern_op, user_op, sizeof(xen_memory_reservation_t)))
- return -EFAULT;
-
- ret = xencomm_create(&kern_op, sizeof(xen_memory_reservation_t),
+ xen_memory_reservation_t *mop;
+
+
+ mop = (xen_memory_reservation_t *)arg;
+ ret = xencomm_create(mop, sizeof(xen_memory_reservation_t),
&op_desc, GFP_KERNEL);
if (ret)
return ret;
switch (cmd) {
case XENMEM_increase_reservation:
- case XENMEM_decrease_reservation: {
+ case XENMEM_decrease_reservation:
+ {
struct xencomm_desc *desc = NULL;
- if (xen_guest_handle(kern_op.extent_start)) {
+
+ if (xen_guest_handle(mop->extent_start)) {
ret = xencomm_create(
- xen_guest_handle(kern_op.extent_start),
- kern_op.nr_extents *
- sizeof(*xen_guest_handle(kern_op.extent_start)),
+ xen_guest_handle(mop->extent_start),
+ mop->nr_extents *
+ sizeof(*xen_guest_handle(mop->extent_start)),
&desc, GFP_KERNEL);
if (ret)
- goto out;
-
- set_xen_guest_handle(kern_op.extent_start,
- (void *)__pa(desc));
+ return ret;
+
+ set_xen_guest_handle(mop->extent_start,
+ (void *)__pa(desc));
}
- ret = plpar_hcall_norets(XEN_MARK(hypercall->op), cmd,
__pa(op_desc));
+ ret = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_memory_op),
+ cmd, __pa(op_desc));
xencomm_free(desc);
- }
- break;
- default:
- printk("%s: unknown memory cmd %ld\n", __func__, cmd);
+ }
+ break;
+
+ case XENMEM_maximum_ram_page:
+ /* arg is NULL so we can call thru here */
+ ret = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_memory_op),
+ cmd, NULL);
+ break;
+ case XENMEM_populate_physmap:
+ case XENMEM_current_reservation:
+ case XENMEM_maximum_reservation:
+ case XENMEM_machphys_mfn_list:
+ case XENMEM_add_to_physmap:
+ case XENMEM_translate_gpfn_list:
+ default:
+ printk("%s: unknown grant table op %d\n", __func__, cmd);
ret = -ENOSYS;
- goto out;
- }
-
- if (copy_to_user(user_op, &kern_op, sizeof(xen_memory_reservation_t)))
+ }
+ xencomm_free(op_desc);
+ return ret;
+
+}
+EXPORT_SYMBOL(memory_op);
+
+static int xenppc_privcmd_memory_op(privcmd_hypercall_t *hypercall)
+{
+ xen_memory_reservation_t kern_op;
+ xen_memory_reservation_t __user *user_op;
+ const unsigned long cmd = hypercall->arg[0];
+ int ret = 0;
+
+ user_op = (xen_memory_reservation_t __user *)hypercall->arg[1];
+ if (copy_from_user(&kern_op, user_op,
+ sizeof(xen_memory_reservation_t)))
return -EFAULT;
-out:
- xencomm_free(op_desc);
+ if (!HYPERVISOR_memory_op(cmd, &kern_op)) {
+ if (copy_to_user(user_op, &kern_op,
+ sizeof(xen_memory_reservation_t)))
+ return -EFAULT;
+ }
return ret;
}
_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel
|