aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2008-02-13 12:56:14 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2008-02-13 12:56:14 -0500
commit10270d4838bdc493781f5a1cf2e90e9c34c9142f (patch)
treed9bce90a79be42ffd619b65b42e9a699bf0d13a6
parentd897d2b597167586fcf1fb197ad5a1c23332c3e8 (diff)
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: Len Brown <len.brown@intel.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/acpi/osl.c16
-rw-r--r--include/acpi/acpiosxf.h2
2 files changed, 9 insertions, 9 deletions
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index 34b3386dedca..15e602377655 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -623,7 +623,7 @@ acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width)
623 623
624acpi_status 624acpi_status
625acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg, 625acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg,
626 void *value, u32 width) 626 u32 *value, u32 width)
627{ 627{
628 int result, size; 628 int result, size;
629 629
@@ -689,7 +689,6 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */
689 acpi_status status; 689 acpi_status status;
690 unsigned long temp; 690 unsigned long temp;
691 acpi_object_type type; 691 acpi_object_type type;
692 u8 tu8;
693 692
694 acpi_get_parent(chandle, &handle); 693 acpi_get_parent(chandle, &handle);
695 if (handle != rhandle) { 694 if (handle != rhandle) {
@@ -704,6 +703,7 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */
704 acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, 703 acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL,
705 &temp); 704 &temp);
706 if (ACPI_SUCCESS(status)) { 705 if (ACPI_SUCCESS(status)) {
706 u32 val;
707 pci_id->device = ACPI_HIWORD(ACPI_LODWORD(temp)); 707 pci_id->device = ACPI_HIWORD(ACPI_LODWORD(temp));
708 pci_id->function = ACPI_LOWORD(ACPI_LODWORD(temp)); 708 pci_id->function = ACPI_LOWORD(ACPI_LODWORD(temp));
709 709
@@ -712,24 +712,24 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */
712 712
713 /* any nicer way to get bus number of bridge ? */ 713 /* any nicer way to get bus number of bridge ? */
714 status = 714 status =
715 acpi_os_read_pci_configuration(pci_id, 0x0e, &tu8, 715 acpi_os_read_pci_configuration(pci_id, 0x0e, &val,
716 8); 716 8);
717 if (ACPI_SUCCESS(status) 717 if (ACPI_SUCCESS(status)
718 && ((tu8 & 0x7f) == 1 || (tu8 & 0x7f) == 2)) { 718 && ((val & 0x7f) == 1 || (val & 0x7f) == 2)) {
719 status = 719 status =
720 acpi_os_read_pci_configuration(pci_id, 0x18, 720 acpi_os_read_pci_configuration(pci_id, 0x18,
721 &tu8, 8); 721 &val, 8);
722 if (!ACPI_SUCCESS(status)) { 722 if (!ACPI_SUCCESS(status)) {
723 /* Certainly broken... FIX ME */ 723 /* Certainly broken... FIX ME */
724 return; 724 return;
725 } 725 }
726 *is_bridge = 1; 726 *is_bridge = 1;
727 pci_id->bus = tu8; 727 pci_id->bus = val;
728 status = 728 status =
729 acpi_os_read_pci_configuration(pci_id, 0x19, 729 acpi_os_read_pci_configuration(pci_id, 0x19,
730 &tu8, 8); 730 &val, 8);
731 if (ACPI_SUCCESS(status)) { 731 if (ACPI_SUCCESS(status)) {
732 *bus_number = tu8; 732 *bus_number = val;
733 } 733 }
734 } else 734 } else
735 *is_bridge = 0; 735 *is_bridge = 0;
diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h
index 022a5fd80c8e..4839f2af94c3 100644
--- a/include/acpi/acpiosxf.h
+++ b/include/acpi/acpiosxf.h
@@ -222,7 +222,7 @@ acpi_os_write_memory(acpi_physical_address address, u32 value, u32 width);
222 */ 222 */
223acpi_status 223acpi_status
224acpi_os_read_pci_configuration(struct acpi_pci_id *pci_id, 224acpi_os_read_pci_configuration(struct acpi_pci_id *pci_id,
225 u32 reg, void *value, u32 width); 225 u32 reg, u32 *value, u32 width);
226 226
227acpi_status 227acpi_status
228acpi_os_write_pci_configuration(struct acpi_pci_id *pci_id, 228acpi_os_write_pci_configuration(struct acpi_pci_id *pci_id,