Commit 10270d48 authored by Linus Torvalds's avatar Linus Torvalds

acpi: fix acpi_os_read_pci_configuration() misuse of raw_pci_read()

The raw_pci_read() interface (as the raw_pci_ops->read() before it)
unconditionally fills in a 32-bit integer return value regardless of the
size of the operation requested.

So claiming to take a "void *" is wrong, as is passing in a pointer to
just a byte variable.

Noticed by pageexec when enabling -fstack-protector (which needs other
patches too to actually work, but that's a separate issue).
Acked-by: default avatarLen Brown <len.brown@intel.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d897d2b5
...@@ -623,7 +623,7 @@ acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width) ...@@ -623,7 +623,7 @@ acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width)
acpi_status acpi_status
acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg, acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg,
void *value, u32 width) u32 *value, u32 width)
{ {
int result, size; int result, size;
...@@ -689,7 +689,6 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */ ...@@ -689,7 +689,6 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */
acpi_status status; acpi_status status;
unsigned long temp; unsigned long temp;
acpi_object_type type; acpi_object_type type;
u8 tu8;
acpi_get_parent(chandle, &handle); acpi_get_parent(chandle, &handle);
if (handle != rhandle) { if (handle != rhandle) {
...@@ -704,6 +703,7 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */ ...@@ -704,6 +703,7 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */
acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL,
&temp); &temp);
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
u32 val;
pci_id->device = ACPI_HIWORD(ACPI_LODWORD(temp)); pci_id->device = ACPI_HIWORD(ACPI_LODWORD(temp));
pci_id->function = ACPI_LOWORD(ACPI_LODWORD(temp)); pci_id->function = ACPI_LOWORD(ACPI_LODWORD(temp));
...@@ -712,24 +712,24 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */ ...@@ -712,24 +712,24 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */
/* any nicer way to get bus number of bridge ? */ /* any nicer way to get bus number of bridge ? */
status = status =
acpi_os_read_pci_configuration(pci_id, 0x0e, &tu8, acpi_os_read_pci_configuration(pci_id, 0x0e, &val,
8); 8);
if (ACPI_SUCCESS(status) if (ACPI_SUCCESS(status)
&& ((tu8 & 0x7f) == 1 || (tu8 & 0x7f) == 2)) { && ((val & 0x7f) == 1 || (val & 0x7f) == 2)) {
status = status =
acpi_os_read_pci_configuration(pci_id, 0x18, acpi_os_read_pci_configuration(pci_id, 0x18,
&tu8, 8); &val, 8);
if (!ACPI_SUCCESS(status)) { if (!ACPI_SUCCESS(status)) {
/* Certainly broken... FIX ME */ /* Certainly broken... FIX ME */
return; return;
} }
*is_bridge = 1; *is_bridge = 1;
pci_id->bus = tu8; pci_id->bus = val;
status = status =
acpi_os_read_pci_configuration(pci_id, 0x19, acpi_os_read_pci_configuration(pci_id, 0x19,
&tu8, 8); &val, 8);
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
*bus_number = tu8; *bus_number = val;
} }
} else } else
*is_bridge = 0; *is_bridge = 0;
......
...@@ -222,7 +222,7 @@ acpi_os_write_memory(acpi_physical_address address, u32 value, u32 width); ...@@ -222,7 +222,7 @@ acpi_os_write_memory(acpi_physical_address address, u32 value, u32 width);
*/ */
acpi_status acpi_status
acpi_os_read_pci_configuration(struct acpi_pci_id *pci_id, acpi_os_read_pci_configuration(struct acpi_pci_id *pci_id,
u32 reg, void *value, u32 width); u32 reg, u32 *value, u32 width);
acpi_status acpi_status
acpi_os_write_pci_configuration(struct acpi_pci_id *pci_id, acpi_os_write_pci_configuration(struct acpi_pci_id *pci_id,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment