linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] irqchip/loongarch: Fix irq_domain_alloc_fwnode() abuse
@ 2022-08-08 10:50 Marc Zyngier
  2022-08-08 12:05 ` Jianmin Lv
  2022-08-09  5:57 ` [irqchip: irq/irqchip-fixes] " irqchip-bot for Marc Zyngier
  0 siblings, 2 replies; 5+ messages in thread
From: Marc Zyngier @ 2022-08-08 10:50 UTC (permalink / raw)
  To: linux-kernel; +Cc: chenhuacai, lvjianmin, Thomas Gleixner

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>
---
 drivers/irqchip/irq-loongarch-cpu.c    | 2 +-
 drivers/irqchip/irq-loongson-eiointc.c | 3 ++-
 drivers/irqchip/irq-loongson-liointc.c | 2 +-
 drivers/irqchip/irq-loongson-pch-msi.c | 2 +-
 drivers/irqchip/irq-loongson-pch-pic.c | 2 +-
 5 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/irqchip/irq-loongarch-cpu.c b/drivers/irqchip/irq-loongarch-cpu.c
index 327f3ab62c03..741612ba6a52 100644
--- a/drivers/irqchip/irq-loongarch-cpu.c
+++ b/drivers/irqchip/irq-loongarch-cpu.c
@@ -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);
 
diff --git a/drivers/irqchip/irq-loongson-eiointc.c b/drivers/irqchip/irq-loongson-eiointc.c
index bffb7b3128e8..16e9af8d8b1e 100644
--- a/drivers/irqchip/irq-loongson-eiointc.c
+++ b/drivers/irqchip/irq-loongson-eiointc.c
@@ -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;
diff --git a/drivers/irqchip/irq-loongson-liointc.c b/drivers/irqchip/irq-loongson-liointc.c
index c4f3c886ad61..acd1a4b897df 100644
--- a/drivers/irqchip/irq-loongson-liointc.c
+++ b/drivers/irqchip/irq-loongson-liointc.c
@@ -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;
diff --git a/drivers/irqchip/irq-loongson-pch-msi.c b/drivers/irqchip/irq-loongson-pch-msi.c
index d0e8551bebfa..a72ede90ffc6 100644
--- a/drivers/irqchip/irq-loongson-pch-msi.c
+++ b/drivers/irqchip/irq-loongson-pch-msi.c
@@ -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)
diff --git a/drivers/irqchip/irq-loongson-pch-pic.c b/drivers/irqchip/irq-loongson-pch-pic.c
index b987b6517d59..c01b9c257005 100644
--- a/drivers/irqchip/irq-loongson-pch-pic.c
+++ b/drivers/irqchip/irq-loongson-pch-pic.c
@@ -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;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] irqchip/loongarch: Fix irq_domain_alloc_fwnode() abuse
  2022-08-08 10:50 [PATCH] irqchip/loongarch: Fix irq_domain_alloc_fwnode() abuse Marc Zyngier
