Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 11 Aug 2006 11:28:22 GMT
From:      Roman Divacky <rdivacky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 103634 for review
Message-ID:  <200608111128.k7BBSM1r060231@repoman.freebsd.org>

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

Change 103634 by rdivacky@rdivacky_witten on 2006/08/11 11:27:21

	IFC

Affected files ...

.. //depot/projects/soc2006/rdivacky_linuxolator/Makefile#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/amd64/amd64/trap.c#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/amd64/linux32/linux32_sysvec.c#6 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/arm/arm/mem.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/arm/arm/pmap.c#6 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/arm/arm/vm_machdep.c#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/arm/at91/at91_st.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/arm/at91/kb920x_machdep.c#5 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/arm/include/pmap.h#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/arm/include/sf_buf.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/arm/include/vmparam.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/arm/sa11x0/assabet_machdep.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/arm/xscale/i80321/iq31244_machdep.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/Makefile#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/Makefile#1 branch
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/Makefile.inc#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/bootiic/Makefile#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/bootiic/arm_init.S#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/bootiic/env_vars.c#1 branch
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/bootiic/env_vars.h#1 branch
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/bootiic/loader_prompt.c#1 branch
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/bootiic/loader_prompt.h#1 branch
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/bootiic/main.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/Makefile#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/at91rm9200.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/at91rm9200_lowlevel.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/eeprom.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/eeprom.h#2 delete
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/emac.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/emac.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/env_vars.c#2 delete
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/env_vars.h#2 delete
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/lib.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/loader_prompt.c#2 delete
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/loader_prompt.h#2 delete
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/p_string.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/p_string.h#2 delete
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/spi_flash.c#1 branch
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/spi_flash.h#1 branch
.. //depot/projects/soc2006/rdivacky_linuxolator/boot/arm/at91/libat91/xmodem.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/compat/linprocfs/linprocfs.c#6 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/conf/files#7 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/conf/options.arm#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/acpica/acpi_dock.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/acpica/acpi_pci_link.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/acpica/acpi_video.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/ata/ata-disk.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/ath/if_ath.c#6 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/ath/if_athioctl.h#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/bge/if_bge.c#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/bge/if_bgereg.h#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/em/if_em.c#6 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/em/if_em_hw.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/em/if_em_hw.h#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/pccard/pccard_cis.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/sound/pci/emu10k1.c#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/sound/pci/emu10kx-pcm.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/sound/pci/emu10kx.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/sound/pci/emu10kx.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/usb/usbdevs#5 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/dev/usb/uscanner.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/fs/nwfs/nwfs_io.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/fs/smbfs/smbfs_io.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/geom/eli/g_eli.c#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/geom/eli/g_eli.h#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/geom/eli/g_eli_ctl.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/geom/geom_gpt.c#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/geom/mirror/g_mirror.c#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/geom/raid3/g_raid3.c#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/i386/acpica/acpi_wakeup.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/i386/conf/XBOX#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/i386/i386/machdep.c#5 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/i386/isa/clock.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/i386/linux/linux_sysvec.c#13 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/kern/uipc_proto.c#2 delete
.. //depot/projects/soc2006/rdivacky_linuxolator/kern/uipc_syscalls.c#7 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/kern/uipc_usrreq.c#7 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/kern/vfs_bio.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/kern/vfs_subr.c#6 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/net/bpf.c#5 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/net/if_tun.c#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/net80211/ieee80211_input.c#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/net80211/ieee80211_ioctl.c#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/net80211/ieee80211_ioctl.h#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/net80211/ieee80211_output.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/netgraph/ng_pppoe.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/netgraph/ng_pppoe.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/nfsclient/nfs_bio.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/nfsclient/nfs_vfsops.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/pc98/include/md_var.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/pc98/pc98/pc98_machdep.c#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/security/mac_biba/mac_biba.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/sparc64/sparc64/pmap.c#4 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/sys/domain.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/sys/mac_policy.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/sys/param.h#5 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/vm/swap_pager.c#3 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/vm/vm_object.c#5 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/vm/vm_page.c#6 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/vm/vm_page.h#2 integrate
.. //depot/projects/soc2006/rdivacky_linuxolator/vm/vnode_pager.c#2 integrate

Differences ...

==== //depot/projects/soc2006/rdivacky_linuxolator/Makefile#4 (text+ko) ====

@@ -1,13 +1,11 @@
-# $FreeBSD: src/sys/Makefile,v 1.37 2006/07/04 14:14:16 maxim Exp $
+# $FreeBSD: src/sys/Makefile,v 1.38 2006/08/10 06:29:43 imp Exp $
 
 .include <bsd.own.mk>
 
 # The boot loader
 .if ${MK_BOOT} != "no"
-.if ${MACHINE_ARCH} != "arm"
 SUBDIR=	boot
 .endif
