.code32 /* Always starts in 32bit flat mode. */
GLOBAL(_start) /* HVM common setup. */
-#ifdef CONFIG_PAGING_PAE /* CR4.PAE = 1 */
+#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 %eax, %cr4
-#endif /* CONFIG_PAGING_PAE */
+ mov $l4_identmap, %ebx
-#if CONFIG_PAGING_LEVELS > 0 /* CR3 = pagetable */
+#elif CONFIG_PAGING_LEVELS == 3 /* 32bit PAE, 3 levels */
+
+ mov $X86_CR4_PAE, %eax
+ mov $l3_paemap, %ebx
-#if CONFIG_PAGING_LEVELS == 4
- mov $l4_identmap, %eax
-#elif CONFIG_PAGING_LEVELS == 3 && defined CONFIG_PAGING_PAE
- mov $l3_paemap, %eax
#else
# error Bad paging mode
#endif
- mov %eax, %cr3
+ mov %eax, %cr4
+ mov %ebx, %cr3
#endif /* CONFIG_PAGING_LEVELS > 0 */
#ifdef __x86_64__ /* EFER.LME = 1 */
* Converts `CONFIG_ENV_$foo` into:
* - `CONFIG_PV` or `CONFIG_HVM`
* - `CONFIG_PAGING_LEVELS = $num`
- * - Possibly `CONFIG_PAGING_PAE`
*
* The `CONFIG_ENV_$foo` is then undefined, to prevent its use in general code.
*/
#define CONFIG_PV
#define CONFIG_PAGING_LEVELS 4
-#define CONFIG_PAGING_PAE
#define ENVIRONMENT_DESCRIPTION "PV 64bit (Long mode 4 levels)"
#undef CONFIG_ENV_pv64
#define CONFIG_PV
#define CONFIG_PAGING_LEVELS 3
-#define CONFIG_PAGING_PAE
#define ENVIRONMENT_DESCRIPTION "PV 32bit (PAE 3 levels)"
#undef CONFIG_ENV_pv32pae
#define CONFIG_HVM
#define CONFIG_PAGING_LEVELS 4
-#define CONFIG_PAGING_PAE
#define ENVIRONMENT_DESCRIPTION "HVM 64bit (Long mode 4 levels)"
#undef CONFIG_ENV_hvm64
#define CONFIG_HVM
#define CONFIG_PAGING_LEVELS 3
-#define CONFIG_PAGING_PAE
#define ENVIRONMENT_DESCRIPTION "HVM 32bit (PAE 3 levels)"
#undef CONFIG_ENV_hvm32pae