mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
ACPI: OSL: Fix and clean up acpi_os_read/write_port()
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 <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
e783362eb5
commit
2e433a94da
@ -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;
|
||||
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user