Browse Source

s390/vdso: move boot_vdso_data to vdso.c

The boot_vdso_data variable is related to the vdso code, the magic of the
initial vdso area for the early boot and the replacement of it in vdso_init
should all be put into vdso.c.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Martin Schwidefsky 8 years ago
parent
commit
608796ffe1
3 changed files with 16 additions and 1 deletions
  1. 1 0
      arch/s390/include/asm/vdso.h
  2. 1 1
      arch/s390/kernel/setup.c
  3. 14 0
      arch/s390/kernel/vdso.c

+ 1 - 0
arch/s390/include/asm/vdso.h

@@ -46,6 +46,7 @@ struct vdso_per_cpu_data {
 
 extern struct vdso_data *vdso_data;
 
+void vdso_alloc_boot_cpu(struct lowcore *lowcore);
 int vdso_alloc_per_cpu(struct lowcore *lowcore);
 void vdso_free_per_cpu(struct lowcore *lowcore);
 

+ 1 - 1
arch/s390/kernel/setup.c

@@ -349,7 +349,7 @@ static void __init setup_lowcore(void)
 		if (MACHINE_HAS_GS)
 			lc->mcesad |= bits;
 	}
-	lc->vdso_per_cpu_data = (unsigned long) &lc->paste[0];
+	vdso_alloc_boot_cpu(lc);
 	lc->sync_enter_timer = S390_lowcore.sync_enter_timer;
 	lc->async_enter_timer = S390_lowcore.async_enter_timer;
 	lc->exit_timer = S390_lowcore.exit_timer;

+ 14 - 0
arch/s390/kernel/vdso.c

@@ -140,6 +140,20 @@ static void __init vdso_init_data(struct vdso_data *vd)
  */
 #define SEGMENT_ORDER	2
 
+/*
+ * The initial vdso_data structure for the boot CPU. Eventually
+ * it is replaced with a properly allocated structure in vdso_init.
+ * This is necessary because a valid S390_lowcore.vdso_per_cpu_data
+ * pointer is required to be able to return from an interrupt or
+ * program check. See the exit paths in entry.S.
+ */
+struct vdso_data boot_vdso_data __initdata;
+
+void __init vdso_alloc_boot_cpu(struct lowcore *lowcore)
+{
+	lowcore->vdso_per_cpu_data = (unsigned long) &boot_vdso_data;
+}
+
 int vdso_alloc_per_cpu(struct lowcore *lowcore)
 {
 	unsigned long segment_table, page_table, page_frame;