Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 3 Oct 2002 12:13:03 -0700 (PDT)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 18598 for review
Message-ID:  <200210031913.g93JD36e097384@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://people.freebsd.org/~peter/p4db/chv.cgi?CH=18598

Change 18598 by peter@peter_daintree on 2002/10/03 12:12:48

	integrate i386_hammer branch (copy tracked x86 changes to x86-64)

Affected files ...

.. //depot/projects/hammer/lib/csu/x86_64/crt1.c#3 integrate
.. //depot/projects/hammer/sys/x86_64/acpica/OsdEnvironment.c#3 integrate
.. //depot/projects/hammer/sys/x86_64/acpica/acpi_machdep.c#4 integrate
.. //depot/projects/hammer/sys/x86_64/include/pcb.h#3 integrate
.. //depot/projects/hammer/sys/x86_64/include/pcpu.h#2 integrate
.. //depot/projects/hammer/sys/x86_64/include/proc.h#3 integrate
.. //depot/projects/hammer/sys/x86_64/include/sysarch.h#4 integrate
.. //depot/projects/hammer/sys/x86_64/isa/npx.c#12 integrate
.. //depot/projects/hammer/sys/x86_64/pci/pci_bus.c#4 integrate
.. //depot/projects/hammer/sys/x86_64/pci/pci_cfgreg.c#5 integrate
.. //depot/projects/hammer/sys/x86_64/x86_64/legacy.c#3 integrate
.. //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#23 integrate
.. //depot/projects/hammer/sys/x86_64/x86_64/nexus.c#7 integrate
.. //depot/projects/hammer/sys/x86_64/x86_64/pmap.c#6 integrate
.. //depot/projects/hammer/sys/x86_64/x86_64/sys_machdep.c#6 integrate
.. //depot/projects/hammer/sys/x86_64/x86_64/trap.c#11 integrate

Differences ...

==== //depot/projects/hammer/lib/csu/x86_64/crt1.c#3 (text+ko) ====

@@ -100,7 +100,40 @@
 	monstartup(&eprol, &etext);
 #endif
 	_init();
+#ifndef __GNUC__
 	exit( main(argc, argv, env) );
+#else
+	/*
+	 * Some versions of gcc-2 expect the stack frame to be aligned as
+	 * follows after it is set up in main():
+	 *
+	 *  +--------------+ <--- aligned by PREFERRED_STACK_BOUNDARY
+	 *  +%ebp (if any) +
+	 *  +--------------+
+	 *  |return address|
+	 *  +--------------+
+	 *  |  arguments   |
+	 *  |      :       |
+	 *  |      :       |
+	 *  +--------------+
+	 *
+	 * We implement the above to fix just the usual case in FreeBSD-4.
+	 * Alignment for main() is too compiler-dependent to handle correctly
+	 * in all cases here (or in the kernel).  E.g., a different alignment
+	 * is required for at least gcc-2.95.4 even for the small variation
+	 * of compiling main() with -fomit-frame-pointer.
+	 */
+	__asm__("
+	andl	$~0xf, %%esp		# align stack to 16-byte boundary
+	subl	$12+12, %%esp		# space for args and padding
+	movl	%0, 0(%%esp)
+	movl	%1, 4(%%esp)
+	movl	%2, 8(%%esp)
+	call	main
+	movl	%%eax, 0(%%esp)
+	call	exit
+	" : : "r" (argc), "r" (argv), "r" (env) : "ax", "cx", "dx", "memory");
+#endif
 }
 
 #ifdef GCRT
@@ -109,4 +142,4 @@
 __asm__(".previous");
 #endif
 
-__asm__(".ident\t\"$FreeBSD: src/lib/csu/i386-elf/crt1.c,v 1.9 2002/07/16 12:28:49 markm Exp $\"");
+__asm__(".ident\t\"$FreeBSD: src/lib/csu/i386-elf/crt1.c,v 1.10 2002/09/29 13:42:27 bde Exp $\"");

==== //depot/projects/hammer/sys/x86_64/acpica/OsdEnvironment.c#3 (text+ko) ====

