svn commit: r236850 - in projects/amd64_xen_pv/sys/amd64: amd64 include xen

Cherry G. Mathew cherry at FreeBSD.org
Sun Jun 10 13:15:13 UTC 2012


Author: cherry
Date: Sun Jun 10 13:15:13 2012
New Revision: 236850
URL: http://svn.freebsd.org/changeset/base/236850

Log:
  - Fine tune the pages that are added to the crashdump.
  - Enable the msgbufp initialisation. Note: console is not ready yet.
  - Further pmap tweaks to make boot progress.
  
  Approved by:	gibbs (implicit)

Modified:
  projects/amd64_xen_pv/sys/amd64/amd64/uma_machdep.c
  projects/amd64_xen_pv/sys/amd64/include/pmap.h
  projects/amd64_xen_pv/sys/amd64/xen/machdep.c
  projects/amd64_xen_pv/sys/amd64/xen/pmap.c

Modified: projects/amd64_xen_pv/sys/amd64/amd64/uma_machdep.c
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/amd64/uma_machdep.c	Sun Jun 10 13:10:21 2012	(r236849)
+++ projects/amd64_xen_pv/sys/amd64/amd64/uma_machdep.c	Sun Jun 10 13:15:13 2012	(r236850)
@@ -68,6 +68,12 @@ uma_small_alloc(uma_zone_t zone, int byt
 	if ((wait & M_NODUMP) == 0)
 		dump_add_page(pa);
 	va = (void *)PHYS_TO_DMAP(pa);
+#ifdef XEN
+	/* XXX: temp fix, dmap not yet implemented. */
+	vm_offset_t vaddr = (vm_offset_t) va;
+	pmap_map(&vaddr, pa, pa + roundup(bytes, PAGE_SIZE),
+		 VM_PROT_READ | VM_PROT_WRITE);
+#endif
 	if ((wait & M_ZERO) && (m->flags & PG_ZERO) == 0)
 		pagezero(va);
 	return (va);

Modified: projects/amd64_xen_pv/sys/amd64/include/pmap.h
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/include/pmap.h	Sun Jun 10 13:10:21 2012	(r236849)
+++ projects/amd64_xen_pv/sys/amd64/include/pmap.h	Sun Jun 10 13:15:13 2012	(r236850)
@@ -345,7 +345,11 @@ extern vm_paddr_t dump_avail[];
 extern vm_offset_t virtual_avail;
 extern vm_offset_t virtual_end;
 
+#ifdef XEN
+#define	pmap_page_get_memattr(m) VM_MEMATTR_DEFAULT /* XXX: review */
+#else
 #define	pmap_page_get_memattr(m)	((vm_memattr_t)(m)->md.pat_mode)
+#endif
 #define	pmap_unmapbios(va, sz)	pmap_unmapdev((va), (sz))
 
 void	pmap_bootstrap(vm_paddr_t *);

Modified: projects/amd64_xen_pv/sys/amd64/xen/machdep.c
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/xen/machdep.c	Sun Jun 10 13:10:21 2012	(r236849)
+++ projects/amd64_xen_pv/sys/amd64/xen/machdep.c	Sun Jun 10 13:15:13 2012	(r236850)
@@ -57,6 +57,7 @@
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/bus.h>
+#include <sys/cons.h>
 #include <sys/cpu.h>
 #include <sys/imgact.h>
 #include <sys/linker.h>
@@ -65,6 +66,7 @@
 #include <sys/pcpu.h>
 #include <sys/proc.h>
 #include <sys/ptrace.h>
+#include <sys/reboot.h> /* XXX: remove with RB_XXX */
 #include <sys/sched.h>
 #include <sys/smp.h>
 #include <sys/syscallsubr.h>
@@ -104,7 +106,7 @@ xen_pfn_t *xen_phys_machine;
 #define	PHYSMAP_SIZE	(2 * VM_PHYSSEG_MAX)
 vm_offset_t pa_index = 0;
 vm_paddr_t phys_avail[PHYSMAP_SIZE + 2];
-vm_paddr_t dump_avail[2] = {0, 0}; /* XXX: todo */
+vm_paddr_t dump_avail[PHYSMAP_SIZE + 2];
 
 struct pcpu __pcpu[MAXCPU];
 
@@ -307,6 +309,7 @@ initxen(struct start_info *si)
 	physmem = si->nr_pages;
 	Maxmem = si->nr_pages + 1;
 	memset(phys_avail, 0, sizeof phys_avail);
+	memset(dump_avail, 0 , sizeof dump_avail);
 
 	/* 
 	 * Setup kernel tls registers. pcpu needs them, and other
@@ -329,6 +332,9 @@ initxen(struct start_info *si)
 	/* Address of lowest unused page */
 	physfree = VTOP(si->pt_base + si->nr_pt_frames * PAGE_SIZE);
 
+	/* Init basic tunables, hz, msgbufsize etc */
+	init_param1();
+
 	/* page tables */
 	pmap_bootstrap(&physfree);
 
@@ -346,8 +352,11 @@ initxen(struct start_info *si)
 		("Attempt to use unmapped va\n"));
 
 	/* Register the rest of free physical memory with phys_avail[] */