-.endif
 
 # Directories to include in cscope name file and TAGS.
 CSCOPEDIRS=	coda compat conf contrib crypto ddb dev fs geom gnu i4b isa \

==== //depot/projects/soc2006/rdivacky_linuxolator/amd64/amd64/trap.c#4 (text+ko) ====

@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/trap.c,v 1.307 2006/07/28 20:22:57 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/trap.c,v 1.308 2006/08/08 04:01:29 alc Exp $");
 
 /*
  * AMD64 Trap and System call handling
@@ -566,8 +566,14 @@
 		map = &vm->vm_map;
 	}
 
+	/*
+	 * PGEX_I is defined only if the execute disable bit capability is
+	 * supported and enabled; otherwise, that bit is reserved, i.e., zero.
+	 */
 	if (frame->tf_err & PGEX_W)
 		ftype = VM_PROT_WRITE;
+	else if (frame->tf_err & PGEX_I)
+		ftype = VM_PROT_EXECUTE;
 	else
 		ftype = VM_PROT_READ;
 

==== //depot/projects/soc2006/rdivacky_linuxolator/amd64/linux32/linux32_sysvec.c#6 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_sysvec.c,v 1.18 2006/05/06 17:26:45 ambrisko Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_sysvec.c,v 1.19 2006/08/10 22:05:25 netchild Exp $");
 #include "opt_compat.h"
 
 #ifndef COMPAT_IA32
@@ -123,6 +123,10 @@
 
 /*
  * Linux syscalls return negative errno's, we do positive and map them
+ * Reference:
+ *   FreeBSD: src/sys/sys/errno.h
+ *   Linux:   linux-2.6.17.8/include/asm-generic/errno-base.h
+ *            linux-2.6.17.8/include/asm-generic/errno.h
  */
 static int bsd_to_linux_errno[ELAST + 1] = {
 	-0,  -1,  -2,  -3,  -4,  -5,  -6,  -7,  -8,  -9,
@@ -133,7 +137,8 @@
 	-100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
 	-110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
 	-116, -66,  -6,  -6,  -6,  -6,  -6, -37, -38,  -9,
-	-6, -6, -43, -42, -75, -6, -84
+	  -6,  -6, -43, -42, -75,-125, -84, -95, -16, -74,
+	 -72, -67, -71
 };
 
 int bsd_to_linux_signal[LINUX_SIGTBLSZ] = {

==== //depot/projects/soc2006/rdivacky_linuxolator/arm/arm/mem.c#2 (text+ko) ====

@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/arm/mem.c,v 1.2 2005/10/03 14:18:21 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/arm/mem.c,v 1.3 2006/08/08 20:59:38 cognet Exp $");
 
 /*
  * Memory special file
@@ -66,11 +66,6 @@
 
 #include "opt_global.h"
 
-#ifdef ARM_USE_SMALL_ALLOC
-extern vm_offset_t alloc_curaddr;
-extern vm_offset_t alloc_firstaddr;
-#endif
-
 /*
  * Used in /dev/mem drivers and elsewhere
  */
@@ -127,8 +122,8 @@
 			    uio->uio_rw == UIO_READ ? 
 			    VM_PROT_READ : VM_PROT_WRITE))
 #ifdef ARM_USE_SMALL_ALLOC
-				if (addr < alloc_firstaddr || addr >
-				    alloc_curaddr)
+				if (addr <= VM_MAXUSER_ADDRESS ||
+				    addr >= KERNBASE)
 #endif
 					return (EFAULT);
 			error = uiomove((caddr_t)(int)uio->uio_offset, (int)c, uio);

==== //depot/projects/soc2006/rdivacky_linuxolator/arm/arm/pmap.c#6 (text+ko) ====

@@ -147,7 +147,7 @@
 #include "opt_vm.h"
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/arm/pmap.c,v 1.67 2006/08/01 19:06:04 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/arm/pmap.c,v 1.68 2006/08/08 20:59:38 cognet Exp $");
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
@@ -1129,7 +1129,7 @@
 		l2b = pmap_get_l2_bucket(pmap_kernel(), va);
 		ptep = &l2b->l2b_kva[l2pte_index(va)];
 		pte = *ptep;