@ 2022-08-08 12:05 ` Jianmin Lv
  2022-08-08 15:16   ` Marc Zyngier
  2022-08-09  5:57 ` [irqchip: irq/irqchip-fixes] " irqchip-bot for Marc Zyngier
  1 sibling, 1 reply; 5+ messages in thread
From: Jianmin Lv @ 2022-08-08 12:05 UTC (permalink / raw)
  To: Marc Zyngier, linux-kernel; +Cc: chenhuacai, Thomas Gleixner

Hi, Marc

Yes, I think that's right. Thanks for your patch to fix them.

On 2022/8/8 下午6:50, Marc Zyngier wrote:
> 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>
> ---
>   drivers/irqchip/irq-loongarch-cpu.c    | 2 +-
>   drivers/irqchip/irq-loongson-eiointc.c | 3 ++-
>   drivers/irqchip/irq-loongson-liointc.c | 2 +-
>   drivers/irqchip/irq-loongson-pch-msi.c | 2 +-
>   drivers/irqchip/irq-loongson-pch-pic.c | 2 +-
>   5 files changed, 6 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/irqchip/irq-loongarch-cpu.c b/drivers/irqchip/irq-loongarch-cpu.c
> index 327f3ab62c03..741612ba6a52 100644
> --- a/drivers/irqchip/irq-loongarch-cpu.c
> +++ b/drivers/irqchip/irq-loongarch-cpu.c
> @@ -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);
>   
> diff --git a/drivers/irqchip/irq-loongson-eiointc.c b/drivers/irqchip/irq-loongson-eiointc.c
> index bffb7b3128e8..16e9af8d8b1e 100644
> --- a/drivers/irqchip/irq-loongson-eiointc.c
> +++ b/drivers/irqchip/irq-loongson-eiointc.c
> @@ -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;
> diff --git a/drivers/irqchip/irq-loongson-liointc.c b/drivers/irqchip/irq-loongson-liointc.c
> index c4f3c886ad61..acd1a4b897df 100644
> --- a/drivers/irqchip/irq-loongson-liointc.c
> +++ b/drivers/irqchip/irq-loongson-liointc.c
> @@ -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;
> diff --git a/drivers/irqchip/irq-loongson-pch-msi.c b/drivers/irqchip/irq-loongson-pch-msi.c
> index d0e8551bebfa..a72ede90ffc6 100644
> --- a/drivers/irqchip/irq-loongson-pch-msi.c
> +++ b/drivers/irqchip/irq-loongson-pch-msi.c
> @@ -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)
> diff --git a/drivers/irqchip/irq-loongson-pch-pic.c b/drivers/irqchip/irq-loongson-pch-pic.c
> index b987b6517d59..c01b9c257005 100644
> --- a/drivers/irqchip/irq-loongson-pch-pic.c
> +++ b/drivers/irqchip/irq-loongson-pch-pic.c
> @@ -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;
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] irqchip/loongarch: Fix irq_domain_alloc_fwnode() abuse
  2022-08-08 12:05 ` Jianmin Lv
@ 2022-08-08 15:16   ` Marc Zyngier
  2022-08-09  1:00     ` Jianmin Lv
  0 siblings, 1 reply; 5+ messages in thread
From: Marc Zyngier @ 2022-08-08 15:16 UTC (permalink / raw)
  To: Jianmin Lv; +Cc: linux-kernel, chenhuacai, Thomas Gleixner

Hi Jianmin,

On Mon, 08 Aug 2022 13:05:27 +0100,
Jianmin Lv <lvjianmin@loongson.cn> wrote:
> 
> Hi, Marc
> 
> Yes, I think that's right. Thanks for your patch to fix them.

Thanks for having a look. Is that an Acked-by? A Reviewed-by? Or just
a comment?

Thanks,

	M.

-- 
Without deviation from the norm, progress is not possible.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] irqchip/loongarch: Fix irq_domain_alloc_fwnode() abuse
  2022-08-08 15:16   ` Marc Zyngier
@ 2022-08-09  1:00     ` Jianmin Lv
  0 siblings, 0 replies; 5+ messages in thread
From: Jianmin Lv @ 2022-08-09  1:00 UTC (permalink / raw)
  To: Marc Zyngier; +Cc: linux-kernel, chenhuacai, Thomas Gleixner



On 2022/8/8 下午11:16, Marc Zyngier wrote:
> Hi Jianmin,
> 
> On Mon, 08 Aug 2022 13:05:27 +0100,
> Jianmin Lv <lvjianmin@loongson.cn> wrote:
>>
>> Hi, Marc
>>
>> Yes, I think that's right. Thanks for your patch to fix them.
> 
> Thanks for having a look. Is that an Acked-by? A Reviewed-by? Or just
> a comment?
> 
> Thanks,
> 
> 	M.
> 

