PERFORCE change 103634 for review
Roman Divacky
rdivacky at FreeBSD.org
Fri Aug 11 11:28:25 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=103634
Change 103634 by rdivacky at 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) <<<
More information about the p4-projects
mailing list