Re: [PATCH 1/8] powerpc/rtas: ensure 8-byte alignment for struct rtas_args
From: Andrew Donnellan <hidden>
Date: 2023-03-23 04:01:28
On Mon, 2023-03-06 at 15:33 -0600, Nathan Lynch via B4 Relay wrote:
quoted
From: Nathan Lynch <redacted> CHRP and PAPR agree: "In order to make an RTAS call, the operating system must construct an argument call buffer aligned on an eight byte boundary in physically contiguous real memory [...]." (7.2.7 Calling Mechanism and Conventions). struct rtas_args is the type used for this argument call buffer. The unarchitected 'rets' member happens to produce 8-byte alignment for the struct on 64-bit targets in practice. But without an alignment directive the structure will have only 4-byte alignment on 32-bit targets: $ nm b/{before,after}/chrp32/vmlinux | grep rtas_args c096881c b rtas_args c0968820 b rtas_args Add an alignment directive to the struct rtas_args declaration so all instances have the alignment required by the specs. rtas-types.h no longer refers to any spinlock types, so drop the spinlock_types.h inclusion while we're here. Signed-off-by: Nathan Lynch <redacted>
Reviewed-by: Andrew Donnellan <redacted>
quoted
--- arch/powerpc/include/asm/rtas-types.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)diff --git a/arch/powerpc/include/asm/rtas-types.hb/arch/powerpc/include/asm/rtas-types.h index f2ad4a96cbc5..861145c8a021 100644--- a/arch/powerpc/include/asm/rtas-types.h +++ b/arch/powerpc/include/asm/rtas-types.h@@ -2,7 +2,8 @@#ifndef _ASM_POWERPC_RTAS_TYPES_H #define _ASM_POWERPC_RTAS_TYPES_H -#include <linux/spinlock_types.h> +#include <linux/compiler_attributes.h> +#include <linux/sizes.h> typedef __be32 rtas_arg_t;@@ -12,7 +13,7 @@ struct rtas_args {__be32 nret; rtas_arg_t args[16]; rtas_arg_t *rets; /* Pointer to return values in args[]. */ -}; +} __aligned(SZ_8);
Nowhere else in the kernel uses __aligned(SZ_8) over just __aligned(8), which I suppose would also save an include, but I don't care either way.
quoted
struct rtas_t { unsigned long entry; /* physical address pointer */
-- Andrew Donnellan OzLabs, ADL Canberra ajd@linux.ibm.com IBM Australia Limited