Date: Sun, 6 Jun 2010 21:19:05 +0000 (UTC) From: Marcel Moolenaar <marcel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r208880 - in projects/altix/sys: amd64/acpica amd64/amd64 amd64/ia32 amd64/include arm/arm boot/fdt/dts boot/i386/boot0 boot/i386/btx/btx boot/i386/btx/btxldr boot/i386/cdboot boot/i386... Message-ID: <201006062119.o56LJ596057466@svn.freebsd.org>
index | next in thread | raw e-mail
Author: marcel Date: Sun Jun 6 21:19:04 2010 New Revision: 208880 URL: http://svn.freebsd.org/changeset/base/208880 Log: Merge svn+ssh://svn.freebsd.org/base/head@208879 Added: projects/altix/sys/boot/fdt/dts/ - copied from r208879, head/sys/boot/fdt/dts/ projects/altix/sys/dev/fdt/ - copied from r208879, head/sys/dev/fdt/ projects/altix/sys/dev/ofw/ofw_fdt.c - copied unchanged from r208879, head/sys/dev/ofw/ofw_fdt.c projects/altix/sys/dev/uart/uart_bus_fdt.c - copied unchanged from r208879, head/sys/dev/uart/uart_bus_fdt.c projects/altix/sys/libkern/memchr.c - copied unchanged from r208879, head/sys/libkern/memchr.c projects/altix/sys/powerpc/powermac/smusat.c - copied unchanged from r208879, head/sys/powerpc/powermac/smusat.c projects/altix/sys/tools/fdt/ - copied from r208879, head/sys/tools/fdt/ Modified: projects/altix/sys/amd64/acpica/acpi_wakeup.c projects/altix/sys/amd64/amd64/cpu_switch.S projects/altix/sys/amd64/amd64/fpu.c projects/altix/sys/amd64/amd64/machdep.c projects/altix/sys/amd64/amd64/mca.c projects/altix/sys/amd64/amd64/mp_machdep.c projects/altix/sys/amd64/amd64/pmap.c projects/altix/sys/amd64/amd64/trap.c projects/altix/sys/amd64/amd64/vm_machdep.c projects/altix/sys/amd64/ia32/ia32_reg.c projects/altix/sys/amd64/include/fpu.h projects/altix/sys/amd64/include/pcb.h projects/altix/sys/arm/arm/pmap.c projects/altix/sys/boot/i386/boot0/Makefile projects/altix/sys/boot/i386/btx/btx/Makefile projects/altix/sys/boot/i386/btx/btxldr/Makefile projects/altix/sys/boot/i386/cdboot/Makefile projects/altix/sys/boot/i386/mbr/Makefile projects/altix/sys/boot/i386/pmbr/Makefile projects/altix/sys/boot/pc98/boot0.5/Makefile projects/altix/sys/boot/pc98/boot0/Makefile projects/altix/sys/boot/pc98/btx/btx/Makefile projects/altix/sys/boot/pc98/btx/btxldr/Makefile projects/altix/sys/boot/pc98/cdboot/Makefile projects/altix/sys/boot/sparc64/boot1/Makefile projects/altix/sys/boot/zfs/zfs.c projects/altix/sys/boot/zfs/zfsimpl.c projects/altix/sys/cam/ata/ata_pmp.c projects/altix/sys/cam/ata/ata_xpt.c projects/altix/sys/cam/cam_ccb.h projects/altix/sys/cam/cam_periph.c projects/altix/sys/cam/cam_xpt.c projects/altix/sys/cam/scsi/scsi_cd.c projects/altix/sys/cam/scsi/scsi_xpt.c projects/altix/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c projects/altix/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c projects/altix/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c projects/altix/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c projects/altix/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c projects/altix/sys/conf/files.powerpc projects/altix/sys/conf/options projects/altix/sys/contrib/libfdt/libfdt_env.h projects/altix/sys/crypto/via/padlock.c projects/altix/sys/crypto/via/padlock.h projects/altix/sys/crypto/via/padlock_cipher.c projects/altix/sys/crypto/via/padlock_hash.c projects/altix/sys/dev/acpica/acpi_ec.c projects/altix/sys/dev/ahci/ahci.c projects/altix/sys/dev/amdsbwd/amdsbwd.c projects/altix/sys/dev/ata/ata-all.h projects/altix/sys/dev/ata/ata-lowlevel.c projects/altix/sys/dev/ata/atapi-cam.c projects/altix/sys/dev/ata/chipsets/ata-acerlabs.c projects/altix/sys/dev/ata/chipsets/ata-intel.c projects/altix/sys/dev/ata/chipsets/ata-serverworks.c projects/altix/sys/dev/ath/ath_hal/ah.h projects/altix/sys/dev/ath/ath_hal/ah_eeprom_v1.c projects/altix/sys/dev/ath/ath_hal/ah_eeprom_v4k.c projects/altix/sys/dev/ath/ath_hal/ah_eeprom_v4k.h projects/altix/sys/dev/ath/ath_hal/ar5210/ar5210_reset.c projects/altix/sys/dev/ath/ath_hal/ar5211/ar5211_reset.c projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416phy.h projects/altix/sys/dev/ath/ath_hal/ar5416/ar5416reg.h projects/altix/sys/dev/ath/ath_hal/ar5416/ar9285_attach.c projects/altix/sys/dev/ath/ath_hal/ar5416/ar9285_reset.c projects/altix/sys/dev/bge/if_bge.c projects/altix/sys/dev/bge/if_bgereg.h projects/altix/sys/dev/cas/if_cas.c projects/altix/sys/dev/fdc/fdc_acpi.c projects/altix/sys/dev/hwpmc/hwpmc_mod.c projects/altix/sys/dev/iicbus/iic.h projects/altix/sys/dev/isp/isp.c projects/altix/sys/dev/isp/isp_freebsd.c projects/altix/sys/dev/isp/isp_library.c projects/altix/sys/dev/isp/isp_pci.c projects/altix/sys/dev/ixgbe/ixgbe.c projects/altix/sys/dev/ixgbe/ixgbe.h projects/altix/sys/dev/mvs/mvs.c projects/altix/sys/dev/ofw/ofw_bus_subr.c projects/altix/sys/dev/ofw/ofw_bus_subr.h projects/altix/sys/dev/ofw/ofw_if.m projects/altix/sys/dev/ofw/ofw_standard.c projects/altix/sys/dev/ofw/openfirm.c projects/altix/sys/dev/ofw/openfirm.h projects/altix/sys/dev/random/nehemiah.c projects/altix/sys/dev/sge/if_sge.c projects/altix/sys/dev/siis/siis.c projects/altix/sys/fs/devfs/devfs_vnops.c projects/altix/sys/fs/udf/udf_vnops.c projects/altix/sys/geom/label/g_label.c projects/altix/sys/geom/mountver/g_mountver.c projects/altix/sys/geom/part/g_part_bsd.c projects/altix/sys/geom/part/g_part_gpt.c projects/altix/sys/i386/i386/machdep.c projects/altix/sys/i386/i386/mca.c projects/altix/sys/i386/i386/pmap.c projects/altix/sys/i386/i386/ptrace_machdep.c projects/altix/sys/i386/i386/swtch.s projects/altix/sys/i386/i386/trap.c projects/altix/sys/i386/i386/vm_machdep.c projects/altix/sys/i386/include/npx.h projects/altix/sys/i386/include/pcb.h projects/altix/sys/i386/include/pcpu.h projects/altix/sys/i386/isa/npx.c projects/altix/sys/i386/linux/linux_ptrace.c projects/altix/sys/i386/xen/pmap.c projects/altix/sys/ia64/ia64/pmap.c projects/altix/sys/isa/syscons_isa.c projects/altix/sys/kern/kern_jail.c projects/altix/sys/kern/kern_proc.c projects/altix/sys/kern/posix4_mib.c projects/altix/sys/kern/sched_4bsd.c projects/altix/sys/kern/sched_ule.c projects/altix/sys/kern/subr_acl_nfs4.c projects/altix/sys/kern/subr_acl_posix1e.c projects/altix/sys/kern/subr_taskqueue.c projects/altix/sys/kern/subr_trap.c projects/altix/sys/kern/uipc_sem.c projects/altix/sys/kern/uipc_shm.c projects/altix/sys/kern/uipc_socket.c projects/altix/sys/kern/vfs_acl.c projects/altix/sys/kern/vfs_bio.c projects/altix/sys/kern/vfs_subr.c projects/altix/sys/mips/mips/pmap.c projects/altix/sys/mips/mips/tick.c projects/altix/sys/mips/mips/uio_machdep.c projects/altix/sys/modules/Makefile projects/altix/sys/modules/iwnfw/Makefile.inc projects/altix/sys/modules/zfs/Makefile projects/altix/sys/net/vnet.h projects/altix/sys/net80211/ieee80211_hwmp.c projects/altix/sys/net80211/ieee80211_ioctl.c projects/altix/sys/net80211/ieee80211_scan_sta.c projects/altix/sys/netgraph/ng_pppoe.c projects/altix/sys/netinet/ip_mroute.c projects/altix/sys/netinet/ip_mroute.h projects/altix/sys/netinet/pim_var.h projects/altix/sys/netinet/sctp_auth.c projects/altix/sys/netinet/sctp_bsd_addr.c projects/altix/sys/netinet/sctp_constants.h projects/altix/sys/netinet/sctp_indata.c projects/altix/sys/netinet/sctp_input.c projects/altix/sys/netinet/sctp_lock_bsd.h projects/altix/sys/netinet/sctp_output.c projects/altix/sys/netinet/sctp_pcb.c projects/altix/sys/netinet/sctp_pcb.h projects/altix/sys/netinet/sctp_sysctl.c projects/altix/sys/netinet/sctp_usrreq.c projects/altix/sys/netinet/sctputil.c projects/altix/sys/nfsclient/nfs_vfsops.c projects/altix/sys/nfsclient/nfs_vnops.c projects/altix/sys/opencrypto/crypto.c projects/altix/sys/pc98/cbus/syscons_cbus.c projects/altix/sys/pc98/pc98/machdep.c projects/altix/sys/powerpc/aim/mmu_oea.c projects/altix/sys/powerpc/aim/mmu_oea64.c projects/altix/sys/powerpc/booke/pmap.c projects/altix/sys/powerpc/ofw/ofw_real.c projects/altix/sys/powerpc/powermac/kiic.c projects/altix/sys/powerpc/powermac/macgpio.c projects/altix/sys/powerpc/powermac/smu.c projects/altix/sys/powerpc/powermac/uninorth.c projects/altix/sys/powerpc/powerpc/intr_machdep.c projects/altix/sys/sparc64/sparc64/pmap.c projects/altix/sys/sun4v/sun4v/pmap.c projects/altix/sys/sys/_task.h projects/altix/sys/sys/libkern.h projects/altix/sys/sys/pmc.h projects/altix/sys/sys/posix4.h projects/altix/sys/sys/sysent.h projects/altix/sys/sys/taskqueue.h projects/altix/sys/sys/user.h projects/altix/sys/sys/vtoc.h projects/altix/sys/ufs/ufs/ufs_quota.c projects/altix/sys/vm/vm_contig.c projects/altix/sys/vm/vm_map.c projects/altix/sys/vm/vm_mmap.c projects/altix/sys/vm/vm_page.c projects/altix/sys/vm/vm_page.h projects/altix/sys/vm/vm_pageout.h projects/altix/sys/vm/vnode_pager.c Directory Properties: projects/altix/lib/libstand/ (props changed) projects/altix/sys/ (props changed) projects/altix/sys/amd64/include/xen/ (props changed) projects/altix/sys/cddl/contrib/opensolaris/ (props changed) projects/altix/sys/contrib/dev/acpica/ (props changed) projects/altix/sys/contrib/x86emu/ (props changed) projects/altix/sys/dev/xen/xenpci/ (props changed) Modified: projects/altix/sys/amd64/acpica/acpi_wakeup.c ============================================================================== --- projects/altix/sys/amd64/acpica/acpi_wakeup.c Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/amd64/acpica/acpi_wakeup.c Sun Jun 6 21:19:04 2010 (r208880) @@ -245,7 +245,7 @@ acpi_sleep_machdep(struct acpi_softc *sc cr3 = rcr3(); load_cr3(KPML4phys); - stopfpu = &stopxpcbs[0]->xpcb_pcb.pcb_save; + stopfpu = stopxpcbs[0]->xpcb_pcb.pcb_save; if (acpi_savecpu(stopxpcbs[0])) { fpugetregs(curthread, stopfpu); Modified: projects/altix/sys/amd64/amd64/cpu_switch.S ============================================================================== --- projects/altix/sys/amd64/amd64/cpu_switch.S Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/amd64/amd64/cpu_switch.S Sun Jun 6 21:19:04 2010 (r208880) @@ -116,7 +116,7 @@ done_store_dr: /* have we used fp, and need a save? */ cmpq %rdi,PCPU(FPCURTHREAD) jne 1f - addq $PCB_SAVEFPU,%r8 + movq PCB_SAVEFPU(%r8),%r8 clts fxsave (%r8) smsw %ax @@ -341,7 +341,7 @@ ENTRY(savectx) je 1f movq TD_PCB(%rax),%rdi - leaq PCB_SAVEFPU(%rdi),%rdi + movq PCB_SAVEFPU(%rdi),%rdi clts fxsave (%rdi) smsw %ax @@ -349,7 +349,7 @@ ENTRY(savectx) lmsw %ax movq $PCB_SAVEFPU_SIZE,%rdx /* arg 3 */ - leaq PCB_SAVEFPU(%rcx),%rsi /* arg 2 */ + movq PCB_SAVEFPU(%rcx),%rsi /* arg 2 */ /* arg 1 (%rdi) already loaded */ call bcopy 1: Modified: projects/altix/sys/amd64/amd64/fpu.c ============================================================================== --- projects/altix/sys/amd64/amd64/fpu.c Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/amd64/amd64/fpu.c Sun Jun 6 21:19:04 2010 (r208880) @@ -91,8 +91,8 @@ void stop_emulating(void); #endif /* __GNUCLIKE_ASM && !lint */ -#define GET_FPU_CW(thread) ((thread)->td_pcb->pcb_save.sv_env.en_cw) -#define GET_FPU_SW(thread) ((thread)->td_pcb->pcb_save.sv_env.en_sw) +#define GET_FPU_CW(thread) ((thread)->td_pcb->pcb_save->sv_env.en_cw) +#define GET_FPU_SW(thread) ((thread)->td_pcb->pcb_save->sv_env.en_sw) typedef u_char bool_t; @@ -146,7 +146,7 @@ fpuexit(struct thread *td) savecrit = intr_disable(); if (curthread == PCPU_GET(fpcurthread)) { stop_emulating(); - fxsave(&PCPU_GET(curpcb)->pcb_save); + fxsave(PCPU_GET(curpcb)->pcb_save); start_emulating(); PCPU_SET(fpcurthread, 0); } @@ -424,8 +424,10 @@ fpudna(void) if (pcb->pcb_initial_fpucw != __INITIAL_FPUCW__) fldcw(&pcb->pcb_initial_fpucw); pcb->pcb_flags |= PCB_FPUINITDONE; + if (PCB_USER_FPU(pcb)) + pcb->pcb_flags |= PCB_USERFPUINITDONE; } else - fxrstor(&pcb->pcb_save); + fxrstor(pcb->pcb_save); intr_restore(s); } @@ -449,13 +451,39 @@ fpudrop() * It returns the FPU ownership status. */ int +fpugetuserregs(struct thread *td, struct savefpu *addr) +{ + struct pcb *pcb; + register_t s; + + pcb = td->td_pcb; + if ((pcb->pcb_flags & PCB_USERFPUINITDONE) == 0) { + bcopy(&fpu_initialstate, addr, sizeof(fpu_initialstate)); + addr->sv_env.en_cw = pcb->pcb_initial_fpucw; + return (_MC_FPOWNED_NONE); + } + s = intr_disable(); + if (td == PCPU_GET(fpcurthread) && PCB_USER_FPU(pcb)) { + fxsave(addr); + intr_restore(s); + return (_MC_FPOWNED_FPU); + } else { + intr_restore(s); + bcopy(&pcb->pcb_user_save, addr, sizeof(*addr)); + return (_MC_FPOWNED_PCB); + } +} + +int fpugetregs(struct thread *td, struct savefpu *addr) { + struct pcb *pcb; register_t s; - if ((td->td_pcb->pcb_flags & PCB_FPUINITDONE) == 0) { + pcb = td->td_pcb; + if ((pcb->pcb_flags & PCB_FPUINITDONE) == 0) { bcopy(&fpu_initialstate, addr, sizeof(fpu_initialstate)); - addr->sv_env.en_cw = td->td_pcb->pcb_initial_fpucw; + addr->sv_env.en_cw = pcb->pcb_initial_fpucw; return (_MC_FPOWNED_NONE); } s = intr_disable(); @@ -465,7 +493,7 @@ fpugetregs(struct thread *td, struct sav return (_MC_FPOWNED_FPU); } else { intr_restore(s); - bcopy(&td->td_pcb->pcb_save, addr, sizeof(*addr)); + bcopy(pcb->pcb_save, addr, sizeof(*addr)); return (_MC_FPOWNED_PCB); } } @@ -474,19 +502,44 @@ fpugetregs(struct thread *td, struct sav * Set the state of the FPU. */ void +fpusetuserregs(struct thread *td, struct savefpu *addr) +{ + struct pcb *pcb; + register_t s; + + pcb = td->td_pcb; + s = intr_disable(); + if (td == PCPU_GET(fpcurthread) && PCB_USER_FPU(pcb)) { + fxrstor(addr); + intr_restore(s); + pcb->pcb_flags |= PCB_FPUINITDONE | PCB_USERFPUINITDONE; + } else { + intr_restore(s); + bcopy(addr, &td->td_pcb->pcb_user_save, sizeof(*addr)); + if (PCB_USER_FPU(pcb)) + pcb->pcb_flags |= PCB_FPUINITDONE; + pcb->pcb_flags |= PCB_USERFPUINITDONE; + } +} + +void fpusetregs(struct thread *td, struct savefpu *addr) { + struct pcb *pcb; register_t s; + pcb = td->td_pcb; s = intr_disable(); if (td == PCPU_GET(fpcurthread)) { fxrstor(addr); intr_restore(s); } else { intr_restore(s); - bcopy(addr, &td->td_pcb->pcb_save, sizeof(*addr)); + bcopy(addr, td->td_pcb->pcb_save, sizeof(*addr)); } - curthread->td_pcb->pcb_flags |= PCB_FPUINITDONE; + if (PCB_USER_FPU(pcb)) + pcb->pcb_flags |= PCB_USERFPUINITDONE; + pcb->pcb_flags |= PCB_FPUINITDONE; } /* @@ -575,3 +628,74 @@ static devclass_t fpupnp_devclass; DRIVER_MODULE(fpupnp, acpi, fpupnp_driver, fpupnp_devclass, 0, 0); #endif /* DEV_ISA */ + +int +fpu_kern_enter(struct thread *td, struct fpu_kern_ctx *ctx, u_int flags) +{ + struct pcb *pcb; + + pcb = td->td_pcb; + KASSERT(!PCB_USER_FPU(pcb) || pcb->pcb_save == &pcb->pcb_user_save, + ("mangled pcb_save")); + ctx->flags = 0; + if ((pcb->pcb_flags & PCB_FPUINITDONE) != 0) + ctx->flags |= FPU_KERN_CTX_FPUINITDONE; + fpuexit(td); + ctx->prev = pcb->pcb_save; + pcb->pcb_save = &ctx->hwstate; + pcb->pcb_flags |= PCB_KERNFPU; + pcb->pcb_flags &= ~PCB_FPUINITDONE; + return (0); +} + +int +fpu_kern_leave(struct thread *td, struct fpu_kern_ctx *ctx) +{ + struct pcb *pcb; + register_t savecrit; + + pcb = td->td_pcb; + savecrit = intr_disable(); + if (curthread == PCPU_GET(fpcurthread)) + fpudrop(); + intr_restore(savecrit); + pcb->pcb_save = ctx->prev; + if (pcb->pcb_save == &pcb->pcb_user_save) { + if ((pcb->pcb_flags & PCB_USERFPUINITDONE) != 0) + pcb->pcb_flags |= PCB_FPUINITDONE; + else + pcb->pcb_flags &= ~PCB_FPUINITDONE; + pcb->pcb_flags &= ~PCB_KERNFPU; + } else { + if ((ctx->flags & FPU_KERN_CTX_FPUINITDONE) != 0) + pcb->pcb_flags |= PCB_FPUINITDONE; + else + pcb->pcb_flags &= ~PCB_FPUINITDONE; + KASSERT(!PCB_USER_FPU(pcb), ("unpaired fpu_kern_leave")); + } + return (0); +} + +int +fpu_kern_thread(u_int flags) +{ + struct pcb *pcb; + + pcb = PCPU_GET(curpcb); + KASSERT((curthread->td_pflags & TDP_KTHREAD) != 0, + ("Only kthread may use fpu_kern_thread")); + KASSERT(pcb->pcb_save == &pcb->pcb_user_save, ("mangled pcb_save")); + KASSERT(PCB_USER_FPU(pcb), ("recursive call")); + + pcb->pcb_flags |= PCB_KERNFPU; + return (0); +} + +int +is_fpu_kern_thread(u_int flags) +{ + + if ((curthread->td_pflags & TDP_KTHREAD) == 0) + return (0); + return ((PCPU_GET(curpcb)->pcb_flags & PCB_KERNFPU) != 0); +} Modified: projects/altix/sys/amd64/amd64/machdep.c ============================================================================== --- projects/altix/sys/amd64/amd64/machdep.c Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/amd64/amd64/machdep.c Sun Jun 6 21:19:04 2010 (r208880) @@ -285,7 +285,6 @@ cpu_startup(dummy) vm_pager_bufferinit(); cpu_setregs(); - mca_init(); } /* @@ -1961,7 +1960,7 @@ int fill_fpregs(struct thread *td, struct fpreg *fpregs) { - fill_fpregs_xmm(&td->td_pcb->pcb_save, fpregs); + fill_fpregs_xmm(&td->td_pcb->pcb_user_save, fpregs); return (0); } @@ -1970,7 +1969,7 @@ int set_fpregs(struct thread *td, struct fpreg *fpregs) { - set_fpregs_xmm(fpregs, &td->td_pcb->pcb_save); + set_fpregs_xmm(fpregs, &td->td_pcb->pcb_user_save); return (0); } @@ -2085,7 +2084,8 @@ static void get_fpcontext(struct thread *td, mcontext_t *mcp) { - mcp->mc_ownedfp = fpugetregs(td, (struct savefpu *)&mcp->mc_fpstate); + mcp->mc_ownedfp = fpugetuserregs(td, + (struct savefpu *)&mcp->mc_fpstate); mcp->mc_fpformat = fpuformat(); } @@ -2110,7 +2110,7 @@ set_fpcontext(struct thread *td, const m */ fpstate = (struct savefpu *)&mcp->mc_fpstate; fpstate->sv_env.en_mxcsr &= cpu_mxcsr_mask; - fpusetregs(td, fpstate); + fpusetuserregs(td, fpstate); } else return (EINVAL); return (0); @@ -2121,6 +2121,7 @@ fpstate_drop(struct thread *td) { register_t s; + KASSERT(PCB_USER_FPU(td->td_pcb), ("fpstate_drop: kernel-owned fpu")); s = intr_disable(); if (PCPU_GET(fpcurthread) == td) fpudrop(); @@ -2134,7 +2135,8 @@ fpstate_drop(struct thread *td) * sendsig() is the only caller of fpugetregs()... perhaps we just * have too many layers. */ - curthread->td_pcb->pcb_flags &= ~PCB_FPUINITDONE; + curthread->td_pcb->pcb_flags &= ~(PCB_FPUINITDONE | + PCB_USERFPUINITDONE); intr_restore(s); } Modified: projects/altix/sys/amd64/amd64/mca.c ============================================================================== --- projects/altix/sys/amd64/amd64/mca.c Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/amd64/amd64/mca.c Sun Jun 6 21:19:04 2010 (r208880) @@ -789,6 +789,19 @@ mca_init(void) load_cr4(rcr4() | CR4_MCE); } +/* + * The machine check registers for the BSP cannot be initialized until + * the local APIC is initialized. This happens at SI_SUB_CPU, + * SI_ORDER_SECOND. + */ +static void +mca_init_bsp(void *arg __unused) +{ + + mca_init(); +} +SYSINIT(mca_init_bsp, SI_SUB_CPU, SI_ORDER_ANY, mca_init_bsp, NULL); + /* Called when a machine check exception fires. */ int mca_intr(void) Modified: projects/altix/sys/amd64/amd64/mp_machdep.c ============================================================================== --- projects/altix/sys/amd64/amd64/mp_machdep.c Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/amd64/amd64/mp_machdep.c Sun Jun 6 21:19:04 2010 (r208880) @@ -1247,7 +1247,7 @@ cpususpend_handler(void) rf = intr_disable(); cr3 = rcr3(); - stopfpu = &stopxpcbs[cpu]->xpcb_pcb.pcb_save; + stopfpu = stopxpcbs[cpu]->xpcb_pcb.pcb_save; if (savectx2(stopxpcbs[cpu])) { fpugetregs(curthread, stopfpu); wbinvd(); Modified: projects/altix/sys/amd64/amd64/pmap.c ============================================================================== --- projects/altix/sys/amd64/amd64/pmap.c Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/amd64/amd64/pmap.c Sun Jun 6 21:19:04 2010 (r208880) @@ -2041,7 +2041,6 @@ SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_coll static void pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) { - struct md_page *pvh; pd_entry_t *pde; pmap_t pmap; pt_entry_t *pte, tpte; @@ -2077,15 +2076,13 @@ pmap_collect(pmap_t locked_pmap, struct pmap_invalidate_page(pmap, va); pmap_free_zero_pages(free); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); - if (TAILQ_EMPTY(&m->md.pv_list)) { - pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); - if (TAILQ_EMPTY(&pvh->pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); - } free_pv_entry(pmap, pv); if (pmap != locked_pmap) PMAP_UNLOCK(pmap); } + if (TAILQ_EMPTY(&m->md.pv_list) && + TAILQ_EMPTY(&pa_to_pvh(VM_PAGE_TO_PHYS(m))->pv_list)) + vm_page_flag_clear(m, PG_WRITEABLE); } } @@ -2796,6 +2793,7 @@ pmap_remove_all(vm_page_t m) KASSERT((m->flags & PG_FICTITIOUS) == 0, ("pmap_remove_all: page %p is fictitious", m)); + free = NULL; vm_page_lock_queues(); pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) { @@ -2825,16 +2823,15 @@ pmap_remove_all(vm_page_t m) */ if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); - free = NULL; pmap_unuse_pt(pmap, pv->pv_va, *pde, &free); pmap_invalidate_page(pmap, pv->pv_va); - pmap_free_zero_pages(free); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); free_pv_entry(pmap, pv); PMAP_UNLOCK(pmap); } vm_page_flag_clear(m, PG_WRITEABLE); vm_page_unlock_queues(); + pmap_free_zero_pages(free); } /* @@ -3128,11 +3125,11 @@ void pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, vm_prot_t prot, boolean_t wired) { - vm_paddr_t pa; pd_entry_t *pde; pt_entry_t *pte; - vm_paddr_t opa; - pt_entry_t origpte, newpte; + pt_entry_t newpte, origpte; + pv_entry_t pv; + vm_paddr_t opa, pa; vm_page_t mpte, om; boolean_t invlva; @@ -3190,16 +3187,15 @@ pmap_enter(pmap_t pmap, vm_offset_t va, if (mpte) mpte->wire_count--; - /* - * We might be turning off write access to the page, - * so we go ahead and sense modify status. - */ if (origpte & PG_MANAGED) { om = m; pa |= PG_MANAGED; } goto validate; } + + pv = NULL; + /* * Mapping has changed, invalidate old range and fall through to * handle validating new mapping. @@ -3209,7 +3205,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, pmap->pm_stats.wired_count--; if (origpte & PG_MANAGED) { om = PHYS_TO_VM_PAGE(opa); - pmap_remove_entry(pmap, om, va); + pv = pmap_pvh_remove(&om->md, pmap, va); } if (mpte != NULL) { mpte->wire_count--; @@ -3226,9 +3222,13 @@ pmap_enter(pmap_t pmap, vm_offset_t va, if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) { KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva, ("pmap_enter: managed mapping within the clean submap")); - pmap_insert_entry(pmap, va, m); + if (pv == NULL) + pv = get_pv_entry(pmap, FALSE); + pv->pv_va = va; + TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); pa |= PG_MANAGED; - } + } else if (pv != NULL) + free_pv_entry(pmap, pv); /* * Increment counters @@ -3243,7 +3243,8 @@ validate: newpte = (pt_entry_t)(pa | pmap_cache_bits(m->md.pat_mode, 0) | PG_V); if ((prot & VM_PROT_WRITE) != 0) { newpte |= PG_RW; - vm_page_flag_set(m, PG_WRITEABLE); + if ((newpte & PG_MANAGED) != 0) + vm_page_flag_set(m, PG_WRITEABLE); } if ((prot & VM_PROT_EXECUTE) == 0) newpte |= pg_nx; @@ -3278,6 +3279,10 @@ validate: if ((newpte & PG_RW) == 0) invlva = TRUE; } + if ((origpte & PG_MANAGED) != 0 && + TAILQ_EMPTY(&om->md.pv_list) && + TAILQ_EMPTY(&pa_to_pvh(opa)->pv_list)) + vm_page_flag_clear(om, PG_WRITEABLE); if (invlva) pmap_invalidate_page(pmap, va); } else @@ -3389,6 +3394,7 @@ pmap_enter_object(pmap_t pmap, vm_offset psize = atop(end - start); mpte = NULL; m = m_start; + vm_page_lock_queues(); PMAP_LOCK(pmap); while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) { va = start + ptoa(diff); @@ -3402,6 +3408,7 @@ pmap_enter_object(pmap_t pmap, vm_offset mpte); m = TAILQ_NEXT(m, listq); } + vm_page_unlock_queues(); PMAP_UNLOCK(pmap); } @@ -4209,12 +4216,15 @@ pmap_is_prefaultable(pmap_t pmap, vm_off boolean_t pmap_is_referenced(vm_page_t m) { + boolean_t rv; - if (m->flags & PG_FICTITIOUS) - return (FALSE); - if (pmap_is_referenced_pvh(&m->md)) - return (TRUE); - return (pmap_is_referenced_pvh(pa_to_pvh(VM_PAGE_TO_PHYS(m)))); + KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + ("pmap_is_referenced: page %p is not managed", m)); + vm_page_lock_queues(); + rv = pmap_is_referenced_pvh(&m->md) || + pmap_is_referenced_pvh(pa_to_pvh(VM_PAGE_TO_PHYS(m))); + vm_page_unlock_queues(); + return (rv); } /* Modified: projects/altix/sys/amd64/amd64/trap.c ============================================================================== --- projects/altix/sys/amd64/amd64/trap.c Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/amd64/amd64/trap.c Sun Jun 6 21:19:04 2010 (r208880) @@ -425,6 +425,8 @@ trap(struct trapframe *frame) case T_DNA: /* transparent fault (due to context switch "late") */ + KASSERT(PCB_USER_FPU(td->td_pcb), + ("kernel FPU ctx has leaked")); fpudna(); goto userout; @@ -449,16 +451,19 @@ trap(struct trapframe *frame) goto out; case T_DNA: + KASSERT(!PCB_USER_FPU(td->td_pcb), + ("Unregistered use of FPU in kernel")); + fpudna(); + goto out; + + case T_ARITHTRAP: /* arithmetic trap */ + case T_XMMFLT: /* SIMD floating-point exception */ + case T_FPOPFLT: /* FPU operand fetch fault */ /* - * The kernel is apparently using fpu for copying. - * XXX this should be fatal unless the kernel has - * registered such use. + * XXXKIB for now disable any FPU traps in kernel + * handler registration seems to be overkill */ - printf("fpudna in kernel mode!\n"); -#ifdef KDB - kdb_backtrace(); -#endif - fpudna(); + trap_fatal(frame, 0); goto out; case T_STKFLT: /* stack fault */ @@ -603,6 +608,8 @@ trap(struct trapframe *frame) user: userret(td, frame); mtx_assert(&Giant, MA_NOTOWNED); + KASSERT(PCB_USER_FPU(td->td_pcb), + ("Return from trap with kernel FPU ctx leaked")); userout: out: return; @@ -891,5 +898,12 @@ syscall(struct trapframe *frame) trapsignal(td, &ksi); } + KASSERT(PCB_USER_FPU(td->td_pcb), + ("System call %s returing with kernel FPU ctx leaked", + syscallname(td->td_proc, sa.code))); + KASSERT(td->td_pcb->pcb_save == &td->td_pcb->pcb_user_save, + ("System call %s returning with mangled pcb_save", + syscallname(td->td_proc, sa.code))); + syscallret(td, error, &sa); } Modified: projects/altix/sys/amd64/amd64/vm_machdep.c ============================================================================== --- projects/altix/sys/amd64/amd64/vm_machdep.c Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/amd64/amd64/vm_machdep.c Sun Jun 6 21:19:04 2010 (r208880) @@ -122,7 +122,7 @@ cpu_fork(td1, p2, td2, flags) return; } - /* Ensure that p1's pcb is up to date. */ + /* Ensure that td1's pcb is up to date. */ fpuexit(td1); /* Point the pcb to the top of the stack */ @@ -130,9 +130,12 @@ cpu_fork(td1, p2, td2, flags) td2->td_kstack_pages * PAGE_SIZE) - 1; td2->td_pcb = pcb2; - /* Copy p1's pcb */ + /* Copy td1's pcb */ bcopy(td1->td_pcb, pcb2, sizeof(*pcb2)); + /* Properly initialize pcb_save */ + pcb2->pcb_save = &pcb2->pcb_user_save; + /* Point mdproc and then copy over td1's contents */ mdp2 = &p2->p_md; bcopy(&p1->p_md, mdp2, sizeof(*mdp2)); @@ -308,6 +311,7 @@ cpu_thread_alloc(struct thread *td) td->td_pcb = (struct pcb *)(td->td_kstack + td->td_kstack_pages * PAGE_SIZE) - 1; td->td_frame = (struct trapframe *)td->td_pcb - 1; + td->td_pcb->pcb_save = &td->td_pcb->pcb_user_save; } void @@ -381,7 +385,8 @@ cpu_set_upcall(struct thread *td, struct * values here. */ bcopy(td0->td_pcb, pcb2, sizeof(*pcb2)); - pcb2->pcb_flags &= ~PCB_FPUINITDONE; + pcb2->pcb_flags &= ~(PCB_FPUINITDONE | PCB_USERFPUINITDONE); + pcb2->pcb_save = &pcb2->pcb_user_save; pcb2->pcb_full_iret = 1; /* Modified: projects/altix/sys/amd64/ia32/ia32_reg.c ============================================================================== --- projects/altix/sys/amd64/ia32/ia32_reg.c Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/amd64/ia32/ia32_reg.c Sun Jun 6 21:19:04 2010 (r208880) @@ -147,7 +147,7 @@ fill_fpregs32(struct thread *td, struct { struct save87 *sv_87 = (struct save87 *)regs; struct env87 *penv_87 = &sv_87->sv_env; - struct savefpu *sv_fpu = &td->td_pcb->pcb_save; + struct savefpu *sv_fpu = &td->td_pcb->pcb_user_save; struct envxmm *penv_xmm = &sv_fpu->sv_env; int i; @@ -182,7 +182,7 @@ set_fpregs32(struct thread *td, struct f { struct save87 *sv_87 = (struct save87 *)regs; struct env87 *penv_87 = &sv_87->sv_env; - struct savefpu *sv_fpu = &td->td_pcb->pcb_save; + struct savefpu *sv_fpu = &td->td_pcb->pcb_user_save; struct envxmm *penv_xmm = &sv_fpu->sv_env; int i; Modified: projects/altix/sys/amd64/include/fpu.h ============================================================================== --- projects/altix/sys/amd64/include/fpu.h Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/amd64/include/fpu.h Sun Jun 6 21:19:04 2010 (r208880) @@ -73,6 +73,17 @@ struct savefpu { u_char sv_pad[96]; } __aligned(16); +#ifdef _KERNEL +struct fpu_kern_ctx { + struct savefpu hwstate; + struct savefpu *prev; + uint32_t flags; +}; +#define FPU_KERN_CTX_FPUINITDONE 0x01 + +#define PCB_USER_FPU(pcb) (((pcb)->pcb_flags & PCB_KERNFPU) == 0) +#endif + /* * The hardware default control word for i387's and later coprocessors is * 0x37F, giving: @@ -102,9 +113,22 @@ void fpudrop(void); void fpuexit(struct thread *td); int fpuformat(void); int fpugetregs(struct thread *td, struct savefpu *addr); +int fpugetuserregs(struct thread *td, struct savefpu *addr); void fpuinit(void); void fpusetregs(struct thread *td, struct savefpu *addr); +void fpusetuserregs(struct thread *td, struct savefpu *addr); int fputrap(void); +int fpu_kern_enter(struct thread *td, struct fpu_kern_ctx *ctx, + u_int flags); +int fpu_kern_leave(struct thread *td, struct fpu_kern_ctx *ctx); +int fpu_kern_thread(u_int flags); +int is_fpu_kern_thread(u_int flags); + +/* + * Flags for fpu_kern_enter() and fpu_kern_thread(). + */ +#define FPU_KERN_NORMAL 0x0000 + #endif #endif /* !_MACHINE_FPU_H_ */ Modified: projects/altix/sys/amd64/include/pcb.h ============================================================================== --- projects/altix/sys/amd64/include/pcb.h Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/amd64/include/pcb.h Sun Jun 6 21:19:04 2010 (r208880) @@ -57,7 +57,9 @@ struct pcb { register_t pcb_gsbase; u_long pcb_flags; #define PCB_DBREGS 0x02 /* process using debug registers */ +#define PCB_KERNFPU 0x04 /* kernel uses fpu */ #define PCB_FPUINITDONE 0x08 /* fpu state is initialized */ +#define PCB_USERFPUINITDONE 0x10 /* fpu user state is initialized */ #define PCB_GS32BIT 0x20 /* linux gs switch */ #define PCB_32BIT 0x40 /* process has 32 bit context (segs etc) */ #define PCB_FULLCTX 0x80 /* full context restore on sysret */ @@ -69,7 +71,7 @@ struct pcb { u_int64_t pcb_dr6; u_int64_t pcb_dr7; - struct savefpu pcb_save; + struct savefpu pcb_user_save; uint16_t pcb_initial_fpucw; caddr_t pcb_onfault; /* copyin/out fault recovery */ @@ -78,6 +80,7 @@ struct pcb { struct user_segment_descriptor pcb_gs32sd; /* local tss, with i/o bitmap; NULL for common */ struct amd64tss *pcb_tssp; + struct savefpu *pcb_save; char pcb_full_iret; }; Modified: projects/altix/sys/arm/arm/pmap.c ============================================================================== --- projects/altix/sys/arm/arm/pmap.c Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/arm/arm/pmap.c Sun Jun 6 21:19:04 2010 (r208880) @@ -3318,15 +3318,16 @@ pmap_enter_locked(pmap_t pmap, vm_offset u_int oflags; vm_paddr_t pa; - KASSERT((m->oflags & VPO_BUSY) != 0 || (flags & M_NOWAIT) != 0, - ("pmap_enter_locked: page %p is not busy", m)); PMAP_ASSERT_LOCKED(pmap); mtx_assert(&vm_page_queue_mtx, MA_OWNED); if (va == vector_page) { pa = systempage.pv_pa; m = NULL; - } else + } else { + KASSERT((m->oflags & VPO_BUSY) != 0 || (flags & M_NOWAIT) != 0, + ("pmap_enter_locked: page %p is not busy", m)); pa = VM_PAGE_TO_PHYS(m); + } nflags = 0; if (prot & VM_PROT_WRITE) nflags |= PVF_WRITE; @@ -3411,7 +3412,8 @@ do_l2b_alloc: if (prot & VM_PROT_WRITE) { npte |= L2_S_PROT_W; - if (m != NULL) + if (m != NULL && + (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) vm_page_flag_set(m, PG_WRITEABLE); } npte |= pte_l2_s_cache_mode; @@ -3589,12 +3591,14 @@ pmap_enter_object(pmap_t pmap, vm_offset psize = atop(end - start); m = m_start; + vm_page_lock_queues(); 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_NOWAIT); m = TAILQ_NEXT(m, listq); } + vm_page_unlock_queues(); PMAP_UNLOCK(pmap); } @@ -4521,8 +4525,9 @@ boolean_t pmap_is_referenced(vm_page_t m) { - return ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0 && - (m->md.pvh_attrs & PVF_REF) != 0); + KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + ("pmap_is_referenced: page %p is not managed", m)); + return ((m->md.pvh_attrs & PVF_REF) != 0); } /* Modified: projects/altix/sys/boot/i386/boot0/Makefile ============================================================================== --- projects/altix/sys/boot/i386/boot0/Makefile Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/boot/i386/boot0/Makefile Sun Jun 6 21:19:04 2010 (r208880) @@ -74,6 +74,6 @@ CFLAGS+=-DFLAGS=${BOOT_BOOT0_FLAGS} \ -DTICKS=${BOOT_BOOT0_TICKS} \ -DCOMSPEED=${BOOT_BOOT0_COMCONSOLE_SPEED} -LDFLAGS=-N -e start -Ttext ${BOOT_BOOT0_ORG} -Wl,-S,--oformat,binary +LDFLAGS=-e start -Ttext ${BOOT_BOOT0_ORG} -Wl,-N,-S,--oformat,binary .include <bsd.prog.mk> Modified: projects/altix/sys/boot/i386/btx/btx/Makefile ============================================================================== --- projects/altix/sys/boot/i386/btx/btx/Makefile Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/boot/i386/btx/btx/Makefile Sun Jun 6 21:19:04 2010 (r208880) @@ -24,6 +24,6 @@ CFLAGS+=-DBTX_SERIAL -DSIOPRT=${BOOT_COM ORG= 0x9000 -LDFLAGS=-N -e start -Ttext ${ORG} -Wl,-S,--oformat,binary +LDFLAGS=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary .include <bsd.prog.mk> Modified: projects/altix/sys/boot/i386/btx/btxldr/Makefile ============================================================================== --- projects/altix/sys/boot/i386/btx/btxldr/Makefile Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/boot/i386/btx/btxldr/Makefile Sun Jun 6 21:19:04 2010 (r208880) @@ -11,6 +11,6 @@ CFLAGS+=-DLOADER_ADDRESS=${LOADER_ADDRES CFLAGS+=-DBTXLDR_VERBOSE .endif -LDFLAGS=-N -e start -Ttext ${LOADER_ADDRESS} -Wl,-S,--oformat,binary +LDFLAGS=-e start -Ttext ${LOADER_ADDRESS} -Wl,-N,-S,--oformat,binary .include <bsd.prog.mk> Modified: projects/altix/sys/boot/i386/cdboot/Makefile ============================================================================== --- projects/altix/sys/boot/i386/cdboot/Makefile Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/boot/i386/cdboot/Makefile Sun Jun 6 21:19:04 2010 (r208880) @@ -8,6 +8,6 @@ SRCS= ${PROG}.s ORG= 0x7c00 -LDFLAGS=-N -e start -Ttext ${ORG} -Wl,-S,--oformat,binary +LDFLAGS=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary .include <bsd.prog.mk> Modified: projects/altix/sys/boot/i386/mbr/Makefile ============================================================================== --- projects/altix/sys/boot/i386/mbr/Makefile Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/boot/i386/mbr/Makefile Sun Jun 6 21:19:04 2010 (r208880) @@ -12,6 +12,6 @@ BOOT_MBR_FLAGS?= 0x80 ORG= 0x600 AFLAGS+=--defsym FLAGS=${BOOT_MBR_FLAGS} -LDFLAGS=-N -e start -Ttext ${ORG} -Wl,-S,--oformat,binary +LDFLAGS=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary .include <bsd.prog.mk> Modified: projects/altix/sys/boot/i386/pmbr/Makefile ============================================================================== --- projects/altix/sys/boot/i386/pmbr/Makefile Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/boot/i386/pmbr/Makefile Sun Jun 6 21:19:04 2010 (r208880) @@ -9,6 +9,6 @@ SRCS= ${PROG}.s ORG= 0x600 AFLAGS+=--defsym FLAGS=${BOOT_MBR_FLAGS} -LDFLAGS=-N -e start -Ttext ${ORG} -Wl,-S,--oformat,binary +LDFLAGS=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary .include <bsd.prog.mk> Modified: projects/altix/sys/boot/pc98/boot0.5/Makefile ============================================================================== --- projects/altix/sys/boot/pc98/boot0.5/Makefile Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/boot/pc98/boot0.5/Makefile Sun Jun 6 21:19:04 2010 (r208880) @@ -14,7 +14,7 @@ BOOT= boot0.5 # unless you are glutton for punishment. BOOT_BOOT0_ORG?= 0x0000 -LDFLAGS=-N -e start -Ttext ${BOOT_BOOT0_ORG} -Wl,-T,${.CURDIR}/ldscript +LDFLAGS=-e start -Ttext ${BOOT_BOOT0_ORG} -Wl,-N,-T,${.CURDIR}/ldscript # The size of boot0.5 must be 7168 bytes ${BOOT}: ${BOOT}.bin Modified: projects/altix/sys/boot/pc98/boot0/Makefile ============================================================================== --- projects/altix/sys/boot/pc98/boot0/Makefile Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/boot/pc98/boot0/Makefile Sun Jun 6 21:19:04 2010 (r208880) @@ -13,7 +13,7 @@ BOOT= boot0 # unless you are glutton for punishment. BOOT_BOOT0_ORG?= 0x0000 -LDFLAGS=-N -e start -Ttext ${BOOT_BOOT0_ORG} +LDFLAGS=-e start -Ttext ${BOOT_BOOT0_ORG} -Wl,-N ${BOOT}: ${BOOT}.out objcopy -S -O binary ${BOOT}.out ${.TARGET} Modified: projects/altix/sys/boot/pc98/btx/btx/Makefile ============================================================================== --- projects/altix/sys/boot/pc98/btx/btx/Makefile Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/boot/pc98/btx/btx/Makefile Sun Jun 6 21:19:04 2010 (r208880) @@ -24,6 +24,6 @@ CFLAGS+=-DBTX_SERIAL -DSIOPRT=${BOOT_COM ORG= 0x9000 -LDFLAGS=-N -e start -Ttext ${ORG} -Wl,-S,--oformat,binary +LDFLAGS=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary .include <bsd.prog.mk> Modified: projects/altix/sys/boot/pc98/btx/btxldr/Makefile ============================================================================== --- projects/altix/sys/boot/pc98/btx/btxldr/Makefile Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/boot/pc98/btx/btxldr/Makefile Sun Jun 6 21:19:04 2010 (r208880) @@ -11,6 +11,6 @@ CFLAGS+=-DLOADER_ADDRESS=${LOADER_ADDRES CFLAGS+=-DBTXLDR_VERBOSE .endif -LDFLAGS=-N -e start -Ttext ${LOADER_ADDRESS} -Wl,-S,--oformat,binary +LDFLAGS=-e start -Ttext ${LOADER_ADDRESS} -Wl,-N,-S,--oformat,binary .include <bsd.prog.mk> Modified: projects/altix/sys/boot/pc98/cdboot/Makefile ============================================================================== --- projects/altix/sys/boot/pc98/cdboot/Makefile Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/boot/pc98/cdboot/Makefile Sun Jun 6 21:19:04 2010 (r208880) @@ -8,6 +8,6 @@ SRCS= ${PROG}.s ORG= 0x0000 -LDFLAGS=-N -e start -Ttext ${ORG} -Wl,-S,--oformat,binary +LDFLAGS=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary .include <bsd.prog.mk> Modified: projects/altix/sys/boot/sparc64/boot1/Makefile ============================================================================== --- projects/altix/sys/boot/sparc64/boot1/Makefile Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/boot/sparc64/boot1/Makefile Sun Jun 6 21:19:04 2010 (r208880) @@ -9,7 +9,7 @@ SRCS= _start.s boot1.c BOOTBLOCKBASE= 0x4000 CFLAGS= -mcmodel=medlow -Os -I${.CURDIR}/../../common -LDFLAGS=-N -Ttext ${BOOTBLOCKBASE} +LDFLAGS=-Ttext ${BOOTBLOCKBASE} -Wl,-N # Construct boot1. sunlabel expects it to contain zeroed-out space for the # label, and to be of the correct size. Modified: projects/altix/sys/boot/zfs/zfs.c ============================================================================== --- projects/altix/sys/boot/zfs/zfs.c Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/boot/zfs/zfs.c Sun Jun 6 21:19:04 2010 (r208880) @@ -265,6 +265,8 @@ zfs_readdir(struct open_file *f, struct rc = dnode_read(spa, &fp->f_dnode, fp->f_seekp, &mze, sizeof(mze)); + if (rc) + return (rc); fp->f_seekp += sizeof(mze); if (!mze.mze_name[0]) Modified: projects/altix/sys/boot/zfs/zfsimpl.c ============================================================================== --- projects/altix/sys/boot/zfs/zfsimpl.c Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/boot/zfs/zfsimpl.c Sun Jun 6 21:19:04 2010 (r208880) @@ -958,12 +958,17 @@ zio_read_gang(spa_t *spa, const blkptr_t break; if (!vdev || !vdev->v_read) return (EIO); - if (vdev->v_read(vdev, bp, &zio_gb, offset, SPA_GANGBLOCKSIZE)) + if (vdev->v_read(vdev, NULL, &zio_gb, offset, SPA_GANGBLOCKSIZE)) return (EIO); for (i = 0; i < SPA_GBH_NBLKPTRS; i++) { - if (zio_read(spa, &zio_gb.zg_blkptr[i], buf)) + blkptr_t *gbp = &zio_gb.zg_blkptr[i]; + + if (BP_IS_HOLE(gbp)) + continue; + if (zio_read(spa, gbp, buf)) return (EIO); + buf = (char*)buf + BP_GET_PSIZE(gbp); } return (0); @@ -994,9 +999,8 @@ zio_read(spa_t *spa, const blkptr_t *bp, continue; if (DVA_GET_GANG(dva)) { - printf("ZFS: gang block detected!\n"); if (zio_read_gang(spa, bp, dva, buf)) - return (EIO); + continue; } else { vdevid = DVA_GET_VDEV(dva); offset = DVA_GET_OFFSET(dva); Modified: projects/altix/sys/cam/ata/ata_pmp.c ============================================================================== --- projects/altix/sys/cam/ata/ata_pmp.c Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/cam/ata/ata_pmp.c Sun Jun 6 21:19:04 2010 (r208880) @@ -737,10 +737,8 @@ pmpdone(struct cam_periph *periph, union if (xpt_create_path(&dpath, periph, xpt_path_path_id(periph->path), i, 0) != CAM_REQ_CMP) { - printf("pmpdone: xpt_create_path failed" - ", bus scan halted\n"); - xpt_free_ccb(done_ccb); - goto done; + printf("pmpdone: xpt_create_path failed\n"); + continue; } /* If we did hard reset to this device, inform XPT. */ if ((softc->reset & softc->found & (1 << i)) != 0) Modified: projects/altix/sys/cam/ata/ata_xpt.c ============================================================================== --- projects/altix/sys/cam/ata/ata_xpt.c Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/cam/ata/ata_xpt.c Sun Jun 6 21:19:04 2010 (r208880) @@ -1185,6 +1185,7 @@ ata_scan_bus(struct cam_periph *periph, ("xpt_scan_bus\n")); switch (request_ccb->ccb_h.func_code) { case XPT_SCAN_BUS: + case XPT_SCAN_TGT: /* Find out the characteristics of the bus */ work_ccb = xpt_alloc_ccb_nowait(); if (work_ccb == NULL) { @@ -1209,6 +1210,12 @@ ata_scan_bus(struct cam_periph *periph, !(work_ccb->cpi.hba_misc & PIM_NOBUSRESET) && !timevalisset(&request_ccb->ccb_h.path->bus->last_reset)) { reset_ccb = xpt_alloc_ccb_nowait(); + if (reset_ccb == NULL) { + request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL; + xpt_free_ccb(work_ccb); + xpt_done(request_ccb); + return; + } xpt_setup_ccb(&reset_ccb->ccb_h, request_ccb->ccb_h.path, CAM_PRIORITY_NONE); reset_ccb->ccb_h.func_code = XPT_RESET_BUS; @@ -1228,6 +1235,7 @@ ata_scan_bus(struct cam_periph *periph, malloc(sizeof(ata_scan_bus_info), M_CAMXPT, M_NOWAIT); if (scan_info == NULL) { request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL; + xpt_free_ccb(work_ccb); xpt_done(request_ccb); return; } @@ -1526,6 +1534,7 @@ ata_action(union ccb *start_ccb) break; } case XPT_SCAN_BUS: + case XPT_SCAN_TGT: ata_scan_bus(start_ccb->ccb_h.path->periph, start_ccb); break; case XPT_SCAN_LUN: Modified: projects/altix/sys/cam/cam_ccb.h ============================================================================== --- projects/altix/sys/cam/cam_ccb.h Sun Jun 6 20:34:17 2010 (r208879) +++ projects/altix/sys/cam/cam_ccb.h Sun Jun 6 21:19:04 2010 (r208880) @@ -184,6 +184,11 @@ typedef enum { /* * Set SIM specific knob values. */ *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201006062119.o56LJ596057466>
