#if CONFIG_PAGING_LEVELS > 0 /* Paging setup for CR3 and CR4 */
-#if CONFIG_PAGING_LEVELS == 4 /* 64bit PAE, 4 levels */
-
- mov $X86_CR4_PAE, %eax
- mov $pae_l4_identmap, %ebx
-
-#elif CONFIG_PAGING_LEVELS == 3 /* 32bit PAE, 3 levels */
-
- mov $X86_CR4_PAE, %eax
- mov $pae32_l3_identmap, %ebx
-
-#elif CONFIG_PAGING_LEVELS == 2 /* 32bit PSE, 2 levels */
-
- mov $X86_CR4_PSE, %eax
- mov $pse_l2_identmap, %ebx
-
-#else
-# error Bad paging mode
-#endif
-
/* Set _PAGE_USER on leaf mappings if a test wants them. */
cmpb $0, test_wants_user_mappings
je .Lskip_user
loop .Lnext_pte
.Lskip_user:
+#if CONFIG_PAGING_LEVELS == 2
+ mov $X86_CR4_PSE, %eax
+#elif CONFIG_PAGING_LEVELS == 3 || CONFIG_PAGING_LEVELS == 4
+ mov $X86_CR4_PAE, %eax
+#else
+# error Bad paging mode
+#endif
mov %eax, %cr4
+
+ mov $cr3_target, %ebx
mov %ebx, %cr3
#endif /* CONFIG_PAGING_LEVELS > 0 */
.global l2_identmap
.global l2_identmap_end
+ /* Alias of the pagetable %cr3 points at. */
+#if CONFIG_PAGING_LEVELS > 0
+
+#if CONFIG_PAGING_LEVELS == 2
+ .set cr3_target, pse_l2_identmap
+#elif CONFIG_PAGING_LEVELS == 3
+ .set cr3_target, pae32_l3_identmap
+#elif CONFIG_PAGING_LEVELS == 4
+ .set cr3_target, pae_l4_identmap
+#else
+# error Bad paging mode
+#endif
+
+#else
+ .set cr3_target, 0
+#endif
+ .global cr3_target
+
/*
* Local variables:
* tab-width: 8
extern intpte_t l2_identmap[L2_PT_ENTRIES];
#endif
+/* Alias of the pagetable %cr3 points at. */
+extern intpte_t cr3_target[];
+
#endif /* CONFIG_HVM */
#endif /* !__ASSEMBLY__ */