s390/stack: add union to reflect kvm stack slot usages
authorHeiko Carstens <hca@linux.ibm.com>
Mon, 30 May 2022 12:20:50 +0000 (14:20 +0200)
committerHeiko Carstens <hca@linux.ibm.com>
Wed, 1 Jun 2022 10:03:17 +0000 (12:03 +0200)
Add a union which describes how the empty stack slots are being used
by kvm and perf. This should help to avoid another bug like the one
which was fixed with commit c9bfb460c3e4 ("s390/perf: obtain sie_block
from the right address").

Reviewed-by: Nico Boehr <nrb@linux.ibm.com>
Tested-by: Nico Boehr <nrb@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
arch/s390/include/asm/stacktrace.h
arch/s390/kernel/asm-offsets.c
arch/s390/kernel/perf_event.c

index 7e0e15bee18de780f501ded65fcf51019001b4fe..b23c658dce77f19e6b03a9fdb093e6fdf913f9c9 100644 (file)
@@ -39,7 +39,15 @@ static inline bool on_stack(struct stack_info *info,
  * Kernel uses the packed stack layout (-mpacked-stack).
  */
 struct stack_frame {
-       unsigned long empty[9];
+       union {
+               unsigned long empty[9];
+               struct {
+                       unsigned long sie_control_block;
+                       unsigned long sie_savearea;
+                       unsigned long sie_reason;
+                       unsigned long sie_flags;
+               };
+       };
        unsigned long gprs[10];
        unsigned long back_chain;
 };
index 0e10d7ff4203363772a09ad187011df8d1b0b67f..d8ce965c0a97c6cbf5668ca247e936f1362bad2f 100644 (file)
@@ -58,10 +58,10 @@ int main(void)
        OFFSET(__SF_BACKCHAIN, stack_frame, back_chain);
        OFFSET(__SF_GPRS, stack_frame, gprs);
        OFFSET(__SF_EMPTY, stack_frame, empty[0]);
-       OFFSET(__SF_SIE_CONTROL, stack_frame, empty[1]);
-       OFFSET(__SF_SIE_SAVEAREA, stack_frame, empty[2]);
-       OFFSET(__SF_SIE_REASON, stack_frame, empty[3]);
-       OFFSET(__SF_SIE_FLAGS, stack_frame, empty[4]);
+       OFFSET(__SF_SIE_CONTROL, stack_frame, sie_control_block);
+       OFFSET(__SF_SIE_SAVEAREA, stack_frame, sie_savearea);
+       OFFSET(__SF_SIE_REASON, stack_frame, sie_reason);
+       OFFSET(__SF_SIE_FLAGS, stack_frame, sie_flags);
        DEFINE(STACK_FRAME_OVERHEAD, sizeof(struct stack_frame));
        BLANK();
        /* idle data offsets */
index e259ff1f5ad351ad214598c30ce2d101fa0c3e68..c27321cb0969fbe6b3c6e9ec8a99db344000285e 100644 (file)
@@ -30,7 +30,7 @@ static struct kvm_s390_sie_block *sie_block(struct pt_regs *regs)
        if (!stack)
                return NULL;
 
-       return (struct kvm_s390_sie_block *)stack->empty[1];
+       return (struct kvm_s390_sie_block *)stack->sie_control_block;
 }
 
 static bool is_in_guest(struct pt_regs *regs)