Hi all,
We have been porting PV-on-HVM feature for ia64 platform.
I will post patches for PV-on-HVM on ia64 platform. These patches modify
common code for PV-on-HVM on IPF.
We ported PV-on-HVM for IPF under this consideration:
* Expand memory_op hypercall
+ Introduce XENMEM_add_to_physmap
- A virtual space allocated on HVM-guest OS is remapped original
shared_info and grant_table page with this hypercall.
- This method is same as x86 method.
* Reduce hvm_op hypercall
+ Delete functions introduced for old PV-on-HVM on IPF.
* Revert domain destroy logic
+ revert arch_domain_destroy() for old PV-on-HVM on IPF.
* Modify unmodified_drivers initialization
+ cut off unused codes for IPF
+ modify build rule for IPF
These patch include: (ia64 specific code)
* expand-memory-op.patch
- introduce XENMEM_add_to_physmap feature for PV-on-HVM on IPF
* reduce-hvmop.patch
- reduce hvm_op hypercall for old PV-on-HVM on IPF
* revert-destroy.patch
- revert arch_domain_destory() for old PV-on-HVM on IPF
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 on IPF.
Thanks,
- Tsunehisa Doi
# HG changeset patch
# User Doi.Tsunehisa@xxxxxxxxxxxxxx
# Node ID 127e7a6c9f5636aea69d47bdeae0b938ea0d2d88
# Parent 684fdcfb251a443fa885c142b427d253ec033212
Reduce HYPERVISOR_hvmop for IPF
Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx>
Signed-off-by: Tomonari Horikoshi <t.horikoshi@xxxxxxxxxxxxxx>
diff -r 684fdcfb251a -r 127e7a6c9f56 xen/arch/ia64/vmx/vmx_hypercall.c
--- a/xen/arch/ia64/vmx/vmx_hypercall.c Mon Aug 28 16:26:37 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_hypercall.c Tue Aug 29 18:31:43 2006 +0900
@@ -37,91 +37,6 @@
#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;
- struct grant_entry *pgaddr;
- unsigned long o_grant_shared;
-
- 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 = pgaddr;
-
- /* Copy existing grant table 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;
- shared_info_t *pgaddr;
- struct vcpu *v;
-
- if (gpa & ~PAGE_MASK) {
- return -EINVAL;
- }
-
- pgaddr = domain_mpa_to_imva(d, gpa);
- if (pgaddr == NULL) {
- return -EFAULT;
- }
-
- o_info = (u64)d->shared_info;
- d->shared_info = 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)
@@ -166,25 +81,6 @@ 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 684fdcfb251a -r 127e7a6c9f56 xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h Mon Aug 28 16:26:37 2006 -0600
+++ b/xen/include/public/arch-ia64.h Tue Aug 29 18:31:43 2006 +0900
@@ -338,17 +338,6 @@ 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 62b5720142e6b19420977f139a09a1c8eea63a52
# Parent 127e7a6c9f5636aea69d47bdeae0b938ea0d2d88
Revert arch_domain_destroy for old PV-on-HVM
Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx>
Signed-off-by: Tomonari Horikoshi <t.horikoshi@xxxxxxxxxxxxxx>
diff -r 127e7a6c9f56 -r 62b5720142e6 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c Tue Aug 29 18:31:43 2006 +0900
+++ b/xen/arch/ia64/xen/domain.c Tue Aug 29 18:33:29 2006 +0900
@@ -400,16 +400,9 @@ 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) {
- /* 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->shared_info != NULL)
+ free_xenheap_pages(d->shared_info,
+ get_order_from_shift(XSI_SHIFT));
if (d->arch.shadow_bitmap != NULL)
xfree(d->arch.shadow_bitmap);
# HG changeset patch
# User Doi.Tsunehisa@xxxxxxxxxxxxxx
# Node ID 259aea558618ad79219d838dcb520142a5f04897
# Parent 62b5720142e6b19420977f139a09a1c8eea63a52
Expand memory_op for PV-on-HVM on IPF
Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx>
Signed-off-by: Tomonari Horikoshi <t.horikoshi@xxxxxxxxxxxxxx>
diff -r 62b5720142e6 -r 259aea558618 xen/arch/ia64/xen/mm.c
--- a/xen/arch/ia64/xen/mm.c Tue Aug 29 18:33:29 2006 +0900
+++ b/xen/arch/ia64/xen/mm.c Tue Aug 29 18:42:04 2006 +0900
@@ -173,6 +173,9 @@
#include <asm/vcpu.h>
#include <asm/shadow.h>
#include <linux/efi.h>
+#include <xen/guest_access.h>
+#include <asm/page.h>
+#include <public/memory.h>
static void domain_page_flush(struct domain* d, unsigned long mpaddr,
unsigned long old_mfn, unsigned long new_mfn);
@@ -1752,6 +1755,82 @@ int memory_is_conventional_ram(paddr_t p
return (efi_mem_type(p) == EFI_CONVENTIONAL_MEMORY);
}
+
+long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
+{
+ switch (op) {
+ case XENMEM_add_to_physmap:
+ {
+ struct xen_add_to_physmap xatp;
+ unsigned long prev_mfn, mfn = 0, gpfn;
+ struct domain *d;
+
+ if (copy_from_guest(&xatp, arg, 1))
+ return -EFAULT;
+
+ if (xatp.domid == DOMID_SELF) {
+ d = current->domain;
+ get_knownalive_domain(d);
+ }
+ else if (!IS_PRIV(current->domain))
+ return -EPERM;
+ else if ((d = find_domain_by_id(xatp.domid)) == NULL)
+ return -ESRCH;
+
+ /* This hypercall is used for VT-i domain only */
+ if (!VMX_DOMAIN(d->vcpu[0])) {
+ put_domain(d);
+ return -ENOSYS;
+ }
+
+ switch (xatp.space) {
+ case XENMAPSPACE_shared_info:
+ if (xatp.idx == 0)
+ mfn = virt_to_mfn(d->shared_info);
+ break;
+ case XENMAPSPACE_grant_table:
+ if (xatp.idx < NR_GRANT_FRAMES)
+ mfn = virt_to_mfn(d->grant_table->shared) + xatp.idx;
+ break;
+ default:
+ break;
+ }
+
+ LOCK_BIGLOCK(d);
+
+ /* Remove previously mapped page if it was present. */
+ prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
+ if (prev_mfn && mfn_valid(prev_mfn)) {
+ if (IS_XEN_HEAP_FRAME(mfn_to_page(prev_mfn)))
+ /* Xen heap frames are simply unhooked from this phys slot. */
+ guest_physmap_remove_page(d, xatp.gpfn, prev_mfn);
+ else
+ /* Normal domain memory is freed, to avoid leaking memory. */
+ guest_remove_page(d, xatp.gpfn);
+ }
+
+ /* Unmap from old location, if any. */
+ gpfn = get_gpfn_from_mfn(mfn);
+ if (gpfn != INVALID_M2P_ENTRY)
+ guest_physmap_remove_page(d, gpfn, mfn);
+
+ /* Map at new location. */
+ guest_physmap_add_page(d, xatp.gpfn, mfn);
+
+ UNLOCK_BIGLOCK(d);
+
+ put_domain(d);
+
+ break;
+ }
+
+ default:
+ return -ENOSYS;
+ }
+
+ return 0;
+}
+
/*
* Local variables:
* mode: C
diff -r 62b5720142e6 -r 259aea558618 xen/arch/ia64/xen/vhpt.c
--- a/xen/arch/ia64/xen/vhpt.c Tue Aug 29 18:33:29 2006 +0900
+++ b/xen/arch/ia64/xen/vhpt.c Tue Aug 29 18:42:04 2006 +0900
@@ -14,6 +14,7 @@
#include <asm/page.h>
#include <asm/vhpt.h>
#include <asm/vcpu.h>
+#include <asm/vmmu.h>
/* Defined in tlb.c */
extern void ia64_global_tlb_purge(UINT64 start, UINT64 end, UINT64 nbits);
@@ -131,15 +132,21 @@ void vhpt_init(void)
void vcpu_flush_vtlb_all(struct vcpu *v)
{
- /* First VCPU tlb. */
- vcpu_purge_tr_entry(&PSCBX(v,dtlb));
- vcpu_purge_tr_entry(&PSCBX(v,itlb));
-
- /* Then VHPT. */
- vhpt_flush ();
-
- /* Then mTLB. */
- local_flush_tlb_all ();
+ if (VMX_DOMAIN(v)) {
+ /* Purge vTLB for VT-i domain */
+ thash_purge_all(v);
+ }
+ else {
+ /* First VCPU tlb. */
+ vcpu_purge_tr_entry(&PSCBX(v,dtlb));
+ vcpu_purge_tr_entry(&PSCBX(v,itlb));
+
+ /* Then VHPT. */
+ vhpt_flush ();
+
+ /* Then mTLB. */
+ local_flush_tlb_all ();
+ }
/* We could clear bit in d->domain_dirty_cpumask only if domain d in
not running on this processor. There is currently no easy way to
diff -r 62b5720142e6 -r 259aea558618 xen/include/asm-ia64/mm.h
--- a/xen/include/asm-ia64/mm.h Tue Aug 29 18:33:29 2006 +0900
+++ b/xen/include/asm-ia64/mm.h Tue Aug 29 18:42:04 2006 +0900
@@ -495,7 +495,7 @@ extern u64 translate_domain_pte(u64 ptev
((gmfn_to_mfn((_d),(gpa)>>PAGE_SHIFT)<<PAGE_SHIFT)|((gpa)&~PAGE_MASK))
/* Arch-specific portion of memory_op hypercall. */
-#define arch_memory_op(op, arg) (-ENOSYS)
+long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg);
int steal_page(
struct domain *d, struct page_info *page, unsigned int memflags);
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|