Skip to content

Commit

Permalink
acpi/apm: Improve APM ioctl interface emulation
Browse files Browse the repository at this point in the history
The apm(8) program documents certain states, but doesn't document the
'unknown' state. It reports things correctly for systems with a battery,
but incorrectly for systems without one. Emulate the old interface a
little better by saying ac power is online if we have no status (instead
of unknown), the battery has a high charge of 255% if there's no battery
(instead of -1). Programs, like emacs, expect to see only the documented
values and misbehave when they see something else.

This is closer to what would happen on old-school APM machines. Sadly
(or not) I have no access to old-school APM machines to 100% confirm
this, but reading the spec, old code and testing with emacs' mode line
with battery suggests these values are more correct. emacs has never
been converted to acpi_conf due to permissions issues with acpi devices.

Fixing the kernel is preferable to hacking apm(8) for these special
cases because other programs that use these interfaces will also be more
correct. The kernel also has more data with which to decide what to
return.

Sponsored by:	Netflix
MFC After:	1 week
  • Loading branch information
bsdimp committed Jan 11, 2024
1 parent a61d2c7 commit 8a3fafc
Showing 1 changed file with 8 additions and 8 deletions.
16 changes: 8 additions & 8 deletions sys/x86/acpica/acpi_apm.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,18 +141,18 @@ acpi_capm_get_info(apm_info_t aip)
aip->ai_capabilities= 0xff00; /* unknown */

if (acpi_acad_get_acline(&acline))
aip->ai_acline = APM_UNKNOWN; /* unknown */
aip->ai_acline = 1; /* no info -- on-line best guess */
else
aip->ai_acline = acline; /* on/off */

if (acpi_battery_get_battinfo(NULL, &batt) != 0) {
aip->ai_batt_stat = APM_UNKNOWN;
aip->ai_batt_life = APM_UNKNOWN;
aip->ai_batt_time = -1; /* unknown */
aip->ai_batteries = ~0U; /* unknown */
aip->ai_batt_stat = 0; /* "high" old I/F has no unknown state */
aip->ai_batt_life = 255; /* N/A, not -1 */
aip->ai_batt_time = -1; /* unknown */
aip->ai_batteries = ~0U; /* unknown */
} else {
aip->ai_batt_stat = acpi_capm_convert_battstate(&batt);
aip->ai_batt_life = batt.cap;
aip->ai_batt_life = (batt.cap == -1) ? 255 : batt.cap;
aip->ai_batt_time = (batt.min == -1) ? -1 : batt.min * 60;
aip->ai_batteries = acpi_battery_get_units();
}
Expand Down Expand Up @@ -186,11 +186,11 @@ acpi_capm_get_pwstatus(apm_pwstatus_t app)

app->ap_batt_stat = acpi_capm_convert_battstate(&batt);
app->ap_batt_flag = acpi_capm_convert_battflags(&batt);
app->ap_batt_life = batt.cap;
app->ap_batt_life = (batt.cap == -1) ? 255 : batt.cap;
app->ap_batt_time = (batt.min == -1) ? -1 : batt.min * 60;

if (acpi_acad_get_acline(&acline))
app->ap_acline = APM_UNKNOWN;
app->ap_acline = 1; /* no info -- on-line best guess */
else
app->ap_acline = acline; /* on/off */

Expand Down

0 comments on commit 8a3fafc

Please sign in to comment.