Commit 2e433a94 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

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: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent e783362e
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -646,18 +646,20 @@ 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;