-
+		
 		if ((pte & L2_S_CACHE_MASK) != pte_l2_s_cache_mode_pt) {
 			/*
 			 * Page tables must have the cache-mode set to 
@@ -1140,7 +1140,6 @@
 			cpu_tlb_flushD_SE(va);
 			cpu_cpwait();
 		}
-		
 #ifdef ARM_USE_SMALL_ALLOC
 	}
 #endif
@@ -2384,8 +2383,6 @@
 #define PMAP_STATIC_L2_SIZE 16
 #ifdef ARM_USE_SMALL_ALLOC
 extern struct mtx smallalloc_mtx;
-extern vm_offset_t alloc_curaddr;
-extern vm_offset_t alloc_firstaddr;
 #endif
 
 void
@@ -2544,9 +2541,9 @@
 
 #ifdef ARM_USE_SMALL_ALLOC
 	mtx_init(&smallalloc_mtx, "Small alloc page list", NULL, MTX_DEF);
-	alloc_firstaddr = alloc_curaddr = arm_nocache_startaddr +
-	    ARM_NOCACHE_KVA_SIZE;
+	arm_init_smallalloc();
 #endif
+	pmap_set_pcb_pagedir(kernel_pmap, thread0.td_pcb);
 }
 
 /***************************************************
@@ -2933,6 +2930,9 @@
 vm_offset_t
 pmap_map(vm_offset_t *virt, vm_offset_t start, vm_offset_t end, int prot)
 {
+#ifdef ARM_USE_SMALL_ALLOC
+	return (arm_ptovirt(start));
+#else
 	vm_offset_t sva = *virt;
 	vm_offset_t va = sva;
 
@@ -2947,6 +2947,7 @@
 	}
 	*virt = va;
 	return (sva);
+#endif
 }
 
 static void
@@ -3488,7 +3489,7 @@
 			 * is current
 			 */
 			PTE_SYNC(ptep);
-			if (L1_IDX(va) != L1_IDX(vector_page) &&
+			if (L1_IDX(va) != L1_IDX(vector_page) && 
 			    l2pte_valid(npte)) {
 				/*
 				 * This mapping is likely to be accessed as
@@ -3999,6 +4000,10 @@
 void
 pmap_zero_page_generic(vm_paddr_t phys, int off, int size)
 {
+#ifdef ARM_USE_SMALL_ALLOC
+	char *dstpg;
+#endif
+
 #ifdef DEBUG
 	struct vm_page *pg = PHYS_TO_VM_PAGE(phys);
 
@@ -4010,6 +4015,16 @@
 	    _arm_bzero((void *)(phys + off), size, IS_PHYSICAL) == 0)
 		return;
 
+#ifdef ARM_USE_SMALL_ALLOC
+	dstpg = (char *)arm_ptovirt(phys);
+	if (off || size != PAGE_SIZE) {
+		bzero(dstpg + off, size);
+		cpu_dcache_wbinv_range((vm_offset_t)(dstpg + off), size);
+	} else {
+		bzero_page((vm_offset_t)dstpg);
+		cpu_dcache_wbinv_range((vm_offset_t)dstpg, PAGE_SIZE);
+	}
+#else
 
 	mtx_lock(&cmtx);
 	/*
@@ -4021,12 +4036,15 @@
 	PTE_SYNC(cdst_pte);
 	cpu_tlb_flushD_SE(cdstp);
 	cpu_cpwait();
-	if (off || size != PAGE_SIZE)
+	if (off || size != PAGE_SIZE) {
 		bzero((void *)(cdstp + off), size);
-	else
+		cpu_dcache_wbinv_range(cdstp + off, size);
+	} else {
 		bzero_page(cdstp);
+		cpu_dcache_wbinv_range(cdstp, PAGE_SIZE);
+	}
 	mtx_unlock(&cmtx);
-	cpu_dcache_wbinv_range(cdstp, PAGE_SIZE);
+#endif
 }
 #endif /* (ARM_MMU_GENERIC + ARM_MMU_SA1) != 0 */
 
@@ -4034,7 +4052,6 @@
 void
 pmap_zero_page_xscale(vm_paddr_t phys, int off, int size)
 {
-	
 	if (_arm_bzero && 
 	    _arm_bzero((void *)(phys + off), size, IS_PHYSICAL) == 0)
 		return;
@@ -4344,12 +4361,23 @@
 void
 pmap_copy_page(vm_page_t src, vm_page_t dst)
 {
+#ifdef ARM_USE_SMALL_ALLOC
+	vm_offset_t srcpg, dstpg;
+#endif
+
 	cpu_dcache_wbinv_all();
 	if (_arm_memcpy && 
 	    _arm_memcpy((void *)VM_PAGE_TO_PHYS(dst), 
 	    (void *)VM_PAGE_TO_PHYS(src), PAGE_SIZE, IS_PHYSICAL) == 0)
 		return;
+#ifdef ARM_USE_SMALL_ALLOC
+	srcpg = arm_ptovirt(VM_PAGE_TO_PHYS(src));
+	dstpg = arm_ptovirt(VM_PAGE_TO_PHYS(dst));
+	bcopy_page(srcpg, dstpg);
+	cpu_dcache_wbinv_range(dstpg, PAGE_SIZE);
+#else
 	pmap_copy_page_func(VM_PAGE_TO_PHYS(src), VM_PAGE_TO_PHYS(dst));
+#endif
 }
 
 

==== //depot/projects/soc2006/rdivacky_linuxolator/arm/arm/vm_machdep.c#4 (text+ko) ====

@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/arm/vm_machdep.c,v 1.26 2006/07/15 23:15:31 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/arm/vm_machdep.c,v 1.27 2006/08/08 20:59:38 cognet Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -66,6 +66,7 @@
 #include <vm/vm_page.h>
 #include <vm/vm_map.h>
 #include <vm/vm_param.h>
+#include <vm/vm_pageout.h>
 #include <vm/uma.h>
 #include <vm/uma_int.h>
 
@@ -73,6 +74,7 @@
 #define NSFBUFS		(512 + maxusers * 16)
 #endif
 
+#ifndef ARM_USE_SMALL_ALLOC
 static void     sf_buf_init(void *arg);
 SYSINIT(sock_sf, SI_SUB_MBUF, SI_ORDER_ANY, sf_buf_init, NULL)
 
@@ -94,6 +96,7 @@
  * A lock used to synchronize access to the hash table and free list
  */
 static struct mtx sf_buf_lock;
+#endif
 
 /*
  * Finish a fork operation, with process p2 nearly set up.
@@ -161,6 +164,7 @@
 void
 sf_buf_free(struct sf_buf *sf)
 {
+#ifndef ARM_USE_SMALL_ALLOC
 	 mtx_lock(&sf_buf_lock);
 	 sf->ref_count--;
 	 if (sf->ref_count == 0) {
@@ -170,11 +174,13 @@
 			 wakeup_one(&sf_buf_freelist);
 	 }
 	 mtx_unlock(&sf_buf_lock);				 
+#endif
 }
 
+#ifndef ARM_USE_SMALL_ALLOC
 /*
- *  * Allocate a pool of sf_bufs (sendfile(2) or "super-fast" if you prefer. :-))
- *   */
+ * Allocate a pool of sf_bufs (sendfile(2) or "super-fast" if you prefer. :-))
+ */
 static void
 sf_buf_init(void *arg)
 {       
@@ -197,6 +203,7 @@
 	sf_buf_alloc_want = 0; 
 	mtx_init(&sf_buf_lock, "sf_buf", NULL, MTX_DEF);
 }
+#endif
 
 /*
  * Get an sf_buf from the freelist. Will block if none are available.
@@ -204,6 +211,9 @@
 struct sf_buf *
 sf_buf_alloc(struct vm_page *m, int flags)
 {
+#ifdef ARM_USE_SMALL_ALLOC
+	return ((struct sf_buf *)m);
+#else
 	struct sf_head *hash_list;
 	struct sf_buf *sf;
 	int error;
@@ -249,7 +259,7 @@
 done:
 	mtx_unlock(&sf_buf_lock);
 	return (sf);
-	
+#endif
 }
 
 /*
@@ -446,10 +456,55 @@
 
 MALLOC_DEFINE(M_VMSMALLALLOC, "vm_small_alloc", "VM Small alloc data");
 
-vm_offset_t alloc_curaddr;
-vm_offset_t alloc_firstaddr;
+static vm_offset_t alloc_firstaddr;
+
+vm_offset_t
+arm_ptovirt(vm_paddr_t pa)
+{
+	int i;
+	vm_offset_t addr = alloc_firstaddr;
+
+	KASSERT(alloc_firstaddr != 0, ("arm_ptovirt called to early ?"));
+	for (i = 0; dump_avail[i]; i += 2) {
+		if (pa >= dump_avail[i] && pa < dump_avail[i + 1])
+			break;
+		addr += (dump_avail[i + 1] & L1_S_FRAME) + L1_S_SIZE -
+		    (dump_avail[i] & L1_S_FRAME);
+	}
+	KASSERT(dump_avail[i] != 0, ("Trying to access invalid physical address"));
+	return (addr + (pa - (dump_avail[i] & L1_S_FRAME)));
+}
 
-extern int doverbose;
+void
+arm_init_smallalloc(void)
+{
+	vm_offset_t to_map = 0, mapaddr;
+	int i;
+	
+	/* 
+	 * We need to use dump_avail and not phys_avail, since we want to
+	 * map the whole memory and not just the memory available to the VM
+	 * to be able to do a pa => va association for any address.
+	 */
+	   
+	for (i = 0; dump_avail[i]; i+= 2) {
+		to_map += (dump_avail[i + 1] & L1_S_FRAME) + L1_S_SIZE -
+		    (dump_avail[i] & L1_S_FRAME);
+	}
+	alloc_firstaddr = mapaddr = KERNBASE - to_map;
+	for (i = 0; dump_avail[i]; i+= 2) {
+		vm_offset_t size = (dump_avail[i + 1] & L1_S_FRAME) +
+		    L1_S_SIZE - (dump_avail[i] & L1_S_FRAME);
+		vm_offset_t did = 0;
+		while (size > 0 ) {
+			pmap_kenter_section(mapaddr, 
+			    (dump_avail[i] & L1_S_FRAME) + did, SECTION_CACHE);
+			mapaddr += L1_S_SIZE;
+			did += L1_S_SIZE;
+			size -= L1_S_SIZE;
+		}
+	}
+}
 
 void
 arm_add_smallalloc_pages(void *list, void *mem, int bytes, int pagetable)
@@ -470,52 +525,15 @@
 	}
 }
 
