Yes..another Xencomm patch :-). The last one actually hit a bug that was
currently in xen-linux with handling of domain control operation
XEN_DOMCTL_shadow_op. This fix is included in the patch. I've also
added error handling and changed return codes from xencomm_no_alloc()
failure to be EINVAL.
Signed-off-by: Jerone Young [EMAIL PROTECTED]
diff -r ab3b5849331d arch/powerpc/platforms/xen/gnttab.c
--- a/arch/powerpc/platforms/xen/gnttab.c Sun Jan 21 08:36:53 2007 -0500
+++ b/arch/powerpc/platforms/xen/gnttab.c Sun Feb 04 12:12:24 2007 -0600
@@ -244,8 +244,8 @@ static void gnttab_post_map_grant_ref(
int HYPERVISOR_grant_table_op(unsigned int cmd, void *op, unsigned int count)
{
- void *desc;
- void *frame_list;
+ void *desc = NULL;
+ void *frame_list = NULL;
int argsize;
int ret;
@@ -263,8 +263,13 @@ int HYPERVISOR_grant_table_op(unsigned i
memcpy(setup, op, sizeof(setup));
argsize = sizeof(setup);
- frame_list = xencomm_create_inline(
- xen_guest_handle(setup.frame_list));
+ frame_list = xencomm_map(
+ xen_guest_handle(setup.frame_list),
+ (sizeof(*xen_guest_handle(setup.frame_list))
+ * setup.nr_frames));
+
+ if (frame_list == NULL)
+ return -ENOMEM;
set_xen_guest_handle(setup.frame_list, frame_list);
memcpy(op, setup, sizeof(setup));
@@ -286,12 +291,18 @@ int HYPERVISOR_grant_table_op(unsigned i
return -ENOSYS;
}
- desc = xencomm_create_inline(op);
+ desc = xencomm_map_no_alloc(op, argsize);
+
+ if (desc == NULL)
+ return -ENOSPC;
ret = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_grant_table_op), cmd,
desc, count);
if (cmd == GNTTABOP_map_grant_ref)
gnttab_post_map_grant_ref(op, count);
+
+ xencomm_free(frame_list);
+ xencomm_free(desc);
return ret;
}
diff -r ab3b5849331d arch/powerpc/platforms/xen/hcall.c
--- a/arch/powerpc/platforms/xen/hcall.c Sun Jan 21 08:36:53 2007 -0500
+++ b/arch/powerpc/platforms/xen/hcall.c Sun Feb 04 12:08:49 2007 -0600
@@ -54,25 +54,43 @@
int HYPERVISOR_console_io(int cmd, int count, char *str)
{
- void *desc = xencomm_create_inline(str);
-
- return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_console_io),
+ int rc;
+
+ void *desc = xencomm_map_no_alloc(str, count);
+
+ if (desc == NULL)
+ return -EINVAL;
+
+ rc = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_console_io),
cmd, count, desc);
+
+ xencomm_free(desc);
+
+ return rc;
}
EXPORT_SYMBOL(HYPERVISOR_console_io);
int HYPERVISOR_event_channel_op(int cmd, void *op)
{
- void *desc = xencomm_create_inline(op);
-
- return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_event_channel_op),
+ int rc;
+
+ void *desc = xencomm_map_no_alloc(op, sizeof(evtchn_op_t));
+ if (desc == NULL)
+ return -EINVAL;
+
+ rc = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_event_channel_op),
cmd, desc);
+
+ xencomm_free(desc);
+
+ return rc;
+
}
EXPORT_SYMBOL(HYPERVISOR_event_channel_op);
-int HYPERVISOR_xen_version_userspace(int cmd, void *arg)
-{
- struct xencomm_desc *desc;
+int HYPERVISOR_xen_version(int cmd, void *arg)
+{
+ void *desc;
const unsigned long hcall = __HYPERVISOR_xen_version;
int argsize;
int rc;
@@ -97,7 +115,10 @@ int HYPERVISOR_xen_version_userspace(int
argsize = sizeof(xen_platform_parameters_t);
break;
case XENVER_pagesize:
- argsize = (arg == NULL) ? 0 : sizeof(void *);
+ if (arg == NULL)
+ argsize = 0;
+ else
+ argsize = sizeof(void *);
break;
case XENVER_get_features:
argsize = sizeof(xen_feature_info_t);
@@ -107,38 +128,41 @@ int HYPERVISOR_xen_version_userspace(int
return -ENOSYS;
}
- rc = xencomm_create(arg, argsize, desc, GFP_KERNEL);
- if (rc)
- return rc;
-
- rc = plpar_hcall_norets(XEN_MARK(hcall), cmd, xencomm_pa(desc));
-
- xencomm_free(desc);
+ /* desc could be NULL in the case of XENVER_pagesize with NULL arg */
+ desc = xencomm_map(arg, argsize);
+
+ rc = plpar_hcall_norets(XEN_MARK(hcall), cmd, desc);
+
+ xencomm_free(desc);
+
return rc;
}
EXPORT_SYMBOL(HYPERVISOR_xen_version);
-int HYPERVISOR_xen_version(int cmd, void *arg)
-{
- if (is_kernel_addr((unsigned long)arg)) {
- void *desc = xencomm_create_inline(arg);
- return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_xen_version), cmd, desc);
- }
- return HYPERVISOR_xen_version_userspace(cmd, arg);
-}
int HYPERVISOR_physdev_op(int cmd, void *op)
{
- void *desc = xencomm_create_inline(op);
-
- return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_physdev_op),
+ void *desc = xencomm_map_no_alloc(op, sizeof(physdev_op_t));
+ int rc;
+
+ if (desc == NULL)
+ return -EINVAL;
+
+ rc = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_physdev_op),
cmd, desc);
+
+ xencomm_free(desc);
+
+ return rc;
}
EXPORT_SYMBOL(HYPERVISOR_physdev_op);
int HYPERVISOR_sched_op(int cmd, void *arg)
{
- struct xencomm_desc *desc;
+ int argsize = 0;
+ int rc;
+ void *desc;
+ evtchn_port_t *ports = NULL;
switch (cmd) {
case SCHEDOP_yield:
@@ -148,30 +172,46 @@ int HYPERVISOR_sched_op(int cmd, void *a
break;
case SCHEDOP_poll: {
- evtchn_port_t *ports;