From owner-freebsd-bugs Fri Mar 22 15: 2: 2 2002 Delivered-To: freebsd-bugs@freebsd.org Received: from ground0.paix.net (ground0.paix.net [128.177.247.242]) by hub.freebsd.org (Postfix) with ESMTP id 317CF37B437 for ; Fri, 22 Mar 2002 15:00:11 -0800 (PST) Received: (from larson@localhost) by ground0.paix.net (8.9.3/8.9.1) id PAA30437; Fri, 22 Mar 2002 15:00:10 -0800 (PST) env-from (larson@eng.paix.net) Date: Fri, 22 Mar 2002 15:00:10 -0800 (PST) From: Alan Larson Message-Id: <200203222300.PAA30437@ground0.paix.net> To: freebsd-bugs@freebsd.org Subject: halt -p doesn't if apm not enabled. Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org 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