-static void *
-arm_uma_do_alloc(struct arm_small_page **pglist, int bytes, int pagetable)
-{
-	void *ret;
-	vm_page_t page_array = NULL;
-	    
-	*pglist = (void *)kmem_malloc(kmem_map, (0x100000 / PAGE_SIZE) *
-	    sizeof(struct arm_small_page), M_WAITOK);
-	if (*pglist && alloc_curaddr < 0xf0000000) {/* XXX */
-		mtx_lock(&Giant);
-		page_array = vm_page_alloc_contig(0x100000 / PAGE_SIZE,
-		    0, 0xffffffff, 0x100000, 0);
-		mtx_unlock(&Giant);
-	}
-	if (page_array) {
-		vm_paddr_t pa = VM_PAGE_TO_PHYS(page_array);
-		mtx_lock(&smallalloc_mtx);
-		ret = (void*)alloc_curaddr;
-		alloc_curaddr += 0x100000;
-		/* XXX: ARM_TP_ADDRESS should probably be move elsewhere. */
-		if (alloc_curaddr == ARM_TP_ADDRESS)
-			alloc_curaddr += 0x100000;
-		mtx_unlock(&smallalloc_mtx);
-		pmap_kenter_section((vm_offset_t)ret, pa
-		    , pagetable);
-	} else {
-		if (*pglist)
-			kmem_free(kmem_map, (vm_offset_t)*pglist, 
-			    (0x100000 / PAGE_SIZE) *
-			    sizeof(struct arm_small_page));
-		*pglist = NULL;
-		ret = (void *)kmem_malloc(kmem_map, bytes, M_WAITOK);
-	}
-	return (ret);
-}
-
 void *
 uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait)
 {
 	void *ret;
-	struct arm_small_page *sp, *tmp;
+	struct arm_small_page *sp;
 	TAILQ_HEAD(,arm_small_page) *head;
-	static struct thread *in_alloc;
-	static int in_sleep;
-	int should_wakeup = 0;
-	
+	static vm_pindex_t color;
+	vm_page_t m;
+
 	*flags = UMA_SLAB_PRIV;
 	/*
 	 * For CPUs where we setup page tables as write back, there's no
@@ -527,55 +545,42 @@
 		head = (void *)&pages_normal;
 
 	mtx_lock(&smallalloc_mtx);
-retry:
 	sp = TAILQ_FIRST(head);
 
 	if (!sp) {
-		/* No more free pages, need to alloc more. */
-		if (!(wait & M_WAITOK) ||
-		    in_alloc == curthread) {
-			mtx_unlock(&smallalloc_mtx);
+		int pflags;
+
+		mtx_unlock(&smallalloc_mtx);
+		if (zone == l2zone &&
+		    pte_l1_s_cache_mode != pte_l1_s_cache_mode_pt) {
 			*flags = UMA_SLAB_KMEM;
-			return ((void *)kmem_malloc(kmem_map, bytes, M_NOWAIT));
+			ret = ((void *)kmem_malloc(kmem_map, bytes, M_NOWAIT));
+			return (ret);
 		}
-		if (in_alloc != NULL) {
-			/* Somebody else is already doing the allocation. */
-			in_sleep++;
-			msleep(&in_alloc, &smallalloc_mtx, PWAIT, 
-			    "smallalloc", 0);
-			in_sleep--;
-			goto retry;
+		if ((wait & (M_NOWAIT|M_USE_RESERVE)) == M_NOWAIT)
+			pflags = VM_ALLOC_INTERRUPT;
+		else
+			pflags = VM_ALLOC_SYSTEM;
+		if (wait & M_ZERO)
+			pflags |= VM_ALLOC_ZERO;
+		for (;;) {
+			m = vm_page_alloc(NULL, color++, 
+			    pflags | VM_ALLOC_NOOBJ);
+			if (m == NULL) {
+				if (wait & M_NOWAIT)
+					return (NULL);
+				VM_WAIT;
+			} else
+				break;
 		}
-		in_alloc = curthread;
-		mtx_unlock(&smallalloc_mtx);
-		/* Try to alloc 1MB of contiguous memory. */
-		ret = arm_uma_do_alloc(&sp, bytes, zone == l2zone ?
-		    SECTION_PT : SECTION_CACHE);
-		mtx_lock(&smallalloc_mtx);
-		in_alloc = NULL;
-		if (in_sleep > 0)
-			should_wakeup = 1;
-		if (sp) {
-			for (int i = 0; i < (0x100000 / PAGE_SIZE) - 1;
-			    i++) {
-				tmp = &sp[i];
-				tmp->addr = (char *)ret + i * PAGE_SIZE;
-				TAILQ_INSERT_HEAD(head, tmp, pg_list);
-			}
-			ret = (char *)ret + 0x100000 - PAGE_SIZE;
-			TAILQ_INSERT_HEAD(&free_pgdesc, &sp[(0x100000 / (
-			    PAGE_SIZE)) - 1], pg_list);
-		} else
-			*flags = UMA_SLAB_KMEM;
-			
-	} else {
-		sp = TAILQ_FIRST(head);
-		TAILQ_REMOVE(head, sp, pg_list);
-		TAILQ_INSERT_HEAD(&free_pgdesc, sp, pg_list);
-		ret = sp->addr;
-	}
-	if (should_wakeup)
-		wakeup(&in_alloc);
+		ret = (void *)arm_ptovirt(VM_PAGE_TO_PHYS(m));
+		if ((wait & M_ZERO) && (m->flags & PG_ZERO) == 0)
+			bzero(ret, PAGE_SIZE);
+		return (ret);
+	}    
+	TAILQ_REMOVE(head, sp, pg_list);
+	TAILQ_INSERT_HEAD(&free_pgdesc, sp, pg_list);
+	ret = sp->addr;
 	mtx_unlock(&smallalloc_mtx);
 	if ((wait & M_ZERO))
 		bzero(ret, bytes);
@@ -593,18 +598,30 @@
 	else {
 		struct arm_small_page *sp;
 
-		mtx_lock(&smallalloc_mtx);
-		sp = TAILQ_FIRST(&free_pgdesc);
-		KASSERT(sp != NULL, ("No more free page descriptor ?"));
-		TAILQ_REMOVE(&free_pgdesc, sp, pg_list);
-		sp->addr = mem;
-		pmap_get_pde_pte(kernel_pmap, (vm_offset_t)mem, &pd, &pt);
-		if ((*pd & pte_l1_s_cache_mask) == pte_l1_s_cache_mode_pt &&
-		    pte_l1_s_cache_mode_pt != pte_l1_s_cache_mode)
-			TAILQ_INSERT_HEAD(&pages_wt, sp, pg_list);
-		else
-			TAILQ_INSERT_HEAD(&pages_normal, sp, pg_list);
-		mtx_unlock(&smallalloc_mtx);
+		if ((vm_offset_t)mem >= KERNBASE) {
+			mtx_lock(&smallalloc_mtx);
+			sp = TAILQ_FIRST(&free_pgdesc);
+			KASSERT(sp != NULL, ("No more free page descriptor ?"));
+			TAILQ_REMOVE(&free_pgdesc, sp, pg_list);
+			sp->addr = mem;
+			pmap_get_pde_pte(kernel_pmap, (vm_offset_t)mem, &pd,
+			    &pt);
+			if ((*pd & pte_l1_s_cache_mask) == 
+			    pte_l1_s_cache_mode_pt &&
+			    pte_l1_s_cache_mode_pt != pte_l1_s_cache_mode)
+				TAILQ_INSERT_HEAD(&pages_wt, sp, pg_list);
+			else
+				TAILQ_INSERT_HEAD(&pages_normal, sp, pg_list);
+			mtx_unlock(&smallalloc_mtx);
+		} else {
+			vm_page_t m;
+			vm_paddr_t pa = vtophys((vm_offset_t)mem);
+
+			m = PHYS_TO_VM_PAGE(pa);
+			vm_page_lock_queues();
+			vm_page_free(m);
+			vm_page_unlock_queues();
+		}
 	}
 }
 

