Mailing List Archive

Replace the MMUEXTOP 'pfn hole' commands with a new
# HG changeset patch
# User kaf24@firebug.cl.cam.ac.uk
# Node ID 1db05e589fa029a676dae172bdb980aadb83958e
# Parent ce057aa33cadc2a71ed5ef715217e577fc867408
Replace the MMUEXTOP 'pfn hole' commands with a new
arch-specific XENMEM_ operation.

Signed-off-by: Keir Fraser <keir@xensource.com>

diff -r ce057aa33cad -r 1db05e589fa0 tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c Sat Jan 28 12:01:19 2006
+++ b/tools/libxc/xc_linux_build.c Sat Jan 28 14:31:43 2006
@@ -114,9 +114,12 @@
vl2e++;
}

- if (shadow_mode_enabled) {
+ if ( shadow_mode_enabled )
+ {
*vl1e = (count << PAGE_SHIFT) | L1_PROT;
- } else {
+ }
+ else
+ {
*vl1e = (page_array[count] << PAGE_SHIFT) | L1_PROT;
if ( (count >= ((vpt_start-dsi_v_start)>>PAGE_SHIFT)) &&
(count < ((vpt_end -dsi_v_start)>>PAGE_SHIFT)) )
@@ -196,9 +199,12 @@
*vl2e++ = l1tab | L2_PROT;
}

- if (shadow_mode_enabled) {
+ if ( shadow_mode_enabled )
+ {
*vl1e = (count << PAGE_SHIFT) | L1_PROT;
- } else {
+ }
+ else
+ {
*vl1e = ((uint64_t)page_array[count] << PAGE_SHIFT) | L1_PROT;
if ( (count >= ((vpt_start-dsi_v_start)>>PAGE_SHIFT)) &&
(count < ((vpt_end -dsi_v_start)>>PAGE_SHIFT)) )
@@ -289,9 +295,12 @@
vl2e++;
}

- if (shadow_mode_enabled) {
+ if ( shadow_mode_enabled )
+ {
*vl1e = (count << PAGE_SHIFT) | L1_PROT;
- } else {
+ }
+ else
+ {
*vl1e = (page_array[count] << PAGE_SHIFT) | L1_PROT;
if ( (count >= ((vpt_start-dsi_v_start)>>PAGE_SHIFT)) &&
(count < ((vpt_end -dsi_v_start)>>PAGE_SHIFT)) )
@@ -442,7 +451,9 @@
{
ctxt->initrd.start = vinitrd_start;
ctxt->initrd.size = initrd_len;
- } else {
+ }
+ else
+ {
ctxt->initrd.start = 0;
ctxt->initrd.size = 0;
}
@@ -553,12 +564,15 @@
if ( (v_end - vstack_end) < (512UL << 10) )
v_end += 1UL << 22; /* Add extra 4MB to get >= 512kB padding. */
#if defined(__i386__)
- if (dsi.pae_kernel) {
+ if ( dsi.pae_kernel )
+ {
/* FIXME: assumes one L2 pgtable @ 0xc0000000 */
if ( (((v_end - dsi.v_start + ((1<<L2_PAGETABLE_SHIFT_PAE)-1)) >>
L2_PAGETABLE_SHIFT_PAE) + 2) <= nr_pt_pages )
break;
- } else {
+ }
+ else
+ {
if ( (((v_end - dsi.v_start + ((1<<L2_PAGETABLE_SHIFT)-1)) >>
L2_PAGETABLE_SHIFT) + 1) <= nr_pt_pages )
break;
@@ -676,23 +690,33 @@
if ( xc_finish_mmu_updates(xc_handle, mmu) )
goto error_out;

- if (shadow_mode_enabled) {
+ if ( shadow_mode_enabled )
+ {
+ struct xen_reserved_phys_area xrpa;
+
/* Enable shadow translate mode */
- if (xc_shadow_control(xc_handle, dom,
- DOM0_SHADOW_CONTROL_OP_ENABLE_TRANSLATE,
- NULL, 0, NULL) < 0) {
+ if ( xc_shadow_control(xc_handle, dom,
+ DOM0_SHADOW_CONTROL_OP_ENABLE_TRANSLATE,
+ NULL, 0, NULL) < 0 )
+ {
PERROR("Could not enable translation mode");
goto error_out;
}

/* Find the shared info frame. It's guaranteed to be at the
start of the PFN hole. */
- guest_shared_info_mfn = xc_get_pfn_hole_start(xc_handle, dom);
- if (guest_shared_info_mfn <= 0) {
+ xrpa.domid = dom;
+ xrpa.idx = 0;
+ rc = xc_memory_op(xc_handle, XENMEM_reserved_phys_area, &xrpa);
+ if ( rc != 0 )
+ {
PERROR("Cannot find shared info pfn");
goto error_out;
}
- } else {
+ guest_shared_info_mfn = xrpa.first_pfn;
+ }
+ else
+ {
guest_shared_info_mfn = shared_info_frame;
}

@@ -723,12 +747,16 @@
* Pin down l2tab addr as page dir page - causes hypervisor to provide
* correct protection for the page
*/
- if (!shadow_mode_enabled) {
- if (dsi.pae_kernel) {
+ if ( !shadow_mode_enabled )
+ {
+ if ( dsi.pae_kernel )
+ {
if ( pin_table(xc_handle, MMUEXT_PIN_L3_TABLE,
ctxt->ctrlreg[3] >> PAGE_SHIFT, dom) )
goto error_out;
- } else {
+ }
+ else
+ {
if ( pin_table(xc_handle, MMUEXT_PIN_L2_TABLE,
ctxt->ctrlreg[3] >> PAGE_SHIFT, dom) )
goto error_out;
@@ -751,10 +779,13 @@
if ( xc_clear_domain_page(xc_handle, dom, *store_mfn) ||
xc_clear_domain_page(xc_handle, dom, *console_mfn) )
goto error_out;
- if (shadow_mode_enabled) {
+ if ( shadow_mode_enabled )
+ {
guest_store_mfn = (vstoreinfo_start-dsi.v_start) >> PAGE_SHIFT;
guest_console_mfn = (vconsole_start-dsi.v_start) >> PAGE_SHIFT;
- } else {
+ }
+ else
+ {
guest_store_mfn = *store_mfn;
guest_console_mfn = *console_mfn;
}
diff -r ce057aa33cad -r 1db05e589fa0 tools/libxc/xc_misc.c
--- a/tools/libxc/xc_misc.c Sat Jan 28 12:01:19 2006
+++ b/tools/libxc/xc_misc.c Sat Jan 28 14:31:43 2006
@@ -131,13 +131,6 @@
return rc;
}

-int xc_get_pfn_hole_start(int xc_handle, domid_t dom)
-{
- struct mmuext_op op = {0};
- op.cmd = MMUEXT_PFN_HOLE_BASE;
- return xc_mmuext_op(xc_handle, &op, 1, dom);
-}
-

/*
* Local variables:
diff -r ce057aa33cad -r 1db05e589fa0 tools/libxc/xc_private.c
--- a/tools/libxc/xc_private.c Sat Jan 28 12:01:19 2006
+++ b/tools/libxc/xc_private.c Sat Jan 28 14:31:43 2006
@@ -201,6 +201,7 @@
{
case XENMEM_increase_reservation:
case XENMEM_decrease_reservation:
+ case XENMEM_populate_physmap:
if ( mlock(reservation, sizeof(*reservation)) != 0 )
{
PERROR("Could not mlock");
@@ -229,6 +230,13 @@
goto out1;
}
break;
+ case XENMEM_reserved_phys_area:
+ if ( mlock(arg, sizeof(struct xen_reserved_phys_area)) )
+ {
+ PERROR("Could not mlock");
+ goto out1;
+ }
+ break;
}

ret = do_xen_hypercall(xc_handle, &hypercall);
@@ -237,6 +245,7 @@
{
case XENMEM_increase_reservation:
case XENMEM_decrease_reservation:
+ case XENMEM_populate_physmap:
safe_munlock(reservation, sizeof(*reservation));
if ( reservation->extent_start != NULL )
safe_munlock(reservation->extent_start,
@@ -246,6 +255,9 @@
safe_munlock(xmml, sizeof(*xmml));
safe_munlock(xmml->extent_start,
xmml->max_extents * sizeof(unsigned long));
+ break;
+ case XENMEM_reserved_phys_area:
+ safe_munlock(arg, sizeof(struct xen_reserved_phys_area));
break;
}

diff -r ce057aa33cad -r 1db05e589fa0 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h Sat Jan 28 12:01:19 2006
+++ b/tools/libxc/xenctrl.h Sat Jan 28 14:31:43 2006
@@ -528,6 +528,4 @@
unsigned long long ptr, unsigned long long val);
int xc_finish_mmu_updates(int xc_handle, xc_mmu_t *mmu);

-int xc_get_pfn_hole_start(int xc_handle, domid_t dom);
-
#endif
diff -r ce057aa33cad -r 1db05e589fa0 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Sat Jan 28 12:01:19 2006
+++ b/xen/arch/x86/mm.c Sat Jan 28 14:31:43 2006
@@ -104,6 +104,7 @@
#include <asm/uaccess.h>
#include <asm/ldt.h>
#include <asm/x86_emulate.h>
+#include <public/memory.h>

#ifdef VERBOSE
#define MEM_LOG(_f, _a...) \
@@ -1930,56 +1931,6 @@
break;
}

- case MMUEXT_PFN_HOLE_BASE:
- {
- if (FOREIGNDOM->start_pfn_hole) {
- rc = FOREIGNDOM->start_pfn_hole;
- okay = 1;
- } else {
- rc = FOREIGNDOM->start_pfn_hole =
- FOREIGNDOM->max_pages;
- okay = 1;
- if (shadow_mode_translate(FOREIGNDOM)) {
- /* Fill in a few entries in the hole. At the
- moment, this means the shared info page and the
- grant table pages. */
- struct domain_mmap_cache c1, c2;
- unsigned long pfn, mfn, x;
- domain_mmap_cache_init(&c1);
- domain_mmap_cache_init(&c2);
- shadow_lock(FOREIGNDOM);
- pfn = FOREIGNDOM->start_pfn_hole;
- mfn = virt_to_phys(FOREIGNDOM->shared_info) >> PAGE_SHIFT;
- set_p2m_entry(FOREIGNDOM, pfn, mfn, &c1, &c2);
- set_pfn_from_mfn(mfn, pfn);
- pfn++;
- for (x = 0; x < NR_GRANT_FRAMES; x++) {
- mfn = gnttab_shared_mfn(FOREIGNDOM,
- FOREIGNDOM->grant_table,
- x);
- set_p2m_entry(FOREIGNDOM, pfn, mfn, &c1, &c2);
- set_pfn_from_mfn(mfn, pfn);
- pfn++;
- }
- shadow_unlock(FOREIGNDOM);
- domain_mmap_cache_destroy(&c1);
- domain_mmap_cache_destroy(&c2);
- }
- }
- break;
- }
-
- case MMUEXT_PFN_HOLE_SIZE:
- {
- if (shadow_mode_translate(FOREIGNDOM)) {
- rc = PFN_HOLE_SIZE;
- } else {
- rc = 0;
- }
- okay = 1;
- break;
- }
-
default:
MEM_LOG("Invalid extended pt command 0x%x", op.cmd);
okay = 0;
@@ -2815,6 +2766,62 @@
}


+long arch_memory_op(int op, void *arg)
+{
+ struct xen_reserved_phys_area xrpa;
+ unsigned long pfn;
+ struct domain *d;
+ unsigned int i;
+
+ switch ( op )
+ {
+ case XENMEM_reserved_phys_area:
+ if ( copy_from_user(&xrpa, arg, sizeof(xrpa)) )
+ return -EFAULT;
+
+ /* No guest has more than one reserved area. */
+ if ( xrpa.idx != 0 )
+ return -ESRCH;
+
+ if ( (d = find_domain_by_id(xrpa.domid)) == NULL )
+ return -ESRCH;
+
+ /* Only initialised translated guests have a reserved area. */
+ if ( !shadow_mode_translate(d) || (d->max_pages == 0) )
+ {
+ put_domain(d);
+ return -ESRCH;
+ }
+
+ LOCK_BIGLOCK(d);
+ if ( d->arch.first_reserved_pfn == 0 )
+ {
+ d->arch.first_reserved_pfn = pfn = d->max_pages;
+ guest_physmap_add_page(
+ d, pfn + 0, virt_to_phys(d->shared_info) >> PAGE_SHIFT);
+ for ( i = 0; i < NR_GRANT_FRAMES; i++ )
+ guest_physmap_add_page(
+ d, pfn + 1 + i, gnttab_shared_mfn(d, d->grant_table, i));
+ }
+ UNLOCK_BIGLOCK(d);
+
+ xrpa.first_pfn = d->arch.first_reserved_pfn;
+ xrpa.nr_pfns = 32;
+
+ put_domain(d);
+
+ if ( copy_to_user(arg, &xrpa, sizeof(xrpa)) )
+ return -EFAULT;
+
+ break;
+
+ default:
+ return subarch_memory_op(op, arg);
+ }
+
+ return 0;
+}
+

/*************************
* Writable Pagetables
diff -r ce057aa33cad -r 1db05e589fa0 xen/arch/x86/x86_32/mm.c
--- a/xen/arch/x86/x86_32/mm.c Sat Jan 28 12:01:19 2006
+++ b/xen/arch/x86/x86_32/mm.c Sat Jan 28 14:31:43 2006
@@ -182,7 +182,7 @@
}
}

-long arch_memory_op(int op, void *arg)
+long subarch_memory_op(int op, void *arg)
{
struct xen_machphys_mfn_list xmml;
unsigned long mfn;
diff -r ce057aa33cad -r 1db05e589fa0 xen/arch/x86/x86_64/mm.c
--- a/xen/arch/x86/x86_64/mm.c Sat Jan 28 12:01:19 2006
+++ b/xen/arch/x86/x86_64/mm.c Sat Jan 28 14:31:43 2006
@@ -182,7 +182,7 @@
}
}

-long arch_memory_op(int op, void *arg)
+long subarch_memory_op(int op, void *arg)
{
struct xen_machphys_mfn_list xmml;
l3_pgentry_t l3e;
diff -r ce057aa33cad -r 1db05e589fa0 xen/include/asm-x86/config.h
--- a/xen/include/asm-x86/config.h Sat Jan 28 12:01:19 2006
+++ b/xen/include/asm-x86/config.h Sat Jan 28 14:31:43 2006
@@ -59,9 +59,6 @@
#define STACK_ORDER 2
#endif
#endif
-
-/* How large is the PFN reserved area, when we have one? */
-#define PFN_HOLE_SIZE 32

#ifndef STACK_ORDER
#define STACK_ORDER 1
diff -r ce057aa33cad -r 1db05e589fa0 xen/include/asm-x86/domain.h
--- a/xen/include/asm-x86/domain.h Sat Jan 28 12:01:19 2006
+++ b/xen/include/asm-x86/domain.h Sat Jan 28 14:31:43 2006
@@ -109,6 +109,9 @@

pagetable_t phys_table; /* guest 1:1 pagetable */
struct vmx_platform vmx_platform;
+
+ /* Shadow-translated guest: Pseudophys base address of reserved area. */
+ unsigned long first_reserved_pfn;
} __cacheline_aligned;

struct arch_vcpu
diff -r ce057aa33cad -r 1db05e589fa0 xen/include/asm-x86/mm.h
--- a/xen/include/asm-x86/mm.h Sat Jan 28 12:01:19 2006
+++ b/xen/include/asm-x86/mm.h Sat Jan 28 14:31:43 2006
@@ -382,5 +382,6 @@

/* Arch-specific portion of memory_op hypercall. */
long arch_memory_op(int op, void *arg);
+long subarch_memory_op(int op, void *arg);

#endif /* __ASM_X86_MM_H__ */
diff -r ce057aa33cad -r 1db05e589fa0 xen/include/public/memory.h
--- a/xen/include/public/memory.h Sat Jan 28 12:01:19 2006
+++ b/xen/include/public/memory.h Sat Jan 28 14:31:43 2006
@@ -94,6 +94,26 @@
unsigned int nr_extents;
} xen_machphys_mfn_list_t;

+/*
+ * Returns the base and size of the specified reserved 'RAM hole' in the
+ * specified guest's pseudophysical address space.
+ * arg == addr of xen_reserved_phys_area_t.
+ */
+#define XENMEM_reserved_phys_area 7
+typedef struct xen_reserved_phys_area {
+ /* Which request to report about? */
+ domid_t domid;
+
+ /*
+ * Which reserved area to report? Out-of-range request reports
+ * -ESRCH. Currently no architecture will have more than one reserved area.
+ */
+ unsigned int idx;
+
+ /* Base and size of the specified reserved area. */
+ unsigned long first_pfn, nr_pfns;
+} xen_reserved_phys_area_t;
+
#endif /* __XEN_PUBLIC_MEMORY_H__ */

/*
diff -r ce057aa33cad -r 1db05e589fa0 xen/include/public/xen.h
--- a/xen/include/public/xen.h Sat Jan 28 12:01:19 2006
+++ b/xen/include/public/xen.h Sat Jan 28 14:31:43 2006
@@ -144,15 +144,6 @@
* cmd: MMUEXT_SET_LDT
* linear_addr: Linear address of LDT base (NB. must be page-aligned).
* nr_ents: Number of entries in LDT.
- *
- * cmd: MMUEXT_PFN_HOLE_BASE
- * No additional arguments. Returns the first pfn in the Xen-reserved
- * pfn hole. Note that we delay allocating the hole until the first
- * time this is called.
- *
- * cmd: MMUEXT_PFN_HOLE_SIZE
- * No additional arguments. Returns the number of pfns in the
- * Xen-reserved pfn hole.
*/
#define MMUEXT_PIN_L1_TABLE 0
#define MMUEXT_PIN_L2_TABLE 1
@@ -169,8 +160,6 @@
#define MMUEXT_FLUSH_CACHE 12
#define MMUEXT_SET_LDT 13
#define MMUEXT_NEW_USER_BASEPTR 15
-#define MMUEXT_PFN_HOLE_BASE 16
-#define MMUEXT_PFN_HOLE_SIZE 17

#ifndef __ASSEMBLY__
struct mmuext_op {
diff -r ce057aa33cad -r 1db05e589fa0 xen/include/xen/sched.h
--- a/xen/include/xen/sched.h Sat Jan 28 12:01:19 2006
+++ b/xen/include/xen/sched.h Sat Jan 28 14:31:43 2006
@@ -153,9 +153,6 @@

/* Control-plane tools handle for this domain. */
xen_domain_handle_t handle;
-
- /* Start of the PFN hole */
- unsigned long start_pfn_hole;
};

struct domain_setup_info

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