Hello everyone,
I am a user of Xen and I have encountered a problem when trying to get the return value from hypercall in TOOLS. I found that when programs in TOOLS called hypercall and failed, it would get return value -1 instead of the real return value given by Hypervisor.
The reason is that the hypercall interface of TOOLS uses ioctl to call hypercall, and ioctl will only return -1 when failure occurs. The related code is in xen-4.2.0/tools/libxc/xc_linux_osdep.c:
static int linux_privcmd_hypercall(xc_interface *xch, xc_osdep_handle h, privcmd_hypercall_t *hypercall)
{
int fd = (int)h;
return ioctl(fd, IOCTL_PRIVCMD_HYPERCALL, hypercall);
}
While I don't think this is a good idea, because some tools may wish to use real return value. For example, in xen-4.2.0/tools/memshr/interface.c, the function memshr_vbd_issue_ro_request will switch variable ret which comes from return value of hypercall do_memory_op:
switch(ret)
{
case XENMEM_SHARING_OP_S_HANDLE_INVALID:
……
break;
case XENMEM_SHARING_OP_C_HANDLE_INVALID:
……
break;
default:
break;
}
So I think if we could modify the interface a little bit to return the real error number, it would be beneficial to many TOOLS developers including myself. My suggested modification is simple:
static int linux_privcmd_hypercall(xc_interface *xch, xc_osdep_handle h, privcmd_hypercall_t *hypercall)
{
int fd = (int)h;
int ret = ioctl(fd, IOCTL_PRIVCMD_HYPERCALL, hypercall);
if (ret < 0)
return -errno;
return ret;
}
Do you think this would be a good modification?
Also, I am curious why the original design didn't do that. Is it a bug or is it designed that way intentionally?
Any suggestions and comments will be highly appreciated.
Thanks!
Best Regards,
Yanzhang Li
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
I am a user of Xen and I have encountered a problem when trying to get the return value from hypercall in TOOLS. I found that when programs in TOOLS called hypercall and failed, it would get return value -1 instead of the real return value given by Hypervisor.
The reason is that the hypercall interface of TOOLS uses ioctl to call hypercall, and ioctl will only return -1 when failure occurs. The related code is in xen-4.2.0/tools/libxc/xc_linux_osdep.c:
static int linux_privcmd_hypercall(xc_interface *xch, xc_osdep_handle h, privcmd_hypercall_t *hypercall)
{
int fd = (int)h;
return ioctl(fd, IOCTL_PRIVCMD_HYPERCALL, hypercall);
}
While I don't think this is a good idea, because some tools may wish to use real return value. For example, in xen-4.2.0/tools/memshr/interface.c, the function memshr_vbd_issue_ro_request will switch variable ret which comes from return value of hypercall do_memory_op:
switch(ret)
{
case XENMEM_SHARING_OP_S_HANDLE_INVALID:
……
break;
case XENMEM_SHARING_OP_C_HANDLE_INVALID:
……
break;
default:
break;
}
So I think if we could modify the interface a little bit to return the real error number, it would be beneficial to many TOOLS developers including myself. My suggested modification is simple:
static int linux_privcmd_hypercall(xc_interface *xch, xc_osdep_handle h, privcmd_hypercall_t *hypercall)
{
int fd = (int)h;
int ret = ioctl(fd, IOCTL_PRIVCMD_HYPERCALL, hypercall);
if (ret < 0)
return -errno;
return ret;
}
Do you think this would be a good modification?
Also, I am curious why the original design didn't do that. Is it a bug or is it designed that way intentionally?
Any suggestions and comments will be highly appreciated.
Thanks!
Best Regards,
Yanzhang Li
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel