Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 22 Mar 2002 15:00:10 -0800 (PST)
From:      Alan Larson <larson@eng.paix.net>
To:        freebsd-bugs@freebsd.org
Subject:   halt -p doesn't if apm not enabled.
Message-ID:  <200203222300.PAA30437@ground0.paix.net>

next in thread | raw e-mail | index | archive | help

email address:	larson@paix.net

name:		Alan Larson

organization:	PAIX.net

summary:	halt -p = reboot(RB_POWEROFF) doesn't halt if apm not enabled

category:	kernel

severity:	non-critical

priority:	low

class:		sw-bug

freebsd version:  4.3 and later

Full description:
  halt -p would halt the system, but not power down.  Power down
was known to work for windows 2k.  Investigation revealed that
apm_power_off() in apm.c was testing the softc to see if it was
active.

  It appears to be unnecessary for the apm to be active to issue
the bios call to power the machine down.

  A context diff of the correction is included.

  While investigating this, I defined APM_DEBUG and discovered a
couple problems in printf formats.  They are also corrected in
the diff, and should be included.

How to repeat the problem:
	su		# many fun things start with this.
	apm -e 0	# only needed if it was already on.
	halt -p		# you did save your work first, didn't you?

Fix to the problem:
  The following diff should do it just fine.

*** apm.ccO	Fri Mar 22 14:09:17 2002
--- apm.cc	Fri Mar 22 14:15:10 2002
***************
*** 285,293 ****
  {
  	struct apm_softc *sc = &apm_softc;
  
! 	/* Not halting powering off, or not active */
! 	if (!(howto & RB_POWEROFF) || !apm_softc.active)
! 		return;
  	sc->bios.r.eax = (APM_BIOS << 8) | APM_SETPWSTATE;
  	sc->bios.r.ebx = PMDV_ALLDEV;
  	sc->bios.r.ecx = PMST_OFF;
--- 285,292 ----
  {
  	struct apm_softc *sc = &apm_softc;
  
! 	if (!(howto & RB_POWEROFF))	/* Powering off? */
! 		return;			/* no */
  	sc->bios.r.eax = (APM_BIOS << 8) | APM_SETPWSTATE;
  	sc->bios.r.ebx = PMDV_ALLDEV;
  	sc->bios.r.ecx = PMST_OFF;
***************
*** 1041,1047 ****
  
  	/* print bootstrap messages */
  #ifdef APM_DEBUG
! 	printf("apm: APM BIOS version %04x\n",  apm_version);
  	printf("apm: Code16 0x%08x, Data 0x%08x\n",
                 sc->bios.seg.code16.base, sc->bios.seg.data.base);
  	printf("apm: Code entry 0x%08x, Idling CPU %s, Management %s\n",
--- 1040,1046 ----
  
  	/* print bootstrap messages */
  #ifdef APM_DEBUG
! 	printf("apm: APM BIOS version %04lx\n",  apm_version);
  	printf("apm: Code16 0x%08x, Data 0x%08x\n",
                 sc->bios.seg.code16.base, sc->bios.seg.data.base);
  	printf("apm: Code entry 0x%08x, Idling CPU %s, Management %s\n",
***************
*** 1191,1197 ****
  	if (!sc->initialized)
  		return (ENXIO);
  #ifdef APM_DEBUG
! 	printf("APM ioctl: cmd = 0x%x\n", cmd);
  #endif
  	switch (cmd) {
  	case APMIO_SUSPEND:
--- 1190,1196 ----
  	if (!sc->initialized)
  		return (ENXIO);
  #ifdef APM_DEBUG
! 	printf("APM ioctl: cmd = 0x%lx\n", cmd);
  #endif
  	switch (cmd) {
  	case APMIO_SUSPEND:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200203222300.PAA30437>