]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
irqchip/loongarch: Fix irq_domain_alloc_fwnode() abuse
authorMarc Zyngier <maz@kernel.org>
Mon, 8 Aug 2022 10:50:20 +0000 (11:50 +0100)
committerMarc Zyngier <maz@kernel.org>
Tue, 9 Aug 2022 05:54:05 +0000 (06:54 +0100)
The recently merged LoongArch drivers paper over the lack of
topology information by creating a bunch of fwnodes for the
irqchips. So far, so good.

However, irq_domain_alloc_fwnode() is supposed to take a PA, and
not a kernel VA blindly cast as a PA, potentially disclosing
kernel VAs to userspace. In some other cases, even NULL is used
as the PA, which is entertaining.

Fix this by using the actual PA of the block when available,
and switch to a named fwnode in the other cases.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Jianmin Lv <lvjianmin@loongson.cn>
Link: https://lore.kernel.org/r/20220808105020.2689757-1-maz@kernel.org
drivers/irqchip/irq-loongarch-cpu.c
drivers/irqchip/irq-loongson-eiointc.c
drivers/irqchip/irq-loongson-liointc.c
drivers/irqchip/irq-loongson-pch-msi.c
drivers/irqchip/irq-loongson-pch-pic.c

index 327f3ab62c0360fffd8a60be33cf5947c4a657ff..741612ba6a5209e5fdc3382439fd749d54106283 100644 (file)
@@ -129,7 +129,7 @@ static int __init cpuintc_acpi_init(union acpi_subtable_headers *header,
        clear_csr_ecfg(ECFG0_IM);
        clear_csr_estat(ESTATF_IP);
 
-       cpuintc_handle = irq_domain_alloc_fwnode(NULL);
+       cpuintc_handle = irq_domain_alloc_named_fwnode("CPUINTC");
        irq_domain = irq_domain_create_linear(cpuintc_handle, EXCCODE_INT_NUM,
                                        &loongarch_cpu_intc_irq_domain_ops, NULL);
 
index bffb7b3128e8c3891cd57e92eb4413a9eacff84b..16e9af8d8b1eabb3d9c21223927aefb06a9cc481 100644 (file)
@@ -348,7 +348,8 @@ int __init eiointc_acpi_init(struct irq_domain *parent,
        if (!priv)
                return -ENOMEM;
 
-       priv->domain_handle = irq_domain_alloc_fwnode((phys_addr_t *)acpi_eiointc);
+       priv->domain_handle = irq_domain_alloc_named_id_fwnode("EIOPIC",
+                                                              acpi_eiointc->node);
        if (!priv->domain_handle) {
                pr_err("Unable to allocate domain handle\n");
                goto out_free_priv;
index c4f3c886ad6150dea1aca63311eba9662be87b5a..acd1a4b897df0d7e8ef247db78a7c4eee1f973c9 100644 (file)
@@ -360,7 +360,7 @@ int __init liointc_acpi_init(struct irq_domain *parent, struct acpi_madt_lio_pic
        parent_irq[0] = irq_create_mapping(parent, acpi_liointc->cascade[0]);
        parent_irq[1] = irq_create_mapping(parent, acpi_liointc->cascade[1]);
 
-       domain_handle = irq_domain_alloc_fwnode((phys_addr_t *)acpi_liointc);
+       domain_handle = irq_domain_alloc_fwnode(&acpi_liointc->address);
        if (!domain_handle) {
                pr_err("Unable to allocate domain handle\n");
                return -ENOMEM;
index d0e8551bebfab7bdb5b1962c6859b9eaaa20b88f..a72ede90ffc69a0b00cbf92e280d70cc30a57368 100644 (file)
@@ -282,7 +282,7 @@ int __init pch_msi_acpi_init(struct irq_domain *parent,
        int ret;
        struct fwnode_handle *domain_handle;
 
-       domain_handle = irq_domain_alloc_fwnode((phys_addr_t *)acpi_pchmsi);
+       domain_handle = irq_domain_alloc_fwnode(&acpi_pchmsi->msg_address);
        ret = pch_msi_init(acpi_pchmsi->msg_address, acpi_pchmsi->start,
                                acpi_pchmsi->count, parent, domain_handle);
        if (ret < 0)
index b987b6517d59b6855c3476dfce2b8f8554f578e7..c01b9c2570053aff8e5642d36eae0ec8e864d133 100644 (file)
@@ -349,7 +349,7 @@ int __init pch_pic_acpi_init(struct irq_domain *parent,
 
        vec_base = acpi_pchpic->gsi_base - GSI_MIN_PCH_IRQ;
 
-       domain_handle = irq_domain_alloc_fwnode((phys_addr_t *)acpi_pchpic);
+       domain_handle = irq_domain_alloc_fwnode(&acpi_pchpic->address);
        if (!domain_handle) {
                pr_err("Unable to allocate domain handle\n");
                return -ENOMEM;