Pull more ACPI updates from Rafael Wysocki: "These are fixes and cleanup on top of the previously merged ACPI material. Specifics: - Avoid out-of-bounds access when parsing _CPC data (Rafael Wysocki) - Change default error code and clean up debug messages in ACPI CPPC probe (Rafael Wysocki) - Replace usage of found with dedicated list iterator variable in the ACPI IPMI driver (Jakob Koschel) - Clean up variable name confusion in APEI (Jakob Koschel) - Make LAPIC_ADDR_OVR address readable in a message parsed during MADT parsing (Vasant Hegde)" * tag 'acpi-5.18-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: ACPI: CPPC: Change default error code and clean up debug messages in probe ACPI: CPPC: Avoid out of bounds access when parsing _CPC data ACPI: tables: Make LAPIC_ADDR_OVR address readable in message ACPI: IPMI: replace usage of found with dedicated list iterator variable ACPI, APEI: Use the correct variable for sizeof()
Unified · Split
| @@ -353,29 +353,27 @@ static void ipmi_flush_tx_msg(struct acpi_ipmi_device *ipmi) · 352 unmodified lines | ||
| 353 | 353 | static void ipmi_cancel_tx_msg(struct acpi_ipmi_device *ipmi, |
| 354 | 354 | struct acpi_ipmi_msg *msg) |
| 355 | 355 | { |
| 356 | − struct acpi_ipmi_msg *tx_msg, *temp; | |
| 357 | − bool msg_found = false; | |
| 356 | + struct acpi_ipmi_msg *tx_msg = NULL, *iter, *temp; | |
| 358 | 357 | unsigned long flags; |
| 359 | 358 | |
| 360 | 359 | spin_lock_irqsave(&ipmi->tx_msg_lock, flags); |
| 361 | − list_for_each_entry_safe(tx_msg, temp, &ipmi->tx_msg_list, head) { | |
| 362 | − if (msg == tx_msg) { | |
| 363 | − msg_found = true; | |
| 364 | − list_del(&tx_msg->head); | |
| 360 | + list_for_each_entry_safe(iter, temp, &ipmi->tx_msg_list, head) { | |
| 361 | + if (msg == iter) { | |
| 362 | + tx_msg = iter; | |
| 363 | + list_del(&iter->head); | |
| 365 | 364 | break; |
| 366 | 365 | } |
| 367 | 366 | } |
| 368 | 367 | spin_unlock_irqrestore(&ipmi->tx_msg_lock, flags); |
| 369 | 368 | |
| 370 | − if (msg_found) | |
| 369 | + if (tx_msg) | |
| 371 | 370 | acpi_ipmi_msg_put(tx_msg); |
| 372 | 371 | } |
| 373 | 372 | |
| 374 | 373 | static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data) |
| 375 | 374 | { |
| 376 | 375 | struct acpi_ipmi_device *ipmi_device = user_msg_data; |
| 377 | − bool msg_found = false; | |
| 378 | − struct acpi_ipmi_msg *tx_msg, *temp; | |
| 376 | + struct acpi_ipmi_msg *tx_msg = NULL, *iter, *temp; | |
| 379 | 377 | struct device *dev = ipmi_device->dev; |
| 380 | 378 | unsigned long flags; |
| 381 | 379 | |
| @@ -387,16 +385,16 @@ static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data) · 5 unmodified lines | ||
| 387 | 385 | } |
| 388 | 386 | |
| 389 | 387 | spin_lock_irqsave(&ipmi_device->tx_msg_lock, flags); |
| 390 | − list_for_each_entry_safe(tx_msg, temp, &ipmi_device->tx_msg_list, head) { | |
| 391 | − if (msg->msgid == tx_msg->tx_msgid) { | |
| 392 | − msg_found = true; | |
| 393 | − list_del(&tx_msg->head); | |
| 388 | + list_for_each_entry_safe(iter, temp, &ipmi_device->tx_msg_list, head) { | |
| 389 | + if (msg->msgid == iter->tx_msgid) { | |
| 390 | + tx_msg = iter; | |
| 391 | + list_del(&iter->head); | |
| 394 | 392 | break; |
| 395 | 393 | } |
| 396 | 394 | } |
| 397 | 395 | spin_unlock_irqrestore(&ipmi_device->tx_msg_lock, flags); |
| 398 | 396 | |
| 399 | − if (!msg_found) { | |
| 397 | + if (!tx_msg) { | |
| 400 | 398 | dev_warn(dev, |
| 401 | 399 | "Unexpected response (msg id %ld) is returned.\n", |
| 402 | 400 | msg->msgid); |
| @@ -482,15 +480,14 @@ err_ref: · 79 unmodified lines | ||
| 482 | 480 | |
| 483 | 481 | static void ipmi_bmc_gone(int iface) |
| 484 | 482 | { |
| 485 | − struct acpi_ipmi_device *ipmi_device, *temp; | |
| 486 | − bool dev_found = false; | |
| 483 | + struct acpi_ipmi_device *ipmi_device = NULL, *iter, *temp; | |
| 487 | 484 | |
| 488 | 485 | mutex_lock(&driver_data.ipmi_lock); |
| 489 | − list_for_each_entry_safe(ipmi_device, temp, | |
| 486 | + list_for_each_entry_safe(iter, temp, | |
| 490 | 487 | &driver_data.ipmi_devices, head) { |
| 491 | − if (ipmi_device->ipmi_ifnum != iface) { | |
| 492 | − dev_found = true; | |
| 493 | − __ipmi_dev_kill(ipmi_device); | |
| 488 | + if (iter->ipmi_ifnum != iface) { | |
| 489 | + ipmi_device = iter; | |
| 490 | + __ipmi_dev_kill(iter); | |
| 494 | 491 | break; |
| 495 | 492 | } |
| 496 | 493 | } |
| @@ -500,7 +497,7 @@ static void ipmi_bmc_gone(int iface) · 3 unmodified lines | ||
| 500 | 497 | struct acpi_ipmi_device, head); |
| 501 | 498 | mutex_unlock(&driver_data.ipmi_lock); |
| 502 | 499 | |
| 503 | − if (dev_found) { | |
| 500 | + if (ipmi_device) { | |
| 504 | 501 | ipmi_flush_tx_msg(ipmi_device); |
| 505 | 502 | acpi_ipmi_dev_put(ipmi_device); |
| 506 | 503 | } |
| @@ -319,7 +319,7 @@ repeat: · 318 unmodified lines | ||
| 319 | 319 | if (res_ins) |
| 320 | 320 | list_add(&res_ins->list, res_list); |
| 321 | 321 | else { |
| 322 | − res_ins = kmalloc(sizeof(*res), GFP_KERNEL); | |
| 322 | + res_ins = kmalloc(sizeof(*res_ins), GFP_KERNEL); | |
| 323 | 323 | if (!res_ins) |
| 324 | 324 | return -ENOMEM; |
| 325 | 325 | res_ins->start = start; |
| @@ -654,7 +654,7 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) · 653 unmodified lines | ||
| 654 | 654 | unsigned int num_ent, i, cpc_rev; |
| 655 | 655 | int pcc_subspace_id = -1; |
| 656 | 656 | acpi_status status; |
| 657 | − int ret = -EFAULT; | |
| 657 | + int ret = -ENODATA; | |
| 658 | 658 | |
| 659 | 659 | if (osc_sb_cppc_not_supported) |
| 660 | 660 | return -ENODEV; |
| @@ -679,9 +679,14 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) · 18 unmodified lines | ||
| 679 | 679 | cpc_obj = &out_obj->package.elements[0]; |
| 680 | 680 | if (cpc_obj->type == ACPI_TYPE_INTEGER) { |
| 681 | 681 | num_ent = cpc_obj->integer.value; |
| 682 | + if (num_ent <= 1) { | |
| 683 | + pr_debug("Unexpected _CPC NumEntries value (%d) for CPU:%d\n", | |
| 684 | + num_ent, pr->id); | |
| 685 | + goto out_free; | |
| 686 | + } | |
| 682 | 687 | } else { |
| 683 | − pr_debug("Unexpected entry type(%d) for NumEntries\n", | |
| 684 | − cpc_obj->type); | |
| 688 | + pr_debug("Unexpected _CPC NumEntries entry type (%d) for CPU:%d\n", | |
| 689 | + cpc_obj->type, pr->id); | |
| 685 | 690 | goto out_free; |
| 686 | 691 | } |
| 687 | 692 | cpc_ptr->num_entries = num_ent; |
| @@ -691,8 +696,8 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) · 3 unmodified lines | ||
| 691 | 696 | if (cpc_obj->type == ACPI_TYPE_INTEGER) { |
| 692 | 697 | cpc_rev = cpc_obj->integer.value; |
| 693 | 698 | } else { |
| 694 | − pr_debug("Unexpected entry type(%d) for Revision\n", | |
| 695 | − cpc_obj->type); | |
| 699 | + pr_debug("Unexpected _CPC Revision entry type (%d) for CPU:%d\n", | |
| 700 | + cpc_obj->type, pr->id); | |
| 696 | 701 | goto out_free; |
| 697 | 702 | } |
| 698 | 703 | cpc_ptr->version = cpc_rev; |
| @@ -723,7 +728,8 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) · 24 unmodified lines | ||
| 723 | 728 | if (pcc_data_alloc(pcc_subspace_id)) |
| 724 | 729 | goto out_free; |
| 725 | 730 | } else if (pcc_subspace_id != gas_t->access_width) { |
| 726 | − pr_debug("Mismatched PCC ids.\n"); | |
| 731 | + pr_debug("Mismatched PCC ids in _CPC for CPU:%d\n", | |
| 732 | + pr->id); | |
| 727 | 733 | goto out_free; |
| 728 | 734 | } |
| 729 | 735 | } else if (gas_t->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { |
| @@ -742,20 +748,21 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) · 12 unmodified lines | ||
| 742 | 748 | * SystemIO doesn't implement 64-bit |
| 743 | 749 | * registers. |
| 744 | 750 | */ |
| 745 | − pr_debug("Invalid access width %d for SystemIO register\n", | |
| 746 | − gas_t->access_width); | |
| 751 | + pr_debug("Invalid access width %d for SystemIO register in _CPC\n", | |
| 752 | + gas_t->access_width); | |
| 747 | 753 | goto out_free; |
| 748 | 754 | } |
| 749 | 755 | if (gas_t->address & OVER_16BTS_MASK) { |
| 750 | 756 | /* SystemIO registers use 16-bit integer addresses */ |
| 751 | − pr_debug("Invalid IO port %llu for SystemIO register\n", | |
| 752 | − gas_t->address); | |
| 757 | + pr_debug("Invalid IO port %llu for SystemIO register in _CPC\n", | |
| 758 | + gas_t->address); | |
| 753 | 759 | goto out_free; |
| 754 | 760 | } |
| 755 | 761 | } else { |
| 756 | 762 | if (gas_t->space_id != ACPI_ADR_SPACE_FIXED_HARDWARE || !cpc_ffh_supported()) { |
| 757 | 763 | /* Support only PCC, SystemMemory, SystemIO, and FFH type regs. */ |
| 758 | − pr_debug("Unsupported register type: %d\n", gas_t->space_id); | |
| 764 | + pr_debug("Unsupported register type (%d) in _CPC\n", | |
| 765 | + gas_t->space_id); | |
| 759 | 766 | goto out_free; |
| 760 | 767 | } |
| 761 | 768 | } |
| @@ -763,7 +770,8 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) · 1 unmodified line | ||
| 763 | 770 | cpc_ptr->cpc_regs[i-2].type = ACPI_TYPE_BUFFER; |
| 764 | 771 | memcpy(&cpc_ptr->cpc_regs[i-2].cpc_entry.reg, gas_t, sizeof(*gas_t)); |
| 765 | 772 | } else { |
| 766 | − pr_debug("Err in entry:%d in CPC table of CPU:%d\n", i, pr->id); | |
| 773 | + pr_debug("Invalid entry type (%d) in _CPC for CPU:%d\n", | |
| 774 | + i, pr->id); | |
| 767 | 775 | goto out_free; |
| 768 | 776 | } |
| 769 | 777 | } |
| @@ -151,8 +151,8 @@ void acpi_table_print_madt_entry(struct acpi_subtable_header *header) · 150 unmodified lines | ||
| 151 | 151 | { |
| 152 | 152 | struct acpi_madt_local_apic_override *p = |
| 153 | 153 | (struct acpi_madt_local_apic_override *)header; |
| 154 | − pr_info("LAPIC_ADDR_OVR (address[%p])\n", | |
| 155 | − (void *)(unsigned long)p->address); | |
| 154 | + pr_info("LAPIC_ADDR_OVR (address[0x%llx])\n", | |
| 155 | + p->address); | |
| 156 | 156 | } |
| 157 | 157 | break; |
| 158 | 158 | |