powerpc/rtas: ensure 8-byte alignment for struct rtas_args
authorNathan Lynch <nathanl@linux.ibm.com>
Mon, 6 Mar 2023 21:33:40 +0000 (15:33 -0600)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 30 Mar 2023 12:36:34 +0000 (23:36 +1100)
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 <nathanl@linux.ibm.com>
Reviewed-by: Andrew Donnellan <ajd@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20230220-rtas-queue-for-6-4-v1-1-010e4416f13f@linux.ibm.com
arch/powerpc/include/asm/rtas-types.h

index f2ad4a96cbc50d9deb78ea3ac7193d1c134e09f6..9d5b16803cbbb27a4d1dcb41dc955a9d0b79ff4a 100644 (file)
@@ -2,7 +2,7 @@
 #ifndef _ASM_POWERPC_RTAS_TYPES_H
 #define _ASM_POWERPC_RTAS_TYPES_H
 
-#include <linux/spinlock_types.h>
+#include <linux/compiler_attributes.h>
 
 typedef __be32 rtas_arg_t;
 
@@ -12,7 +12,7 @@ struct rtas_args {
        __be32 nret;
        rtas_arg_t args[16];
        rtas_arg_t *rets;     /* Pointer to return values in args[]. */
-};
+} __aligned(8);
 
 struct rtas_t {
        unsigned long entry;            /* physical address pointer */