-	phys_avail[pa_index++] = physfree;
+	/* dump_avail[] starts at index 1 */
+	phys_avail[pa_index++] = physfree; 
+	dump_avail[pa_index] = physfree;
 	phys_avail[pa_index++] = ptoa(physmem);
+	dump_avail[pa_index] = ptoa(physmem);
 
 	/*
  	 * This may be done better later if it gets more high level
@@ -375,8 +384,6 @@ initxen(struct start_info *si)
 	ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
 	ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);
 #endif
-	/* Init basic tunables, hz etc */
-	init_param1();
 
 	/* gdt */
 	vm_paddr_t gdt0_frame = phystomach(VTOP(gdt));
@@ -432,8 +439,13 @@ initxen(struct start_info *si)
 	/* Event handling */
 	init_event_callbacks();
 
+
+	cninit();		/* Console subsystem init */
+
 	identify_cpu();		/* Final stage of CPU initialization */
 
+	init_param2(physmem);
+
 	//msgbufinit(msgbufp, msgbufsize);
 	//fpuinit();
 
@@ -454,8 +466,6 @@ initxen(struct start_info *si)
 	_ufssel = GSEL(GUFS32_SEL, SEL_UPL);
 	_ugssel = GSEL(GUGS32_SEL, SEL_UPL);
 
-	gdtset = 1;
-
 	/* console */
 	printk("Hello world!\n");
 

Modified: projects/amd64_xen_pv/sys/amd64/xen/pmap.c
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/xen/pmap.c	Sun Jun 10 13:10:21 2012	(r236849)
+++ projects/amd64_xen_pv/sys/amd64/xen/pmap.c	Sun Jun 10 13:15:13 2012	(r236850)
@@ -121,6 +121,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/systm.h>
 #include <sys/ktr.h>
 #include <sys/lock.h>
+#include <sys/msgbuf.h>
 #include <sys/mutex.h>
 
 #ifdef SMP
@@ -128,6 +129,7 @@ __FBSDID("$FreeBSD$");
 #endif
 
 #include <vm/vm.h>
+#include <vm/vm_page.h>
 #include <vm/vm_param.h>
 #include <vm/pmap.h>
 
@@ -198,7 +200,6 @@ vallocpages(vm_paddr_t *firstaddr, int n
 	/* Make sure we are still inside of available mapped va. */
 	KASSERT(PTOV(*firstaddr) <= (xenstack + 512 * 1024), 
 		("Attempt to use unmapped va\n"));
-
 	return (ret);
 }
 
@@ -495,8 +496,8 @@ pmap_bootstrap(vm_paddr_t *firstaddr)
 	KASSERT(pa_index == 0, 
 		("reclaimed page table pages are not the lowest available!"));
 
-	phys_avail[pa_index] = VTOP(xen_start_info->pt_base);
-	phys_avail[pa_index + 1] = phys_avail[pa_index] +
+	dump_avail[pa_index + 1] = phys_avail[pa_index] = VTOP(xen_start_info->pt_base);
+	dump_avail[pa_index + 2] = phys_avail[pa_index + 1] = phys_avail[pa_index] +
 		ptoa(xen_start_info->nr_pt_frames - 1);
 	pa_index += 2;
 
@@ -519,8 +520,6 @@ pmap_bootstrap(vm_paddr_t *firstaddr)
 	/* XXX: Check we don't overlap xen pgdir entries. */
 	virtual_end = VM_MAX_KERNEL_ADDRESS; 
 
-	virtual_avail =  xenstack + 1052 * 1024;
-
 	/*
 	 * Initialize the kernel pmap (which is statically allocated).
 	 */
@@ -532,36 +531,70 @@ pmap_bootstrap(vm_paddr_t *firstaddr)
 
 	tsz = mmu_map_t_size();
 
-#if 0
-	/* XXX test */
-	vm_offset_t va = virtual_avail + 4096 * 1024;
-
-	vm_paddr_t pa = phys_avail[pa_index - 1];
-
-	pmap_kenter(va, pa);
+	/* Steal some memory (backing physical pages, and kva) */
+	physmem -= atop(round_page(msgbufsize));
 
-	memset((void *)va, 0, PAGE_SIZE);
-	while(1);
-	/* test XXX */
-#endif
+	msgbufp = (void *) pmap_map(&virtual_avail,
+				    ptoa(physmem), ptoa(physmem) + round_page(msgbufsize),
+				    VM_PROT_READ | VM_PROT_WRITE);
 }
 
 void
 pmap_page_init(vm_page_t m)
 {
-	KASSERT(0, ("XXX: TODO\n"));
+	/* XXX: TODO - pv_lists */
+
 }
 
