[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Xen-devel] [PATCH 04/12] Nested Virtualization: core



Dong, Eddie wrote:
> # HG changeset patch
> # User cegger
> # Date 1292839432 -3600
> Nested Virtualization core implementation
> 
> Signed-off-by: Christoph Egger <Christoph.Egger@xxxxxxx>
> 
> diff -r e43ab6fb0ee2 -r a9465de5a794 xen/arch/x86/hvm/Makefile
> --- a/xen/arch/x86/hvm/Makefile
> +++ b/xen/arch/x86/hvm/Makefile
> @@ -10,6 +10,7 @@ obj-y += intercept.o
>  obj-y += io.o
>  obj-y += irq.o
>  obj-y += mtrr.o
> +obj-y += nestedhvm.o
>  obj-y += pmtimer.o
>  obj-y += quirks.o
>  obj-y += rtc.o
> diff -r e43ab6fb0ee2 -r a9465de5a794 xen/arch/x86/hvm/nestedhvm.c
> --- /dev/null
> +++ b/xen/arch/x86/hvm/nestedhvm.c
> @@ -0,0 +1,198 @@
> +/*
> + * Nested HVM
> + * Copyright (c) 2010, Advanced Micro Devices, Inc.
> + * Author: Christoph Egger <Christoph.Egger@xxxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or
> modify it + * under the terms and conditions of the GNU General
> Public License, + * version 2, as published by the Free Software
> Foundation. + *
> + * This program is distributed in the hope it will be useful, but
> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> General Public License for + * more details.
> + *
> + * You should have received a copy of the GNU General Public License
> along with + * this program; if not, write to the Free Software
> Foundation, Inc., 59 Temple + * Place - Suite 330, Boston, MA
> 02111-1307 USA. + */
> +
> +#include <asm/msr.h>
> +#include <asm/hvm/support.h> /* for HVM_DELIVER_NO_ERROR_CODE */
> +#include <asm/hvm/hvm.h>
> +#include <asm/hvm/nestedhvm.h>
> +#include <asm/event.h>  /* for local_event_delivery_(en|dis)able */
> +#include <asm/paging.h> /* for paging_mode_hap() */
> +
> +
> +/* Nested HVM on/off per domain */
> +bool_t
> +nestedhvm_enabled(struct domain *d)
> +{
> +    bool_t enabled;
> +
> +    enabled = !!(d->arch.hvm_domain.params[HVM_PARAM_NESTEDHVM]);
> +    /* sanity check */
> +    BUG_ON(enabled && !is_hvm_domain(d));
> +
> +    if (!is_hvm_domain(d))
> +        return 0;
> +
> +    return enabled;
> +}
> +
> +/* Nested VCPU */
> +bool_t
> +nestedhvm_vcpu_in_guestmode(struct vcpu *v)
> +{
> +    return vcpu_nestedhvm(v).nv_guestmode;
> +}
> +
> +void
> +nestedhvm_vcpu_reset(struct vcpu *v)
> +{
> +    struct nestedvcpu *nv = &vcpu_nestedhvm(v);
> +
> +    if (nv->nv_vmcx)
> +        hvm_unmap_guest_frame(nv->nv_vmcx);
> +    nv->nv_vmcx = NULL;
> +    nv->nv_vmcxaddr = VMCX_EADDR;
> +    nv->nv_flushp2m = 0;
> +    nv->nv_p2m = NULL;
> +
> +    nhvm_vcpu_reset(v);
> +
> +    /* vcpu is in host mode */
> +    nestedhvm_vcpu_exit_guestmode(v);
> +}
> +
> +int
> +nestedhvm_vcpu_initialise(struct vcpu *v)
> +{
> +    int rc;
> +    struct nestedvcpu *nv = &vcpu_nestedhvm(v);
> +
> +    if (!nestedhvm_enabled(v->domain))
> +        return 0;
> +
> +    memset(nv, 0x0, sizeof(struct nestedvcpu));
> +
> +    /* initialise hostsave, for example */
> +    rc = nhvm_vcpu_initialise(v);
> +    if (rc) {
> +        nhvm_vcpu_destroy(v);
> +        return rc;
> +    }
> +
> +    nestedhvm_vcpu_reset(v);
> +    return 0;
> +}
> +
> +int
> +nestedhvm_vcpu_destroy(struct vcpu *v)
> +{
> +    if (!nestedhvm_enabled(v->domain))
> +        return 0;
> +
> +    return nhvm_vcpu_destroy(v);
> +}
> +
> +void
> +nestedhvm_vcpu_enter_guestmode(struct vcpu *v)
> +{
> +    vcpu_nestedhvm(v).nv_guestmode = 1;
> +}
> +
> +void
> +nestedhvm_vcpu_exit_guestmode(struct vcpu *v)
> +{
> +    vcpu_nestedhvm(v).nv_guestmode = 0;
> +}
> +
> +/* Common shadow IO Permission bitmap */
> +
> +struct shadow_iomap {
> +    /* same format and size as hvm_io_bitmap */
> +    unsigned long iomap[3*PAGE_SIZE/BYTES_PER_LONG];
> +    int refcnt;
> +};
> +
> +/* There four global patterns of io bitmap each guest can
> + * choose one of them depending on interception of io port 0x80
> and/or + * 0xED (shown in table below). Each shadow iomap pattern is
> + * implemented as a singleton to minimize memory consumption while
> + * providing a provider/consumer interface to the users.
> + * The users are in SVM/VMX specific code.
> + *
> + * bitmap        port 0x80  port 0xed
> + * hvm_io_bitmap cleared    cleared
> + * iomap[0]      cleared    set
> + * iomap[1]      set        cleared
> + * iomap[2]      set        set
> + */
> +static struct shadow_iomap *nhvm_io_bitmap[3];
> +
> +unsigned long *
> +nestedhvm_vcpu_iomap_get(bool_t port_80, bool_t port_ed)
> +{
> +    int i;
> +    extern int hvm_port80_allowed;
> +
> +    if (!hvm_port80_allowed)
> +        port_80 = 1;
> +
> +    if (port_80 == 0) {
> +        if (port_ed == 0)
> +            return hvm_io_bitmap;
> +        i = 0;
> +    } else {
> +        if (port_ed == 0)
> +            i = 1;
> +        else
> +            i = 2;
> +    }
> +
> +    if (nhvm_io_bitmap[i] == NULL) {
> +        nhvm_io_bitmap[i] =
> +            _xmalloc(sizeof(struct shadow_iomap), PAGE_SIZE);
> +        nhvm_io_bitmap[i]->refcnt = 0;
> +        /* set all bits */
> +        memset(nhvm_io_bitmap[i]->iomap, ~0,
> sizeof(nhvm_io_bitmap[i]->iomap)); +        switch (i) {
> +        case 0:
> +            __clear_bit(0x80, nhvm_io_bitmap[i]->iomap);
> +            break;
> +        case 1:
> +            __clear_bit(0xed, nhvm_io_bitmap[i]->iomap);
> +            break;
> +        case 2:
> +            break;
> +        }
> +    }
> +


This is overcomplicated. Static table should serve this much simple and 
efficient.



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.