#include <arch/x86/msr-index.h>
#include <arch/x86/segment.h>
- .code32 /* Always starts in 32bit flat mode. */
+ .code32 /* Always starts in 32bit flat mode. */
+GLOBAL(_start) /* HVM common setup. */
-
-/* HVM common setup for pae paging. */
-GLOBAL(_start)
-
- /* CR4.PAE = 1 */
+#ifdef CONFIG_PAGING_PAE /* CR4.PAE = 1 */
mov $X86_CR4_PAE, %eax
mov %eax, %cr4
+#endif /* CONFIG_PAGING_PAE */
- /* CR3 = l?_???map */
-#ifdef __x86_64__
+#if CONFIG_PAGING_LEVELS > 0 /* CR3 = pagetable */
+
+#if CONFIG_PAGING_LEVELS == 4
mov $l4_identmap, %eax
-#else
+#elif CONFIG_PAGING_LEVELS == 3 && defined CONFIG_PAGING_PAE
mov $l3_paemap, %eax
+#else
+# error Bad paging mode
#endif
+
mov %eax, %cr3
+#endif /* CONFIG_PAGING_LEVELS > 0 */
-#ifdef __x86_64__
- /* EFER.LME = 1 */
+#ifdef __x86_64__ /* EFER.LME = 1 */
mov $MSR_EFER, %ecx
rdmsr
bts $_EFER_LME, %eax
wrmsr
-#endif
+#endif /* __x86_64__ */
- /* CR0.{PG,PE} = 1 */
+#if CONFIG_PAGING_LEVELS > 0 /* CR0.PG = 1 */
mov %cr0, %eax
- or $(X86_CR0_PG | X86_CR0_PE), %eax
+ or $X86_CR0_PG, %eax
mov %eax, %cr0
+#endif /* CONFIG_PAGING_LEVELS > 0 */
lgdt gdt_ptr
*/
uint8_t boot_stack[2 * PAGE_SIZE] __aligned(PAGE_SIZE);
-const char *environment_description =
-#if defined(CONFIG_PV)
- "PV"
-#elif defined(CONFIG_HVM)
- "HVM"
-#else
-# error Bad Guest Type
-#endif
-
-#if defined(__x86_64__)
- " 64bit"
-#elif defined(__i386__)
- " 32bit"
-#else
-# error Bad Width
-#endif
- ;
+const char *environment_description = ENVIRONMENT_DESCRIPTION;
#ifdef CONFIG_PV
/* Filled in by head_pv.S */
+/**
+ * @file include/arch/x86/config.h
+ * Logic to split an environment into finer-grain @#define's
+ *
+ * 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.
+ */
#ifndef XTF_X86_CONFIG_H
#define XTF_X86_CONFIG_H
-#if defined(CONFIG_ENV_pv64) || defined(CONFIG_ENV_pv32pae)
-# define CONFIG_PV
-#elif defined(CONFIG_ENV_hvm64) || defined(CONFIG_ENV_hvm32pae)
-# define CONFIG_HVM
+#if defined(CONFIG_ENV_pv64)
+
+#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
+
+#elif defined(CONFIG_ENV_pv32pae)
+
+#define CONFIG_PV
+#define CONFIG_PAGING_LEVELS 3
+#define CONFIG_PAGING_PAE
+#define ENVIRONMENT_DESCRIPTION "PV 32bit (PAE 3 levels)"
+
+#undef CONFIG_ENV_pv32pae
+
+#elif defined(CONFIG_ENV_hvm64)
+
+#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
+
+#elif defined(CONFIG_ENV_hvm32pae)
+
+#define CONFIG_HVM
+#define CONFIG_PAGING_LEVELS 3
+#define CONFIG_PAGING_PAE
+#define ENVIRONMENT_DESCRIPTION "HVM 32bit (PAE 3 levels)"
+
+#undef CONFIG_ENV_hvm32pae
+
+#else
+# error Bad environment
#endif
#endif /* XTF_X86_CONFIG_H */