WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ia64-devel

Re: [Xen-ia64-devel] PV-on-HVM driver for IPF

  Sorry, I didn't cleanup about indent.

  I'll repost new xen-hyper.patch4.

Thanks,
-- Tsunehisa Doi

DOI Tsunehisa wrote:
>   I'll post new xen-hyper.patch3 whitch was modified.
> 
> Thanks,
> -- Tsunehisa Doi
> 
> Doi.Tsunehisa@xxxxxxxxxxxxxx wrote:
>>>>> +            if (likely(IS_XEN_HEAP_FRAME(virt_to_page(pgaddr)))) {
>>>>> +                free_domheap_page(virt_to_page(pgaddr));
>>>>> +                free_xenheap_page((void *)pgaddr);
>>>>> +            }
>>>>> +            else {
>>>>> +                put_page(virt_to_page(pgaddr));
>>>>> +            }
>>>>> May create a function to be called by gnttab_setup_table and
>>>>> setup_shared_info_page.
>>>>   I think that these function are for only VT-i domain, thus I used
>>>> vmx_ prefix. What do you think about it ?
>>> Sorry I was not clear enough.
>>> This block appears in both function.  I'd suggest to create a function to 
>>> avoid duplicating code.
>>   Sorry, I had misunderstood your suggestion.
>>
>>   I agree. I'll correct it.
>>
>> ------------------------------------------------------------------------
>>
>>
>> Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx>
>> Signed-off-by: Tomonari Horikoshi <t.horikoshi@xxxxxxxxxxxxxx>
>>
>> diff -r 3e54734e55f3 xen/arch/ia64/vmx/vmx_hypercall.c
>> --- a/xen/arch/ia64/vmx/vmx_hypercall.c      Wed Aug 23 13:26:46 2006 -0600
>> +++ b/xen/arch/ia64/vmx/vmx_hypercall.c      Fri Aug 25 17:25:17 2006 +0900
>> @@ -2,6 +2,7 @@
>>  /*
>>   * vmx_hyparcall.c: handling hypercall from domain
>>   * Copyright (c) 2005, Intel Corporation.
>> + * Copyright (c) 2006, Fujitsu Limited.
>>   *
>>   * This program is free software; you can redistribute it and/or modify it
>>   * under the terms and conditions of the GNU General Public License,
>> @@ -17,6 +18,8 @@
>>   * Place - Suite 330, Boston, MA 02111-1307 USA.
>>   *
>>   *  Xuefei Xu (Anthony Xu) (Anthony.xu@xxxxxxxxx)
>> + *  Tsunehisa Doi (Doi.Tsunehisa@xxxxxxxxxxxxxx)
>> + *  Tomonari Horikoshi (t.horikoshi@xxxxxxxxxxxxxx)
>>   */
>>  
>>  #include <xen/config.h>
>> @@ -34,6 +37,89 @@
>>  #include <public/version.h>
>>  #include <asm/dom_fw.h>
>>  #include <xen/domain.h>
>> +#include <xen/compile.h>
>> +#include <xen/event.h>
>> +
>> +static void
>> +vmx_free_pages(unsigned long pgaddr, int npg)
>> +{
>> +    for (; npg > 0; npg--, pgaddr += PAGE_SIZE) {
>> +        /* If original page belongs to xen heap, then relinguish back
>> +         * to xen heap. Or else, leave to domain itself to decide.
>> +         */
>> +    if (likely(IS_XEN_HEAP_FRAME(virt_to_page(pgaddr)))) {
>> +        free_domheap_page(virt_to_page(pgaddr));
>> +        free_xenheap_page((void *)pgaddr);
>> +    }
>> +    else {
>> +        put_page(virt_to_page(pgaddr));
>> +    }
>> +    }
>> +}
>> +
>> +static int
>> +vmx_gnttab_setup_table(unsigned long frame_pa, unsigned long nr_frames)
>> +{
>> +    struct domain *d = current->domain;
>> +    unsigned long o_grant_shared, pgaddr;
>> +
>> +    if ((nr_frames != NR_GRANT_FRAMES) || (frame_pa & (PAGE_SIZE - 1))) {
>> +        return -EINVAL;
>> +    }
>> +
>> +    pgaddr = domain_mpa_to_imva(d, frame_pa);
>> +    if (pgaddr == NULL) {
>> +        return -EFAULT;
>> +    }
>> +
>> +    o_grant_shared = (unsigned long)d->grant_table->shared;
>> +    d->grant_table->shared = (struct grant_entry *)pgaddr;
>> +
>> +    /* Copy existing grant table shared into new page */
>> +    if (o_grant_shared) {
>> +        memcpy((void *)d->grant_table->shared,
>> +                (void *)o_grant_shared, PAGE_SIZE * nr_frames);
>> +    vmx_free_pages(o_grant_shared, nr_frames);
>> +    }
>> +    else {
>> +        memset((void *)d->grant_table->shared, 0, PAGE_SIZE * nr_frames);
>> +    }
>> +    return 0;
>> +}
>> +
>> +static int
>> +vmx_setup_shared_info_page(unsigned long gpa)
>> +{
>> +    VCPU *vcpu = current;
>> +    struct domain *d = vcpu->domain;
>> +    unsigned long o_info, pgaddr;
>> +    struct vcpu *v;
>> +
>> +    if (gpa & (PAGE_SIZE - 1)) {
>> +        return -EINVAL;
>> +    }
>> +
>> +    pgaddr = domain_mpa_to_imva(d, gpa);
>> +    if (pgaddr == NULL) {
>> +        return -EFAULT;
>> +    }
>> +
>> +    o_info = (u64)d->shared_info;
>> +    d->shared_info= (shared_info_t *)pgaddr;
>> +
>> +    /* Copy existing shared info into new page */
>> +    if (o_info) {
>> +        memcpy((void*)d->shared_info, (void*)o_info, PAGE_SIZE);
>> +        for_each_vcpu(d, v) {
>> +            v->vcpu_info = &d->shared_info->vcpu_info[v->vcpu_id];
>> +        }
>> +    vmx_free_pages(o_info, 1);
>> +    }
>> +    else {
>> +        memset((void *)d->shared_info, 0, PAGE_SIZE);
>> +    }
>> +    return 0;
>> +}
>>  
>>  long
>>  do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg)
>> @@ -78,6 +164,25 @@ do_hvm_op(unsigned long op, XEN_GUEST_HA
>>          break;
>>      }
>>  
>> +    case HVMOP_setup_gnttab_table:
>> +    case HVMOP_setup_shared_info_page:
>> +    {
>> +        struct xen_hvm_setup a;
>> +
>> +        if (copy_from_guest(&a, arg, 1))
>> +            return -EFAULT;
>> +
>> +        switch (op) {
>> +        case HVMOP_setup_gnttab_table:
>> +            printk("vmx_gnttab_setup_table: frame_pa=%#lx,"
>> +                            "nr_frame=%ld\n", a.arg1, a.arg2);
>> +            return vmx_gnttab_setup_table(a.arg1, a.arg2);
>> +        case HVMOP_setup_shared_info_page:
>> +            printk("vmx_setup_shared_info_page: gpa=0x%lx\n", a.arg1);
>> +            return vmx_setup_shared_info_page(a.arg1);
>> +        }
>> +    }
>> +
>>      default:
>>          DPRINTK("Bad HVM op %ld.\n", op);
>>          rc = -ENOSYS;
>> diff -r 3e54734e55f3 xen/include/public/arch-ia64.h
>> --- a/xen/include/public/arch-ia64.h Wed Aug 23 13:26:46 2006 -0600
>> +++ b/xen/include/public/arch-ia64.h Fri Aug 25 17:25:17 2006 +0900
>> @@ -335,6 +335,17 @@ struct vcpu_guest_context {
>>  };
>>  typedef struct vcpu_guest_context vcpu_guest_context_t;
>>  DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
>> +
>> +// hvm_op expansion
>> +#define HVMOP_setup_gnttab_table        2
>> +#define HVMOP_setup_shared_info_page    3
>> +
>> +struct xen_hvm_setup {
>> +    unsigned long arg1;
>> +    unsigned long arg2;
>> +};
>> +typedef struct xen_hvm_setup xen_hvm_setup_t;
>> +DEFINE_XEN_GUEST_HANDLE(xen_hvm_setup_t);
>>  
>>  // dom0 vp op
>>  #define __HYPERVISOR_ia64_dom0vp_op     __HYPERVISOR_arch_0
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Xen-ia64-devel mailing list
>> Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
>> http://lists.xensource.com/xen-ia64-devel
Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx>
Signed-off-by: Tomonari Horikoshi <t.horikoshi@xxxxxxxxxxxxxx>

