|
|
|
|
|
|
|
|
|
|
xen-devel
Re: [Xen-devel] passing hypercall parameters by pointer
On Wednesday 17 August 2005 15:44, Ian Pratt wrote:
> > Many Xen hypercalls pass mlocked pointers as parameters for
> > both input and output. For example, xc_get_pfn_list() is a
> > nice one with multiple levels of structures/mlocking.
> >
> > Considering just the tools for the moment, those pointers are
> > userspace addresses. Ultimately the hypervisor ends up with
> > that userspace address, from which it reads and writes data.
> > This is OK for x86, since userspace, kernel, and hypervisor
> > all share the same virtual address space (and userspace has
> > carefully mlocked the relevent memory).
> >
> > On PowerPC though, the hypervisor runs in real mode (no MMU
> > translation).
> > Unlike x86, PowerPC exceptions arrive in real mode, and also
> > PowerPC does not force a TLB flush when switching between
> > real and virtual modes. So a virtual address is pretty much
> > worthless as a hypervisor parameter; performing the MMU
> > translation in software is infeasible.
>
> I think I'd prefer to hide all of this by co-operation between the
> kernel and the hypervisor's copy to/from user.
>
> The kernel can easily translate a virtual address and length into a list
> of psuedo-phyiscal frame numbers and initial offset. Xen's copy from
> user function can then use this list when doing its work.
Could you elaborate a little?
Consider this structure:
typedef struct {
/* IN variables. */
domid_t domain;
memory_t max_pfns;
void *buffer;
/* OUT variables. */
memory_t num_pfns;
} dom0_getmemlist_t;
libxc creates this struct and passes it to the kernel, and the kernel doesn't
know anything about the internals. Are you saying that privcmd_ioctl() should
look like this?
switch ( cmd )
{
case IOCTL_PRIVCMD_HYPERCALL:
{
privcmd_hypercall_t hypercall;
dom0_op_t *op = (dom0_op_t *)&hypercall;
if ( copy_from_user(&hypercall, (void *)data, sizeof(hypercall)) )
return -EFAULT;
/* NEW switch statement: */
switch (op->cmd)
{
case DOM0_GETMEMLIST:
op->u.getmemlist.buffer = virt_to_phys(op->u.getmemlist.buffer);
break;
case DOM0_SETDOMAININFO:
...
case DOM0_READCONSOLE:
...
}
}
break;
}
Right now the kernel doesn't peer inside the hypercall structures at all.
--
Hollis Blanchard
IBM Linux Technology Center
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
|
|
|
|