Reviewed-by: Jianmin Lv <lvjianmin@loongson.cn>

Thanks.


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [irqchip: irq/irqchip-fixes] irqchip/loongarch: Fix irq_domain_alloc_fwnode() abuse
  2022-08-08 10:50 [PATCH] irqchip/loongarch: Fix irq_domain_alloc_fwnode() abuse Marc Zyngier
  2022-08-08 12:05 ` Jianmin Lv
@ 2022-08-09  5:57 ` irqchip-bot for Marc Zyngier
  1 sibling, 0 replies; 5+ messages in thread
From: irqchip-bot for Marc Zyngier @ 2022-08-09  5:57 UTC (permalink / raw)
  To: linux-kernel; +Cc: Marc Zyngier, Jianmin Lv, tglx

The following commit has been merged into the irq/irqchip-fixes branch of irqchip:

Commit-ID:     7e4fd7a1a6fdf23d069eeb0ae0e8e46b9fb40723
Gitweb:        https://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms/7e4fd7a1a6fdf23d069eeb0ae0e8e46b9fb40723
Author:        Marc Zyngier <maz@kernel.org>
AuthorDate:    Mon, 08 Aug 2022 11:50:20 +01:00
Committer:     Marc Zyngier <maz@kernel.org>
CommitterDate: Tue, 09 Aug 2022 06:54:05 +01:00

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
---
 drivers/irqchip/irq-loongarch-cpu.c    | 2 +-
 drivers/irqchip/irq-loongson-eiointc.c | 3 ++-
 drivers/irqchip/irq-loongson-liointc.c | 2 +-
 drivers/irqchip/irq-loongson-pch-msi.c | 2 +-
 drivers/irqchip/irq-loongson-pch-pic.c | 2 +-
 5 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/irqchip/irq-loongarch-cpu.c b/drivers/irqchip/irq-loongarch-cpu.c
index 327f3ab..741612b 100644
--- a/drivers/irqchip/irq-loongarch-cpu.c
+++ b/drivers/irqchip/irq-loongarch-cpu.c
@@ -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);
 
diff --git a/drivers/irqchip/irq-loongson-eiointc.c b/drivers/irqchip/irq-loongson-eiointc.c
index bffb7b3..16e9af8 100644
--- a/drivers/irqchip/irq-loongson-eiointc.c
+++ b/drivers/irqchip/irq-loongson-eiointc.c
@@ -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;
diff --git a/drivers/irqchip/irq-loongson-liointc.c b/drivers/irqchip/irq-loongson-liointc.c
index c4f3c88..acd1a4b 100644
--- a/drivers/irqchip/irq-loongson-liointc.c
+++ b/drivers/irqchip/irq-loongson-liointc.c
@@ -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;
diff --git a/drivers/irqchip/irq-loongson-pch-msi.c b/drivers/irqchip/irq-loongson-pch-msi.c
index d0e8551..a72ede9 100644
--- a/drivers/irqchip/irq-loongson-pch-msi.c
+++ b/drivers/irqchip/irq-loongson-pch-msi.c
@@ -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)
diff --git a/drivers/irqchip/irq-loongson-pch-pic.c b/drivers/irqchip/irq-loongson-pch-pic.c
index b987b65..c01b9c2 100644
--- a/drivers/irqchip/irq-loongson-pch-pic.c
+++ b/drivers/irqchip/irq-loongson-pch-pic.c
@@ -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;

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2022-08-09  5:57 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-08 10:50 [PATCH] irqchip/loongarch: Fix irq_domain_alloc_fwnode() abuse Marc Zyngier
2022-08-08 12:05 ` Jianmin Lv
2022-08-08 15:16   ` Marc Zyngier
2022-08-09  1:00     ` Jianmin Lv
2022-08-09  5:57 ` [irqchip: irq/irqchip-fixes] " irqchip-bot for Marc Zyngier

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).