diff -r 3e54734e55f3 xen/arch/ia64/vmx/vmx_hypercall.c
--- a/xen/arch/ia64/vmx/vmx_hypercall.c Wed Aug 23 13:26:46 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_hypercall.c Fri Aug 25 17:41:32 2006 +0900
@@ -2,6 +2,7 @@
 /*
  * vmx_hyparcall.c: handling hypercall from domain
  * Copyright (c) 2005, Intel Corporation.
+ * Copyright (c) 2006, Fujitsu Limited.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
@@ -17,6 +18,8 @@
  * Place - Suite 330, Boston, MA 02111-1307 USA.
  *
  *  Xuefei Xu (Anthony Xu) (Anthony.xu@xxxxxxxxx)
+ *  Tsunehisa Doi (Doi.Tsunehisa@xxxxxxxxxxxxxx)
+ *  Tomonari Horikoshi (t.horikoshi@xxxxxxxxxxxxxx)
  */
 
 #include <xen/config.h>
@@ -34,6 +37,89 @@
 #include <public/version.h>
 #include <asm/dom_fw.h>
 #include <xen/domain.h>
+#include <xen/compile.h>
+#include <xen/event.h>
+
+static void
+vmx_free_pages(unsigned long pgaddr, int npg)
+{
+    for (; npg > 0; npg--, pgaddr += PAGE_SIZE) {
+        /* If original page belongs to xen heap, then relinguish back
+         * to xen heap. Or else, leave to domain itself to decide.
+         */
+        if (likely(IS_XEN_HEAP_FRAME(virt_to_page(pgaddr)))) {
+            free_domheap_page(virt_to_page(pgaddr));
+            free_xenheap_page((void *)pgaddr);
+        }
+        else {
+            put_page(virt_to_page(pgaddr));
+        }
+    }
+}
+
+static int
+vmx_gnttab_setup_table(unsigned long frame_pa, unsigned long nr_frames)
+{
+    struct domain *d = current->domain;
+    unsigned long o_grant_shared, pgaddr;
+
+    if ((nr_frames != NR_GRANT_FRAMES) || (frame_pa & (PAGE_SIZE - 1))) {
+        return -EINVAL;
+    }
+
+    pgaddr = domain_mpa_to_imva(d, frame_pa);
+    if (pgaddr == NULL) {
+        return -EFAULT;
+    }
+
+    o_grant_shared = (unsigned long)d->grant_table->shared;
+    d->grant_table->shared = (struct grant_entry *)pgaddr;
+
+    /* Copy existing grant table shared into new page */
+    if (o_grant_shared) {
+        memcpy((void *)d->grant_table->shared,
+                (void *)o_grant_shared, PAGE_SIZE * nr_frames);
+        vmx_free_pages(o_grant_shared, nr_frames);
+    }
+    else {
+        memset((void *)d->grant_table->shared, 0, PAGE_SIZE * nr_frames);
+    }
+    return 0;
+}
+
+static int
+vmx_setup_shared_info_page(unsigned long gpa)
+{
+    VCPU *vcpu = current;
+    struct domain *d = vcpu->domain;
+    unsigned long o_info, pgaddr;
+    struct vcpu *v;
+
+    if (gpa & (PAGE_SIZE - 1)) {
+        return -EINVAL;
+    }
+
+    pgaddr = domain_mpa_to_imva(d, gpa);
+    if (pgaddr == NULL) {
+        return -EFAULT;
+    }
+
+    o_info = (u64)d->shared_info;
+    d->shared_info= (shared_info_t *)pgaddr;
+
+    /* Copy existing shared info into new page */
+    if (o_info) {
+        memcpy((void*)d->shared_info, (void*)o_info, PAGE_SIZE);
+        for_each_vcpu(d, v) {
+            v->vcpu_info = &d->shared_info->vcpu_info[v->vcpu_id];
+        }
+        vmx_free_pages(o_info, 1);
+    }
+    else {
+        memset((void *)d->shared_info, 0, PAGE_SIZE);
+    }
+    return 0;
+}
 
 long
 do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg)
