PERFORCE change 98953 for review
Warner Losh
imp at FreeBSD.org
Sat Jun 10 23:56:13 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=98953
Change 98953 by imp at 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 <sys/cdefs.h>
-__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 <sys/param.h>
@@ -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 <sys/cdefs.h>
-__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 <sys/param.h>
@@ -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 <sys/cdefs.h>
-__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 <sys/param.h>
@@ -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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <dev/mpt/mpt.h>
#include <dev/mpt/mpt_cam.h>
@@ -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 <sys/param.h>
@@ -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 <sys/param.h>
#include <sys/systm.h>
@@ -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 <sys/cdefs.h>
-__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 <sys/param.h>
#include <sys/bus.h>
@@ -52,8 +52,12 @@
#include <i386/bios/apm.h>
+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 <sys/cdefs.h>
-__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 <sys/param.h>
#include <sys/systm.h>
@@ -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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <sys/param.h>
#include <sys/kernel.h>
@@ -42,7 +42,6 @@
#include <sys/module.h>
#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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.267 2006/06/08 22:33:18 rwatson Exp $");
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list