From owner-p4-projects@FreeBSD.ORG Fri Aug 11 11:28:25 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1D18C16A504; Fri, 11 Aug 2006 11:28:25 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id D1D1B16A501 for ; Fri, 11 Aug 2006 11:28:24 +0000 (UTC) (envelope-from rdivacky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 6BB8443D55 for ; Fri, 11 Aug 2006 11:28:24 +0000 (GMT) (envelope-from rdivacky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k7BBSOK1060234 for ; Fri, 11 Aug 2006 11:28:24 GMT (envelope-from rdivacky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k7BBSM1r060231 for perforce@freebsd.org; Fri, 11 Aug 2006 11:28:22 GMT (envelope-from rdivacky@FreeBSD.org) Date: Fri, 11 Aug 2006 11:28:22 GMT Message-Id: <200608111128.k7BBSM1r060231@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to rdivacky@FreeBSD.org using -f From: Roman Divacky To: Perforce Change Reviews Cc: Subject: PERFORCE change 103634 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 11 Aug 2006 11:28:25 -0000 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 # 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 -__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 -__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 -__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 -__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 #include #include @@ -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 -__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 #include @@ -66,6 +66,7 @@ #include #include #include +#include #include #include @@ -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 -__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 #include @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -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 -__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 @@ -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 struct vm_page; +#ifdef ARM_USE_SMALL_ALLOC + +#include +#include +#include + +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 + 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 -__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) <<<