PERFORCE change 104932 for review
Jue Yuan
yuanjue at FreeBSD.org
Thu Aug 24 13:55:49 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=104932
Change 104932 by yuanjue at maver-freebsd on 2006/08/24 13:54:54
two features added:
1. The option for ignoring ISA hole for domU works now.
2. kernel for domU now support up to 8MB size. A proper
mfsroot could be embedded in kernel now.
Submitted by: Yuan, Jue
Affected files ...
.. //depot/projects/soc2006/yuanjue-xen3/src/sys/i386-xen/i386-xen/xen_machdep.c#2 edit
.. //depot/projects/soc2006/yuanjue-xen3/src/sys/i386-xen/include/vmparam.h#2 edit
.. //depot/projects/soc2006/yuanjue-xen3/src/sys/i386-xen/include/xenvar.h#2 edit
Differences ...
==== //depot/projects/soc2006/yuanjue-xen3/src/sys/i386-xen/i386-xen/xen_machdep.c#2 (text+ko) ====
@@ -634,9 +634,16 @@
#endif
/*
* pre-zero unused mapped pages - mapped on 4MB boundary
+ * mapped on 8MB boundary if mfsroot is embedded in kernel
*/
#ifndef PAE
- round_tmpindex = (((tmpindex - 1) / 1024) + 1)*1024;
+
+#ifndef ADD_MFS_ROOT
+ round_tmpindex = (((tmpindex - 1) / 1024) + 1) * 1024;
+#else
+ round_tmpindex = (((tmpindex - 1) / 1024) + 2) * 1024;
+#endif
+
#endif
bzero((char *)PFNTOV(tmpindex), (round_tmpindex - tmpindex)*PAGE_SIZE);
@@ -687,6 +694,11 @@
xen_queue_pt_update(pdir_shadow_ma + (KPTDI + ISA_PDR_OFFSET)*sizeof(vm_paddr_t),
KPTphys | PG_V | PG_A);
+ /*we need at least one more 4MB for mfsroot embedded in kernel*/
+#ifdef ADD_MFS_ROOT
+ xen_queue_pt_update(pdir_shadow_ma + (KPTDI + ISA_PDR_OFFSET + 1)*sizeof(vm_paddr_t),
+ xpmap_ptom(VTOP(startinfo->pt_base + (2 * PAGE_SIZE))) | PG_V | PG_A);
+#endif
xen_flush_queue();
@@ -720,20 +732,40 @@
if (tmpindex > 980)
__asm__("int3");
#endif
- /* unmap remaining pages from initial 4MB chunk
+ /* unmap remaining pages from initial 4MB chunk
+ * 8MB chunk if mfsroot is embedded in kernel
*/
+#ifndef ADD_MFS_ROOT
for (i = (tmpindex - ISA_INDEX_OFFSET); i%1024 != 0; i++)
xen_queue_pt_update(KPTphys + i*sizeof(vm_paddr_t), 0);
+#else
+ for (i = (tmpindex - ISA_INDEX_OFFSET); i%2048 != 0; i++) {
+ if (i < 1024)
+ xen_queue_pt_update(KPTphys + i*sizeof(vm_paddr_t), 0);
+ else
+ xen_queue_pt_update(xpmap_ptom(VTOP(startinfo->pt_base + (2 * PAGE_SIZE))) + (i-1024)*sizeof(vm_paddr_t), 0);
+ }
+#endif
xen_flush_queue();
/* allocate remainder of NKPT pages */
- for (i = 0; i < NKPT-1; i++, tmpindex++) {
+#ifndef ADD_MFS_ROOT
+ for (i = 0; i < NKPT - 1; i++, tmpindex++) {
/* KERNBASE left unmapped (+ 1) KERNLOAD already mapped (+1) == + 2 */
xen_queue_pt_update((vm_paddr_t)(IdlePTDma + KPTDI + i + 1 + ISA_PDR_OFFSET),
xpmap_ptom((tmpindex << PAGE_SHIFT)| PG_KERNEL));
xen_queue_pt_update(pdir_shadow_ma + (KPTDI + i + 1 + ISA_PDR_OFFSET)*sizeof(vm_paddr_t),
xpmap_ptom((tmpindex << PAGE_SHIFT)| PG_V | PG_A));
}
+#else
+ for (i = 0; i < NKPT - 2; i++, tmpindex++) {
+ /*if mfsroot embedded, 2 PDE has used for bootstrap already*/
+ xen_queue_pt_update((vm_paddr_t)(IdlePTDma + KPTDI + i + 2 + ISA_PDR_OFFSET),
+ xpmap_ptom((tmpindex << PAGE_SHIFT)| PG_KERNEL));
+ xen_queue_pt_update(pdir_shadow_ma + (KPTDI + i + 2 + ISA_PDR_OFFSET)*sizeof(vm_paddr_t),
+ xpmap_ptom((tmpindex << PAGE_SHIFT)| PG_V | PG_A));
+ }
+#endif
tmpindex += NKPT-1;
PT_UPDATES_FLUSH();
@@ -769,6 +801,7 @@
op.u.set_iopl.iopl = 1;
PANIC_IF(HYPERVISOR_physdev_op(&op));
+#ifdef ADD_ISA_HOLE
/* add page table for KERNBASE */
xen_queue_pt_update((vm_paddr_t)(IdlePTDma + KPTDI),
xpmap_ptom((tmpindex << PAGE_SHIFT)| PG_KERNEL));
@@ -776,6 +809,7 @@
xpmap_ptom((tmpindex << PAGE_SHIFT)| PG_V | PG_A));
xen_flush_queue();
tmpindex++;
+#endif
if (xen_start_info->flags & SIF_INITDOMAIN) {
/* Map first megabyte */
==== //depot/projects/soc2006/yuanjue-xen3/src/sys/i386-xen/include/vmparam.h#2 (text+ko) ====
@@ -1,1 +1,143 @@
-#include <i386/include/vmparam.h>
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ * Copyright (c) 1994 John S. Dyson
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * William Jolitz.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * from: @(#)vmparam.h 5.9 (Berkeley) 5/12/91
+ * $FreeBSD: src/sys/i386/include/vmparam.h,v 1.39 2004/08/16 08:35:22 obrien Exp $
+ */
+
+
+#ifndef _MACHINE_VMPARAM_H_
+#define _MACHINE_VMPARAM_H_ 1
+
+/*
+ * Machine dependent constants for 386.
+ */
+
+#define VM_PROT_READ_IS_EXEC /* if you can read -- then you can exec */
+
+/*
+ * Virtual memory related constants, all in bytes
+ */
+#define MAXTSIZ (128UL*1024*1024) /* max text size */
+#ifndef DFLDSIZ
+#define DFLDSIZ (128UL*1024*1024) /* initial data size limit */
+#endif
+#ifndef MAXDSIZ
+#define MAXDSIZ (512UL*1024*1024) /* max data size */
+#endif
+#ifndef DFLSSIZ
+#define DFLSSIZ (8UL*1024*1024) /* initial stack size limit */
+#endif
+#ifndef MAXSSIZ
+#define MAXSSIZ (64UL*1024*1024) /* max stack size */
+#endif
+#ifndef SGROWSIZ
+#define SGROWSIZ (128UL*1024) /* amount to grow stack */
+#endif
+
+#define USRTEXT (1*PAGE_SIZE) /* base of user text XXX bogus */
+
+/*
+ * The time for a process to be blocked before being very swappable.
+ * This is a number of seconds which the system takes as being a non-trivial
+ * amount of real time. You probably shouldn't change this;
+ * it is used in subtle ways (fractions and multiples of it are, that is, like
+ * half of a ``long time'', almost a long time, etc.)
+ * It is related to human patience and other factors which don't really
+ * change over time.
+ */
+#define MAXSLP 20
+
+
+/*
+ * Kernel physical load address.
+ */
+#ifndef KERNLOAD
+
+#ifdef ADD_ISA_HOLE
+#define KERNLOAD (1 << PDRSHIFT)
+#else
+#define KERNLOAD 0 /*ISA Hole is what belows KERNLOAD*/
+#endif
+
+#endif
+
+/*
+ * Virtual addresses of things. Derived from the page directory and
+ * page table indexes from pmap.h for precision.
+ * Because of the page that is both a PD and PT, it looks a little
+ * messy at times, but hey, we'll do anything to save a page :-)
+ */
+
+#define VM_MAX_KERNEL_ADDRESS VADDR(KPTDI+NKPDE-1, NPTEPG-1)
+#define VM_MIN_KERNEL_ADDRESS VADDR(PTDPTDI, PTDPTDI)
+
+#define KERNBASE VADDR(KPTDI, 0)
+
+#define UPT_MAX_ADDRESS VADDR(PTDPTDI, PTDPTDI)
+#define UPT_MIN_ADDRESS VADDR(PTDPTDI, 0)
+
+#define VM_MAXUSER_ADDRESS VADDR(PTDPTDI, 0)
+
+#define USRSTACK VM_MAXUSER_ADDRESS
+
+#define VM_MAX_ADDRESS VADDR(PTDPTDI, PTDPTDI)
+#define VM_MIN_ADDRESS ((vm_offset_t)0)
+
+/* virtual sizes (bytes) for various kernel submaps */
+#ifndef VM_KMEM_SIZE
+#define VM_KMEM_SIZE (12 * 1024 * 1024)
+#endif
+
+/*
+ * How many physical pages per KVA page allocated.
+ * min(max(VM_KMEM_SIZE, Physical memory/VM_KMEM_SIZE_SCALE), VM_KMEM_SIZE_MAX)
+ * is the total KVA space allocated for kmem_map.
+ */
+#ifndef VM_KMEM_SIZE_SCALE
+#define VM_KMEM_SIZE_SCALE (3)
+#endif
+
+/*
+ * Ceiling on amount of kmem_map kva space.
+ */
+#ifndef VM_KMEM_SIZE_MAX
+#define VM_KMEM_SIZE_MAX (320 * 1024 * 1024)
+#endif
+
+/* initial pagein size of beginning of executable file */
+#ifndef VM_INITIAL_PAGEIN
+#define VM_INITIAL_PAGEIN 16
+#endif
+
+#endif /* _MACHINE_VMPARAM_H_ */
==== //depot/projects/soc2006/yuanjue-xen3/src/sys/i386-xen/include/xenvar.h#2 (text+ko) ====
@@ -19,8 +19,9 @@
* FreeBSD doesn't
*/
-
+#if 0 /*we don't need this for domU*/
#define ADD_ISA_HOLE
+#endif
#ifdef ADD_ISA_HOLE
#define ISA_INDEX_OFFSET 1024
@@ -30,6 +31,9 @@
#define ISA_PDR_OFFSET 0
#endif
+#if 1
+#define ADD_MFS_ROOT
+#endif
#define PFNTOMFN(i) (((unsigned long *)xen_phys_machine)[(i)])
#define MFNTOPFN(i) (xen_machine_phys[i])
More information about the p4-projects
mailing list