From 05889ed71256e8cc8cf4f0c050c6cd12fcb70f1b Mon Sep 17 00:00:00 2001 From: Andrew Cooper Date: Wed, 3 Aug 2016 15:20:45 +0100 Subject: [PATCH] Add CONFIG_{32,64}BIT to config.h To allow the use of IS_DEFINED() in preference to #ifdef __x86_64__/__i386__ to reduce the likelihood of bitrot. In turn, modify page.h and pagetable.h sufficiently to compile for unpaged enviroments. This leaves a link error if dead-code-elimination doesn't manage to elide the reference. Signed-off-by: Andrew Cooper --- include/arch/x86/config.h | 6 ++++++ include/arch/x86/page.h | 10 ++++++++++ include/arch/x86/pagetable.h | 10 +++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/include/arch/x86/config.h b/include/arch/x86/config.h index 7ee7010..d626df5 100644 --- a/include/arch/x86/config.h +++ b/include/arch/x86/config.h @@ -16,6 +16,7 @@ #if defined(CONFIG_ENV_pv64) #define CONFIG_PV 1 +#define CONFIG_64BIT 1 #define CONFIG_PAGING_LEVELS 4 #define ENVIRONMENT_DESCRIPTION "PV 64bit (Long mode 4 levels)" @@ -24,6 +25,7 @@ #elif defined(CONFIG_ENV_pv32pae) #define CONFIG_PV 1 +#define CONFIG_32BIT 1 #define CONFIG_PAGING_LEVELS 3 #define ENVIRONMENT_DESCRIPTION "PV 32bit (PAE 3 levels)" @@ -32,6 +34,7 @@ #elif defined(CONFIG_ENV_hvm64) #define CONFIG_HVM 1 +#define CONFIG_64BIT 1 #define CONFIG_PAGING_LEVELS 4 #define ENVIRONMENT_DESCRIPTION "HVM 64bit (Long mode 4 levels)" @@ -40,6 +43,7 @@ #elif defined(CONFIG_ENV_hvm32pae) #define CONFIG_HVM 1 +#define CONFIG_32BIT 1 #define CONFIG_PAGING_LEVELS 3 #define ENVIRONMENT_DESCRIPTION "HVM 32bit (PAE 3 levels)" @@ -48,6 +52,7 @@ #elif defined(CONFIG_ENV_hvm32pse) #define CONFIG_HVM 1 +#define CONFIG_32BIT 1 #define CONFIG_PAGING_LEVELS 2 #define ENVIRONMENT_DESCRIPTION "HVM 32bit (PSE 2 levels)" @@ -56,6 +61,7 @@ #elif defined(CONFIG_ENV_hvm32) #define CONFIG_HVM 1 +#define CONFIG_32BIT 1 #define CONFIG_PAGING_LEVELS 0 #define ENVIRONMENT_DESCRIPTION "HVM 32bit (No paging)" diff --git a/include/arch/x86/page.h b/include/arch/x86/page.h index d8d070e..bff5063 100644 --- a/include/arch/x86/page.h +++ b/include/arch/x86/page.h @@ -96,6 +96,8 @@ typedef uint64_t paddr_t; #define PRIpaddr "016"PRIx64 +#if CONFIG_PAGING_LEVELS > 0 /* Some form of pagetables. */ + #if CONFIG_PAGING_LEVELS == 2 /* PSE Paging */ typedef pse_intpte_t intpte_t; @@ -144,6 +146,14 @@ static inline unsigned int l4_table_offset(unsigned long va) #endif /* CONFIG_PAGING_LEVELS >= 4 */ +#else /* CONFIG_PAGING_LEVELS > 0 */ + +/* Enough compatibility to compile in unpaged environments. */ +typedef unsigned long intpte_t; +#define PRIpte "08lx" + +#endif + #ifdef CONFIG_HVM extern pae_intpte_t pae_l1_identmap[PAE_L1_PT_ENTRIES]; diff --git a/include/arch/x86/pagetable.h b/include/arch/x86/pagetable.h index 24789fe..aa5ab82 100644 --- a/include/arch/x86/pagetable.h +++ b/include/arch/x86/pagetable.h @@ -25,7 +25,15 @@ static inline intpte_t pte_from_virt(const void *va, uint64_t flags) return pte_from_paddr((paddr_t)virt_to_gfn(va) << PAGE_SHIFT, flags); } -#endif /* CONFIG_PAGING_LEVELS > 0 */ +#else /* CONFIG_PAGING_LEVELS > 0 */ + +/* Enough compatibility to compile in unpaged environments. */ +extern paddr_t pte_to_paddr(intpte_t pte); +extern intpte_t pte_from_paddr(paddr_t paddr, uint64_t flags); +extern intpte_t pte_from_gfn(unsigned long gfn, uint64_t flags); +extern intpte_t pte_from_virt(const void *va, uint64_t flags); + +#endif #endif /* XTF_X86_PAGETABLE_H */ -- 2.39.5