|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 4/4] Implement XEN_DOMCTL_gethvmcontext part of arch_do_domctl
On Wed, 2013-06-05 at 14:46 +0900, Jaeyong Yoo wrote:
> Signed-off-by: Jaeyong Yoo <jaeyong.yoo@xxxxxxxxxxx>
> ---
> xen/arch/arm/domctl.c | 58
> ++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 57 insertions(+), 1 deletion(-)
>
> diff --git a/xen/arch/arm/domctl.c b/xen/arch/arm/domctl.c
> index 851ee40..a1ff570 100644
> --- a/xen/arch/arm/domctl.c
> +++ b/xen/arch/arm/domctl.c
> @@ -9,12 +9,68 @@
> #include <xen/lib.h>
> #include <xen/errno.h>
> #include <xen/sched.h>
> +#include <xen/hvm/save.h>
> +#include <xen/guest_access.h>
> #include <public/domctl.h>
>
> long arch_do_domctl(struct xen_domctl *domctl, struct domain *d,
> XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
> {
> - return -ENOSYS;
> + long ret = 0;
> + bool_t copyback = 0;
> + switch ( domctl->cmd )
> + {
> + case XEN_DOMCTL_gethvmcontext:
> + {
> + struct hvm_domain_context c = { 0 };
> +
> + ret = -EINVAL;
> + if ( !is_hvm_domain(d) ) {
> + printk("Domain is not hvm... Just go on...\n");
> + }
I don't think you need this check.
> +
> + c.size = hvm_save_size(d);
> +
> + if ( guest_handle_is_null(domctl->u.hvmcontext.buffer) )
> + {
> + /* Client is querying for the correct buffer size */
> + domctl->u.hvmcontext.size = c.size;
> + ret = 0;
> + goto gethvmcontext_out;
> + }
> +
> + /* Check that the client has a big enough buffer */
> + ret = -ENOSPC;
> + if ( domctl->u.hvmcontext.size < c.size )
> + goto gethvmcontext_out;
> +
> + /* Allocate our own marshalling buffer */
> + ret = -ENOMEM;
> + if ( (c.data = xmalloc_bytes(c.size)) == NULL )
> + goto gethvmcontext_out;
> +
> + domain_pause(d);
> + ret = hvm_save(d, &c);
> + domain_unpause(d);
> +
> + domctl->u.hvmcontext.size = c.cur;
> + if ( copy_to_guest(domctl->u.hvmcontext.buffer, c.data, c.size) != 0
> )
> + ret = -EFAULT;
> +
> + gethvmcontext_out:
> + copyback = 1;
> +
> + if ( c.data != NULL )
> + xfree(c.data);
> + }
> + break;
> + default:
> + return -EINVAL;
> + }
> + if ( copyback && __copy_to_guest(u_domctl, domctl, 1) )
> + ret = -EFAULT;
> +
> + return ret;
> }
>
> void arch_get_info_guest(struct vcpu *v, vcpu_guest_context_u c)
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |