linux-acpi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] arm64: permit ACPI core to map kernel memory used for table overrides
@ 2020-09-29 13:25 Ard Biesheuvel
  2020-09-30 17:32 ` Jonathan Cameron
  2020-09-30 21:29 ` Catalin Marinas
  0 siblings, 2 replies; 3+ messages in thread
From: Ard Biesheuvel @ 2020-09-29 13:25 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-acpi, catalin.marinas, will, Jonathan.Cameron,
	Ard Biesheuvel, Sudeep Holla, Lorenzo Pieralisi

Jonathan reports that the strict policy for memory mapped by the
ACPI core breaks the use case of passing ACPI table overrides via
initramfs. This is due to the fact that the memory type used for
loading the initramfs in memory is not recognized as a memory type
that is typically used by firmware to pass firmware tables.

Since the purpose of the strict policy is to ensure that no AML or
other ACPI code can manipulate any memory that is used by the kernel
to keep its internal state or the state of user tasks, we can relax
the permission check, and allow mappings of memory that is reserved
and marked as NOMAP via memblock, and therefore not covered by the
linear mapping to begin with.

Cc: Sudeep Holla <sudeep.holla@arm.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Fixes: 1583052d111f ("arm64/acpi: disallow AML memory opregions to access kernel memory")
Fixes: 325f5585ec36 ("arm64/acpi: disallow writeable AML opregion mapping for EFI code regions")
Reported-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
 arch/arm64/kernel/acpi.c | 22 ++++++++++++++++++--
 include/linux/acpi.h     |  2 +-
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c
index a85174d05473..cada0b816c8a 100644
--- a/arch/arm64/kernel/acpi.c
+++ b/arch/arm64/kernel/acpi.c
@@ -298,8 +298,21 @@ void __iomem *acpi_os_ioremap(acpi_physical_address phys, acpi_size size)
 		case EFI_BOOT_SERVICES_DATA:
 		case EFI_CONVENTIONAL_MEMORY:
 		case EFI_PERSISTENT_MEMORY:
-			pr_warn(FW_BUG "requested region covers kernel memory @ %pa\n", &phys);
-			return NULL;
+			if (memblock_is_map_memory(phys) ||
+			    !memblock_is_region_memory(phys, size)) {
+				pr_warn(FW_BUG "requested region covers kernel memory @ %pa\n", &phys);
+				return NULL;
+			}
+			/*
+			 * Mapping kernel memory is permitted if the region in
+			 * question is covered by a single memblock with the
+			 * NOMAP attribute set: this enables the use of ACPI
+			 * table overrides passed via initramfs, which are
+			 * reserved in memory using arch_reserve_mem_area()
+			 * below. As this particular use case only requires
+			 * read access, fall through to the R/O mapping case.
+			 */
+			fallthrough;
 
 		case EFI_RUNTIME_SERVICES_CODE:
 			/*
@@ -388,3 +401,8 @@ int apei_claim_sea(struct pt_regs *regs)
 
 	return err;
 }
+
+void arch_reserve_mem_area(acpi_physical_address addr, size_t size)
+{
+	memblock_mark_nomap(addr, size);
+}
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 1e4cdc6c7ae2..64ae25c59d55 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -958,7 +958,7 @@ void acpi_os_set_prepare_extended_sleep(int (*func)(u8 sleep_state,
 acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state,
 					   u32 val_a, u32 val_b);
 
-#ifdef CONFIG_X86
+#ifndef CONFIG_IA64
 void arch_reserve_mem_area(acpi_physical_address addr, size_t size);
 #else
 static inline void arch_reserve_mem_area(acpi_physical_address addr,
-- 
2.17.1


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

* Re: [PATCH] arm64: permit ACPI core to map kernel memory used for table overrides
  2020-09-29 13:25 [PATCH] arm64: permit ACPI core to map kernel memory used for table overrides Ard Biesheuvel
@ 2020-09-30 17:32 ` Jonathan Cameron
  2020-09-30 21:29 ` Catalin Marinas
  1 sibling, 0 replies; 3+ messages in thread
From: Jonathan Cameron @ 2020-09-30 17:32 UTC (permalink / raw)
  To: Ard Biesheuvel
  Cc: linux-arm-kernel, linux-acpi, catalin.marinas, will,
	Sudeep Holla, Lorenzo Pieralisi

On Tue, 29 Sep 2020 15:25:22 +0200
Ard Biesheuvel <ardb@kernel.org> wrote:

> Jonathan reports that the strict policy for memory mapped by the
> ACPI core breaks the use case of passing ACPI table overrides via
> initramfs. This is due to the fact that the memory type used for
> loading the initramfs in memory is not recognized as a memory type
> that is typically used by firmware to pass firmware tables.
> 
> Since the purpose of the strict policy is to ensure that no AML or
> other ACPI code can manipulate any memory that is used by the kernel
> to keep its internal state or the state of user tasks, we can relax
> the permission check, and allow mappings of memory that is reserved
> and marked as NOMAP via memblock, and therefore not covered by the
> linear mapping to begin with.
> 

My over enthusiastic filters went and swept this one away so I missed it.
Catalin, thanks for pointing it out!

Anyhow, retested and still looks good.   Slightly tighter check makes
sense.

> Cc: Sudeep Holla <sudeep.holla@arm.com>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Fixes: 1583052d111f ("arm64/acpi: disallow AML memory opregions to access kernel memory")
> Fixes: 325f5585ec36 ("arm64/acpi: disallow writeable AML opregion mapping for EFI code regions")
> Reported-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Tested-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

> ---
>  arch/arm64/kernel/acpi.c | 22 ++++++++++++++++++--
>  include/linux/acpi.h     |  2 +-
>  2 files changed, 21 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c
> index a85174d05473..cada0b816c8a 100644
> --- a/arch/arm64/kernel/acpi.c
> +++ b/arch/arm64/kernel/acpi.c
> @@ -298,8 +298,21 @@ void __iomem *acpi_os_ioremap(acpi_physical_address phys, acpi_size size)
>  		case EFI_BOOT_SERVICES_DATA:
>  		case EFI_CONVENTIONAL_MEMORY:
>  		case EFI_PERSISTENT_MEMORY:
> -			pr_warn(FW_BUG "requested region covers kernel memory @ %pa\n", &phys);
> -			return NULL;
> +			if (memblock_is_map_memory(phys) ||
> +			    !memblock_is_region_memory(phys, size)) {
> +				pr_warn(FW_BUG "requested region covers kernel memory @ %pa\n", &phys);
> +				return NULL;
> +			}
> +			/*
> +			 * Mapping kernel memory is permitted if the region in
> +			 * question is covered by a single memblock with the
> +			 * NOMAP attribute set: this enables the use of ACPI
> +			 * table overrides passed via initramfs, which are
> +			 * reserved in memory using arch_reserve_mem_area()
> +			 * below. As this particular use case only requires
> +			 * read access, fall through to the R/O mapping case.
> +			 */
> +			fallthrough;
>  
>  		case EFI_RUNTIME_SERVICES_CODE:
>  			/*
> @@ -388,3 +401,8 @@ int apei_claim_sea(struct pt_regs *regs)
>  
>  	return err;
>  }
> +
> +void arch_reserve_mem_area(acpi_physical_address addr, size_t size)
> +{
> +	memblock_mark_nomap(addr, size);
> +}
> diff --git a/include/linux/acpi.h b/include/linux/acpi.h
> index 1e4cdc6c7ae2..64ae25c59d55 100644
> --- a/include/linux/acpi.h
> +++ b/include/linux/acpi.h
> @@ -958,7 +958,7 @@ void acpi_os_set_prepare_extended_sleep(int (*func)(u8 sleep_state,
>  acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state,
>  					   u32 val_a, u32 val_b);
>  
> -#ifdef CONFIG_X86
> +#ifndef CONFIG_IA64
>  void arch_reserve_mem_area(acpi_physical_address addr, size_t size);
>  #else
>  static inline void arch_reserve_mem_area(acpi_physical_address addr,


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

* Re: [PATCH] arm64: permit ACPI core to map kernel memory used for table overrides
  2020-09-29 13:25 [PATCH] arm64: permit ACPI core to map kernel memory used for table overrides Ard Biesheuvel
  2020-09-30 17:32 ` Jonathan Cameron
@ 2020-09-30 21:29 ` Catalin Marinas
  1 sibling, 0 replies; 3+ messages in thread
From: Catalin Marinas @ 2020-09-30 21:29 UTC (permalink / raw)
  To: Ard Biesheuvel, linux-arm-kernel
  Cc: Will Deacon, Sudeep Holla, Jonathan.Cameron, linux-acpi,
	Lorenzo Pieralisi

On Tue, 29 Sep 2020 15:25:22 +0200, Ard Biesheuvel wrote:
> Jonathan reports that the strict policy for memory mapped by the
> ACPI core breaks the use case of passing ACPI table overrides via
> initramfs. This is due to the fact that the memory type used for
> loading the initramfs in memory is not recognized as a memory type
> that is typically used by firmware to pass firmware tables.
> 
> Since the purpose of the strict policy is to ensure that no AML or
> other ACPI code can manipulate any memory that is used by the kernel
> to keep its internal state or the state of user tasks, we can relax
> the permission check, and allow mappings of memory that is reserved
> and marked as NOMAP via memblock, and therefore not covered by the
> linear mapping to begin with.

Applied to arm64 (for-next/fixes), thanks!

[1/1] arm64: permit ACPI core to map kernel memory used for table overrides
      https://git.kernel.org/arm64/c/a509a66a9d0d

-- 
Catalin


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

end of thread, other threads:[~2020-09-30 21:29 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-29 13:25 [PATCH] arm64: permit ACPI core to map kernel memory used for table overrides Ard Biesheuvel
2020-09-30 17:32 ` Jonathan Cameron
2020-09-30 21:29 ` Catalin Marinas

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).