Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 26 Apr 2003 21:21:19 -0700 (PDT)
From:      Juli Mallett <jmallett@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 29853 for review
Message-ID:  <200304270421.h3R4LJLf037239@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=29853

Change 29853 by jmallett@jmallett_dalek on 2003/04/26 21:20:30

	Lies, placeholders, and a PTE description.

Affected files ...

.. //depot/projects/mips/sys/mips/include/md_var.h#5 edit
.. //depot/projects/mips/sys/mips/include/pmap.h#6 edit
.. //depot/projects/mips/sys/mips/include/pte.h#1 add
.. //depot/projects/mips/sys/mips/mips/machdep.c#11 edit
.. //depot/projects/mips/sys/mips/mips/pmap.c#7 edit
.. //depot/projects/mips/sys/mips/sgimips/machdep_sgimips.c#11 edit

Differences ...

==== //depot/projects/mips/sys/mips/include/md_var.h#5 (text+ko) ====

@@ -28,6 +28,9 @@
 #ifndef _MACHINE_MD_VAR_H_
 #define	_MACHINE_MD_VAR_H_
 
+extern	vm_offset_t kstack0;
+extern	vm_paddr_t kstack0_phys;
+
 void	cpu_halt(void);
 void	cpu_reset(void);
 void	mips_init(void);

==== //depot/projects/mips/sys/mips/include/pmap.h#6 (text+ko) ====

@@ -34,6 +34,8 @@
 
 struct pmap {
 	struct pmap_statistics	pm_stats;
+	int			pm_asid;
+	int			pm_asidgen;
 };
 
 typedef	struct pmap *pmap_t;
@@ -45,7 +47,9 @@
 extern	vm_offset_t virtual_avail;
 extern	vm_offset_t virtual_end;
 
+void pmap_bootstrap(void);
 vm_offset_t pmap_kextract(vm_offset_t);
+vm_offset_t pmap_steal_memory(vm_size_t);
 
 #define	pmap_resident_count(pm)	((pm)->pm_stats.resident_count)
 #define	vtophys(va)	pmap_kextract((vm_offset_t)(va))

==== //depot/projects/mips/sys/mips/mips/machdep.c#11 (text+ko) ====

@@ -44,12 +44,16 @@
 
 struct pcpu pcpu0;
 
+vm_offset_t kstack0;
+vm_paddr_t kstack0_phys;
+
 void
 mips_init(void)
 {
 	struct pcpu *pc;
 
 	proc_linkup(&proc0, &ksegrp0, &kse0, &thread0);
+	thread0.td_kstack = kstack0;
 	pc = &pcpu0;
 	pc->pc_curthread = &thread0;
 }

==== //depot/projects/mips/sys/mips/mips/pmap.c#7 (text+ko) ====

@@ -37,6 +37,8 @@
 #include <machine/cpufunc.h>
 #include <machine/cpuregs.h>
 #include <machine/frame.h>
+#include <machine/md_var.h>
+#include <machine/pte.h>
 
 #include <vm/vm.h>
 #include <vm/vm_param.h>
@@ -56,10 +58,15 @@
 vm_offset_t virtual_avail;
 vm_offset_t virtual_end;
 
+pt_entry_t *kptemap;
+vm_size_t kptemapsize;
+
 struct msgbuf *msgbufp;
 
 int pmap_pagedaemon_waken;
 
+static vm_offset_t pmap_bootstrap_alloc(vm_size_t);
+
 #define	UNIMPL()					\
 printf("%s unimplemented at %s:%d\n", __func__, __FILE__, __LINE__)
 
@@ -312,3 +319,78 @@
 {
 	UNIMPL();
 }
+
+void
+pmap_bootstrap(void)
+{
+	int i;
+
+	kptemapsize = PAGE_SIZE; /* XXX placeholder */
+	kptemap = pmap_bootstrap_alloc(sizeof *kptemap * kptemapsize);
+
+	/*
+	 * Allocate a kernel stack for thread0.
+	 */
+	kstack0_phys = pmap_bootstrap_alloc(KSTACK_PAGES * PAGE_SIZE);
+	kstack0 = kstack0_phys;
+
+	/*
+	 * Calculate the first and last available physical addresses.
+	 */
+	avail_start = phys_avail[0];
+	for (i = 0; phys_avail[i + 2] != 0; i += 2)
+		;
+	avail_end = phys_avail[i + 1];
+}
+
+/*
+ * Allocate a physical page of memory directly from the phys_avail map.
+ * Can only be called from pmap_bootstrap before avail start and end are
+ * calculated.
+ */
+static vm_offset_t
+pmap_bootstrap_alloc(vm_size_t size)
+{
+	vm_offset_t pa;
+	int i;
+
+	size = round_page(size);
+	for (i = 0; phys_avail[i + 1] != 0; i += 2) {
+		if (phys_avail[i + 1] - phys_avail[i] < size)
+			continue;
+		pa = phys_avail[i];
+		phys_avail[i] += size;
+		return (pa);
+	}
+	panic("pmap_bootstrap_alloc");
+}
+
+vm_offset_t
+pmap_steal_memory(vm_size_t size)
+{
+	vm_size_t bank_size;
+	vm_offset_t pa, va;
+
+	size = round_page(size);
+
+	bank_size = phys_avail[1] - phys_avail[0];
+	while (size > bank_size) {
+		int i;
+		for (i = 0; phys_avail[i+2]; i+= 2) {
+			phys_avail[i+0] = phys_avail[i+2];
+			phys_avail[i+1] = phys_avail[i+3];
+		}
+		phys_avail[i+0] = 0;
+		phys_avail[i+1] = 0;
+		if (!phys_avail[0])
+			panic("pmap_steal_memory: out of memory");
+		bank_size = phys_avail[1] - phys_avail[0];
+	}
+
+	pa = phys_avail[0];
+	phys_avail[0] += size;
+
+	va = MIPS_PHYS_TO_KSEG1(pa);
+	bzero(va, size);
+	return (va);
+}

==== //depot/projects/mips/sys/mips/sgimips/machdep_sgimips.c#11 (text+ko) ====

@@ -141,5 +141,6 @@
 	printf("avail memory = %d (%d MB)\n", ctob(availmem),
 	       ctob(availmem) / (1024 * 1024));
 
+	pmap_bootstrap();
 	mips_init();
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200304270421.h3R4LJLf037239>