Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+6 -5
+1 -1
drivers/irqchip/irq-loongarch-cpu.c
··· 129 129 clear_csr_ecfg(ECFG0_IM); 130 130 clear_csr_estat(ESTATF_IP); 131 131 132 - cpuintc_handle = irq_domain_alloc_fwnode(NULL); 132 + cpuintc_handle = irq_domain_alloc_named_fwnode("CPUINTC"); 133 133 irq_domain = irq_domain_create_linear(cpuintc_handle, EXCCODE_INT_NUM, 134 134 &loongarch_cpu_intc_irq_domain_ops, NULL); 135 135
+2 -1
drivers/irqchip/irq-loongson-eiointc.c
··· 348 348 if (!priv) 349 349 return -ENOMEM; 350 350 351 - priv->domain_handle = irq_domain_alloc_fwnode((phys_addr_t *)acpi_eiointc); 351 + priv->domain_handle = irq_domain_alloc_named_id_fwnode("EIOPIC", 352 + acpi_eiointc->node); 352 353 if (!priv->domain_handle) { 353 354 pr_err("Unable to allocate domain handle\n"); 354 355 goto out_free_priv;
+1 -1
drivers/irqchip/irq-loongson-liointc.c
··· 360 360 parent_irq[0] = irq_create_mapping(parent, acpi_liointc->cascade[0]); 361 361 parent_irq[1] = irq_create_mapping(parent, acpi_liointc->cascade[1]); 362 362 363 - domain_handle = irq_domain_alloc_fwnode((phys_addr_t *)acpi_liointc); 363 + domain_handle = irq_domain_alloc_fwnode(&acpi_liointc->address); 364 364 if (!domain_handle) { 365 365 pr_err("Unable to allocate domain handle\n"); 366 366 return -ENOMEM;
+1 -1
drivers/irqchip/irq-loongson-pch-msi.c
··· 282 282 int ret; 283 283 struct fwnode_handle *domain_handle; 284 284 285 - domain_handle = irq_domain_alloc_fwnode((phys_addr_t *)acpi_pchmsi); 285 + domain_handle = irq_domain_alloc_fwnode(&acpi_pchmsi->msg_address); 286 286 ret = pch_msi_init(acpi_pchmsi->msg_address, acpi_pchmsi->start, 287 287 acpi_pchmsi->count, parent, domain_handle); 288 288 if (ret < 0)
+1 -1
drivers/irqchip/irq-loongson-pch-pic.c
··· 349 349 350 350 vec_base = acpi_pchpic->gsi_base - GSI_MIN_PCH_IRQ; 351 351 352 - domain_handle = irq_domain_alloc_fwnode((phys_addr_t *)acpi_pchpic); 352 + domain_handle = irq_domain_alloc_fwnode(&acpi_pchpic->address); 353 353 if (!domain_handle) { 354 354 pr_err("Unable to allocate domain handle\n"); 355 355 return -ENOMEM;