Date: Sat, 11 Aug 2007 11:05:01 GMT From: Rafal Jaworowski <raj@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 125046 for review Message-ID: <200708111105.l7BB51ck003098@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=125046 Change 125046 by raj@raj_booke_intgr on 2007/08/11 11:04:06 Fix e500 kernel build - adapt to gcc 4 requirements (initialize vars, add protos etc.) - adapt to API changes in 7.0 - add pmap_remove_write(), pmap_enter_object - rework pmap_enter(), pmap_enter_locked() - rework sendsig(), syscall() - eliminate unused code Affected files ... .. //depot/projects/e500/sys/dev/quicc/quicc_core.c#2 edit .. //depot/projects/e500/sys/dev/scc/scc_bfe_quicc.c#2 edit .. //depot/projects/e500/sys/dev/tsec/if_tsec.c#2 edit .. //depot/projects/e500/sys/dev/tsec/if_tsecreg.h#2 edit .. //depot/projects/e500/sys/dev/usb/usb_subr.c#2 edit .. //depot/projects/e500/sys/kern/kern_sig.c#5 edit .. //depot/projects/e500/sys/kern/tty.c#3 edit .. //depot/projects/e500/sys/net/bpf.c#2 edit .. //depot/projects/e500/sys/netinet/in.c#3 edit .. //depot/projects/e500/sys/powerpc/booke/clock.c#2 edit .. //depot/projects/e500/sys/powerpc/booke/copyinout.c#2 edit .. //depot/projects/e500/sys/powerpc/booke/interrupt.c#2 edit .. //depot/projects/e500/sys/powerpc/booke/locore.S#2 edit .. //depot/projects/e500/sys/powerpc/booke/machdep.c#2 edit .. //depot/projects/e500/sys/powerpc/booke/pmap.c#2 edit .. //depot/projects/e500/sys/powerpc/booke/trap.c#2 edit .. //depot/projects/e500/sys/powerpc/booke/trap_subr.S#2 edit .. //depot/projects/e500/sys/powerpc/booke/uio_machdep.c#2 edit .. //depot/projects/e500/sys/powerpc/booke/vm_machdep.c#2 edit .. //depot/projects/e500/sys/powerpc/mpc85xx/ocpbus.c#2 edit .. //depot/projects/e500/sys/powerpc/mpc85xx/pci_ocp.c#2 edit .. //depot/projects/e500/sys/rpc/rpcclnt.c#2 edit .. //depot/projects/e500/sys/vm/vm_fault.c#5 edit .. //depot/projects/e500/sys/vm/vm_mmap.c#4 edit .. //depot/projects/e500/sys/vm/vm_page.c#5 edit Differences ... ==== //depot/projects/e500/sys/dev/quicc/quicc_core.c#2 (text+ko) ==== @@ -124,11 +124,11 @@ if (sc->sc_ires != NULL) { error = bus_setup_intr(dev, sc->sc_ires, - INTR_TYPE_TTY | INTR_FAST, quicc_bfe_intr, sc, + INTR_TYPE_TTY | INTR_FAST, NULL, quicc_bfe_intr, sc, &sc->sc_icookie); if (error) { error = bus_setup_intr(dev, sc->sc_ires, - INTR_TYPE_TTY | INTR_MPSAFE, quicc_bfe_intr, sc, + INTR_TYPE_TTY | INTR_MPSAFE, NULL, quicc_bfe_intr, sc, &sc->sc_icookie); } else sc->sc_fastintr = 1; @@ -348,7 +348,7 @@ sc->sc_fastintr = 0; bus_teardown_intr(dev, sc->sc_ires, sc->sc_icookie); bus_setup_intr(dev, sc->sc_ires, INTR_TYPE_TTY | INTR_MPSAFE, - quicc_bfe_intr, sc, &sc->sc_icookie); + NULL, quicc_bfe_intr, sc, &sc->sc_icookie); } qd = device_get_ivars(child); ==== //depot/projects/e500/sys/dev/scc/scc_bfe_quicc.c#2 (text+ko) ==== @@ -66,7 +66,7 @@ sc->sc_class = &scc_quicc_class; if (BUS_READ_IVAR(parent, dev, QUICC_IVAR_BRGCLK, &rclk)) rclk = 0; - return (scc_bfe_probe(dev, 0, rclk)); + return (scc_bfe_probe(dev, 0, rclk, 0)); } static device_method_t scc_quicc_methods[] = { ==== //depot/projects/e500/sys/dev/tsec/if_tsec.c#2 (text+ko) ==== @@ -1119,7 +1119,7 @@ return (ENXIO); } error = bus_setup_intr(dev, *ires, INTR_TYPE_NET | INTR_MPSAFE, - handler, sc, ihand); + NULL, handler, sc, ihand); if (error) { device_printf(dev, "failed to set up %s IRQ\n", iname); if (bus_release_resource(dev, SYS_RES_IRQ, *irid, *ires)) ==== //depot/projects/e500/sys/dev/tsec/if_tsecreg.h#2 (text+ko) ==== @@ -349,7 +349,3 @@ #define TSEC_RXBUFFER_ALIGNMENT 64 #define TSEC_DEFAULT_MAX_RX_BUFFER_SIZE 0x0600 #define TSEC_DEFAULT_MIN_RX_BUFFER_SIZE 0x0040 - -#if (TSEC_DEFAULT_RX_BUFFER_SIZE > MCLBYTES) -#error TSEC_DEFAULT_RX_BUFFER_SIZE > MCLBYTES ! -#endif ==== //depot/projects/e500/sys/dev/usb/usb_subr.c#2 (text+ko) ==== @@ -849,6 +849,7 @@ uaa.vendor = UGETW(dd->idVendor); uaa.product = UGETW(dd->idProduct); uaa.release = UGETW(dd->bcdDevice); + uaa.matchlvl = 0; /* First try with device specific drivers. */ DPRINTF(("usbd_probe_and_attach: trying device specific drivers\n")); ==== //depot/projects/e500/sys/kern/kern_sig.c#5 (text+ko) ==== @@ -1174,6 +1174,8 @@ p = td->td_proc; error = 0; sig = 0; + ets.tv_sec = 0; + ets.tv_nsec = 0; SIG_CANTMASK(waitset); PROC_LOCK(p); ==== //depot/projects/e500/sys/kern/tty.c#3 (text+ko) ==== @@ -1720,7 +1720,7 @@ int s, first, error = 0; int has_stime = 0, last_cc = 0; long slp = 0; /* XXX this should be renamed `timo'. */ - struct timeval stime; + struct timeval stime = { 0, 0 }; struct pgrp *pg; td = curthread; ==== //depot/projects/e500/sys/net/bpf.c#2 (text+ko) ==== @@ -614,6 +614,8 @@ return (0); bzero(&dst, sizeof(dst)); + m = NULL; + hlen = 0; error = bpf_movein(uio, (int)d->bd_bif->bif_dlt, ifp->if_mtu, &m, &dst, &hlen, d->bd_wfilter); if (error) ==== //depot/projects/e500/sys/netinet/in.c#3 (text+ko) ==== @@ -622,6 +622,7 @@ int cmp; bzero(&mask, sizeof(mask)); + bzero(&match, sizeof(match)); if (iflr->flags & IFLR_PREFIX) { /* lookup a prefix rather than address. */ in_len2mask(&mask, iflr->prefixlen); @@ -822,9 +823,10 @@ struct in_addr prefix, mask, p, m; int error; - if ((flags & RTF_HOST) != 0) + if ((flags & RTF_HOST) != 0) { prefix = target->ia_dstaddr.sin_addr; - else { + mask.s_addr = 0; + } else { prefix = target->ia_addr.sin_addr; mask = target->ia_sockmask.sin_addr; prefix.s_addr &= mask.s_addr; ==== //depot/projects/e500/sys/powerpc/booke/clock.c#2 (text+ko) ==== @@ -63,6 +63,7 @@ #include <sys/kernel.h> #include <sys/sysctl.h> #include <sys/bus.h> +#include <sys/clock.h> #include <sys/timetc.h> #include <sys/interrupt.h> @@ -81,17 +82,6 @@ static u_long ticks_per_sec = 12500000; static long ticks_per_intr; -static int sysctl_machdep_adjkerntz(SYSCTL_HANDLER_ARGS); - -int wall_cmos_clock; /* wall CMOS clock assumed if != 0 */ -SYSCTL_INT(_machdep, CPU_WALLCLOCK, wall_cmos_clock, - CTLFLAG_RW, &wall_cmos_clock, 0, ""); - -int adjkerntz; /* local offset from GMT in seconds */ -SYSCTL_PROC(_machdep, CPU_ADJKERNTZ, adjkerntz, CTLTYPE_INT|CTLFLAG_RW, - &adjkerntz, 0, sysctl_machdep_adjkerntz, "I", ""); - -#define SECDAY 86400 #define DIFF19041970 2082844800 static int clockinitted = 0; @@ -105,17 +95,6 @@ "decrementer" /* name */ }; -static int -sysctl_machdep_adjkerntz(SYSCTL_HANDLER_ARGS) -{ - int error; - - error = sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req); - if (!error && req->newptr) - resettodr(); - return (error); -} - void inittodr(time_t base) { @@ -160,7 +139,7 @@ } void -decr_intr(struct clockframe *frame) +decr_intr(struct trapframe *frame) { u_long msr; @@ -182,7 +161,7 @@ msr = mfmsr(); mtmsr(msr | PSL_EE); - hardclock(frame); + hardclock(TRAPF_USERMODE(frame), TRAPF_PC(frame)); } void ==== //depot/projects/e500/sys/powerpc/booke/copyinout.c#2 (text+ko) ==== @@ -269,14 +269,20 @@ return ((int32_t)fuword(addr)); } -intptr_t -casuptr(intptr_t *addr, intptr_t old, intptr_t new) +uint32_t +casuword32(volatile uint32_t *base, uint32_t oldval, uint32_t newval) +{ + return (casuword((volatile u_long *)base, oldval, newval)); +} + +u_long +casuword(volatile u_long *addr, u_long old, u_long new) { struct thread *td; faultbuf env; - intptr_t val; + u_long val; - if (!is_uaddr(addr)) + if (!((vm_offset_t)addr <= VM_MAXUSER_ADDRESS)) return (EFAULT); td = PCPU_GET(curthread); @@ -287,7 +293,7 @@ } val = *addr; - (void) atomic_cmpset_32(addr, old, new); + (void) atomic_cmpset_32((volatile uint32_t *)addr, old, new); td->td_pcb->pcb_onfault = NULL; ==== //depot/projects/e500/sys/powerpc/booke/interrupt.c#2 (text+ko) ==== @@ -58,7 +58,7 @@ #include <machine/trap.h> #include <machine/interruptvar.h> -extern void decr_intr(struct clockframe *); +extern void decr_intr(struct trapframe *); extern void trap(struct trapframe *); void powerpc_decr_interrupt(struct trapframe *); @@ -120,14 +120,11 @@ void powerpc_decr_interrupt(struct trapframe *framep) { - struct clockframe ckframe; struct thread *td; td = PCPU_GET(curthread); atomic_add_int(&td->td_intr_nesting_level, 1); - ckframe.srr0 = framep->srr0; - ckframe.srr1 = framep->srr1; - decr_intr(&ckframe); + decr_intr(framep); atomic_subtract_int(&td->td_intr_nesting_level, 1); } @@ -156,7 +153,7 @@ #ifdef INTR_DEBUG -/* temporary handler for development purposes - DELETEME LATER */ +/* XXX temporary handler for development purposes - DELETEME LATER */ void unserviced_intr(struct trapframe *framep) { ==== //depot/projects/e500/sys/powerpc/booke/locore.S#2 (text+ko) ==== @@ -491,4 +491,4 @@ .space INTRCNT_COUNT * 4 * 2 GLOBAL(eintrcnt) -#include <powerpc/e500/trap_subr.S> +#include <powerpc/booke/trap_subr.S> ==== //depot/projects/e500/sys/powerpc/booke/machdep.c#2 (text+ko) ==== @@ -181,6 +181,13 @@ void dump_bootinfo(void); void dump_kenv(void); void e500_init(u_int32_t, u_int32_t, void *); +void setPQL2(int *const size, int *const ways); + +void +setPQL2(int *const size, int *const ways) +{ + return; +} static void cpu_e500_startup(void *dummy) @@ -353,7 +360,7 @@ init_param1(); /* Start initializing proc0 and thread0. */ - proc_linkup(&proc0, &ksegrp0, &thread0); + proc_linkup(&proc0, &thread0); thread0.td_frame = &frame0; /* Set up per-cpu data and store the pointer in SPR general 0. */ @@ -574,6 +581,7 @@ return (0); } +#if 0 /* Build siginfo_t for SA thread. */ void cpu_thread_siginfo(int sig, u_long code, siginfo_t *si) @@ -590,6 +598,7 @@ si->si_code = code; /* XXXKSE fill other fields */ } +#endif int sigreturn(struct thread *td, struct sigreturn_args *uap) @@ -762,7 +771,7 @@ } void -sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code) +sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) { struct trapframe *tf; struct sigframe *sfp; @@ -771,10 +780,13 @@ struct thread *td; struct proc *p; int oonstack, rndfsize; + int sig, code; td = curthread; p = td->td_proc; PROC_LOCK_ASSERT(p, MA_OWNED); + sig = ksi->ksi_signo; + code = ksi->ksi_code; psp = p->p_sigacts; mtx_assert(&psp->ps_mtx, MA_OWNED); tf = td->td_frame; @@ -842,12 +854,15 @@ /* * Fill siginfo structure. */ + sf.sf_si = ksi->ksi_info; sf.sf_si.si_signo = sig; - sf.sf_si.si_code = code; - sf.sf_si.si_addr = (void *)tf->srr0; + sf.sf_si.si_addr = (void *) ((tf->exc == EXC_DSI) ? + tf->dear : tf->srr0); } else { /* Old FreeBSD-style arguments. */ tf->fixreg[FIRSTARG+1] = code; + tf->fixreg[FIRSTARG+3] = (tf->exc == EXC_DSI) ? + tf->dear : tf->srr0; } mtx_unlock(&psp->ps_mtx); PROC_UNLOCK(p); @@ -909,3 +924,12 @@ len--; } } + +/* + * XXX what is the better/proper place for this routine? + */ +int +mem_valid(vm_offset_t addr, int len) +{ + return (1); +} ==== //depot/projects/e500/sys/powerpc/booke/pmap.c#2 (text+ko) ==== @@ -130,6 +130,8 @@ /* PMAP */ /**************************************************************************/ +static void pmap_enter_locked(pmap_t, vm_offset_t, vm_page_t, vm_prot_t, boolean_t); + /* Kernel pmap */ struct pmap kernel_pmap_store; @@ -1041,17 +1043,12 @@ * Extract the physical page address associated with the given * kernel virtual address. */ -__inline vm_paddr_t +vm_paddr_t pmap_kextract(vm_offset_t va) { return pte_vatopa(kernel_pmap, va); } -void -pmap_init2(void) -{ -} - /* * Initialize the pmap module. * Called by vm_init, to initialize any structures that the pmap @@ -1289,7 +1286,19 @@ * will be wired down. */ void -pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, boolean_t wired) +pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, + boolean_t wired) +{ + vm_page_lock_queues(); + PMAP_LOCK(pmap); + pmap_enter_locked(pmap, va, m, prot, wired); + vm_page_unlock_queues(); + PMAP_UNLOCK(pmap); +} + +static void +pmap_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, + boolean_t wired) { pte_t *pte; vm_paddr_t pa; @@ -1300,21 +1309,20 @@ su = (pmap == kernel_pmap); sync = 0; - //debugf("pmap_enter: s (pmap=0x%08x su=%d tid=%d m=0x%08x va=0x%08x " + //debugf("pmap_enter_locked: s (pmap=0x%08x su=%d tid=%d m=0x%08x va=0x%08x " // "pa=0x%08x prot=0x%08x wired=%d)\n", // (u_int32_t)pmap, su, pmap->pm_tid, // (u_int32_t)m, va, pa, prot, wired); if (su) { KASSERT(((va >= virtual_avail) && (va <= VM_MAX_KERNEL_ADDRESS)), - ("pmap_enter: kernel pmap, non kernel va")); + ("pmap_enter_locked: kernel pmap, non kernel va")); } else { KASSERT((va <= VM_MAXUSER_ADDRESS), - ("pmap_enter: user pmap, non user va")); + ("pmap_enter_locked: user pmap, non user va")); } - vm_page_lock_queues(); - PMAP_LOCK(pmap); + PMAP_LOCK_ASSERT(pmap, MA_OWNED); /* * If there is an existing mapping, and the physical address has not @@ -1323,7 +1331,7 @@ if (((pte = pte_find(pmap, va)) != NULL) && (PTE_ISVALID(pte)) && (PTE_PA(pte) == pa)) { - //debugf("pmap_enter: update\n"); + //debugf("pmap_enter_locked: update\n"); /* Wiring change, just update stats. */ if (wired) { @@ -1375,9 +1383,9 @@ * physical address, pte_enter() will delete the old mapping. */ //if ((pte != NULL) && PTE_ISVALID(pte)) - // debugf("pmap_enter: replace\n"); + // debugf("pmap_enter_locked: replace\n"); //else - // debugf("pmap_enter: new\n"); + // debugf("pmap_enter_locked: new\n"); /* Now set up the flags and install the new mapping. */ flags = (PTE_SR | PTE_VALID); @@ -1415,12 +1423,9 @@ sync = 0; } - PMAP_UNLOCK(pmap); - if (sync) { /* Create a temporary mapping. */ pmap = PCPU_GET(curpmap); - PMAP_LOCK(pmap); va = 0; pte = pte_find(pmap, va); @@ -1430,20 +1435,48 @@ pte_enter(pmap, m, va, flags); __syncicache((void *)va, PAGE_SIZE); pte_remove(pmap, va, PTBL_UNHOLD); - PMAP_UNLOCK(pmap); } - vm_page_unlock_queues(); + //debugf("pmap_enter_locked: e\n"); +} + +/* + * Maps a sequence of resident pages belonging to the same object. + * The sequence begins with the given page m_start. This page is + * mapped at the given virtual address start. Each subsequent page is + * mapped at a virtual address that is offset from start by the same + * amount as the page is offset from m_start within the object. The + * last page in the sequence is the page with the largest offset from + * m_start that can be mapped at a virtual address less than the given + * virtual address end. Not every virtual page between start and end + * is mapped; only those for which a resident page exists with the + * corresponding offset from m_start are mapped. + */ +void +pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, vm_page_t m_start, + vm_prot_t prot) +{ + vm_page_t m; + vm_pindex_t diff, psize; - //debugf("pmap_enter: e\n"); + psize = atop(end - start); + m = m_start; + PMAP_LOCK(pmap); + while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) { + pmap_enter_locked(pmap, start + ptoa(diff), m, prot & + (VM_PROT_READ | VM_PROT_EXECUTE), FALSE); + m = TAILQ_NEXT(m, listq); + } + PMAP_UNLOCK(pmap); } -vm_page_t -pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, - vm_page_t mpte) +void +pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) { //debugf("pmap_enter_quick: s\n"); +#if 0 + /* XXX this is the old way - test if the new approach is really ok..? */ vm_page_busy(m); vm_page_unlock_queues(); VM_OBJECT_UNLOCK(m->object); @@ -1451,9 +1484,14 @@ VM_OBJECT_LOCK(m->object); vm_page_lock_queues(); vm_page_wakeup(m); +#endif + PMAP_LOCK(pmap); + pmap_enter_locked(pmap, va, m, prot & (VM_PROT_READ | VM_PROT_EXECUTE), + FALSE); + PMAP_UNLOCK(pmap); + //debugf("pmap_enter_quick e\n"); - return (NULL); } /* @@ -1668,6 +1706,7 @@ vm_page_unlock_queues(); } +#if 0 /* * Lower the permission for all mappings to a given page. */ @@ -1715,7 +1754,45 @@ } vm_page_flag_clear(m, PG_WRITEABLE); } +#endif + +void +pmap_remove_write(vm_page_t m) +{ + pv_entry_t pv; + pte_t *pte; + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0 || + (m->flags & PG_WRITEABLE) == 0) + return; + + TAILQ_FOREACH(pv, &m->md.pv_list, pv_link) { + PMAP_LOCK(pv->pv_pmap); + if ((pte = pte_find(pv->pv_pmap, pv->pv_va)) != NULL) { + if (PTE_ISVALID(pte)) { + m = PHYS_TO_VM_PAGE(PTE_PA(pte)); + + /* Handle modified pages. */ + if (PTE_ISMODIFIED(pte)) { + if (pmap_track_modified(pv->pv_pmap, pv->pv_va)) + vm_page_dirty(m); + } + + /* Referenced pages. */ + if (PTE_ISREFERENCED(pte)) + vm_page_flag_set(m, PG_REFERENCED); + + /* Flush mapping from TLB0. */ + pte->flags &= ~(PTE_UW | PTE_SW | PTE_MODIFIED | PTE_REFERENCED); + tlb0_flush_entry(pv->pv_pmap, pv->pv_va); + } + } + PMAP_UNLOCK(pv->pv_pmap); + } + vm_page_flag_clear(m, PG_WRITEABLE); +} + boolean_t pmap_page_executable(vm_page_t m) { @@ -1851,7 +1928,7 @@ * an entire address space. Only works for the current pmap. */ void -pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) +pmap_remove_pages(pmap_t pmap) { } @@ -2883,7 +2960,7 @@ return (EINVAL); /* - * The BAT entry must be cache-inhibited, guarded, and r/w + * The entry must be cache-inhibited, guarded, and r/w * so it can function as an i/o page */ prot = tlb1[i].mas2 & (MAS2_I | MAS2_G); ==== //depot/projects/e500/sys/powerpc/booke/trap.c#2 (text+ko) ==== @@ -43,6 +43,7 @@ #include <sys/lock.h> #include <sys/mutex.h> #include <sys/pioctl.h> +#include <sys/ptrace.h> #include <sys/reboot.h> #include <sys/syscall.h> #include <sys/sysent.h> @@ -54,6 +55,8 @@ #endif #include <sys/vmmeter.h> +#include <security/audit/audit.h> + #include <vm/vm.h> #include <vm/pmap.h> #include <vm/vm_extern.h> @@ -136,9 +139,9 @@ struct thread *td; struct proc *p; int sig, type, user; - u_int sticks; + ksiginfo_t ksi; - PCPU_LAZY_INC(cnt.v_trap); + PCPU_INC(cnt.v_trap); td = PCPU_GET(curthread); p = td->td_proc; @@ -146,13 +149,11 @@ type = frame->exc; sig = 0; user = (frame->srr1 & PSL_PR) ? 1 : 0; - sticks = 0; CTR3(KTR_TRAP, "trap: %s type=%s (%s)", p->p_comm, trapname(type), user ? "user" : "kernel"); if (user) { - sticks = td->td_sticks; td->td_frame = frame; if (td->td_ucred != p->p_ucred) cred_update_thread(td); @@ -221,10 +222,15 @@ if (sig != 0) { if (p->p_sysent->sv_transtrap != NULL) sig = (p->p_sysent->sv_transtrap)(sig, type); - trapsignal(td, sig, type); + ksiginfo_init_trap(&ksi); + ksi.ksi_signo = sig; + ksi.ksi_code = type; /* XXX, not POSIX */ + /* ksi.ksi_addr = ? */ + ksi.ksi_trapno = type; + trapsignal(td, &ksi); } - userret(td, frame, sticks); + userret(td, frame); mtx_assert(&Giant, MA_NOTOWNED); } @@ -316,10 +322,12 @@ td = PCPU_GET(curthread); p = td->td_proc; - PCPU_LAZY_INC(cnt.v_syscall); + PCPU_INC(cnt.v_syscall); +#if KSE if (p->p_flag & P_SA) thread_user_enter(td); +#endif code = frame->fixreg[0]; params = (caddr_t)(frame->fixreg + FIRSTARG); @@ -358,7 +366,7 @@ else callp = &p->p_sysent->sv_table[code]; - narg = callp->sy_narg & SYF_ARGMASK; + narg = callp->sy_narg; if (narg > n) { bcopy(params, args, n * sizeof(register_t)); @@ -378,11 +386,8 @@ if (KTRPOINT(td, KTR_SYSCALL)) ktrsyscall(code, narg, (register_t *)params); #endif - /* - * Try to run the syscall without Giant if the syscall is MP safe. - */ - if ((callp->sy_narg & SYF_MPSAFE) == 0) - mtx_lock(&Giant); + + td->td_syscalls++; if (error == 0) { td->td_retval[0] = 0; @@ -390,7 +395,11 @@ STOPEVENT(p, S_SCE, narg); + PTRACESTOP_SC(p, td, S_PT_SCE); + + AUDIT_SYSCALL_ENTER(code, td); error = (*callp->sy_call)(td, params); + AUDIT_SYSCALL_EXIT(error, td); CTR3(KTR_SYSC, "syscall: p=%s %s ret=%x", p->p_comm, syscallnames[code], td->td_retval[0]); @@ -398,8 +407,7 @@ switch (error) { case 0: - if ((frame->fixreg[0] == SYS___syscall) && - (code != SYS_lseek)) { + if (frame->fixreg[0] == SYS___syscall && SYS_lseek) { /* * 64-bit return, 32-bit syscall. Fixup byte order */ @@ -434,9 +442,18 @@ break; } - - if ((callp->sy_narg & SYF_MPSAFE) == 0) - mtx_unlock(&Giant); + /* + * Check for misbehavior. + */ + WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning", + (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"); + KASSERT(td->td_critnest == 0, + ("System call %s returning in a critical section", + (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???")); + KASSERT(td->td_locks == 0, + ("System call %s returning with %d locks held", + (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???", + td->td_locks)); #ifdef KTRACE if (KTRPOINT(td, KTR_SYSRET)) @@ -448,10 +465,7 @@ */ STOPEVENT(p, S_SCX, code); - WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning", - (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"); - mtx_assert(&sched_lock, MA_NOTOWNED); - mtx_assert(&Giant, MA_NOTOWNED); + PTRACESTOP_SC(p, td, S_PT_SCX); } static int ==== //depot/projects/e500/sys/powerpc/booke/trap_subr.S#2 (text+ko) ==== @@ -783,6 +783,8 @@ addi %r3, %r1, 8 bl CNAME(ast) + .globl CNAME(asttrapexit) /* db_backtrace code sentinel #2 */ +CNAME(asttrapexit): b trapexit /* test ast ret value ? */ 1: FRAME_LEAVE(SPR_SRR0, SPR_SRR1) ==== //depot/projects/e500/sys/powerpc/booke/uio_machdep.c#2 (text+ko) ==== @@ -52,6 +52,7 @@ #include <machine/cpu.h> #include <machine/vmparam.h> +#include <machine/md_var.h> /* * Implement uiomove(9) from physical memory using sf_bufs to ==== //depot/projects/e500/sys/powerpc/booke/vm_machdep.c#2 (text+ko) ==== @@ -247,7 +247,7 @@ void cpu_throw(struct thread *old, struct thread *new) { - cpu_switch(old, new); + cpu_switch(old, new, NULL); panic("cpu_throw() didn't"); } ==== //depot/projects/e500/sys/powerpc/mpc85xx/ocpbus.c#2 (text+ko) ==== @@ -48,6 +48,8 @@ #include "pic_if.h" +extern struct bus_space bs_be_tag; + struct ocpbus_softc { struct rman sc_mem; device_t sc_pic; @@ -345,7 +347,7 @@ { const struct ocp_resource *res; struct ocp_devinfo *dinfo; - u_long start, count; + u_long start = 0, count = 0; int error; dinfo = device_get_ivars(child); @@ -531,7 +533,7 @@ struct ocpbus_softc *sc; sc = device_get_softc(dev); - return (openpic_setup_intr(sc->sc_pic, child, res, flags, intr, arg, + return (openpic_setup_intr(sc->sc_pic, child, res, flags, NULL, intr, arg, cookiep)); } ==== //depot/projects/e500/sys/powerpc/mpc85xx/pci_ocp.c#2 (text+ko) ==== @@ -144,6 +144,8 @@ sizeof(struct pci_ocp_softc), }; +devclass_t pcib_devclass; + DRIVER_MODULE(pcib, ocpbus, pci_ocp_driver, pcib_devclass, 0, 0); static uint32_t ==== //depot/projects/e500/sys/rpc/rpcclnt.c#2 (text+ko) ==== @@ -1182,6 +1182,19 @@ cred); /* + * This can happen if the auth_type is neither UNIX or NULL + */ + if (m == NULL) { +#ifdef __OpenBSD__ + pool_put(&rpctask_pool, task); +#else + FREE(task, M_RPC); +#endif + error = EPROTONOSUPPORT; + goto rpcmout; + } + + /* * For stream protocols, insert a Sun RPC Record Mark. */ if (rpc->rc_sotype == SOCK_STREAM) { @@ -1867,6 +1880,7 @@ *tl++ = txdr_unsigned(procid); if ((error = rpcauth_buildheader(rc->rc_auth, cred, &mb, &bpos))) { + m_freem(mreq); RPCDEBUG("rpcauth_buildheader failed %d", error); return NULL; } ==== //depot/projects/e500/sys/vm/vm_fault.c#5 (text+ko) ==== @@ -464,7 +464,7 @@ */ if (TRYPAGER) { int rv; - int reqpage; + int reqpage = 0; int ahead, behind; u_char behavior = vm_map_entry_behavior(fs.entry); ==== //depot/projects/e500/sys/vm/vm_mmap.c#4 (text+ko) ==== @@ -1291,7 +1291,7 @@ vm_ooffset_t foff) { boolean_t fitit; - vm_object_t object; + vm_object_t object = NULL; int rv = KERN_SUCCESS; int docow, error; struct thread *td = curthread; ==== //depot/projects/e500/sys/vm/vm_page.c#5 (text+ko) ==== @@ -1506,7 +1506,7 @@ * * Inputs are required to range within a page. */ -inline int +int vm_page_bits(int base, int size) { int first_bit;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200708111105.l7BB51ck003098>