@@ -78,6 +164,25 @@ do_hvm_op(unsigned long op, XEN_GUEST_HA
         break;
     }
 
+    case HVMOP_setup_gnttab_table:
+    case HVMOP_setup_shared_info_page:
+    {
+        struct xen_hvm_setup a;
+
+        if (copy_from_guest(&a, arg, 1))
+            return -EFAULT;
+
+        switch (op) {
+        case HVMOP_setup_gnttab_table:
+            printk("vmx_gnttab_setup_table: frame_pa=%#lx,"
+                            "nr_frame=%ld\n", a.arg1, a.arg2);
+            return vmx_gnttab_setup_table(a.arg1, a.arg2);
+        case HVMOP_setup_shared_info_page:
+            printk("vmx_setup_shared_info_page: gpa=0x%lx\n", a.arg1);
+            return vmx_setup_shared_info_page(a.arg1);
+        }
+    }
+
     default:
         DPRINTK("Bad HVM op %ld.\n", op);
         rc = -ENOSYS;
diff -r 3e54734e55f3 xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h    Wed Aug 23 13:26:46 2006 -0600
+++ b/xen/include/public/arch-ia64.h    Fri Aug 25 17:41:32 2006 +0900
@@ -335,6 +335,17 @@ struct vcpu_guest_context {
 };
 typedef struct vcpu_guest_context vcpu_guest_context_t;
 DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
+
+// hvm_op expansion
+#define HVMOP_setup_gnttab_table        2
+#define HVMOP_setup_shared_info_page    3
+
+struct xen_hvm_setup {
+    unsigned long arg1;
+    unsigned long arg2;
+};
+typedef struct xen_hvm_setup xen_hvm_setup_t;
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_setup_t);
 
 // dom0 vp op
 #define __HYPERVISOR_ia64_dom0vp_op     __HYPERVISOR_arch_0
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel