|
@@ -288,4 +288,25 @@ void __init setup_per_cpu_areas(void)
|
|
|
|
|
|
/* Setup cpu initialized, callin, callout masks */
|
|
|
setup_cpu_local_masks();
|
|
|
+
|
|
|
+#ifdef CONFIG_X86_32
|
|
|
+ /*
|
|
|
+ * Sync back kernel address range. We want to make sure that
|
|
|
+ * all kernel mappings, including percpu mappings, are available
|
|
|
+ * in the smpboot asm. We can't reliably pick up percpu
|
|
|
+ * mappings using vmalloc_fault(), because exception dispatch
|
|
|
+ * needs percpu data.
|
|
|
+ */
|
|
|
+ clone_pgd_range(initial_page_table + KERNEL_PGD_BOUNDARY,
|
|
|
+ swapper_pg_dir + KERNEL_PGD_BOUNDARY,
|
|
|
+ KERNEL_PGD_PTRS);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * sync back low identity map too. It is used for example
|
|
|
+ * in the 32-bit EFI stub.
|
|
|
+ */
|
|
|
+ clone_pgd_range(initial_page_table,
|
|
|
+ swapper_pg_dir + KERNEL_PGD_BOUNDARY,
|
|
|
+ min(KERNEL_PGD_PTRS, KERNEL_PGD_BOUNDARY));
|
|
|
+#endif
|
|
|
}
|