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...
Marcel Moolenaar
marcel at FreeBSD.org
Sun Jun 6 21:19:05 UTC 2010
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 ***
More information about the svn-src-projects
mailing list