@@ -24,7 +24,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$FreeBSD: src/sys/i386/acpica/OsdEnvironment.c,v 1.5 2002/08/22 21:24:00 archie Exp $
+ *	$FreeBSD: src/sys/i386/acpica/OsdEnvironment.c,v 1.6 2002/09/30 18:45:20 jhb Exp $
  */
 
 /*

==== //depot/projects/hammer/sys/x86_64/acpica/acpi_machdep.c#4 (text+ko) ====

@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *      $FreeBSD: src/sys/i386/acpica/acpi_machdep.c,v 1.2 2002/09/06 17:02:01 jhb Exp $
+ *      $FreeBSD: src/sys/i386/acpica/acpi_machdep.c,v 1.3 2002/09/30 18:45:20 jhb Exp $
  */
 
 #include <sys/param.h>

==== //depot/projects/hammer/sys/x86_64/include/pcb.h#3 (text+ko) ====

@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *	from: @(#)pcb.h	5.10 (Berkeley) 5/12/91
- * $FreeBSD: src/sys/i386/include/pcb.h,v 1.46 2002/09/16 19:25:41 mini Exp $
+ * $FreeBSD: src/sys/i386/include/pcb.h,v 1.47 2002/10/01 14:08:07 phk Exp $
  */
 
 #ifndef _I386_PCB_H_
@@ -79,6 +79,9 @@
  * core dumps. For the i386: ???
  */
 struct md_coredump {
+#ifdef lint
+	int dummy;
+#endif
 };
 
 #ifdef _KERNEL

==== //depot/projects/hammer/sys/x86_64/include/pcpu.h#2 (text+ko) ====

@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/include/pcpu.h,v 1.34 2002/07/15 13:29:40 markm Exp $
+ * $FreeBSD: src/sys/i386/include/pcpu.h,v 1.35 2002/10/01 14:01:58 phk Exp $
  */
 
 #ifndef _MACHINE_PCPU_H_
@@ -31,24 +31,6 @@
 
 #ifdef _KERNEL
 
-#ifndef	__GNUC__
-
-#ifndef	lint
-#error	gcc or lint is required to use this file
-#else /* lint */
-#define	__PCPU_PTR(name)
-#define	__PCPU_GET(name)
-#define	__PCPU_SET(name, val)
-#define	PCPU_GET(member)	__PCPU_GET(pc_ ## member)
-#define	PCPU_PTR(member)	__PCPU_PTR(pc_ ## member)
-#define	PCPU_SET(member, val)	__PCPU_SET(pc_ ## member, val)
-#define	PCPU_MD_FIELDS		\
-	int foo;		\
-	char bar
-#endif /* lint */
-
-#else	/* __GNUC__ */
-
 #include <machine/segments.h>
 #include <machine/tss.h>
 
@@ -70,6 +52,16 @@
 	u_int32_t pc_fpending;	/* pending fast interrupts */		\
 	u_int32_t pc_spending 	/* pending soft interrupts */
 
+#if defined(lint)
+ 
+extern struct pcpu *pcpup;
+ 
+#define PCPU_GET(member)        (pcpup->pc_ ## member)
+#define PCPU_PTR(member)        (&pcpup->pc_ ## member)
+#define PCPU_SET(member,value)  (pcpup->pc_ ## member = (value))
+ 
+#elif defined(__GNUC__)
+
 /*
  * Evaluates to the byte offset of the per-cpu variable name.
  */
@@ -160,7 +152,9 @@
 #define	PCPU_PTR(member)	__PCPU_PTR(pc_ ## member)
 #define	PCPU_SET(member, val)	__PCPU_SET(pc_ ## member, val)
 
-#endif	/* __GNUC__ */
+#else
+#error gcc or lint is required to use this file
+#endif
 
 #endif	/* _KERNEL */
 

==== //depot/projects/hammer/sys/x86_64/include/proc.h#3 (text+ko) ====

@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	from: @(#)proc.h	7.1 (Berkeley) 5/15/91
- * $FreeBSD: src/sys/i386/include/proc.h,v 1.17 2002/07/10 20:15:58 dillon Exp $
+ * $FreeBSD: src/sys/i386/include/proc.h,v 1.18 2002/10/01 14:08:08 phk Exp $
  */
 
 #ifndef _MACHINE_PROC_H_

==== //depot/projects/hammer/sys/x86_64/include/sysarch.h#4 (text+ko) ====

@@ -30,7 +30,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/include/sysarch.h,v 1.16 2002/03/20 05:48:58 alfred Exp $
+ * $FreeBSD: src/sys/i386/include/sysarch.h,v 1.17 2002/09/28 20:42:04 peter Exp $
  */
 
 /*
@@ -47,9 +47,9 @@
 #define I386_SET_IOPERM	4
 				/* xxxxx */
 struct i386_ldt_args {
-	int	start;
+	unsigned int start;
 	union	descriptor *descs;
-	int	num;
+	unsigned int num;
 }; 
 
 struct i386_ioperm_args {

==== //depot/projects/hammer/sys/x86_64/isa/npx.c#12 (text+ko) ====

@@ -32,7 +32,7 @@
  * SUCH DAMAGE.
  *
  *	from: @(#)npx.c	7.2 (Berkeley) 5/12/91
- * $FreeBSD: src/sys/i386/isa/npx.c,v 1.131 2002/09/16 19:25:59 mini Exp $
+ * $FreeBSD: src/sys/i386/isa/npx.c,v 1.132 2002/09/28 17:14:47 phk Exp $
  */
 
 #include "opt_debug_npx.h"
@@ -184,7 +184,7 @@
 /*
  * Attach routine - announce which it is, and wire into system
  */
-int
+static int
 npx_attach(dev)
 	device_t dev;
 {

==== //depot/projects/hammer/sys/x86_64/pci/pci_bus.c#4 (text+ko) ====

@@ -23,7 +23,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/pci/pci_bus.c,v 1.91 2002/09/23 18:14:31 jhb Exp $
+ * $FreeBSD: src/sys/i386/pci/pci_bus.c,v 1.92 2002/10/02 17:50:38 iwasaki Exp $
  *
  */
 
@@ -270,6 +270,14 @@
 		*busnum = nexus_pcib_read_config(0, bus, slot, func, 0x44, 1);
 		break;
 
+		/* XXX unknown chipset, but working */
+	case 0x00171166:
+		/* FALLTHROUGH */
+	case 0x01011166:
+		s = "ServerWorks host to PCI bridge(unknown chipset)";
+		*busnum = nexus_pcib_read_config(0, bus, slot, func, 0x44, 1);
+		break;
+
 		/* Integrated Micro Solutions -- vendor 0x10e0 */
 	case 0x884910e0:
 		s = "Integrated Micro Solutions VL Bridge";

==== //depot/projects/hammer/sys/x86_64/pci/pci_cfgreg.c#5 (text+ko) ====

@@ -25,7 +25,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/pci/pci_cfgreg.c,v 1.95 2002/09/23 18:13:42 jhb Exp $
+ * $FreeBSD: src/sys/i386/pci/pci_cfgreg.c,v 1.96 2002/09/28 17:36:29 phk Exp $
  */
 
 #include <sys/param.h>		/* XXX trim includes */

==== //depot/projects/hammer/sys/x86_64/x86_64/legacy.c#3 (text+ko) ====

@@ -26,7 +26,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/i386/legacy.c,v 1.48 2002/09/23 15:50:06 jhb Exp $
+ * $FreeBSD: src/sys/i386/i386/legacy.c,v 1.49 2002/09/30 18:47:11 jhb Exp $
  */
 
 /*
@@ -53,6 +53,7 @@
 
 #define DEVTOAT(dev)	((struct legacy_device *)device_get_ivars(dev))
 
+static void legacy_identify(driver_t *driver, device_t parent);
 static	int legacy_probe(device_t);
 static	int legacy_attach(device_t);
 static	int legacy_print_child(device_t, device_t);
@@ -70,6 +71,7 @@
 
 static device_method_t legacy_methods[] = {
 	/* Device interface */
+	DEVMETHOD(device_identify,	legacy_identify),
 	DEVMETHOD(device_probe,		legacy_probe),
 	DEVMETHOD(device_attach,	legacy_attach),
 	DEVMETHOD(device_detach,	bus_generic_detach),
@@ -104,10 +106,29 @@
 
 DRIVER_MODULE(legacy, nexus, legacy_driver, legacy_devclass, 0, 0);
 
+static void
+legacy_identify(driver_t *driver, device_t parent)
+{
+
+	/*
+	 * Add child device with order of 1 so it gets probed
+	 * after ACPI (which is at order 0.
+	 */
+	if (BUS_ADD_CHILD(parent, 1, "legacy", 0) == NULL)
+		panic("legacy: could not attach");
+}
+
 static int
 legacy_probe(device_t dev)
 {
+	device_t acpi;
 
+	/*
+	 * Fail to probe if ACPI is ok.
+	 */
+	acpi = devclass_get_device(devclass_find("acpi"), 0);
+	if (acpi != NULL && device_is_alive(acpi))
+		return (ENXIO);
 	device_set_desc(dev, "legacy system");
 	device_quiet(dev);
 	return (0);

==== //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#23 (text+ko) ====

@@ -35,7 +35,7 @@
  * SUCH DAMAGE.
  *
  *	from: @(#)machdep.c	7.4 (Berkeley) 6/3/91
- * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.538 2002/09/22 01:32:48 mdodd Exp $
+ * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.539 2002/09/30 07:02:22 obrien Exp $
  */
 
 #include "opt_atalk.h"

==== //depot/projects/hammer/sys/x86_64/x86_64/nexus.c#7 (text+ko) ====

@@ -26,7 +26,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/i386/nexus.c,v 1.48 2002/09/23 16:03:00 jhb Exp $
+ * $FreeBSD: src/sys/i386/i386/nexus.c,v 1.49 2002/09/30 18:47:11 jhb Exp $
  */
 
 /*
@@ -210,14 +210,8 @@
 static int
 nexus_attach(device_t dev)
 {
-	device_t child;
 
 	bus_generic_probe(dev);
-	if (!devclass_get_device(devclass_find("acpi"), 0)) {
-		child = BUS_ADD_CHILD(dev, 0, "legacy", 0);
-		if (child == NULL)
-			panic("nexus_attach legacy");
-	}
 	bus_generic_attach(dev);
 	return 0;
 }

==== //depot/projects/hammer/sys/x86_64/x86_64/pmap.c#6 (text+ko) ====

@@ -39,7 +39,7 @@
  * SUCH DAMAGE.
  *
  *	from:	@(#)pmap.c	7.7 (Berkeley)	5/12/91
- * $FreeBSD: src/sys/i386/i386/pmap.c,v 1.364 2002/08/25 04:20:02 alc Exp $
+ * $FreeBSD: src/sys/i386/i386/pmap.c,v 1.367 2002/10/02 07:44:21 scottl Exp $
  */
 
 /*
@@ -442,7 +442,7 @@
 	}
 }
 
-void *
+static void *
 pmap_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait)
 {
 	*flags = UMA_SLAB_PRIV;
@@ -791,29 +791,39 @@
 	return m;
 }
 
+#ifndef KSTACK_MAX_PAGES
+#define KSTACK_MAX_PAGES 32
+#endif
+
 /*
  * Create the kernel stack (including pcb for i386) for a new thread.
  * This routine directly affects the fork perf for a process and
  * create performance for a thread.
  */
 void
-pmap_new_thread(struct thread *td)
+pmap_new_thread(struct thread *td, int pages)
 {
 	int i;
-	vm_page_t ma[KSTACK_PAGES];
+	vm_page_t ma[KSTACK_MAX_PAGES];
 	vm_object_t ksobj;
 	vm_page_t m;
 	vm_offset_t ks;
 
+	/* Bounds check */
+	if (pages <= 1)
+		pages = KSTACK_PAGES;
+	else if (pages > KSTACK_MAX_PAGES)
+		pages = KSTACK_MAX_PAGES;
+
 	/*
 	 * allocate object for the kstack
 	 */
-	ksobj = vm_object_allocate(OBJT_DEFAULT, KSTACK_PAGES);
+	ksobj = vm_object_allocate(OBJT_DEFAULT, pages);
 	td->td_kstack_obj = ksobj;
 
 	/* get a kernel virtual address for the kstack for this thread */
 #ifdef KSTACK_GUARD
-	ks = kmem_alloc_nofault(kernel_map, (KSTACK_PAGES + 1) * PAGE_SIZE);
+	ks = kmem_alloc_nofault(kernel_map, (pages + 1) * PAGE_SIZE);
 	if (ks == 0)
 		panic("pmap_new_thread: kstack allocation failed");
 	if (*vtopte(ks) != 0)
@@ -822,16 +832,22 @@
 	td->td_kstack = ks;
 #else
 	/* get a kernel virtual address for the kstack for this thread */
-	ks = kmem_alloc_nofault(kernel_map, KSTACK_PAGES * PAGE_SIZE);
+	ks = kmem_alloc_nofault(kernel_map, pages * PAGE_SIZE);
 	if (ks == 0)
 		panic("pmap_new_thread: kstack allocation failed");
 	td->td_kstack = ks;
 #endif
+	/*
+	 * Knowing the number of pages allocated is useful when you
+	 * want to deallocate them.
+	 */
+	td->td_kstack_pages = pages;
+
 	/* 
 	 * For the length of the stack, link in a real page of ram for each
 	 * page of stack.
 	 */
-	for (i = 0; i < KSTACK_PAGES; i++) {
+	for (i = 0; i < pages; i++) {
 		/*
 		 * Get a kernel stack page
 		 */
@@ -843,7 +859,7 @@
 		vm_page_flag_clear(m, PG_ZERO);
 		m->valid = VM_PAGE_BITS_ALL;
 	}
-	pmap_qenter(ks, ma, KSTACK_PAGES);
+	pmap_qenter(ks, ma, pages);
 }
 
 /*
@@ -855,14 +871,16 @@
 	struct thread *td;
 {
 	int i;
+	int pages;
 	vm_object_t ksobj;
 	vm_offset_t ks;
 	vm_page_t m;
 
+	pages = td->td_kstack_pages;
 	ksobj = td->td_kstack_obj;
 	ks = td->td_kstack;
-	pmap_qremove(ks, KSTACK_PAGES);
-	for (i = 0; i < KSTACK_PAGES; i++) {
+	pmap_qremove(ks, pages);
+	for (i = 0; i < pages; i++) {
 		m = vm_page_lookup(ksobj, i);
 		if (m == NULL)
 			panic("pmap_dispose_thread: kstack already missing?");
@@ -877,14 +895,44 @@
 	 * address map.
 	 */
 #ifdef KSTACK_GUARD
-	kmem_free(kernel_map, ks - PAGE_SIZE, (KSTACK_PAGES + 1) * PAGE_SIZE);
+	kmem_free(kernel_map, ks - PAGE_SIZE, (pages + 1) * PAGE_SIZE);
 #else
-	kmem_free(kernel_map, ks, KSTACK_PAGES * PAGE_SIZE);
+	kmem_free(kernel_map, ks, pages * PAGE_SIZE);
 #endif
 	vm_object_deallocate(ksobj);
 }
 
 /*
+ * Set up a variable sized alternate kstack.  Though it may look MI, it may
+ * need to be different on certain arches like ia64.
+ */
+void
+pmap_new_altkstack(struct thread *td, int pages)
+{
+	/* shuffle the original stack */
+	td->td_altkstack_obj = td->td_kstack_obj;
+	td->td_altkstack = td->td_kstack;
+	td->td_altkstack_pages = td->td_kstack_pages;
+
+	pmap_new_thread(td, pages);
+}
+
+void
+pmap_dispose_altkstack(td)
+	struct thread *td;
+{
+	pmap_dispose_thread(td);
+
+	/* restore the original kstack */
+	td->td_kstack = td->td_altkstack;
+	td->td_kstack_obj = td->td_altkstack_obj;
+	td->td_kstack_pages = td->td_altkstack_pages;
+	td->td_altkstack = 0;
+	td->td_altkstack_obj = NULL;
+	td->td_altkstack_pages = 0;
+}
+
+/*
  * Allow the Kernel stack for a thread to be prejudicially paged out.
  */
 void
@@ -892,14 +940,16 @@
 	struct thread *td;
 {
 	int i;
+	int pages;
 	vm_object_t ksobj;
 	vm_offset_t ks;
 	vm_page_t m;
 
+	pages = td->td_kstack_pages;
 	ksobj = td->td_kstack_obj;
 	ks = td->td_kstack;
-	pmap_qremove(ks, KSTACK_PAGES);
-	for (i = 0; i < KSTACK_PAGES; i++) {
+	pmap_qremove(ks, pages);
+	for (i = 0; i < pages; i++) {
 		m = vm_page_lookup(ksobj, i);
 		if (m == NULL)
 			panic("pmap_swapout_thread: kstack already missing?");
@@ -918,14 +968,16 @@
 	struct thread *td;
 {
 	int i, rv;
-	vm_page_t ma[KSTACK_PAGES];
+	int pages;
+	vm_page_t ma[KSTACK_MAX_PAGES];
 	vm_object_t ksobj;
 	vm_offset_t ks;
 	vm_page_t m;
 
+	pages = td->td_kstack_pages;
 	ksobj = td->td_kstack_obj;
 	ks = td->td_kstack;
-	for (i = 0; i < KSTACK_PAGES; i++) {
+	for (i = 0; i < pages; i++) {
 		m = vm_page_grab(ksobj, i, VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
 		if (m->valid != VM_PAGE_BITS_ALL) {
 			rv = vm_pager_get_pages(ksobj, &m, 1, 0);
@@ -940,7 +992,7 @@
 		vm_page_wakeup(m);
 		vm_page_unlock_queues();
 	}
-	pmap_qenter(ks, ma, KSTACK_PAGES);
+	pmap_qenter(ks, ma, pages);
 }
 
 /***************************************************
@@ -2308,9 +2360,9 @@
 #define PAGEORDER_SIZE (PFBAK+PFFOR)
 
 static int pmap_prefault_pageorder[] = {
-	-PAGE_SIZE, PAGE_SIZE,
+	-1 * PAGE_SIZE, 1 * PAGE_SIZE,
 	-2 * PAGE_SIZE, 2 * PAGE_SIZE,
-	-3 * PAGE_SIZE, 3 * PAGE_SIZE
+	-3 * PAGE_SIZE, 3 * PAGE_SIZE,
 	-4 * PAGE_SIZE, 4 * PAGE_SIZE
 };
 

==== //depot/projects/hammer/sys/x86_64/x86_64/sys_machdep.c#6 (text+ko) ====

@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	from: @(#)sys_machdep.c	5.5 (Berkeley) 1/19/91
- * $FreeBSD: src/sys/i386/i386/sys_machdep.c,v 1.71 2002/04/01 21:30:41 jhb Exp $
+ * $FreeBSD: src/sys/i386/i386/sys_machdep.c,v 1.73 2002/09/28 22:44:45 peter Exp $
  *
  */
 
@@ -363,7 +363,7 @@
 		num = min(uap->num, nldt);
 		lp = &ldt[uap->start];
 	}
-	if (uap->start > nldt)
+	if (uap->start + num > nldt)
 		return(EINVAL);
 
 	error = copyout(lp, uap->descs, num * sizeof(union descriptor));
@@ -383,8 +383,9 @@
 	struct mdproc *mdp = &td->td_proc->p_md;
 	struct proc_ldt *pldt = mdp->md_ldt;
 	struct i386_ldt_args ua, *uap = &ua;
+	union descriptor *descs;
 	caddr_t old_ldt_base;
-	int old_ldt_len;
+	int descs_size, old_ldt_len;
 	register_t savecrit;
 
 	if ((error = copyin(args, uap, sizeof(struct i386_ldt_args))) < 0)
@@ -428,17 +429,23 @@
 		mtx_unlock_spin(&sched_lock);
 	}
 
+	descs_size = uap->num * sizeof(union descriptor);
+	descs = (union descriptor *)kmem_alloc(kernel_map, descs_size);
+	if (descs == NULL)
+		return (ENOMEM);
+	error = copyin(&uap->descs[0], descs, descs_size);
+	if (error) {
+		kmem_free(kernel_map, (vm_offset_t)descs, descs_size);
+		return (error);
+	}
 	/* Check descriptors for access violations */
 	for (i = 0, n = uap->start; i < uap->num; i++, n++) {
-		union descriptor desc, *dp;
-		dp = &uap->descs[i];
-		error = copyin(dp, &desc, sizeof(union descriptor));
-		if (error)
-			return(error);
+		union descriptor *dp;
+		dp = &descs[i];
 
-		switch (desc.sd.sd_type) {
+		switch (dp->sd.sd_type) {
 		case SDT_SYSNULL:	/* system null */ 
-			desc.sd.sd_p = 0;
+			dp->sd.sd_p = 0;
 			break;
 		case SDT_SYS286TSS: /* system 286 TSS available */
 		case SDT_SYSLDT:    /* system local descriptor table */
@@ -459,6 +466,7 @@
 			 * to create a segment of these types.  They are
 			 * for OS use only.
 			 */
+			kmem_free(kernel_map, (vm_offset_t)descs, descs_size);
 			return EACCES;
 			/*NOTREACHED*/
 
@@ -468,8 +476,11 @@
 		case SDT_MEMERC:  /* memory execute read conforming */
 		case SDT_MEMERAC: /* memory execute read accessed conforming */
 			 /* Must be "present" if executable and conforming. */
-			if (desc.sd.sd_p == 0)
+			if (dp->sd.sd_p == 0) {
+				kmem_free(kernel_map, (vm_offset_t)descs,
+				    descs_size);
 				return (EACCES);
+			}
 			break;
 		case SDT_MEMRO:   /* memory read only */
 		case SDT_MEMROA:  /* memory read only accessed */
@@ -485,24 +496,26 @@
 		case SDT_MEMERA:  /* memory execute read accessed */
 			break;
 		default:
+			kmem_free(kernel_map, (vm_offset_t)descs, descs_size);
 			return(EINVAL);
 			/*NOTREACHED*/
 		}
 
 		/* Only user (ring-3) descriptors may be present. */
-		if ((desc.sd.sd_p != 0) && (desc.sd.sd_dpl != SEL_UPL))
+		if ((dp->sd.sd_p != 0) && (dp->sd.sd_dpl != SEL_UPL)) {
+			kmem_free(kernel_map, (vm_offset_t)descs, descs_size);
 			return (EACCES);
+		}
 	}
 
 	/* Fill in range */
 	savecrit = intr_disable();
-	error = copyin(uap->descs, 
+	bcopy(uap->descs, 
 	    &((union descriptor *)(pldt->ldt_base))[uap->start],
 	    uap->num * sizeof(union descriptor));
-	if (!error)
-		td->td_retval[0] = uap->start;
+	td->td_retval[0] = uap->start;
 	intr_restore(savecrit);
-
-	return(error);
+	kmem_free(kernel_map, (vm_offset_t)descs, descs_size);
+	return (0);
 }
 #endif

==== //depot/projects/hammer/sys/x86_64/x86_64/trap.c#11 (text+ko) ====

@@ -35,7 +35,7 @@
  * SUCH DAMAGE.
  *
  *	from: @(#)trap.c	7.4 (Berkeley) 5/13/91
- * $FreeBSD: src/sys/i386/i386/trap.c,v 1.233 2002/09/16 19:25:08 mini Exp $
+ * $FreeBSD: src/sys/i386/i386/trap.c,v 1.234 2002/09/28 17:14:46 phk Exp $
  */
 
 /*
@@ -576,7 +576,7 @@
 	return;
 }
 
-int
+static int
 trap_pfault(frame, usermode, eva)
 	struct trapframe *frame;
 	int usermode;

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe p4-projects" in the body of the message




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