==== //depot/projects/soc2006/rdivacky_linuxolator/arm/at91/at91_st.c#3 (text) ====

@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/at91/at91_st.c,v 1.4 2006/07/14 22:31:12 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/at91/at91_st.c,v 1.5 2006/08/09 20:58:55 imp Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -34,6 +34,7 @@
 #include <sys/resource.h>
 #include <sys/rman.h>
 #include <sys/timetc.h>
+#include <sys/watchdog.h>
 
 #include <machine/bus.h>
 #include <machine/cpu.h>
@@ -48,7 +49,8 @@
 static struct at91st_softc {
 	bus_space_tag_t		sc_st;
 	bus_space_handle_t	sc_sh;
-	device_t		dev;
+	device_t		sc_dev;
+	eventhandler_tag	sc_wet;	/* watchdog event handler tag */
 } *timer_softc;
 
 #define RD4(off) \
@@ -56,6 +58,8 @@
 #define WR4(off, val) \
 	bus_space_write_4(timer_softc->sc_st, timer_softc->sc_sh, (off), (val))
 
+static void at91st_watchdog(void *, u_int, int *);
+
 static inline int
 st_crtr(void)
 {
@@ -97,7 +101,7 @@
 
 	timer_softc = device_get_softc(dev);
 	timer_softc->sc_st = sc->sc_st;
-	timer_softc->dev = dev;
+	timer_softc->sc_dev = dev;
 	if (bus_space_subregion(sc->sc_st, sc->sc_sh, AT91RM92_ST_BASE,
 	    AT91RM92_ST_SIZE, &timer_softc->sc_sh) != 0)
 		panic("couldn't subregion timer registers");
@@ -108,6 +112,13 @@
 	WR4(ST_RTMR, 1);
 	/* Disable all interrupts */
 	WR4(ST_IDR, 0xffffffff);
+	/* disable watchdog timer */
+	WR4(ST_WDMR, 0);
+
+	timer_softc->sc_wet = EVENTHANDLER_REGISTER(watchdog_list,
+	  at91st_watchdog, dev, 0);
+	device_printf(dev,
+	  "watchdog registered, timeout intervall max. 64 sec\n");
 	return (0);
 }
 
