irqchip/loongarch: Fix irq_domain_alloc_fwnode() abuse
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
This commit is contained in:
parent
fda7409a8f
commit
7e4fd7a1a6
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue