Date: Tue, 22 Apr 2003 14:01:53 -0700 (PDT) From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 29439 for review Message-ID: <200304222101.h3ML1rtI085835@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=29439 Change 29439 by peter@peter_overcee on 2003/04/22 14:00:55 integrate i386_hammer Affected files ... .. //depot/projects/hammer/sys/x86_64/include/bus_dma.h#4 integrate .. //depot/projects/hammer/sys/x86_64/include/cpufunc.h#10 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/busdma_machdep.c#6 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/genassym.c#17 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/identcpu.c#8 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#65 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/sys_machdep.c#10 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/trap.c#24 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/tsc.c#3 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/vm_machdep.c#20 integrate Differences ... ==== //depot/projects/hammer/sys/x86_64/include/bus_dma.h#4 (text+ko) ==== @@ -67,7 +67,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* $FreeBSD: src/sys/i386/include/bus_dma.h,v 1.17 2003/01/29 07:25:26 scottl Exp $ */ +/* $FreeBSD: src/sys/i386/include/bus_dma.h,v 1.18 2003/04/10 23:03:33 mux Exp $ */ #ifndef _I386_BUS_DMA_H_ #define _I386_BUS_DMA_H_ @@ -89,16 +89,12 @@ struct uio; /* - * bus_dmasync_op_t - * - * Operations performed by bus_dmamap_sync(). + * Operations performed by bus_dmamap_sync(). */ -typedef enum { - BUS_DMASYNC_PREREAD, - BUS_DMASYNC_POSTREAD, - BUS_DMASYNC_PREWRITE, - BUS_DMASYNC_POSTWRITE -} bus_dmasync_op_t; +#define BUS_DMASYNC_PREREAD 1 +#define BUS_DMASYNC_POSTREAD 2 +#define BUS_DMASYNC_PREWRITE 4 +#define BUS_DMASYNC_POSTWRITE 8 /* * bus_dma_tag_t @@ -234,7 +230,7 @@ /* * Perform a syncronization operation on the given map. */ -void _bus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, bus_dmasync_op_t); +void _bus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, int); #define bus_dmamap_sync(dmat, dmamap, op) \ if ((dmamap) != NULL) \ _bus_dmamap_sync(dmat, dmamap, op) ==== //depot/projects/hammer/sys/x86_64/include/cpufunc.h#10 (text+ko) ==== @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/i386/include/cpufunc.h,v 1.130 2002/09/22 04:45:21 peter Exp $ + * $FreeBSD: src/sys/i386/include/cpufunc.h,v 1.133 2003/04/20 02:59:13 obrien Exp $ */ /* ==== //depot/projects/hammer/sys/x86_64/x86_64/busdma_machdep.c#6 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/i386/i386/busdma_machdep.c,v 1.39 2003/04/07 16:08:32 jake Exp $ + * $FreeBSD: src/sys/i386/i386/busdma_machdep.c,v 1.43 2003/04/15 03:11:03 mux Exp $ */ #include <sys/param.h> @@ -406,125 +406,6 @@ bus_dmamem_free_size(dmat, vaddr, map, dmat->maxsize); } -#define BUS_DMAMAP_NSEGS ((64 * 1024) / PAGE_SIZE + 1) - -/* - * Map the buffer buf into bus space using the dmamap map. - */ -int -bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, - bus_size_t buflen, bus_dmamap_callback_t *callback, - void *callback_arg, int flags) -{ - vm_offset_t vaddr; - vm_paddr_t paddr; -#ifdef __GNUC__ - bus_dma_segment_t dm_segments[dmat->nsegments]; -#else - bus_dma_segment_t dm_segments[BUS_DMAMAP_NSEGS]; -#endif - bus_dma_segment_t *sg; - int seg; - int error; - vm_paddr_t nextpaddr; - - if (map == NULL) - map = &nobounce_dmamap; - - error = 0; - /* - * If we are being called during a callback, pagesneeded will - * be non-zero, so we can avoid doing the work twice. - */ - if (dmat->lowaddr < ptoa((vm_paddr_t)Maxmem) && - map->pagesneeded == 0) { - vm_offset_t vendaddr; - - /* - * Count the number of bounce pages - * needed in order to complete this transfer - */ - vaddr = trunc_page((vm_offset_t)buf); - vendaddr = (vm_offset_t)buf + buflen; - - while (vaddr < vendaddr) { - paddr = pmap_kextract(vaddr); - if (run_filter(dmat, paddr) != 0) { - - map->pagesneeded++; - } - vaddr += PAGE_SIZE; - } - } - - /* Reserve Necessary Bounce Pages */ - if (map->pagesneeded != 0) { - mtx_lock(&bounce_lock); - if (reserve_bounce_pages(dmat, map, 1) != 0) { - - /* Queue us for resources */ - map->dmat = dmat; - map->buf = buf; - map->buflen = buflen; - map->callback = callback; - map->callback_arg = callback_arg; - - STAILQ_INSERT_TAIL(&bounce_map_waitinglist, map, links); - mtx_unlock(&bounce_lock); - return (EINPROGRESS); - } - mtx_unlock(&bounce_lock); - } - - vaddr = (vm_offset_t)buf; - sg = &dm_segments[0]; - seg = 1; - sg->ds_len = 0; - - nextpaddr = 0; - do { - bus_size_t size; - - paddr = pmap_kextract(vaddr); - size = PAGE_SIZE - (paddr & PAGE_MASK); - if (size > buflen) - size = buflen; - - if (map->pagesneeded != 0 && run_filter(dmat, paddr)) { - paddr = add_bounce_page(dmat, map, vaddr, size); - } - - if (sg->ds_len == 0) { - sg->ds_addr = paddr; - sg->ds_len = size; - } else if (paddr == nextpaddr) { - sg->ds_len += size; - } else { - /* Go to the next segment */ - sg++; - seg++; - if (seg > dmat->nsegments) - break; - sg->ds_addr = paddr; - sg->ds_len = size; - } - vaddr += size; - nextpaddr = paddr + size; - buflen -= size; - - } while (buflen > 0); - - if (buflen != 0) { - printf("bus_dmamap_load: Too many segs! buf_len = 0x%lx\n", - (u_long)buflen); - error = EFBIG; - } - - (*callback)(callback_arg, dm_segments, seg, error); - - return (0); -} - /* * Utility function to load a linear buffer. lastaddrp holds state * between invocations (for multiple-buffer loads). segp contains @@ -583,9 +464,22 @@ /* Reserve Necessary Bounce Pages */ if (map->pagesneeded != 0) { mtx_lock(&bounce_lock); - if (reserve_bounce_pages(dmat, map, 0) != 0) { - mtx_unlock(&bounce_lock); - return (ENOMEM); + if (flags & BUS_DMA_NOWAIT) { + if (reserve_bounce_pages(dmat, map, 0) != 0) { + mtx_unlock(&bounce_lock); + return (ENOMEM); + } + } else { + if (reserve_bounce_pages(dmat, map, 1) != 0) { + /* Queue us for resources */ + map->dmat = dmat; + map->buf = buf; + map->buflen = buflen; + STAILQ_INSERT_TAIL(&bounce_map_waitinglist, + map, links); + mtx_unlock(&bounce_lock); + return (EINPROGRESS); + } } mtx_unlock(&bounce_lock); } @@ -657,6 +551,45 @@ return (buflen != 0 ? EFBIG : 0); /* XXX better return value here? */ } +#define BUS_DMAMAP_NSEGS ((64 * 1024) / PAGE_SIZE + 1) + +/* + * Map the buffer buf into bus space using the dmamap map. + */ +int +bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, + bus_size_t buflen, bus_dmamap_callback_t *callback, + void *callback_arg, int flags) +{ +#ifdef __GNUC__ + bus_dma_segment_t dm_segments[dmat->nsegments]; +#else + bus_dma_segment_t dm_segments[BUS_DMAMAP_NSEGS]; +#endif + bus_addr_t lastaddr = 0; + int error, nsegs = 0; + + if (map != NULL) { + flags |= BUS_DMA_WAITOK; + map->callback = callback; + map->callback_arg = callback_arg; + } + + error = _bus_dmamap_load_buffer(dmat, map, dm_segments, buf, buflen, + NULL, flags, &lastaddr, &nsegs, 1); + + if (error == EINPROGRESS) + return (error); + + if (error) + (*callback)(callback_arg, dm_segments, 0, error); + else + (*callback)(callback_arg, dm_segments, nsegs + 1, 0); + + return (0); +} + + /* * Like _bus_dmamap_load(), but for mbufs. */ @@ -676,6 +609,7 @@ KASSERT(m0->m_flags & M_PKTHDR, ("bus_dmamap_load_mbuf: no packet header")); + flags |= BUS_DMA_NOWAIT; nsegs = 0; error = 0; if (m0->m_pkthdr.len <= dmat->maxsize) { @@ -727,6 +661,7 @@ struct iovec *iov; struct thread *td = NULL; + flags |= BUS_DMA_NOWAIT; resid = uio->uio_resid; iov = uio->uio_iov; @@ -784,39 +719,32 @@ } void -_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) +_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, int op) { struct bounce_page *bpage; if ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) { - /* * Handle data bouncing. We might also * want to add support for invalidating * the caches on broken hardware */ - switch (op) { - case BUS_DMASYNC_PREWRITE: + if (op & BUS_DMASYNC_PREWRITE) { while (bpage != NULL) { bcopy((void *)bpage->datavaddr, (void *)bpage->vaddr, bpage->datacount); bpage = STAILQ_NEXT(bpage, links); } - break; + } - case BUS_DMASYNC_POSTREAD: + if (op & BUS_DMASYNC_POSTREAD) { while (bpage != NULL) { bcopy((void *)bpage->vaddr, (void *)bpage->datavaddr, bpage->datacount); bpage = STAILQ_NEXT(bpage, links); } - break; - case BUS_DMASYNC_PREREAD: - case BUS_DMASYNC_POSTWRITE: - /* No-ops */ - break; } } } ==== //depot/projects/hammer/sys/x86_64/x86_64/genassym.c#17 (text+ko) ==== @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)genassym.c 5.11 (Berkeley) 5/10/91 - * $FreeBSD: src/sys/i386/i386/genassym.c,v 1.138 2003/02/23 22:12:07 jake Exp $ + * $FreeBSD: src/sys/i386/i386/genassym.c,v 1.140 2003/04/17 22:17:28 jhb Exp $ */ #include "opt_compat.h" @@ -75,13 +75,10 @@ ASSYM(VM_PMAP, offsetof(struct vmspace, vm_pmap)); ASSYM(PM_ACTIVE, offsetof(struct pmap, pm_active)); ASSYM(P_SFLAG, offsetof(struct proc, p_sflag)); -ASSYM(P_STATE, offsetof(struct proc, p_state)); ASSYM(P_UAREA, offsetof(struct proc, p_uarea)); ASSYM(TD_FLAGS, offsetof(struct thread, td_flags)); -ASSYM(TD_WCHAN, offsetof(struct thread, td_wchan)); ASSYM(TD_PCB, offsetof(struct thread, td_pcb)); -ASSYM(TD_KSE, offsetof(struct thread, td_kse)); ASSYM(TD_PROC, offsetof(struct thread, td_proc)); ASSYM(TD_INTR_NESTING_LEVEL, offsetof(struct thread, td_intr_nesting_level)); ASSYM(TD_CRITNEST, offsetof(struct thread, td_critnest)); ==== //depot/projects/hammer/sys/x86_64/x86_64/identcpu.c#8 (text+ko) ==== @@ -38,7 +38,7 @@ * SUCH DAMAGE. * * from: Id: machdep.c,v 1.193 1996/06/18 01:22:04 bde Exp - * $FreeBSD: src/sys/i386/i386/identcpu.c,v 1.120 2003/04/04 17:29:54 des Exp $ + * $FreeBSD: src/sys/i386/i386/identcpu.c,v 1.121 2003/04/10 07:05:24 wes Exp $ */ #include "opt_cpu.h" @@ -80,6 +80,10 @@ SYSCTL_STRING(_hw, HW_MODEL, model, CTLFLAG_RD, cpu_model, 0, "Machine model"); +static int hw_clockrate; +SYSCTL_INT(_hw, OID_AUTO, clockrate, CTLFLAG_RD, + &hw_clockrate, 0, "CPU instruction clock rate"); + static char cpu_brand[48]; static struct cpu_nameclass x86_64_cpus[] = { @@ -148,6 +152,7 @@ printf("%s (", cpu_model); switch(cpu_class) { case CPUCLASS_K8: + hw_clockrate = (tsc_freq + 5000) / 1000000; printf("%jd.%02d-MHz ", (intmax_t)(tsc_freq + 4999) / 1000000, (u_int)((tsc_freq + 4999) / 10000) % 100); ==== //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#65 (text+ko) ==== @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91 - * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.561 2003/04/02 23:53:28 peter Exp $ + * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.562 2003/04/18 20:09:03 jhb Exp $ */ #include "opt_atalk.h" @@ -1420,7 +1420,9 @@ tp = td->td_frame; + PROC_LOCK(curthread->td_proc); mcp->mc_onstack = sigonstack(tp->tf_rsp); + PROC_UNLOCK(curthread->td_proc); mcp->mc_gs = td->td_pcb->pcb_gs; mcp->mc_rdi = tp->tf_rdi; mcp->mc_rsi = tp->tf_rsi; ==== //depot/projects/hammer/sys/x86_64/x86_64/sys_machdep.c#10 (text+ko) ==== @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * from: @(#)sys_machdep.c 5.5 (Berkeley) 1/19/91 - * $FreeBSD: src/sys/i386/i386/sys_machdep.c,v 1.79 2003/03/06 04:47:47 rwatson Exp $ + * $FreeBSD: src/sys/i386/i386/sys_machdep.c,v 1.80 2003/04/11 14:45:07 davidxu Exp $ * */ ==== //depot/projects/hammer/sys/x86_64/x86_64/trap.c#24 (text+ko) ==== @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)trap.c 7.4 (Berkeley) 5/13/91 - * $FreeBSD: src/sys/i386/i386/trap.c,v 1.245 2003/03/31 22:41:32 jeff Exp $ + * $FreeBSD: src/sys/i386/i386/trap.c,v 1.249 2003/04/22 08:12:03 davidxu Exp $ */ /* @@ -198,7 +198,8 @@ * and we shouldn't enable interrupts while holding a * spin lock. */ - if (type != T_PAGEFLT && PCPU_GET(spinlocks) == NULL) + if (type != T_PAGEFLT && PCPU_GET(spinlocks) == NULL && + frame.tf_eip != (int)cpu_switch_load_gs) enable_intr(); } } @@ -232,18 +233,6 @@ if (td->td_ucred != p->p_ucred) cred_update_thread(td); - /* - * First check that we shouldn't just abort. - * But check if we are the single thread first! - * XXX p_singlethread not locked, but should be safe. - */ - if ((p->p_flag & P_WEXIT) && (p->p_singlethread != td)) { - PROC_LOCK(p); - mtx_lock_spin(&sched_lock); - thread_exit(); - /* NOTREACHED */ - } - switch (type) { case T_PRIVINFLT: /* privileged instruction fault */ ucode = type; @@ -364,9 +353,6 @@ case T_PROTFLT: /* general protection fault */ case T_SEGNPFLT: /* segment not present fault */ - if (td->td_intr_nesting_level != 0) - break; - /* * Invalid %fs's and %gs's can be created using * procfs or PT_SETREGS or by invalidating the @@ -378,12 +364,20 @@ */ if (frame.tf_rip == (long)cpu_switch_load_gs) { PCPU_GET(curpcb)->pcb_gs = 0; + printf( + "Process %d has bad %%gs, reset to zero\n", + p->p_pid); +#if 0 PROC_LOCK(p); psignal(p, SIGBUS); PROC_UNLOCK(p); +#endif goto out; } + if (td->td_intr_nesting_level != 0) + break; + /* * Invalid segment selectors and out of bounds * %eip's and %esp's can be set up in user mode. ==== //depot/projects/hammer/sys/x86_64/x86_64/tsc.c#3 (text+ko) ==== @@ -23,18 +23,19 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/i386/i386/tsc.c,v 1.198 2003/04/04 23:54:46 tegge Exp $ + * $FreeBSD: src/sys/i386/i386/tsc.c,v 1.199 2003/04/10 23:07:24 des Exp $ */ #include "opt_clock.h" #include <sys/param.h> #include <sys/systm.h> +#include <sys/sysctl.h> #include <sys/time.h> #include <sys/timetc.h> #include <sys/kernel.h> -#include <sys/sysctl.h> #include <sys/power.h> +#include <sys/smp.h> #include <machine/clock.h> #include <machine/md_var.h> #include <machine/specialreg.h> @@ -43,6 +44,13 @@ int tsc_is_broken; u_int tsc_present = 1; +#ifdef SMP +static int smp_tsc; +SYSCTL_INT(_kern_timecounter, OID_AUTO, smp_tsc, CTLFLAG_RD, &smp_tsc, 0, + "Indicates whether the TSC is safe to use in SMP mode"); +TUNABLE_INT("kern.timecounter.smp_tsc", &smp_tsc); +#endif + static unsigned tsc_get_timecount(struct timecounter *tc); static struct timecounter tsc_timecounter = { ==== //depot/projects/hammer/sys/x86_64/x86_64/vm_machdep.c#20 (text+ko) ==== @@ -38,7 +38,7 @@ * * from: @(#)vm_machdep.c 7.3 (Berkeley) 5/13/91 * Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$ - * $FreeBSD: src/sys/i386/i386/vm_machdep.c,v 1.204 2003/03/30 05:24:52 jake Exp $ + * $FreeBSD: src/sys/i386/i386/vm_machdep.c,v 1.206 2003/04/21 15:05:05 davidxu Exp $ */ #include "opt_isa.h" @@ -184,6 +184,7 @@ { struct mdproc *mdp; + /* Reset pc->pcb_gs and %gs before possibly invalidating it. */ mdp = &td->td_proc->p_md; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200304222101.h3ML1rtI085835>