@@ -140,7 +151,34 @@
 #endif
 }
 
+/*
+ * t below is in a weird unit.  The watchdog is set to 2^t
+ * nanoseconds.  Since our watchdog timer can't really do that too
+ * well, we approximate it by assuming that the timeout interval for
+ * the lsb is 2^22 ns, which is 4.194ms.  This is an overestimation of
+ * the actual time (3.906ms), but close enough for watchdogging.
+ * These approximations, though a violation of the spec, improve the
+ * performance of the application which typically specifies things as
+ * WD_TO_32SEC.  In that last case, we'd wait 32s before the wdog
+ * reset.  The spec says we should wait closer to 34s, but given how
+ * it is likely to be used, and the extremely coarse nature time
+ * interval, I think this is the best solution.
+ */
 static void
+at91st_watchdog(void *argp, u_int cmd, int *error)
+{
+	uint32_t wdog;
+	int t;
+
+	wdog = 0;
+	t = cmd & WD_INTERVAL;
+	if (cmd != 0 && t >= 22 && t <= 37)
+		wdog = (1 << (t - 22)) | ST_WDMR_RSTEN;
+	WR4(ST_WDMR, wdog);
+	WR4(ST_CR, ST_CR_WDRST);
+}
+
+static void
 clock_intr(void *arg)
 {
 	struct trapframe *fp = arg;
@@ -161,7 +199,7 @@
 	struct resource *irq;
 	int rid = 0;
 	void *ih;
-	device_t dev = timer_softc->dev;
+	device_t dev = timer_softc->sc_dev;
 
 	if (32768 % hz) {
 		printf("Cannot get %d Hz clock; using 128Hz\n", hz);
@@ -229,4 +267,3 @@
 cpu_stopprofclock(void)
 {
 }
-

==== //depot/projects/soc2006/rdivacky_linuxolator/arm/at91/kb920x_machdep.c#5 (text) ====

@@ -48,7 +48,7 @@
 #include "opt_at91.h"
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/at91/kb920x_machdep.c,v 1.13 2006/07/25 23:07:35 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/at91/kb920x_machdep.c,v 1.15 2006/08/08 20:59:38 cognet Exp $");
 
 #define _ARM32_BUS_DMA_PRIVATE
 #include <sys/param.h>
@@ -262,7 +262,7 @@
 	u_int l1pagetable;
 	vm_offset_t freemempos;
 	vm_offset_t afterkern;
-	int i = 0;
+	int i;
 	uint32_t fake_preload[35];
 	uint32_t memsize;
 	vm_offset_t lastaddr;
@@ -465,6 +465,15 @@
 	arm_vector_init(ARM_VECTORS_LOW, ARM_VEC_ALL);
 
 	pmap_curmaxkvaddr = afterkern + 0x100000 * (KERNEL_PT_KERN_NUM - 1);
+	/*
+	 * ARM_USE_SMALL_ALLOC uses dump_avail, so it must be filled before
+	 * calling pmap_bootstrap.
+	 */
+	dump_avail[0] = KERNPHYSADDR;
+	dump_avail[1] = KERNPHYSADDR + memsize;
+	dump_avail[2] = 0;
+	dump_avail[3] = 0;
+					
 	pmap_bootstrap(freemempos,
 	    KERNVIRTADDR + 3 * memsize,
 	    &kernel_l1pt);
@@ -473,10 +482,6 @@
 	mutex_init();
 	
 	i = 0;
-	dump_avail[0] = KERNPHYSADDR;
-	dump_avail[1] = KERNPHYSADDR + memsize;
-	dump_avail[2] = 0;
-	dump_avail[3] = 0;
 	
 	phys_avail[0] = virtual_avail - KERNVIRTADDR + KERNPHYSADDR;
 	phys_avail[1] = KERNPHYSADDR + memsize;

==== //depot/projects/soc2006/rdivacky_linuxolator/arm/include/pmap.h#3 (text+ko) ====

@@ -44,7 +44,7 @@
  *      from: @(#)pmap.h        7.4 (Berkeley) 5/12/91
  * 	from: FreeBSD: src/sys/i386/include/pmap.h,v 1.70 2000/11/30
  *
- * $FreeBSD: src/sys/arm/include/pmap.h,v 1.19 2006/06/06 04:32:20 alc Exp $
+ * $FreeBSD: src/sys/arm/include/pmap.h,v 1.20 2006/08/08 20:59:38 cognet Exp $
  */
 
 #ifndef _MACHINE_PMAP_H_
@@ -531,7 +531,8 @@
 
 #ifdef ARM_USE_SMALL_ALLOC
 void	arm_add_smallalloc_pages(void *, void *, int, int);
-void 	arm_busy_pages(void);
+vm_offset_t arm_ptovirt(vm_paddr_t);
+void arm_init_smallalloc(void);
 struct arm_small_page {
 	void *addr;
 	TAILQ_ENTRY(arm_small_page) pg_list;

==== //depot/projects/soc2006/rdivacky_linuxolator/arm/include/sf_buf.h#2 (text+ko) ====

@@ -23,16 +23,40 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/arm/include/sf_buf.h,v 1.1 2004/05/14 11:46:44 cognet Exp $
+ * $FreeBSD: src/sys/arm/include/sf_buf.h,v 1.2 2006/08/08 20:59:38 cognet Exp $
  */
 
 #ifndef _MACHINE_SF_BUF_H_
 #define _MACHINE_SF_BUF_H_
 
-#include <sys/queue.h>
 
 struct vm_page;
 
+#ifdef ARM_USE_SMALL_ALLOC
+
+#include <vm/vm.h>
+#include <vm/vm_param.h>
+#include <vm/vm_page.h>
+
+struct sf_buf;
+
+
+static __inline vm_offset_t
+sf_buf_kva(struct sf_buf *sf)
+{
+	return arm_ptovirt(VM_PAGE_TO_PHYS((vm_page_t)sf));
+}
+
+static __inline vm_page_t
+sf_buf_page(struct sf_buf *sf)
+{
+	return ((vm_page_t)sf);
+}
+
+#else
+
+#include <sys/queue.h>
+
 struct sf_buf {
 	LIST_ENTRY(sf_buf) list_entry;	/* list of buffers */
 	TAILQ_ENTRY(sf_buf) free_entry;	/* list of buffers */
@@ -55,4 +79,5 @@
 	return (sf->m);
 }
 
+#endif
 #endif /* !_MACHINE_SF_BUF_H_ */

==== //depot/projects/soc2006/rdivacky_linuxolator/arm/include/vmparam.h#2 (text+ko) ====

@@ -28,7 +28,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/arm/include/vmparam.h,v 1.5 2005/06/07 23:04:24 cognet Exp $
+ * $FreeBSD: src/sys/arm/include/vmparam.h,v 1.6 2006/08/08 20:59:38 cognet Exp $
  */
 
 #ifndef	_MACHINE_VMPARAM_H_
@@ -96,7 +96,14 @@
 #define UPT_MIN_ADDRESS		VADDR(UPTPTDI, 0)
 
 #define VM_MIN_ADDRESS          (0x00001000)
+#ifdef ARM_USE_SMALL_ALLOC
+#ifndef ARM_KERN_DIRECTMAP
+#define ARM_KERN_DIRECTMAP 512 * 1024 * 1024 /* 512 MB */
+#endif
+#define VM_MAXUSER_ADDRESS	KERNBASE - ARM_KERN_DIRECTMAP
+#else /* ARM_USE_SMALL_ALLOC */
 #define VM_MAXUSER_ADDRESS      KERNBASE
+#endif /* ARM_USE_SMALL_ALLOC */
 #define VM_MAX_ADDRESS          VM_MAXUSER_ADDRESS
 
 #define USRSTACK        VM_MAXUSER_ADDRESS

==== //depot/projects/soc2006/rdivacky_linuxolator/arm/sa11x0/assabet_machdep.c#3 (text+ko) ====

@@ -47,7 +47,7 @@
 
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/sa11x0/assabet_machdep.c,v 1.17 2006/06/07 11:28:17 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/sa11x0/assabet_machdep.c,v 1.18 2006/08/08 20:59:38 cognet Exp $");
 
 #include "opt_md.h"
 
@@ -438,18 +438,15 @@
 
 	pmap_curmaxkvaddr = freemempos + KERNEL_PT_VMDATA_NUM * 0x400000;
 
-	pmap_bootstrap(freemempos, 
-	    0xd0000000, &kernel_l1pt);
-
-	
-	mutex_init();
-	
-	
 	dump_avail[0] = phys_avail[0] = round_page(virtual_avail);
 	dump_avail[1] = phys_avail[1] = 0xc0000000 + 0x02000000 - 1;
 	dump_avail[2] = phys_avail[2] = 0;
 	dump_avail[3] = phys_avail[3] = 0;
-	
+					
+	mutex_init();

>>> TRUNCATED FOR MAIL (1000 lines) <<<



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