+/* 
+ * Map in backing memory from kernel_vm_end to addr, 
+ * and update kernel_vm_end.
+ */
 void
 pmap_growkernel(vm_offset_t addr)
 {
-	KASSERT(0, ("XXX: TODO\n"));
+	KASSERT(kernel_vm_end < addr, ("trying to shrink kernel VA!"));
+
+	addr = trunc_page(addr);
+
+	char tbuf[tsz]; /* Safe to do this on the stack since tsz is
+			 * effectively const.
+			 */
+
+	mmu_map_t tptr = tbuf;
+
+	struct mmu_map_mbackend mb = {
+		ptmb_mappedalloc,
+		ptmb_mappedfree,
+		ptmb_ptov,
+		ptmb_vtop
+	};
+
+	mmu_map_t_init(tptr, &mb);
+
+	for (;addr <= kernel_vm_end;addr += PAGE_SIZE) {
+		
+		if (mmu_map_inspect_va(kernel_pmap, tptr, addr)) {
+			continue;
+		}
+		int pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED;
+		vm_page_t m = vm_page_alloc(NULL, 0, pflags);
+		KASSERT(m != NULL, ("Backing page alloc failed!"));
+		vm_paddr_t pa =m->phys_addr;
+
+		pmap_kenter(addr, pa);
+	}
+
+	mmu_map_t_fini(tptr);
 }
 
 void
 pmap_init(void)
 {
-	KASSERT(0, ("XXX: TODO\n"));
+	/* XXX: review the use of gdtset for the purpose below */
+	gdtset = 1; /* xpq may assert for locking sanity from this point onwards */
+
+	/* XXX: switch the mmu_map.c backend to something more sane */
 }
 
 void
@@ -602,10 +635,36 @@ pmap_lazyfix_action(void)
 }
 #endif /* SMP */
 
+/*
+ * Add a list of wired pages to the kva
+ * this routine is only used for temporary
+ * kernel mappings that do not need to have
+ * page modification or references recorded.
+ * Note that old mappings are simply written
+ * over.  The page *must* be wired.
+ * XXX: TODO SMP.
+ * Note: SMP coherent.  Uses a ranged shootdown IPI.
+ */
+
 void
 pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count)
 {
-	KASSERT(0, ("XXX: TODO\n"));
+	KASSERT(count > 0, ("count > 0"));
+	KASSERT(sva == trunc_page(sva),
+		("sva not page aligned"));
+	KASSERT(ma != NULL, ("ma != NULL"));
+	vm_page_t m;
+	vm_paddr_t pa;
+
+	while (count--) {
+		m = *ma++;
+		pa = VM_PAGE_TO_PHYS(m);
+		pmap_kenter(sva, pa);
+		sva += PAGE_SIZE;
+	}
+	// XXX: TODO: pmap_invalidate_range(kernel_pmap, sva, sva + count *
+	//	      PAGE_SIZE);
+
 }
 
 void
@@ -710,13 +769,11 @@ pmap_kenter(vm_offset_t va, vm_paddr_t p
 	}
 
 	/* Backing page tables are in place, let xen do the maths */
-
 	PT_SET_MA(va, xpmap_ptom(pa) | PG_RW | PG_V | PG_U);
 	PT_UPDATES_FLUSH();
 
 	mmu_map_release_va(kernel_pmap, tptr, va);
 	mmu_map_t_fini(tptr);
-
 }
 
 /*
@@ -754,33 +811,29 @@ pmap_map(vm_offset_t *virt, vm_paddr_t s
 	vm_offset_t va, sva;
 
 	va = sva = *virt;
+
 	CTR4(KTR_PMAP, "pmap_map: va=0x%x start=0x%jx end=0x%jx prot=0x%x",
 	    va, start, end, prot);
 
 	while (start < end) {
-#if 0
-		if (PTOV(start) < xenstack + 512 * 1024) { /* XXX:
-							      remove me */
-			continue;
-		}
-#endif
-	
 		pmap_kenter(va, start);
 		va += PAGE_SIZE;
 		start += PAGE_SIZE;
-
-		while(1);
 	}
 
 	// XXX: pmap_invalidate_range(kernel_pmap, sva, va);
 	*virt = va;
+
 	return (sva);
 }
 
 void
 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
 {
-	KASSERT(0, ("XXX: TODO\n"));
+	/* 
+	 * XXX: TODO - ignore for now - we need to revisit this as
+	 * soon as  kdb is up.
+	 */
 }
 
 void
@@ -811,7 +864,12 @@ pmap_copy_page(vm_page_t src, vm_page_t 
 void
 pmap_zero_page(vm_page_t m)
 {
-	KASSERT(0, ("XXX: TODO\n"));
+	vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
+
+	/* XXX: temp fix, dmap not yet implemented. */
+	pmap_kenter(va, m->phys_addr);
+
+	pagezero((void *)va);
 }
 
 void


More information about the svn-src-projects mailing list