Skip to content

Commit

Permalink
ACPI: OSL: Fix and clean up acpi_os_read/write_port()
Browse files Browse the repository at this point in the history
First, remove type casts that make acpi_os_read_port() only work on
little endian and are generally not needed.

Second, avoid clearing the memory pointed to by the value return
pointer in acpi_os_read_port() if it is the dummy on the stack (in
which case clearing it is not necessary).

Finally, prevent both acpi_os_read_port() and acpi_os_write_port()
from crashing the kernel when they receive an unsupported width
value and make them print a debug message and return an error instead.

Signed-off-by: Rafael J. Wysocki <[email protected]>
  • Loading branch information
rafaeljw committed Jan 25, 2022
1 parent e783362 commit 2e433a9
Showing 1 changed file with 11 additions and 8 deletions.
19 changes: 11 additions & 8 deletions drivers/acpi/osl.c
Original file line number Diff line number Diff line change
Expand Up @@ -642,22 +642,24 @@ u64 acpi_os_get_timer(void)
(ACPI_100NSEC_PER_SEC / HZ);
}

acpi_status acpi_os_read_port(acpi_io_address port, u32 * value, u32 width)
acpi_status acpi_os_read_port(acpi_io_address port, u32 *value, u32 width)
{
u32 dummy;

if (!value)
if (value)
*value = 0;
else
value = &dummy;

*value = 0;
if (width <= 8) {
*(u8 *) value = inb(port);
*value = inb(port);
} else if (width <= 16) {
*(u16 *) value = inw(port);
*value = inw(port);
} else if (width <= 32) {
*(u32 *) value = inl(port);
*value = inl(port);
} else {
BUG();
pr_debug("%s: Access width %d not supported\n", __func__, width);
return AE_BAD_PARAMETER;
}

return AE_OK;
Expand All @@ -674,7 +676,8 @@ acpi_status acpi_os_write_port(acpi_io_address port, u32 value, u32 width)
} else if (width <= 32) {
outl(value, port);
} else {
BUG();
pr_debug("%s: Access width %d not supported\n", __func__, width);
return AE_BAD_PARAMETER;
}

return AE_OK;
Expand Down

0 comments on commit 2e433a9

Please sign in to comment.