From owner-p4-projects@FreeBSD.ORG Sat Jun 10 23:56:13 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id F25D616A420; Sat, 10 Jun 2006 23:56:12 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id B493D16A41B for ; Sat, 10 Jun 2006 23:56:12 +0000 (UTC) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 6618343D45 for ; Sat, 10 Jun 2006 23:56:12 +0000 (GMT) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k5ANs4VX001542 for ; Sat, 10 Jun 2006 23:54:04 GMT (envelope-from imp@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k5ANs46P001539 for perforce@freebsd.org; Sat, 10 Jun 2006 23:54:04 GMT (envelope-from imp@freebsd.org) Date: Sat, 10 Jun 2006 23:54:04 GMT Message-Id: <200606102354.k5ANs46P001539@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to imp@freebsd.org using -f From: Warner Losh To: Perforce Change Reviews Cc: Subject: PERFORCE change 98953 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Jun 2006 23:56:13 -0000 http://perforce.freebsd.org/chv.cgi?CH=98953 Change 98953 by imp@imp_harmony on 2006/06/10 23:53:54 IFC @98952 Affected files ... .. //depot/projects/arm/src/sys/dev/acpica/acpi.c#9 integrate .. //depot/projects/arm/src/sys/dev/acpica/acpi_battery.c#5 integrate .. //depot/projects/arm/src/sys/dev/acpica/acpi_thermal.c#4 integrate .. //depot/projects/arm/src/sys/dev/ipw/if_ipw.c#6 integrate .. //depot/projects/arm/src/sys/dev/ipw/if_ipwvar.h#3 integrate .. //depot/projects/arm/src/sys/dev/mpt/mpt_pci.c#12 integrate .. //depot/projects/arm/src/sys/gnu/fs/xfs/FreeBSD/xfs_mountops.c#6 integrate .. //depot/projects/arm/src/sys/gnu/fs/xfs/FreeBSD/xfs_super.c#4 integrate .. //depot/projects/arm/src/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c#3 integrate .. //depot/projects/arm/src/sys/gnu/fs/xfs/xfs_log_recover.c#3 integrate .. //depot/projects/arm/src/sys/i386/acpica/acpi_machdep.c#4 integrate .. //depot/projects/arm/src/sys/i386/acpica/acpi_wakecode.S#4 integrate .. //depot/projects/arm/src/sys/i386/acpica/acpi_wakeup.c#5 integrate .. //depot/projects/arm/src/sys/kern/kern_mbuf.c#10 integrate .. //depot/projects/arm/src/sys/kern/subr_firmware.c#2 integrate .. //depot/projects/arm/src/sys/kern/sys_pipe.c#5 integrate .. //depot/projects/arm/src/sys/kern/sysv_msg.c#2 integrate .. //depot/projects/arm/src/sys/kern/sysv_sem.c#3 integrate .. //depot/projects/arm/src/sys/kern/sysv_shm.c#4 integrate .. //depot/projects/arm/src/sys/kern/uipc_mbuf.c#12 integrate .. //depot/projects/arm/src/sys/kern/uipc_socket.c#13 integrate .. //depot/projects/arm/src/sys/kern/uipc_socket2.c#10 integrate .. //depot/projects/arm/src/sys/kern/uipc_syscalls.c#10 integrate .. //depot/projects/arm/src/sys/sys/firmware.h#2 integrate .. //depot/projects/arm/src/sys/sys/socketvar.h#8 integrate .. //depot/projects/arm/src/sys/sys/sysctl.h#7 integrate Differences ... ==== //depot/projects/arm/src/sys/dev/acpica/acpi.c#9 (text+ko) ==== @@ -28,7 +28,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.224 2006/05/16 14:36:22 phk Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.225 2006/06/10 08:04:38 njl Exp $"); #include "opt_acpi.h" #include @@ -218,7 +218,7 @@ static const char* sleep_state_names[] = { "S0", "S1", "S2", "S3", "S4", "S5", "NONE"}; -SYSCTL_NODE(_debug, OID_AUTO, acpi, CTLFLAG_RW, NULL, "ACPI debugging"); +SYSCTL_NODE(_debug, OID_AUTO, acpi, CTLFLAG_RD, NULL, "ACPI debugging"); static char acpi_ca_version[12]; SYSCTL_STRING(_debug_acpi, OID_AUTO, acpi_ca_version, CTLFLAG_RD, acpi_ca_version, 0, "Version of Intel ACPI-CA"); @@ -516,14 +516,12 @@ OID_AUTO, "suspend_state", CTLTYPE_STRING | CTLFLAG_RW, &sc->acpi_suspend_sx, 0, acpi_sleep_state_sysctl, "A", ""); SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree), - OID_AUTO, "sleep_delay", CTLFLAG_RD | CTLFLAG_RW, - &sc->acpi_sleep_delay, 0, "sleep delay"); + OID_AUTO, "sleep_delay", CTLFLAG_RW, &sc->acpi_sleep_delay, 0, + "sleep delay"); SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree), - OID_AUTO, "s4bios", CTLFLAG_RD | CTLFLAG_RW, - &sc->acpi_s4bios, 0, "S4BIOS mode"); + OID_AUTO, "s4bios", CTLFLAG_RW, &sc->acpi_s4bios, 0, "S4BIOS mode"); SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree), - OID_AUTO, "verbose", CTLFLAG_RD | CTLFLAG_RW, - &sc->acpi_verbose, 0, "verbose mode"); + OID_AUTO, "verbose", CTLFLAG_RW, &sc->acpi_verbose, 0, "verbose mode"); /* * Default to 1 second before sleeping to give some machines time to ==== //depot/projects/arm/src/sys/dev/acpica/acpi_battery.c#5 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_battery.c,v 1.22 2005/11/23 00:53:01 njl Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_battery.c,v 1.23 2006/06/10 08:04:38 njl Exp $"); #include "opt_acpi.h" #include @@ -482,7 +482,7 @@ NULL, 0, acpi_battery_units_sysctl, "I", "number of batteries"); SYSCTL_ADD_INT(&acpi_battery_sysctl_ctx, SYSCTL_CHILDREN(acpi_battery_sysctl_tree), - OID_AUTO, "info_expire", CTLFLAG_RD | CTLFLAG_RW, + OID_AUTO, "info_expire", CTLFLAG_RW, &acpi_battery_info_expire, 0, "time in seconds until info is refreshed"); ==== //depot/projects/arm/src/sys/dev/acpica/acpi_thermal.c#4 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_thermal.c,v 1.60 2005/09/11 18:39:01 obrien Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_thermal.c,v 1.61 2006/06/10 08:04:38 njl Exp $"); #include "opt_acpi.h" #include @@ -242,12 +242,12 @@ OID_AUTO, "thermal", CTLFLAG_RD, 0, ""); SYSCTL_ADD_INT(&acpi_tz_sysctl_ctx, SYSCTL_CHILDREN(acpi_tz_sysctl_tree), - OID_AUTO, "min_runtime", CTLFLAG_RD | CTLFLAG_RW, + OID_AUTO, "min_runtime", CTLFLAG_RW, &acpi_tz_min_runtime, 0, "minimum cooling run time in sec"); SYSCTL_ADD_INT(&acpi_tz_sysctl_ctx, SYSCTL_CHILDREN(acpi_tz_sysctl_tree), - OID_AUTO, "polling_rate", CTLFLAG_RD | CTLFLAG_RW, + OID_AUTO, "polling_rate", CTLFLAG_RW, &acpi_tz_polling_rate, 0, "monitor polling rate"); } sysctl_ctx_init(&sc->tz_sysctl_ctx); ==== //depot/projects/arm/src/sys/dev/ipw/if_ipw.c#6 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/sys/dev/ipw/if_ipw.c,v 1.21 2006/06/02 23:14:39 sam Exp $ */ +/* $FreeBSD: src/sys/dev/ipw/if_ipw.c,v 1.22 2006/06/10 17:29:40 iedowse Exp $ */ /*- * Copyright (c) 2004-2006 @@ -28,7 +28,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/ipw/if_ipw.c,v 1.21 2006/06/02 23:14:39 sam Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/ipw/if_ipw.c,v 1.22 2006/06/10 17:29:40 iedowse Exp $"); /*- * Intel(R) PRO/Wireless 2100 MiniPCI driver @@ -390,6 +390,11 @@ if (ifp != NULL) if_free(ifp); + if (sc->sc_firmware != NULL) { + firmware_put(sc->sc_firmware, FIRMWARE_UNLOAD); + sc->sc_firmware = NULL; + } + mtx_destroy(&sc->sc_mtx); return 0; @@ -2002,16 +2007,22 @@ * Load firmware image using the firmware(9) subsystem. We need to * release the driver's lock first. */ - mtx_unlock(&sc->sc_mtx); - fp = firmware_get(imagename); - mtx_lock(&sc->sc_mtx); + if (sc->sc_firmware == NULL || strcmp(sc->sc_firmware->name, + imagename) != 0) { + mtx_unlock(&sc->sc_mtx); + if (sc->sc_firmware != NULL) + firmware_put(sc->sc_firmware, FIRMWARE_UNLOAD); + sc->sc_firmware = firmware_get(imagename); + mtx_lock(&sc->sc_mtx); + } - if (fp == NULL) { + if (sc->sc_firmware == NULL) { device_printf(sc->sc_dev, "could not load firmware image '%s'\n", imagename); goto fail1; } + fp = sc->sc_firmware; if (fp->datasize < sizeof *hdr) { device_printf(sc->sc_dev, "firmware image too short %zu\n", fp->datasize); @@ -2061,7 +2072,6 @@ goto fail2; } - firmware_put(fp, FIRMWARE_UNLOAD); sc->flags |= IPW_FLAG_FW_INITED; /* retrieve information tables base addresses */ @@ -2086,6 +2096,7 @@ return; fail2: firmware_put(fp, FIRMWARE_UNLOAD); + sc->sc_firmware = NULL; fail1: ifp->if_flags &= ~IFF_UP; ipw_stop(sc); sc->flags &=~ IPW_FLAG_INIT_LOCKED; ==== //depot/projects/arm/src/sys/dev/ipw/if_ipwvar.h#3 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/sys/dev/ipw/if_ipwvar.h,v 1.4 2006/03/12 19:01:00 damien Exp $ */ +/* $FreeBSD: src/sys/dev/ipw/if_ipwvar.h,v 1.5 2006/06/10 17:29:40 iedowse Exp $ */ /*- * Copyright (c) 2004-2006 @@ -99,6 +99,7 @@ bus_space_tag_t sc_st; bus_space_handle_t sc_sh; void *sc_ih; + struct firmware *sc_firmware; int sc_tx_timer; ==== //depot/projects/arm/src/sys/dev/mpt/mpt_pci.c#12 (text+ko) ==== @@ -99,7 +99,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_pci.c,v 1.33 2006/06/02 18:50:39 mjacob Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_pci.c,v 1.34 2006/06/10 23:45:31 mjacob Exp $"); #include #include @@ -130,6 +130,10 @@ #define PCI_PRODUCT_LSI_FC929X 0x0626 #endif +#ifndef PCI_PRODUCT_LSI_FC919X +#define PCI_PRODUCT_LSI_FC919X 0x0628 +#endif + #ifndef PCI_PRODUCT_LSI_FC7X04X #define PCI_PRODUCT_LSI_FC7X04X 0x0640 #endif @@ -225,6 +229,9 @@ case PCI_PRODUCT_LSI_FC929: desc = "LSILogic FC929 FC Adapter"; break; + case PCI_PRODUCT_LSI_FC919X: + desc = "LSILogic FC919X FC Adapter"; + break; case PCI_PRODUCT_LSI_FC929X: desc = "LSILogic FC929X 2Gb/s FC Adapter"; break; @@ -373,6 +380,7 @@ case PCI_PRODUCT_LSI_FC909A: case PCI_PRODUCT_LSI_FC919: case PCI_PRODUCT_LSI_FC929: + case PCI_PRODUCT_LSI_FC919X: case PCI_PRODUCT_LSI_FC7X04X: mpt->is_fc = 1; break; ==== //depot/projects/arm/src/sys/gnu/fs/xfs/FreeBSD/xfs_mountops.c#6 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/gnu/fs/xfs/FreeBSD/xfs_mountops.c,v 1.5 2006/06/09 06:04:05 rodrigc Exp $ + * $FreeBSD: src/sys/gnu/fs/xfs/FreeBSD/xfs_mountops.c,v 1.6 2006/06/10 19:04:21 rodrigc Exp $ */ #include @@ -187,9 +187,13 @@ struct xfsmount *xmp; struct xfs_vnode *rootvp; struct ucred *curcred; - struct vnode *rvp; + struct vnode *rvp, *devvp; struct cdev *ddev; + struct g_consumer *cp; int error; + + ddev = NULL; + cp = NULL; if (vfs_filteropt(mp->mnt_optnew, xfs_opts)) return (EINVAL); @@ -210,10 +214,11 @@ goto fail; XVFS_ROOT(XFSTOVFS(xmp), &rootvp, error); + ddev = XFS_VFSTOM(XFSTOVFS(xmp))->m_ddev_targp->dev; + devvp = XFS_VFSTOM(XFSTOVFS(xmp))->m_ddev_targp->specvp; if (error) goto fail_unmount; - ddev = XFS_VFSTOM(XFSTOVFS(xmp))->m_ddev_targp->dev; if (ddev->si_iosize_max != 0) mp->mnt_iosize_max = ddev->si_iosize_max; if (mp->mnt_iosize_max > MAXPHYS) @@ -235,6 +240,17 @@ fail_unmount: XVFS_UNMOUNT(XFSTOVFS(xmp), 0, curcred, error); + if (devvp != NULL) { + cp = devvp->v_bufobj.bo_private; + if (cp != NULL) { + DROP_GIANT(); + g_topology_lock(); + g_vfs_close(cp, td); + g_topology_unlock(); + PICKUP_GIANT(); + } + } + fail: if (xmp != NULL) xfsmount_deallocate(xmp); @@ -251,9 +267,26 @@ int mntflags; struct thread *td; { + struct vnode *devvp; + struct g_consumer *cp; int error; + cp = NULL; + devvp = NULL; + + devvp = XFS_VFSTOM((MNTTOVFS(mp)))->m_ddev_targp->specvp; + if (devvp != NULL) + cp = devvp->v_bufobj.bo_private; XVFS_UNMOUNT(MNTTOVFS(mp), 0, td->td_ucred, error); + if (error == 0) { + if (cp != NULL) { + DROP_GIANT(); + g_topology_lock(); + g_vfs_close(cp, td); + g_topology_unlock(); + PICKUP_GIANT(); + } + } return (error); } ==== //depot/projects/arm/src/sys/gnu/fs/xfs/FreeBSD/xfs_super.c#4 (text+ko) ==== @@ -182,11 +182,11 @@ g_topology_unlock(); PICKUP_GIANT(); - VOP_UNLOCK(devvp, 0, td); if (error) { vput(devvp); return (error); } + VOP_UNLOCK(devvp, 0, td); devvp->v_bufobj.bo_private = cp; devvp->v_bufobj.bo_ops = &xfs_bo_ops; ==== //depot/projects/arm/src/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c#3 (text+ko) ==== @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c,v 1.2 2006/06/09 06:04:05 rodrigc Exp $ + * $FreeBSD: src/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c,v 1.3 2006/06/10 23:10:55 rodrigc Exp $ */ #include #include @@ -865,10 +865,8 @@ memset(&va, 0, sizeof (va)); va.va_mask |= XFS_AT_MODE; - va.va_mode = ap->a_vap->va_mode; + va.va_mode = ap->a_vap->va_mode | S_IFLNK; va.va_mask |= XFS_AT_TYPE; - printf("_xfs_symlink need to implement inode type 0x%x\n",ap->a_vap->va_type); - //va.va_type = ap->a_vap->va_type; XVOP_SYMLINK(VPTOXFSVP(ap->a_dvp), ap->a_cnp, &va, ap->a_target, &xvp, credp, error); @@ -901,10 +899,8 @@ memset(&va, 0, sizeof (va)); va.va_mask |= XFS_AT_MODE; - va.va_mode = vap->va_mode; + va.va_mode = vap->va_mode | S_IFIFO; va.va_mask |= XFS_AT_TYPE; - printf("_xfs_mknod need to implement inode type 0x%x\n",vap->va_type); -// va.va_type = vap->va_type; va.va_mask |= XFS_AT_RDEV; va.va_rdev = vap->va_rdev; @@ -939,10 +935,8 @@ memset(&va, 0, sizeof (va)); va.va_mask |= XFS_AT_MODE; - va.va_mode = vap->va_mode; + va.va_mode = vap->va_mode | S_IFDIR; va.va_mask |= XFS_AT_TYPE; - printf("_xfs_mkdir need to implement inode type 0x%x\n",vap->va_type); -// va.va_type = vap->va_type; xvp = NULL; XVOP_MKDIR(VPTOXFSVP(dvp), cnp, &va, &xvp, credp, error); ==== //depot/projects/arm/src/sys/gnu/fs/xfs/xfs_log_recover.c#3 (text+ko) ==== @@ -3827,6 +3827,11 @@ xfs_sb_t *sbp; /* + * XXX: Disable log recovery for now, until we fix panics. + */ + printf("XFS log recovery disabled.\n"); + return (EOPNOTSUPP); + /* * First replay the images in the log. */ error = xlog_do_log_recovery(log, head_blk, tail_blk); ==== //depot/projects/arm/src/sys/i386/acpica/acpi_machdep.c#4 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/i386/acpica/acpi_machdep.c,v 1.31 2006/06/08 17:54:10 njl Exp $"); +__FBSDID("$FreeBSD: src/sys/i386/acpica/acpi_machdep.c,v 1.32 2006/06/10 08:06:16 njl Exp $"); #include #include @@ -52,8 +52,12 @@ #include +SYSCTL_DECL(_debug_acpi); + uint32_t acpi_resume_beep; -TUNABLE_INT("hw.acpi.resume_beep", &acpi_resume_beep); +TUNABLE_INT("debug.acpi.resume_beep", &acpi_resume_beep); +SYSCTL_UINT(_debug_acpi, OID_AUTO, resume_beep, CTLFLAG_RW, &acpi_resume_beep, + 0, "Beep the PC speaker when resuming"); uint32_t acpi_reset_video; TUNABLE_INT("hw.acpi.reset_video", &acpi_reset_video); @@ -322,11 +326,7 @@ SYSCTL_ADD_UINT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree), OID_AUTO, - "resume_beep", CTLFLAG_RD | CTLFLAG_RW, &acpi_resume_beep, 0, - "Beep the PC speaker when resuming"); - SYSCTL_ADD_UINT(&sc->acpi_sysctl_ctx, - SYSCTL_CHILDREN(sc->acpi_sysctl_tree), OID_AUTO, - "reset_video", CTLFLAG_RD | CTLFLAG_RW, &acpi_reset_video, 0, + "reset_video", CTLFLAG_RW, &acpi_reset_video, 0, "Call the VESA reset BIOS vector on the resume path"); return (0); ==== //depot/projects/arm/src/sys/i386/acpica/acpi_wakecode.S#4 (text+ko) ==== @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/i386/acpica/acpi_wakecode.S,v 1.11 2006/06/08 17:54:10 njl Exp $ + * $FreeBSD: src/sys/i386/acpica/acpi_wakecode.S,v 1.13 2006/06/10 08:20:03 njl Exp $ */ #define LOCORE @@ -34,20 +34,30 @@ #include "assym.s" - .align 4096 +/* + * Resume entry point. The BIOS enters here in real mode after POST with + * CS set to the page where we stored this code. It should configure the + * segment registers with a flat 4 GB address space and EFLAGS.IF = 0. + * Depending on the previous sleep state, we may need to initialize more + * of the system (i.e., S3 suspend-to-RAM vs. S4 suspend-to-disk). + */ + .align 4 .code16 wakeup_16: nop cli + cld /* - * Set up segment registers for real mode and a small stack for - * any calls we make. + * Set up segment registers for real mode, a small stack for + * any calls we make, and clear any flags. */ movw %cs,%ax movw %ax,%ds movw %ax,%ss movw $PAGE_SIZE,%sp + pushl $0 + popfl /* To debug resume hangs, beep the speaker if the user requested. */ cmpl $1,resume_beep @@ -75,22 +85,22 @@ movw %ax,%ss nobiosreset: - /* Load GDT for real mode */ - lgdt physical_gdt + /* Load GDT for real mode. Use 32 bit prefix for addresses >16 MB. */ + lgdtl physical_gdt /* Restore CR2, CR3 and CR4 */ - mov previous_cr2,%eax - mov %eax,%cr2 - mov previous_cr3,%eax - mov %eax,%cr3 - mov previous_cr4,%eax - mov %eax,%cr4 + movl previous_cr2,%eax + movl %eax,%cr2 + movl previous_cr3,%eax + movl %eax,%cr3 + movl previous_cr4,%eax + movl %eax,%cr4 - /* Transfer some values to protected mode */ + /* Transfer some values to protected mode with an inline stack */ #define NVALUES 9 #define TRANSFER_STACK32(val, idx) \ - mov val,%eax; \ - mov %eax,wakeup_32stack+(idx+1)+(idx*4); + movl val,%eax; \ + movl %eax,wakeup_32stack+(idx+1)+(idx*4) TRANSFER_STACK32(previous_ss, (NVALUES - 9)) TRANSFER_STACK32(previous_fs, (NVALUES - 8)) @@ -106,21 +116,20 @@ mov physical_esp,%esi /* to be used in 32bit code */ /* Enable protected mode */ - mov %cr0,%eax + movl %cr0,%eax orl $(CR0_PE),%eax - mov %eax,%cr0 + movl %eax,%cr0 wakeup_sw32: /* Switch to protected mode by intersegmental jump */ ljmpl $KCSEL,$0x12345678 /* Code location, to be replaced */ + /* + * Now switched to protected mode without paging enabled. + * %esi: KERNEL stack pointer (physical address) + */ .code32 wakeup_32: - /* - * Switched to protected mode w/o paging - * %esi: KERNEL stack pointer (physical address) - */ - nop /* Set up segment registers for protected mode */ @@ -134,13 +143,13 @@ movl %esi,%esp /* physical address stack pointer */ wakeup_32stack: - /* Operands are overwritten in 16bit code */ + /* Operands are overwritten in 16 bit code by TRANSFER_STACK32 macro */ pushl $0xabcdef09 /* ss + dummy */ pushl $0xabcdef08 /* fs + gs */ pushl $0xabcdef07 /* ds + es */ pushl $0xabcdef06 /* gdt:base (physical address) */ - pushl $0xabcdef05 /* recover address */ - pushl $0xabcdef04 /* idt:base */ + pushl $0xabcdef05 /* recover address */ + pushl $0xabcdef04 /* idt:base */ pushl $0xabcdef03 /* ldt + idt:limit */ pushl $0xabcdef02 /* gdt:base */ pushl $0xabcdef01 /* TR + gdt:limit */ @@ -169,15 +178,10 @@ andb $TSS_TYPEFIX_MASK,5(%eax) /* Prepare to return to sleep/wakeup code point */ - lgdt PREVIOUS_GDT - lidt PREVIOUS_IDT + lgdtl PREVIOUS_GDT + lidtl PREVIOUS_IDT - xorl %eax,%eax - movl %eax,%ebx - movl %eax,%ecx - movl %eax,%edx - movl %eax,%esi - movl %eax,%edi + /* Pack values from the GDT to be loaded into segment registers. */ movl PREVIOUS_DS,%ebx movl PREVIOUS_FS,%ecx movl PREVIOUS_SS,%edx @@ -194,15 +198,17 @@ jmp 1f 1: jmp 1f 1: + /* - * Now that we are in kernel virtual memory addressing - * %ebx: ds + es - * %ecx: fs + gs - * %edx: ss + dummy - * %esi: LDTR + TR - * %edi: recover address + * Now we are in kernel virtual memory addressing with the following + * original register values: + * %ebx: ds + es + * %ecx: fs + gs + * %edx: ss + dummy + * %esi: LDTR + TR + * %edi: recover address + * We'll load these back into the segment registers now. */ - nop movl %esi,%eax /* LDTR + TR */ @@ -235,7 +241,10 @@ resume_beep: .long 0 reset_video: .long 0 -/* transfer from real mode to protected mode */ +/* + * Transfer from real mode to protected mode. The order of these variables + * is very important, DO NOT INSERT OR CHANGE unless you know why. + */ previous_cr0: .long 0 previous_tr: .word 0 previous_gdt: .word 0 ==== //depot/projects/arm/src/sys/i386/acpica/acpi_wakeup.c#5 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/i386/acpica/acpi_wakeup.c,v 1.42 2006/06/08 17:54:10 njl Exp $"); +__FBSDID("$FreeBSD: src/sys/i386/acpica/acpi_wakeup.c,v 1.43 2006/06/10 08:20:17 njl Exp $"); #include #include @@ -52,6 +52,9 @@ #include "acpi_wakecode.h" +/* Make sure the code is less than one page and leave room for the stack. */ +CTASSERT(sizeof(wakecode) < PAGE_SIZE - 1024); + #ifndef _SYS_CDEFS_H_ #error this file needs sys/cdefs.h as a prerequisite #endif @@ -67,7 +70,7 @@ r_efl, r_cr0, r_cr2, r_cr3, r_cr4, ret_addr; static uint16_t r_cs, r_ds, r_es, r_fs, r_gs, r_ss, r_tr; -static uint32_t r_esp = 0; +static uint32_t r_esp; static void acpi_printcpu(void); static void acpi_realmodeinst(void *arg, bus_dma_segment_t *segs, @@ -282,7 +285,7 @@ static bus_dma_tag_t acpi_waketag; static bus_dmamap_t acpi_wakemap; -static vm_offset_t acpi_wakeaddr = 0; +static vm_offset_t acpi_wakeaddr; static void acpi_alloc_wakeup_handler(void) @@ -292,16 +295,21 @@ if (!cold) return; - if (bus_dma_tag_create(/* parent */ NULL, /* alignment */ 2, 0, - /* lowaddr below 1MB */ 0x9ffff, - /* highaddr */ BUS_SPACE_MAXADDR, NULL, NULL, - PAGE_SIZE, 1, PAGE_SIZE, 0, busdma_lock_mutex, - &Giant, &acpi_waketag) != 0) { + /* + * Specify the region for our wakeup code. We want it in the low 1 MB + * region, excluding video memory and above (0xa0000). We ask for + * it to be page-aligned, just to be safe. + */ + if (bus_dma_tag_create(/*parent*/ NULL, + /*alignment*/ PAGE_SIZE, /*no boundary*/ 0, + /*lowaddr*/ 0x9ffff, /*highaddr*/ BUS_SPACE_MAXADDR, NULL, NULL, + /*maxsize*/ PAGE_SIZE, /*segments*/ 1, /*maxsegsize*/ PAGE_SIZE, + 0, busdma_lock_mutex, &Giant, &acpi_waketag) != 0) { printf("acpi_alloc_wakeup_handler: can't create wake tag\n"); return; } - if (bus_dmamem_alloc(acpi_waketag, &wakeaddr, - BUS_DMA_NOWAIT, &acpi_wakemap)) { + if (bus_dmamem_alloc(acpi_waketag, &wakeaddr, BUS_DMA_NOWAIT, + &acpi_wakemap) != 0) { printf("acpi_alloc_wakeup_handler: can't alloc wake memory\n"); return; } @@ -313,13 +321,21 @@ static void acpi_realmodeinst(void *arg, bus_dma_segment_t *segs, int nsegs, int error) { - struct acpi_softc *sc = arg; - uint32_t *addr; + struct acpi_softc *sc; + uint32_t *addr; + /* Overwrite the ljmp target with the real address */ + sc = arg; + sc->acpi_wakephys = segs[0].ds_addr; addr = (uint32_t *)&wakecode[wakeup_sw32 + 2]; - *addr = segs[0].ds_addr + wakeup_32; + *addr = sc->acpi_wakephys + wakeup_32; + + /* Copy the wake code into our low page and save its physical addr. */ bcopy(wakecode, (void *)sc->acpi_wakeaddr, sizeof(wakecode)); - sc->acpi_wakephys = segs[0].ds_addr; + if (bootverbose) { + device_printf(sc->acpi_dev, "wakeup code va %#x pa %#x\n", + acpi_wakeaddr, sc->acpi_wakephys); + } } void @@ -333,6 +349,5 @@ sc->acpi_wakemap = acpi_wakemap; bus_dmamap_load(sc->acpi_waketag, sc->acpi_wakemap, - (void *)sc->acpi_wakeaddr, PAGE_SIZE, - acpi_realmodeinst, sc, 0); + (void *)sc->acpi_wakeaddr, PAGE_SIZE, acpi_realmodeinst, sc, 0); } ==== //depot/projects/arm/src/sys/kern/kern_mbuf.c#10 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/kern_mbuf.c,v 1.24 2006/04/21 09:25:39 ps Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/kern_mbuf.c,v 1.25 2006/06/10 14:34:07 rwatson Exp $"); #include "opt_mac.h" #include "opt_param.h" @@ -110,7 +110,6 @@ } SYSINIT(tunable_mbinit, SI_SUB_TUNABLES, SI_ORDER_ANY, tunable_mbinit, NULL); -SYSCTL_DECL(_kern_ipc); /* XXX: These should be tuneables. Can't change UMA limits on the fly. */ static int sysctl_nmbclusters(SYSCTL_HANDLER_ARGS) ==== //depot/projects/arm/src/sys/kern/subr_firmware.c#2 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/subr_firmware.c,v 1.1 2006/01/29 02:52:41 mlaier Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/subr_firmware.c,v 1.2 2006/06/10 17:04:07 iedowse Exp $"); #include #include @@ -42,7 +42,6 @@ #include #define FIRMWARE_MAX 30 -static char *name_unload = "UNLOADING"; static struct firmware firmware_table[FIRMWARE_MAX]; struct task firmware_task; struct mtx firmware_mtx; @@ -88,6 +87,7 @@ frp->datasize = datasize; frp->version = version; frp->refcnt = 0; + frp->flags = 0; if (parent != NULL) parent->refcnt++; frp->parent = parent; @@ -97,18 +97,15 @@ } static void -clearentry(struct firmware *fp, int keep_file) +clearentry(struct firmware *fp) { KASSERT(fp->refcnt == 0, ("image %s refcnt %u", fp->name, fp->refcnt)); - if (keep_file && (fp->file != NULL)) - fp->name = name_unload; - else { - fp->name = NULL; - fp->file = NULL; - } + fp->name = NULL; + fp->file = NULL; fp->data = NULL; fp->datasize = 0; fp->version = 0; + fp->flags = 0; if (fp->parent != NULL) { /* release parent reference */ fp->parent->refcnt--; fp->parent = NULL; @@ -150,7 +147,7 @@ if (fp != NULL) { refcnt = fp->refcnt; if (refcnt == 0) - clearentry(fp, 0); + clearentry(fp); } mtx_unlock(&firmware_mtx); return (refcnt != 0 ? EBUSY : 0); @@ -208,20 +205,30 @@ unloadentry(void *unused1, int unused2) { struct firmware *fp; + linker_file_t file; + int i; mtx_lock(&firmware_mtx); - while ((fp = lookup(name_unload))) { - /* - * XXX: ugly, we should be able to lookup unlocked here if - * we properly lock around clearentry below to avoid double - * unload. Play it safe for now. - */ + for (;;) { + /* Look for an unwanted entry that we explicitly loaded. */ + for (i = 0; i < FIRMWARE_MAX; i++) { + fp = &firmware_table[i]; + if (fp->name != NULL && fp->file != NULL && + fp->refcnt == 0 && + (fp->flags & FIRMWAREFLAG_KEEPKLDREF) == 0) + break; + fp = NULL; + } + if (fp == NULL) + break; + file = fp->file; + /* No longer explicitly loaded. */ + fp->file = NULL; mtx_unlock(&firmware_mtx); - linker_file_unload(fp->file, LINKER_UNLOAD_NORMAL); + linker_file_unload(file, LINKER_UNLOAD_NORMAL); mtx_lock(&firmware_mtx); - clearentry(fp, 0); } mtx_unlock(&firmware_mtx); } @@ -237,8 +244,10 @@ { mtx_lock(&firmware_mtx); fp->refcnt--; - if (fp->refcnt == 0 && (flags & FIRMWARE_UNLOAD)) - clearentry(fp, 1); + if (fp->refcnt == 0) { + if ((flags & FIRMWARE_UNLOAD) == 0) + fp->flags |= FIRMWAREFLAG_KEEPKLDREF; + } if (fp->file) taskqueue_enqueue(taskqueue_thread, &firmware_task); mtx_unlock(&firmware_mtx); @@ -250,11 +259,18 @@ static int firmware_modevent(module_t mod, int type, void *unused) { + int i; + switch (type) { case MOD_LOAD: TASK_INIT(&firmware_task, 0, unloadentry, NULL); return 0; case MOD_UNLOAD: + for (i = 0; i < FIRMWARE_MAX; i++) { + struct firmware *fp = &firmware_table[i]; + fp->flags &= ~FIRMWAREFLAG_KEEPKLDREF; + } + taskqueue_enqueue(taskqueue_thread, &firmware_task); taskqueue_drain(taskqueue_thread, &firmware_task); return 0; } ==== //depot/projects/arm/src/sys/kern/sys_pipe.c#5 (text+ko) ==== @@ -89,7 +89,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/sys_pipe.c,v 1.186 2006/01/30 08:25:04 glebius Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/sys_pipe.c,v 1.187 2006/06/10 14:34:07 rwatson Exp $"); #include "opt_mac.h" @@ -181,8 +181,6 @@ static int piperesizefail; static int piperesizeallowed = 1; -SYSCTL_DECL(_kern_ipc); - SYSCTL_INT(_kern_ipc, OID_AUTO, maxpipekva, CTLFLAG_RDTUN, &maxpipekva, 0, "Pipe KVA limit"); SYSCTL_INT(_kern_ipc, OID_AUTO, pipes, CTLFLAG_RD, ==== //depot/projects/arm/src/sys/kern/sysv_msg.c#2 (text+ko) ==== @@ -48,7 +48,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/sysv_msg.c,v 1.60 2005/02/12 01:22:39 csjp Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/sysv_msg.c,v 1.61 2006/06/10 14:34:07 rwatson Exp $"); #include "opt_sysvipc.h" #include "opt_mac.h" @@ -1311,7 +1311,6 @@ sizeof(struct msqid_kernel) * msginfo.msgmni)); } -SYSCTL_DECL(_kern_ipc); SYSCTL_INT(_kern_ipc, OID_AUTO, msgmax, CTLFLAG_RD, &msginfo.msgmax, 0, "Maximum message size"); SYSCTL_INT(_kern_ipc, OID_AUTO, msgmni, CTLFLAG_RDTUN, &msginfo.msgmni, 0, ==== //depot/projects/arm/src/sys/kern/sysv_sem.c#3 (text+ko) ==== @@ -37,7 +37,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/sysv_sem.c,v 1.78 2005/06/07 05:03:27 rwatson Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/sysv_sem.c,v 1.79 2006/06/10 14:34:07 rwatson Exp $"); #include "opt_sysvipc.h" #include "opt_mac.h" @@ -196,7 +196,6 @@ SEMAEM /* adjust on exit max value */ }; -SYSCTL_DECL(_kern_ipc); SYSCTL_INT(_kern_ipc, OID_AUTO, semmap, CTLFLAG_RW, &seminfo.semmap, 0, "Number of entries in the semaphore map"); SYSCTL_INT(_kern_ipc, OID_AUTO, semmni, CTLFLAG_RDTUN, &seminfo.semmni, 0, ==== //depot/projects/arm/src/sys/kern/sysv_shm.c#4 (text+ko) ==== @@ -60,7 +60,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/sysv_shm.c,v 1.105 2006/03/30 07:42:32 ps Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/sysv_shm.c,v 1.106 2006/06/10 14:34:07 rwatson Exp $"); #include "opt_compat.h" #include "opt_sysvipc.h" @@ -180,7 +180,6 @@ static int shm_use_phys; static int shm_allow_removed; -SYSCTL_DECL(_kern_ipc); SYSCTL_ULONG(_kern_ipc, OID_AUTO, shmmax, CTLFLAG_RW, &shminfo.shmmax, 0, "Maximum shared memory segment size"); SYSCTL_ULONG(_kern_ipc, OID_AUTO, shmmin, CTLFLAG_RW, &shminfo.shmmin, 0, ==== //depot/projects/arm/src/sys/kern/uipc_mbuf.c#12 (text+ko) ==== @@ -30,7 +30,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/uipc_mbuf.c,v 1.165 2006/03/15 21:11:11 sam Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/uipc_mbuf.c,v 1.166 2006/06/10 14:34:07 rwatson Exp $"); #include "opt_mac.h" #include "opt_param.h" @@ -64,7 +64,6 @@ /* * sysctl(8) exported objects */ -SYSCTL_DECL(_kern_ipc); SYSCTL_INT(_kern_ipc, KIPC_MAX_LINKHDR, max_linkhdr, CTLFLAG_RD, &max_linkhdr, 0, "Size of largest link layer header"); SYSCTL_INT(_kern_ipc, KIPC_MAX_PROTOHDR, max_protohdr, CTLFLAG_RD, ==== //depot/projects/arm/src/sys/kern/uipc_socket.c#13 (text+ko) ==== @@ -89,7 +89,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.267 2006/06/08 22:33:18 rwatson Exp $"); >>> TRUNCATED FOR MAIL (1000 lines) <<<