Date: Mon, 3 Oct 2005 17:14:06 GMT From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 84730 for review Message-ID: <200510031714.j93HE6nM002786@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=84730 Change 84730 by jhb@jhb_slimer on 2005/10/03 17:13:14 IFC @84729. Affected files ... .. //depot/projects/smpng/sys/amd64/amd64/trap.c#34 integrate .. //depot/projects/smpng/sys/arm/arm/bcopyinout.S#7 integrate .. //depot/projects/smpng/sys/arm/arm/bcopyinout_xscale.S#5 integrate .. //depot/projects/smpng/sys/arm/arm/busdma_machdep.c#14 integrate .. //depot/projects/smpng/sys/arm/arm/dump_machdep.c#2 integrate .. //depot/projects/smpng/sys/arm/arm/elf_trampoline.c#1 branch .. //depot/projects/smpng/sys/arm/arm/in_cksum.c#5 integrate .. //depot/projects/smpng/sys/arm/arm/in_cksum_arm.S#6 integrate .. //depot/projects/smpng/sys/arm/arm/inckern.S#1 branch .. //depot/projects/smpng/sys/arm/arm/intr.c#10 integrate .. //depot/projects/smpng/sys/arm/arm/locore.S#10 integrate .. //depot/projects/smpng/sys/arm/arm/machdep.c#13 integrate .. //depot/projects/smpng/sys/arm/arm/mem.c#2 integrate .. //depot/projects/smpng/sys/arm/arm/pmap.c#20 integrate .. //depot/projects/smpng/sys/arm/arm/support.S#9 integrate .. //depot/projects/smpng/sys/arm/arm/swtch.S#12 integrate .. //depot/projects/smpng/sys/arm/arm/vm_machdep.c#15 integrate .. //depot/projects/smpng/sys/arm/conf/IQ31244#8 integrate .. //depot/projects/smpng/sys/arm/include/in_cksum.h#3 integrate .. //depot/projects/smpng/sys/arm/include/md_var.h#3 integrate .. //depot/projects/smpng/sys/arm/include/pmap.h#11 integrate .. //depot/projects/smpng/sys/arm/sa11x0/assabet_machdep.c#9 integrate .. //depot/projects/smpng/sys/arm/xscale/i80321/files.i80321#3 integrate .. //depot/projects/smpng/sys/arm/xscale/i80321/i80321_aau.c#1 branch .. //depot/projects/smpng/sys/arm/xscale/i80321/i80321_dma.c#1 branch .. //depot/projects/smpng/sys/arm/xscale/i80321/i80321_timer.c#5 integrate .. //depot/projects/smpng/sys/arm/xscale/i80321/iq31244_machdep.c#13 integrate .. //depot/projects/smpng/sys/arm/xscale/i80321/iq80321.c#8 integrate .. //depot/projects/smpng/sys/conf/Makefile.arm#10 integrate .. //depot/projects/smpng/sys/conf/NOTES#106 integrate .. //depot/projects/smpng/sys/conf/files#151 integrate .. //depot/projects/smpng/sys/ddb/db_command.c#24 integrate .. //depot/projects/smpng/sys/ddb/db_output.c#16 integrate .. //depot/projects/smpng/sys/dev/em/if_em.c#53 integrate .. //depot/projects/smpng/sys/dev/firewire/00README#2 integrate .. //depot/projects/smpng/sys/dev/firewire/if_fwe.c#28 integrate .. //depot/projects/smpng/sys/dev/firewire/if_fwip.c#7 integrate .. //depot/projects/smpng/sys/dev/fxp/if_fxp.c#67 integrate .. //depot/projects/smpng/sys/dev/ixgb/README#2 integrate .. //depot/projects/smpng/sys/dev/ixgb/if_ixgb.c#12 integrate .. //depot/projects/smpng/sys/dev/lge/if_lge.c#30 integrate .. //depot/projects/smpng/sys/dev/lge/if_lgereg.h#5 integrate .. //depot/projects/smpng/sys/dev/lmc/if_lmc.h#1 branch .. //depot/projects/smpng/sys/dev/mii/acphy.c#13 integrate .. //depot/projects/smpng/sys/dev/mii/amphy.c#12 integrate .. //depot/projects/smpng/sys/dev/mii/brgphy.c#25 integrate .. //depot/projects/smpng/sys/dev/mii/ciphy.c#3 integrate .. //depot/projects/smpng/sys/dev/mii/dcphy.c#15 integrate .. //depot/projects/smpng/sys/dev/mii/exphy.c#12 integrate .. //depot/projects/smpng/sys/dev/mii/lxtphy.c#13 integrate .. //depot/projects/smpng/sys/dev/mii/nsphy.c#12 integrate .. //depot/projects/smpng/sys/dev/mii/pnaphy.c#13 integrate .. //depot/projects/smpng/sys/dev/mii/pnphy.c#12 integrate .. //depot/projects/smpng/sys/dev/mii/qsphy.c#13 integrate .. //depot/projects/smpng/sys/dev/mii/rgephy.c#5 integrate .. //depot/projects/smpng/sys/dev/mii/rlphy.c#16 integrate .. //depot/projects/smpng/sys/dev/mii/tdkphy.c#14 integrate .. //depot/projects/smpng/sys/dev/mii/tlphy.c#14 integrate .. //depot/projects/smpng/sys/dev/mii/ukphy.c#11 integrate .. //depot/projects/smpng/sys/dev/mii/xmphy.c#14 integrate .. //depot/projects/smpng/sys/dev/nge/if_nge.c#43 integrate .. //depot/projects/smpng/sys/dev/re/if_re.c#29 integrate .. //depot/projects/smpng/sys/dev/sound/pci/es137x.c#18 integrate .. //depot/projects/smpng/sys/dev/sound/pcm/ac97.c#28 integrate .. //depot/projects/smpng/sys/dev/sound/pcm/ac97.h#10 integrate .. //depot/projects/smpng/sys/dev/sound/pcm/ac97_patch.c#4 integrate .. //depot/projects/smpng/sys/dev/sound/pcm/ac97_patch.h#4 integrate .. //depot/projects/smpng/sys/dev/sound/pcm/channel.c#32 integrate .. //depot/projects/smpng/sys/dev/sound/pcm/dsp.c#28 integrate .. //depot/projects/smpng/sys/dev/sound/pcm/feeder_volume.c#1 branch .. //depot/projects/smpng/sys/dev/sound/pcm/mixer.c#21 integrate .. //depot/projects/smpng/sys/dev/sound/pcm/sndstat.c#18 integrate .. //depot/projects/smpng/sys/dev/sound/pcm/sound.c#28 integrate .. //depot/projects/smpng/sys/dev/sound/pcm/sound.h#23 integrate .. //depot/projects/smpng/sys/dev/sound/usb/uaudio_pcm.c#12 integrate .. //depot/projects/smpng/sys/dev/txp/if_txpreg.h#4 integrate .. //depot/projects/smpng/sys/dev/vge/if_vge.c#10 integrate .. //depot/projects/smpng/sys/dev/wi/if_wi.c#78 integrate .. //depot/projects/smpng/sys/dev/wi/if_wivar.h#23 integrate .. //depot/projects/smpng/sys/fs/fifofs/fifo_vnops.c#38 integrate .. //depot/projects/smpng/sys/fs/nwfs/nwfs_vfsops.c#21 integrate .. //depot/projects/smpng/sys/i386/i386/trap.c#84 integrate .. //depot/projects/smpng/sys/kern/kern_conf.c#44 integrate .. //depot/projects/smpng/sys/kern/kern_cpu.c#7 integrate .. //depot/projects/smpng/sys/kern/kern_exec.c#88 integrate .. //depot/projects/smpng/sys/kern/kern_lock.c#45 integrate .. //depot/projects/smpng/sys/kern/kern_poll.c#18 integrate .. //depot/projects/smpng/sys/kern/kern_proc.c#77 integrate .. //depot/projects/smpng/sys/kern/vfs_bio.c#83 integrate .. //depot/projects/smpng/sys/modules/Makefile#107 integrate .. //depot/projects/smpng/sys/modules/lmc/Makefile#1 branch .. //depot/projects/smpng/sys/modules/sound/sound/Makefile#3 integrate .. //depot/projects/smpng/sys/net/if.c#75 integrate .. //depot/projects/smpng/sys/net/if.h#27 integrate .. //depot/projects/smpng/sys/net/if_bridge.c#11 integrate .. //depot/projects/smpng/sys/net/if_var.h#41 integrate .. //depot/projects/smpng/sys/net/if_vlan.c#40 integrate .. //depot/projects/smpng/sys/netinet/in.c#29 integrate .. //depot/projects/smpng/sys/netinet/tcp_subr.c#73 integrate .. //depot/projects/smpng/sys/netsmb/netbios.h#6 integrate .. //depot/projects/smpng/sys/pci/if_dc.c#71 integrate .. //depot/projects/smpng/sys/pci/if_rl.c#60 integrate .. //depot/projects/smpng/sys/pci/if_sf.c#39 integrate .. //depot/projects/smpng/sys/pci/if_sis.c#55 integrate .. //depot/projects/smpng/sys/pci/if_ste.c#40 integrate .. //depot/projects/smpng/sys/pci/if_vr.c#38 integrate .. //depot/projects/smpng/sys/pci/if_xl.c#63 integrate .. //depot/projects/smpng/sys/security/mac_seeotheruids/mac_seeotheruids.c#7 integrate .. //depot/projects/smpng/sys/sys/buf.h#41 integrate .. //depot/projects/smpng/sys/sys/kerneldump.h#7 integrate .. //depot/projects/smpng/sys/sys/mac.h#34 integrate .. //depot/projects/smpng/sys/sys/mac_policy.h#34 integrate .. //depot/projects/smpng/sys/ufs/ffs/ffs_snapshot.c#51 integrate Differences ... ==== //depot/projects/smpng/sys/amd64/amd64/trap.c#34 (text+ko) ==== @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/trap.c,v 1.293 2005/09/28 07:03:02 rwatson Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/trap.c,v 1.294 2005/10/01 18:56:16 glebius Exp $"); /* * AMD64 Trap and System call handling @@ -146,11 +146,6 @@ extern char *syscallnames[]; #endif -#ifdef DEVICE_POLLING -extern u_int32_t poll_in_trap; -extern int ether_poll(int count); -#endif /* DEVICE_POLLING */ - /* * Exception, fault, and trap interface to the FreeBSD kernel. * This common code is called from assembly language IDT gate entry @@ -241,11 +236,6 @@ trap_fatal(&frame, frame.tf_addr); } -#ifdef DEVICE_POLLING - if (poll_in_trap) - ether_poll(poll_in_trap); -#endif /* DEVICE_POLLING */ - if (ISPL(frame.tf_cs) == SEL_UPL) { /* user trap */ ==== //depot/projects/smpng/sys/arm/arm/bcopyinout.S#7 (text+ko) ==== @@ -40,7 +40,12 @@ #include <machine/asm.h> -__FBSDID("$FreeBSD: src/sys/arm/arm/bcopyinout.S,v 1.6 2005/05/24 23:55:09 cognet Exp $"); +.L_arm_memcpy: + .word _C_LABEL(_arm_memcpy) +.L_min_memcpy_size: + .word _C_LABEL(_min_memcpy_size) + +__FBSDID("$FreeBSD: src/sys/arm/arm/bcopyinout.S,v 1.7 2005/10/03 14:12:10 cognet Exp $"); #ifdef __XSCALE__ #include <arm/arm/bcopyinout_xscale.S> #else @@ -82,6 +87,27 @@ moveq r0, #0 RETeq + ldr r3, .L_arm_memcpy + ldr r3, [r3] + cmp r3, #0 + beq .Lnormal + ldr r3, .L_min_memcpy_size + ldr r3, [r3] + cmp r2, r3 + blt .Lnormal + stmfd sp!, {r0-r2, r4, lr} + mov r3, r0 + mov r0, r1 + mov r1, r3 + mov r3, #2 /* SRC_IS_USER */ + ldr r4, .L_arm_memcpy + mov lr, pc + ldr pc, [r4] + cmp r0, #0 + ldmfd sp!, {r0-r2, r4, lr} + moveq r0, #0 + RETeq + SAVE_REGS #ifdef MULTIPROCESSOR /* XXX Probably not appropriate for non-Hydra SMPs */ @@ -306,6 +332,27 @@ moveq r0, #0 RETeq + ldr r3, .L_arm_memcpy + ldr r3, [r3] + cmp r3, #0 + beq .Lnormale + ldr r3, .L_min_memcpy_size + ldr r3, [r3] + cmp r2, r3 + blt .Lnormale + stmfd sp!, {r0-r2, r4, lr} + mov r3, r0 + mov r0, r1 + mov r1, r3 + mov r3, #1 /* DST_IS_USER */ + ldr r4, .L_arm_memcpy + mov lr, pc + ldr pc, [r4] + cmp r0, #0 + ldmfd sp!, {r0-r2, r4, lr} + moveq r0, #0 + RETeq + SAVE_REGS #ifdef MULTIPROCESSOR /* XXX Probably not appropriate for non-Hydra SMPs */ ==== //depot/projects/smpng/sys/arm/arm/bcopyinout_xscale.S#5 (text+ko) ==== @@ -36,7 +36,7 @@ */ #include <machine/asm.h> -__FBSDID("$FreeBSD: src/sys/arm/arm/bcopyinout_xscale.S,v 1.4 2005/05/24 23:55:09 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/bcopyinout_xscale.S,v 1.5 2005/10/03 14:12:10 cognet Exp $"); .text .align 0 @@ -61,6 +61,28 @@ movle r0, #0x00 movle pc, lr /* Bail early if length is <= 0 */ + ldr r3, .L_arm_memcpy + ldr r3, [r3] + cmp r3, #0 + beq .Lnormal + ldr r3, .L_min_memcpy_size + ldr r3, [r3] + cmp r2, r3 + blt .Lnormal + stmfd sp!, {r0-r2, r4, lr} + mov r3, r0 + mov r0, r1 + mov r1, r3 + mov r3, #2 /* SRC_IS_USER */ + ldr r4, .L_arm_memcpy + mov lr, pc + ldr pc, [r4] + cmp r0, #0 + ldmfd sp!, {r0-r2, r4, lr} + moveq r0, #0 + RETeq + +.Lnormal: stmfd sp!, {r10-r11, lr} #ifdef MULTIPROCESSOR @@ -491,6 +513,28 @@ movle r0, #0x00 movle pc, lr /* Bail early if length is <= 0 */ + ldr r3, .L_arm_memcpy + ldr r3, [r3] + cmp r3, #0 + beq .Lnormale + ldr r3, .L_min_memcpy_size + ldr r3, [r3] + cmp r2, r3 + blt .Lnormale + stmfd sp!, {r0-r2, r4, lr} + mov r3, r0 + mov r0, r1 + mov r1, r3 + mov r3, #1 /* DST_IS_USER */ + ldr r4, .L_arm_memcpy + mov lr, pc + ldr pc, [r4] + cmp r0, #0 + ldmfd sp!, {r0-r2, r4, lr} + moveq r0, #0 + RETeq + +.Lnormale: stmfd sp!, {r10-r11, lr} #ifdef MULTIPROCESSOR ==== //depot/projects/smpng/sys/arm/arm/busdma_machdep.c#14 (text+ko) ==== @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/arm/arm/busdma_machdep.c,v 1.22 2005/06/24 23:57:27 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/busdma_machdep.c,v 1.23 2005/10/03 14:07:57 cognet Exp $"); /* * MacPPC bus dma support routines @@ -189,7 +189,8 @@ mtx_lock(&busdma_mtx); map = TAILQ_FIRST(&dmamap_freelist); - TAILQ_REMOVE(&dmamap_freelist, map, freelist); + if (map) + TAILQ_REMOVE(&dmamap_freelist, map, freelist); mtx_unlock(&busdma_mtx); if (!map) { map = malloc(sizeof(*map), M_DEVBUF, M_NOWAIT); @@ -493,10 +494,14 @@ } else { curaddr = (pte & L2_S_FRAME) | (vaddr & L2_S_OFFSET); + pmap_uncache(ptep); + map->flags |= DMAMAP_UNCACHED; +#if 0 if (pte & L2_S_CACHE_MASK) { map->flags &= ~DMAMAP_COHERENT; } +#endif } } } else { @@ -769,7 +774,43 @@ */ void _bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) -{ +{ + struct mbuf *m; + struct uio *uio; + int resid; + struct iovec *iov; + + if (map->flags & DMAMAP_UNCACHED) { + switch(map->flags & DMAMAP_TYPE_MASK) { + case DMAMAP_LINEAR: + pmap_recache(map->buffer, len); + break; + case DMAMAP_MBUF: + m = map->buffer; + while (m) { + if (m->m_len > 0) + pmap_recache(m->m_data, len); + m = m->m_next; + } + break; + case DMAMAP_UIO: + uio = map->buffer; + iov = uio->uio_iov; + resid = uio->uio_resid; + for (int i = 0; i < uio->uio_iovcnt && resid != 0; i++) { + bus_size_t minlen = resid < iov[i].iov_len ? resid : + iov[i].iov_len; + if (minlen > 0) { + pmap_recache(iov[i].iov_base, minlen); + resid -= minlen; + } + } + break; + default: + break; + } + + } map->flags &= ~DMAMAP_TYPE_MASK; return; } @@ -799,9 +840,11 @@ if (!(op & (BUS_DMASYNC_PREWRITE | BUS_DMASYNC_POSTREAD))) return; - if (map->flags & DMAMAP_COHERENT) + if (map->flags & DMAMAP_COHERENT) { + printf("COHERENT\n"); return; - if ((op && BUS_DMASYNC_POSTREAD) && (map->len > PAGE_SIZE)) { + } + if ((op && BUS_DMASYNC_POSTREAD) && (map->len >= 2 * PAGE_SIZE)) { cpu_dcache_wbinv_all(); return; } ==== //depot/projects/smpng/sys/arm/arm/dump_machdep.c#2 (text+ko) ==== @@ -1,45 +1,383 @@ /*- - * Copyright (c) 2004 Olivier Houchard + * Copyright (c) 2002 Marcel Moolenaar * All rights reserved. * + * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: + * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. The names of the authors may not be used to endorse or promote - * products derived from this software without specific prior written - * permission. * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/arm/arm/dump_machdep.c,v 1.1 2004/05/14 11:46:42 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/dump_machdep.c,v 1.2 2005/10/03 14:05:03 cognet Exp $"); #include <sys/param.h> #include <sys/systm.h> #include <sys/conf.h> #include <sys/cons.h> #include <sys/kernel.h> +#include <sys/proc.h> #include <sys/kerneldump.h> #include <vm/vm.h> #include <vm/pmap.h> +#include <machine/elf.h> #include <machine/md_var.h> +#include <machine/pcb.h> +#include <machine/armreg.h> + +CTASSERT(sizeof(struct kerneldumpheader) == 512); + +/* + * Don't touch the first SIZEOF_METADATA bytes on the dump device. This + * is to protect us from metadata and to protect metadata from us. + */ +#define SIZEOF_METADATA (64*1024) + +#define MD_ALIGN(x) (((off_t)(x) + PAGE_MASK) & ~PAGE_MASK) +#define DEV_ALIGN(x) (((off_t)(x) + (DEV_BSIZE-1)) & ~(DEV_BSIZE-1)) +extern struct pcb dumppcb; + +struct md_pa { + vm_paddr_t md_start; + vm_paddr_t md_size; +}; + +typedef int callback_t(struct md_pa *, int, void *); + +static struct kerneldumpheader kdh; +static off_t dumplo, fileofs; + +/* Handle buffered writes. */ +static char buffer[DEV_BSIZE]; +static size_t fragsz; + +/* XXX: I suppose 20 should be enough. */ +static struct md_pa dump_map[20]; + +static void +md_pa_init(void) +{ + int n, idx; + + bzero(dump_map, sizeof(dump_map)); + for (n = 0; n < sizeof(dump_map) / sizeof(dump_map[0]); n++) { + idx = n * 2; + if (dump_avail[idx] == 0 && dump_avail[idx + 1] == 0) + break; + dump_map[n].md_start = dump_avail[idx]; + dump_map[n].md_size = dump_avail[idx + 1] - dump_avail[idx]; + } +} + +static struct md_pa * +md_pa_first(void) +{ + + return (&dump_map[0]); +} + +static struct md_pa * +md_pa_next(struct md_pa *mdp) +{ + + mdp++; + if (mdp->md_size == 0) + mdp = NULL; + return (mdp); +} + +/* XXX should be MI */ +static void +mkdumpheader(struct kerneldumpheader *kdh, uint32_t archver, uint64_t dumplen, + uint32_t blksz) +{ + + bzero(kdh, sizeof(*kdh)); + strncpy(kdh->magic, KERNELDUMPMAGIC, sizeof(kdh->magic)); + strncpy(kdh->architecture, MACHINE_ARCH, sizeof(kdh->architecture)); + kdh->version = htod32(KERNELDUMPVERSION); + kdh->architectureversion = htod32(archver); + kdh->dumplength = htod64(dumplen); + kdh->dumptime = htod64(time_second); + kdh->blocksize = htod32(blksz); + strncpy(kdh->hostname, hostname, sizeof(kdh->hostname)); + strncpy(kdh->versionstring, version, sizeof(kdh->versionstring)); + if (panicstr != NULL) + strncpy(kdh->panicstring, panicstr, sizeof(kdh->panicstring)); + kdh->parity = kerneldump_parity(kdh); +} + +static int +buf_write(struct dumperinfo *di, char *ptr, size_t sz) +{ + size_t len; + int error; + + while (sz) { + len = DEV_BSIZE - fragsz; + if (len > sz) + len = sz; + bcopy(ptr, buffer + fragsz, len); + fragsz += len; + ptr += len; + sz -= len; + if (fragsz == DEV_BSIZE) { + error = di->dumper(di->priv, buffer, 0, dumplo, + DEV_BSIZE); + if (error) + return error; + dumplo += DEV_BSIZE; + fragsz = 0; + } + } + + return (0); +} + +static int +buf_flush(struct dumperinfo *di) +{ + int error; + + if (fragsz == 0) + return (0); + + error = di->dumper(di->priv, buffer, 0, dumplo, DEV_BSIZE); + dumplo += DEV_BSIZE; + fragsz = 0; + return (error); +} + +extern vm_offset_t kernel_l1kva; +extern char *pouet2; + +static int +cb_dumpdata(struct md_pa *mdp, int seqnr, void *arg) +{ + struct dumperinfo *di = (struct dumperinfo*)arg; + vm_paddr_t pa; + vm_offset_t va; + uint32_t pgs; + size_t counter, sz, chunk; + int c, error, twiddle; + + error = 0; /* catch case in which chunk size is 0 */ + counter = 0; /* Update twiddle every 16MB */ + twiddle = 0; + va = 0; + pgs = mdp->md_size / PAGE_SIZE; + pa = mdp->md_start; + + printf(" chunk %d: %dMB (%d pages)", seqnr, pgs * PAGE_SIZE / ( + 1024*1024), pgs); + + /* Make sure we write coherent datas. */ + cpu_idcache_wbinv_all(); +#ifdef __XSCALE__ + xscale_cache_clean_minidata(); +#endif + while (pgs) { + chunk = pgs; + if (chunk > MAXDUMPPGS) + chunk = MAXDUMPPGS; + sz = chunk << PAGE_SHIFT; + counter += sz; + if (counter >> 24) { + printf(" %d", pgs * PAGE_SIZE); + counter &= (1<<24) - 1; + } + if (pa == (pa & L1_ADDR_BITS)) { + pmap_kenter_section(0, pa & L1_ADDR_BITS, 0); + cpu_tlb_flushID_SE(0); + cpu_cpwait(); + } + error = di->dumper(di->priv, + (void *)(pa - (pa & L1_ADDR_BITS)),0, dumplo, sz); + if (error) + break; + dumplo += sz; + pgs -= chunk; + pa += sz; + /* Check for user abort. */ + c = cncheckc(); + if (c == 0x03) + return (ECANCELED); + if (c != -1) + printf(" (CTRL-C to abort) "); + } + printf(" ... %s\n", (error) ? "fail" : "ok"); + return (error); +} + +static int +cb_dumphdr(struct md_pa *mdp, int seqnr, void *arg) +{ + struct dumperinfo *di = (struct dumperinfo*)arg; + Elf_Phdr phdr; + uint64_t size; + int error; + + size = mdp->md_size; + bzero(&phdr, sizeof(phdr)); + phdr.p_type = PT_LOAD; + phdr.p_flags = PF_R; /* XXX */ + phdr.p_offset = fileofs; + phdr.p_vaddr = mdp->md_start; + phdr.p_paddr = mdp->md_start; + phdr.p_filesz = size; + phdr.p_memsz = size; + phdr.p_align = PAGE_SIZE; + + error = buf_write(di, (char*)&phdr, sizeof(phdr)); + fileofs += phdr.p_filesz; + return (error); +} + +static int +cb_size(struct md_pa *mdp, int seqnr, void *arg) +{ + uint32_t *sz = (uint32_t*)arg; + + *sz += (uint32_t)mdp->md_size; + return (0); +} + +static int +foreach_chunk(callback_t cb, void *arg) +{ + struct md_pa *mdp; + int error, seqnr; + + seqnr = 0; + mdp = md_pa_first(); + while (mdp != NULL) { + error = (*cb)(mdp, seqnr++, arg); + if (error) + return (-error); + mdp = md_pa_next(mdp); + } + return (seqnr); +} + void dumpsys(struct dumperinfo *di) { + Elf_Ehdr ehdr; + uint32_t dumpsize; + off_t hdrgap; + size_t hdrsz; + int error; + + bzero(&ehdr, sizeof(ehdr)); + ehdr.e_ident[EI_MAG0] = ELFMAG0; + ehdr.e_ident[EI_MAG1] = ELFMAG1; + ehdr.e_ident[EI_MAG2] = ELFMAG2; + ehdr.e_ident[EI_MAG3] = ELFMAG3; + ehdr.e_ident[EI_CLASS] = ELF_CLASS; +#if BYTE_ORDER == LITTLE_ENDIAN + ehdr.e_ident[EI_DATA] = ELFDATA2LSB; +#else + ehdr.e_ident[EI_DATA] = ELFDATA2MSB; +#endif + ehdr.e_ident[EI_VERSION] = EV_CURRENT; + ehdr.e_ident[EI_OSABI] = ELFOSABI_STANDALONE; /* XXX big picture? */ + ehdr.e_type = ET_CORE; + ehdr.e_machine = EM_ARM; + ehdr.e_phoff = sizeof(ehdr); + ehdr.e_flags = 0; + ehdr.e_ehsize = sizeof(ehdr); + ehdr.e_phentsize = sizeof(Elf_Phdr); + ehdr.e_shentsize = sizeof(Elf_Shdr); + + md_pa_init(); + + /* Calculate dump size. */ + dumpsize = 0L; + ehdr.e_phnum = foreach_chunk(cb_size, &dumpsize); + hdrsz = ehdr.e_phoff + ehdr.e_phnum * ehdr.e_phentsize; + fileofs = MD_ALIGN(hdrsz); + dumpsize += fileofs; + hdrgap = fileofs - DEV_ALIGN(hdrsz); + + /* Determine dump offset on device. */ + if (di->mediasize < SIZEOF_METADATA + dumpsize + sizeof(kdh) * 2) { + error = ENOSPC; + goto fail; + } + dumplo = di->mediaoffset + di->mediasize - dumpsize; + dumplo -= sizeof(kdh) * 2; + + mkdumpheader(&kdh, KERNELDUMP_ARM_VERSION, dumpsize, di->blocksize); + + printf("Dumping %llu MB (%d chunks)\n", (long long)dumpsize >> 20, + ehdr.e_phnum); + + /* Dump leader */ + error = di->dumper(di->priv, &kdh, 0, dumplo, sizeof(kdh)); + if (error) + goto fail; + dumplo += sizeof(kdh); + + /* Dump ELF header */ + error = buf_write(di, (char*)&ehdr, sizeof(ehdr)); + if (error) + goto fail; + + /* Dump program headers */ + error = foreach_chunk(cb_dumphdr, di); + if (error < 0) + goto fail; + buf_flush(di); + + /* + * All headers are written using blocked I/O, so we know the + * current offset is (still) block aligned. Skip the alignement + * in the file to have the segment contents aligned at page + * boundary. We cannot use MD_ALIGN on dumplo, because we don't + * care and may very well be unaligned within the dump device. + */ + dumplo += hdrgap; + + /* Dump memory chunks (updates dumplo) */ + error = foreach_chunk(cb_dumpdata, di); + if (error < 0) + goto fail; + + /* Dump trailer */ + error = di->dumper(di->priv, &kdh, 0, dumplo, sizeof(kdh)); + if (error) + goto fail; + + /* Signal completion, signoff and exit stage left. */ + di->dumper(di->priv, NULL, 0, 0, 0); + printf("\nDump complete\n"); + return; + + fail: + if (error < 0) + error = -error; + + if (error == ECANCELED) + printf("\nDump aborted\n"); + else if (error == ENOSPC) + printf("\nDump failed. Partition too small.\n"); + else + printf("\n** DUMP FAILED (ERROR %d) **\n", error); } ==== //depot/projects/smpng/sys/arm/arm/in_cksum.c#5 (text+ko) ==== @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__FBSDID("$FreeBSD: src/sys/arm/arm/in_cksum.c,v 1.4 2005/05/24 21:44:34 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/in_cksum.c,v 1.5 2005/10/03 14:06:44 cognet Exp $"); #include <sys/param.h> #include <sys/mbuf.h> @@ -90,18 +90,6 @@ } u_short -in_pseudo(u_int32_t a, u_int32_t b, u_int32_t c) -{ - u_int64_t sum; - union q_util q_util; - union l_util l_util; - - sum = (u_int64_t) a + b + c; - REDUCE16; - return (sum); -} - -u_short in_cksum_skip(struct mbuf *m, int len, int skip) { u_int64_t sum = 0; ==== //depot/projects/smpng/sys/arm/arm/in_cksum_arm.S#6 (text+ko) ==== @@ -44,7 +44,7 @@ #include <machine/asm.h> #include "assym.s" -__FBSDID("$FreeBSD: src/sys/arm/arm/in_cksum_arm.S,v 1.5 2005/05/24 21:44:34 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/in_cksum_arm.S,v 1.6 2005/10/03 14:07:09 cognet Exp $"); /* * int in_cksum(struct mbuf *m, int len) @@ -93,10 +93,10 @@ ENTRY(do_cksum) - stmfd sp!, {r4-r11, lr} + stmfd sp!, {r4-r7, lr} bl L_cksumdata mov r0, r2 - ldmfd sp!, {r4-r11, pc} + ldmfd sp!, {r4-r7, pc} /* * The main in*_cksum() workhorse... * ==== //depot/projects/smpng/sys/arm/arm/intr.c#10 (text+ko) ==== @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/arm/arm/intr.c,v 1.9 2005/06/09 12:26:19 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/intr.c,v 1.10 2005/10/03 14:17:16 cognet Exp $"); #include <sys/param.h> #include <sys/systm.h> #include <sys/syslog.h> @@ -108,6 +108,7 @@ td->td_intr_nesting_level++; while ((i = arm_get_next_irq()) != -1) { + arm_mask_irq(i); intrcnt[intrcnt_tab[i]]++; ithd = ithreads[i]; if (!ithd) @@ -119,10 +120,9 @@ ih->ih_handler(ih->ih_argument ? ih->ih_argument : frame); } - } else if (ih) { - arm_mask_irq(i); + arm_unmask_irq(i); + } else if (ih) ithread_schedule(ithd); - } } td->td_intr_nesting_level--; } ==== //depot/projects/smpng/sys/arm/arm/locore.S#10 (text+ko) ==== @@ -37,7 +37,7 @@ #include <machine/asm.h> #include <machine/armreg.h> #include <machine/pte.h> -__FBSDID("$FreeBSD: src/sys/arm/arm/locore.S,v 1.10 2005/03/16 07:53:02 jmg Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/locore.S,v 1.11 2005/10/03 14:10:55 cognet Exp $"); /* What size should this really be ? It is only used by init_arm() */ #define INIT_ARM_STACK_SIZE 2048 @@ -60,6 +60,8 @@ .align 0 .globl kernbase .set kernbase,KERNBASE +.globl physaddr +.set physaddr,PHYSADDR ENTRY_NP(btext) @@ -157,7 +159,7 @@ mov r3, #0 .L1: - str r3, [r1], #0x0004 /* Zero the bss */ + str r3, [r1], #0x0004 /* get zero init data */ subs r2, r2, #4 bgt .L1 @@ -177,7 +179,8 @@ sub pc, pc, r4 #endif virt_done: - ldr fp, =KERNVIRTADDR /* trace back starts here */ + nop + mov fp, #0 /* trace back starts here */ bl _C_LABEL(initarm) /* Off we go */ /* init arm will return the new stack pointer. */ @@ -194,6 +197,10 @@ .word 4*((va)>>L1_S_SHIFT) ; \ .word (pa)|(attr) ; +Lvirtaddr: + .word KERNVIRTADDR +Lphysaddr: + .word KERNPHYSADDR Lstartup_pagetable: .word STARTUP_PAGETABLE_ADDR mmu_init_table: ==== //depot/projects/smpng/sys/arm/arm/machdep.c#13 (text+ko) ==== @@ -44,7 +44,7 @@ #include "opt_compat.h" #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/arm/arm/machdep.c,v 1.16 2005/04/04 21:53:52 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/machdep.c,v 1.17 2005/10/03 14:17:45 cognet Exp $"); #include <sys/param.h> #include <sys/proc.h> @@ -95,6 +95,11 @@ long realmem = 0; +int (*_arm_memcpy)(void *, void *, int, int) = NULL; +int (*_arm_bzero)(void *, int, int) = NULL; +int _min_memcpy_size = 0; +int _min_bzero_size = 0; + void sendsig(catcher, sig, mask, code) sig_t catcher; ==== //depot/projects/smpng/sys/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.1 2004/11/07 23:01:36 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/mem.c,v 1.2 2005/10/03 14:18:21 cognet Exp $"); /* * Memory special file @@ -64,6 +64,13 @@ #include <machine/memdev.h> +#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 */ @@ -116,11 +123,14 @@ for (; addr < eaddr; addr += PAGE_SIZE) if (pmap_extract(kernel_pmap, addr) == 0) return (EFAULT); - if (!kernacc((caddr_t)(int)uio->uio_offset, c, uio->uio_rw == UIO_READ ? VM_PROT_READ : VM_PROT_WRITE)) - return (EFAULT); +#ifdef ARM_USE_SMALL_ALLOC + if (addr < alloc_firstaddr || addr > >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200510031714.j93HE6nM002786>