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
|