Hi all,
I will post patches of PV-on-HVM for IPF.
We wrote the patch under this consideration:
* Expand hvm_op hypercall
+ Introduce HVMOP_setup_shared_info_page
- A page allocated on HVM-guest OS is swapped original shared_info
page with this hypercall.
- In x86 code, original shared_info page is used after pv-on-hvm
setup with remapping feature in arch depend HYPERVISOR_memory_op.
But, we can't implement same feature for IPF, thus we select to
implement with this method.
+ Introduce HVMOP_setup_gnttab_table
- Pages allocated on HVM-guest OS is swapped original grant_table
page frames with this hypercall.
- Same above.
* Change domain destroy logic
+ arch_domain_destroy() changed
- considered for swapping shared_info page.
+ grant_table_destroy() changed
- considered for swapping grant_frame pages.
* Modify linux-sparse for pv-on-hvm
+ gnttab.c in linux-sparse modified at initialization
+ modify hypervisor.h for pv-on-hvm
* Modify unmodified_drivers initialization
+ considered the different initialization with x86 code.
+ modify build rule for IPF
This patch includes:
* xen-hyper.patch
- hvm_op hyprecall extension
* xen-destroy.patch
- domain destroy logic modification
* linux.patch
- linux-sparse modification
* driver.patch
- unmodified_drivers modification
* build.patch
- unmodified_drivers build rule modification
We have tested that this patch doesn't affect dom0, domVTi without
pv-on-hvm driver attaching, and domVTi using pv-on-hvm driver works
VBD/VNIF.
Thanks,
- Tsunehisa Doi
# HG changeset patch
# User Doi.Tsunehisa@xxxxxxxxxxxxxx
# Node ID ee3c9f9b3e9f5b4ddb8999f9fc6ac0413b23f419
# Parent 3e54734e55f39419678afd1ce1a9a96669fa69ef
Expand hvm_op hypercall for PV-on-HVM/IPF
Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx>
Signed-off-by: Tomonari Horikoshi <t.horikoshi@xxxxxxxxxxxxxx>
diff -r 3e54734e55f3 -r ee3c9f9b3e9f 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 Thu Aug 24 20:09:21 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,79 @@
#include <public/version.h>
#include <asm/dom_fw.h>
#include <xen/domain.h>
+#include <xen/compile.h>
+#include <xen/event.h>
+
+static int
+vmx_gnttab_setup_table(unsigned long frame_pa, unsigned long nr_frames)
+{
+ struct domain *d = current->domain;
+ int rc = 0, i;
+ unsigned long o_grant_shared, pgaddr;
+
+ if (nr_frames != NR_GRANT_FRAMES) {
+ return -1;
+ }
+ o_grant_shared = (unsigned long)d->grant_table->shared;
+ d->grant_table->shared = (struct grant_entry *)domain_mpa_to_imva(d,
frame_pa);
+
+ /* 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);
+ /* If original page belongs to xen heap, then relinguish back
+ * to xen heap. Or else, leave to domain itself to decide.
+ */
+ for (i = 0; i < NR_GRANT_FRAMES; i++) {
+ pgaddr = o_grant_shared + PAGE_SIZE * i;
+ 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));
+ }
+ }
+ }
+ else {
+ memset(d->grant_table->shared, 0, PAGE_SIZE * nr_frames);
+ }
+ return rc;
+}
+
+static int
+vmx_setup_shared_info_page(unsigned long gpa)
+{
+ VCPU *vcpu = current;
+ struct domain *d = vcpu->domain;
+ unsigned long o_info;
+ struct vcpu *v;
+
+ o_info = (u64)d->shared_info;
+ d->shared_info= (shared_info_t *)domain_mpa_to_imva(d, gpa);
+
+ /* 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];
+ }
+ /* 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(o_info)))) {
+ free_domheap_page(virt_to_page(o_info));
+ free_xenheap_page((void *)o_info);
+ }
+ else {
+ put_page(virt_to_page(o_info));
+ }
+ }
+ else {
+ memset(d->shared_info, 0, PAGE_SIZE);
+ }
+ return 0;
+}
long
do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg)
@@ -78,6 +154,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 -r ee3c9f9b3e9f 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 Thu Aug 24 20:09:21 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
# HG changeset patch
# User Doi.Tsunehisa@xxxxxxxxxxxxxx
# Node ID 64486d0c30052f603c149a9a62c9552eaaf34bca
# Parent 88304f9671b54b3e78fe111cf2142a1828eb8600
Modify unmodified_drivers build rule for PV-on-HVM/IPF
Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx>
Signed-off-by: Tomonari Horikoshi <t.horikoshi@xxxxxxxxxxxxxx>
diff -r 88304f9671b5 -r 64486d0c3005 unmodified_drivers/linux-2.6/mkbuildtree
--- a/unmodified_drivers/linux-2.6/mkbuildtree Thu Aug 24 21:12:27 2006 +0900
+++ b/unmodified_drivers/linux-2.6/mkbuildtree Thu Aug 24 21:14:32 2006 +0900
@@ -42,6 +42,12 @@ i[34567]86)
ln -sf ${XL}/include/asm-i386/mach-xen/asm/synch_bitops.h include/asm
ln -sf ${XL}/include/asm-i386/mach-xen/asm/maddr.h include/asm
;;
+"ia64")
+ ln -sf ${XL}/include/asm-ia64/hypervisor.h include/asm
+ ln -sf ${XL}/include/asm-ia64/hypercall.h include/asm
+ ln -sf ${XL}/include/asm-ia64/synch_bitops.h include/asm
+ ln -sf ${XL}/include/asm-ia64/maddr.h include/asm
+ ;;
*)
echo unknown architecture $uname
exit 1
diff -r 88304f9671b5 -r 64486d0c3005 unmodified_drivers/linux-2.6/overrides.mk
--- a/unmodified_drivers/linux-2.6/overrides.mk Thu Aug 24 21:12:27 2006 +0900
+++ b/unmodified_drivers/linux-2.6/overrides.mk Thu Aug 24 21:14:32 2006 +0900
@@ -4,7 +4,9 @@
#
# (i.e. we need the native config for things like -mregparm, but
# a Xen kernel to find the right headers)
+ifneq ($(ARCH),ia64)
EXTRA_CFLAGS += -DCONFIG_VMX -DCONFIG_VMX_GUEST -DCONFIG_X86_XEN
+endif
EXTRA_CFLAGS += -DCONFIG_XEN_SHADOW_MODE -DCONFIG_XEN_SHADOW_TRANSLATE
EXTRA_CFLAGS += -DCONFIG_XEN_BLKDEV_GRANT -DXEN_EVTCHN_MASK_OPS
EXTRA_CFLAGS += -DCONFIG_XEN_NETDEV_GRANT_RX -DCONFIG_XEN_NETDEV_GRANT_TX
# HG changeset patch
# User Doi.Tsunehisa@xxxxxxxxxxxxxx
# Node ID 88304f9671b54b3e78fe111cf2142a1828eb8600
# Parent 6557c022fe1c5b45f5eab7830594e4bef17a4091
Modify unmodified_drivers for PV-on-HVM/IPF
Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx>
Signed-off-by: Tomonari Horikoshi <t.horikoshi@xxxxxxxxxxxxxx>
diff -r 6557c022fe1c -r 88304f9671b5
unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
--- a/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c Thu Aug 24
21:07:56 2006 +0900
+++ b/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c Thu Aug 24
21:12:27 2006 +0900
@@ -54,11 +54,15 @@ static int __init init_xen_info(void)
static int __init init_xen_info(void)
{
unsigned long shared_info_frame;
+ extern void *shared_info_area;
+#ifndef __ia64__
struct xen_add_to_physmap xatp;
- extern void *shared_info_area;
-
+#else
+ struct xen_hvm_setup xhs;
+#endif
setup_xen_features();
+#ifndef __ia64__
shared_info_frame = alloc_xen_mmio(PAGE_SIZE) >> PAGE_SHIFT;
xatp.domid = DOMID_SELF;
xatp.idx = 0;
@@ -66,9 +70,17 @@ static int __init init_xen_info(void)
xatp.gpfn = shared_info_frame;
if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp))
BUG();
-
shared_info_area =
ioremap(shared_info_frame << PAGE_SHIFT, PAGE_SIZE);
+#else /* !__ia64__ */
+ shared_info_frame = __get_free_page(GFP_KERNEL);
+ xhs.arg1 = virt_to_phys((void *)shared_info_frame);
+ xhs.arg2 = 0;
+ if (HYPERVISOR_hvm_op(HVMOP_setup_shared_info_page, &xhs))
+ BUG();
+ shared_info_area = (shared_info_t *)shared_info_frame;
+#endif /* !__ia64__ */
+
if (shared_info_area == NULL)
panic("can't map shared info\n");
@@ -96,6 +108,7 @@ static void __devexit platform_pci_remov
free_irq(pdev->irq, pdev);
}
+#ifndef __ia64__
static unsigned long platform_mmio;
static unsigned long platform_mmio_alloc;
static unsigned long platform_mmiolen;
@@ -160,6 +173,7 @@ static int get_hypercall_stubs(void)
return 0;
}
+#endif /* !__ia64__ */
static int __devinit platform_pci_init(struct pci_dev *pdev,
const struct pci_device_id *ent)
@@ -198,13 +212,14 @@ static int __devinit platform_pci_init(s
return -EBUSY;
}
+#ifndef __ia64__
platform_mmio = mmio_addr;
platform_mmiolen = mmio_len;
ret = get_hypercall_stubs();
if (ret < 0)
goto out;
-
+#endif /* __ia64__ */
if ((ret = init_xen_info()))
goto out;
diff -r 6557c022fe1c -r 88304f9671b5
unmodified_drivers/linux-2.6/platform-pci/xen_support.c
--- a/unmodified_drivers/linux-2.6/platform-pci/xen_support.c Thu Aug 24
21:07:56 2006 +0900
+++ b/unmodified_drivers/linux-2.6/platform-pci/xen_support.c Thu Aug 24
21:12:27 2006 +0900
@@ -26,11 +26,13 @@
#include <asm/hypervisor.h>
#include "platform-pci.h"
+#ifndef __ia64__
void xen_machphys_update(unsigned long mfn, unsigned long pfn)
{
BUG();
}
EXPORT_SYMBOL(xen_machphys_update);
+#endif /* __ia64__ */
void balloon_update_driver_allowance(long delta)
{
@@ -41,3 +43,15 @@ void balloon_release_driver_page(struct
{
}
EXPORT_SYMBOL(balloon_release_driver_page);
+
+#ifdef __ia64__
+int running_on_xen = 1;
+EXPORT_SYMBOL(running_on_xen);
+
+int ia64_xenmem_reservation_op(unsigned long op,
+ struct xen_memory_reservation* reservation__)
+{
+ return 0;
+}
+EXPORT_SYMBOL(ia64_xenmem_reservation_op);
+#endif /* __ia64__ */
# HG changeset patch
# User Doi.Tsunehisa@xxxxxxxxxxxxxx
# Node ID 6557c022fe1c5b45f5eab7830594e4bef17a4091
# Parent 622fc5f4ca01ef808b44e368786ac0b1776f9161
Modify linux for PV-on-HVM/IPF
Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx>
Signed-off-by: Tomonari Horikoshi <t.horikoshi@xxxxxxxxxxxxxx>
diff -r 622fc5f4ca01 -r 6557c022fe1c
linux-2.6-xen-sparse/drivers/xen/core/gnttab.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/gnttab.c Thu Aug 24 20:13:03
2006 +0900
+++ b/linux-2.6-xen-sparse/drivers/xen/core/gnttab.c Thu Aug 24 21:07:56
2006 +0900
@@ -429,6 +429,7 @@ int gnttab_resume(void)
int gnttab_resume(void)
{
unsigned long frames;
+#ifndef __ia64__
struct xen_add_to_physmap xatp;
unsigned int i;
@@ -448,13 +449,30 @@ int gnttab_resume(void)
printk("error to ioremap gnttab share frames\n");
return -1;
}
+#else /* !__ia64__ */
+ struct xen_hvm_setup xhs;
+
+ shared = (struct grant_entry *)
+ __get_free_pages(GFP_KERNEL, get_order(PAGE_SIZE *
NR_GRANT_FRAMES));
+ if (shared == NULL) {
+ printk("error to allocate gnttab share frames\n");
+ return -1;
+ }
+ frames = virt_to_phys((void *)shared);
+ xhs.arg1 = frames;
+ xhs.arg2 = NR_GRANT_FRAMES;
+ if (HYPERVISOR_hvm_op(HVMOP_setup_gnttab_table, &xhs))
+ BUG();
+#endif /* !__ia64__ */
return 0;
}
int gnttab_suspend(void)
{
+#ifndef __ia64__
iounmap(shared);
+#endif /* !__ia64__ */
return 0;
}
diff -r 622fc5f4ca01 -r 6557c022fe1c
linux-2.6-xen-sparse/include/asm-ia64/hypercall.h
--- a/linux-2.6-xen-sparse/include/asm-ia64/hypercall.h Thu Aug 24 20:13:03
2006 +0900
+++ b/linux-2.6-xen-sparse/include/asm-ia64/hypercall.h Thu Aug 24 21:07:56
2006 +0900
@@ -315,7 +315,9 @@ static inline void exit_idle(void) {}
})
#include <linux/err.h>
+#ifdef CONFIG_XEN
#include <asm/xen/privop.h>
+#endif /* CONFIG_XEN */
#define _hypercall_imm1(type, name, imm, a1) \
({ \
diff -r 622fc5f4ca01 -r 6557c022fe1c
linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h
--- a/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h Thu Aug 24
20:13:03 2006 +0900
+++ b/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h Thu Aug 24
21:07:56 2006 +0900
@@ -33,15 +33,9 @@
#ifndef __HYPERVISOR_H__
#define __HYPERVISOR_H__
-#ifndef CONFIG_XEN
-#define is_running_on_xen() (0)
-#define HYPERVISOR_ioremap(offset, size) (offset)
-#else
extern int running_on_xen;
#define is_running_on_xen() (running_on_xen)
-#endif
-#ifdef CONFIG_XEN
#include <linux/config.h>
#include <linux/types.h>
#include <linux/kernel.h>
@@ -59,7 +53,11 @@ extern shared_info_t *HYPERVISOR_shared_
extern shared_info_t *HYPERVISOR_shared_info;
extern start_info_t *xen_start_info;
+#ifdef CONFIG_XEN_PRIVILEGED_GUEST
#define is_initial_xendomain() (xen_start_info->flags & SIF_INITDOMAIN)
+#else
+#define is_initial_xendomain() 0
+#endif
void force_evtchn_callback(void);
@@ -182,10 +180,19 @@ MULTI_update_va_mapping(
mcl->result = 0;
}
+static inline void
+MULTI_grant_table_op(multicall_entry_t *mcl, unsigned int cmd,
+ void *uop, unsigned int count)
+{
+ mcl->op = __HYPERVISOR_grant_table_op;
+ mcl->args[0] = cmd;
+ mcl->args[1] = (unsigned long)uop;
+ mcl->args[2] = count;
+}
+
// for debug
asmlinkage int xprintk(const char *fmt, ...);
#define xprintd(fmt, ...) xprintk("%s:%d " fmt, __func__, __LINE__, \
##__VA_ARGS__)
-#endif /* CONFIG_XEN */
#endif /* __HYPERVISOR_H__ */
# HG changeset patch
# User Doi.Tsunehisa@xxxxxxxxxxxxxx
# Node ID 622fc5f4ca01ef808b44e368786ac0b1776f9161
# Parent ee3c9f9b3e9f5b4ddb8999f9fc6ac0413b23f419
Change destroy for PV-on-HVM/IPF
Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx>
Signed-off-by: Tomonari Horikoshi <t.horikoshi@xxxxxxxxxxxxxx>
diff -r ee3c9f9b3e9f -r 622fc5f4ca01 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c Thu Aug 24 20:09:21 2006 +0900
+++ b/xen/arch/ia64/xen/domain.c Thu Aug 24 20:13:03 2006 +0900
@@ -390,8 +390,16 @@ void arch_domain_destroy(struct domain *
void arch_domain_destroy(struct domain *d)
{
BUG_ON(d->arch.mm.pgd != NULL);
- if (d->shared_info != NULL)
- free_xenheap_pages(d->shared_info, get_order_from_shift(XSI_SHIFT));
+ if (d->shared_info != NULL) {
+ /* If this domain is domVTi, the shared_info page may
+ * be replaced with domheap. Then the shared_info page
+ * frees in relinquish_mm().
+ */
+ if (IS_XEN_HEAP_FRAME(virt_to_page(d->shared_info))) {
+ free_xenheap_pages(d->shared_info,
+ get_order_from_shift(XSI_SHIFT));
+ }
+ }
if (d->arch.shadow_bitmap != NULL)
xfree(d->arch.shadow_bitmap);
diff -r ee3c9f9b3e9f -r 622fc5f4ca01 xen/common/grant_table.c
--- a/xen/common/grant_table.c Thu Aug 24 20:09:21 2006 +0900
+++ b/xen/common/grant_table.c Thu Aug 24 20:13:03 2006 +0900
@@ -1164,7 +1164,8 @@ grant_table_destroy(
if ( t == NULL )
return;
- free_xenheap_pages(t->shared, ORDER_GRANT_FRAMES);
+ if (IS_XEN_HEAP_FRAME(virt_to_page(t->shared)))
+ free_xenheap_pages(t->shared, ORDER_GRANT_FRAMES);
free_xenheap_page(t->maptrack);
xfree(t->active);
xfree(t);
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|