@@ -35,6 +35,7 @@
#define X86_CR0_MP 0x00000002
#define X86_CR0_EM 0x00000004
#define X86_CR0_TS 0x00000008
+#define X86_CR0_NE 0x00000020
#define X86_CR0_WP 0x00010000
#define X86_CR0_AM 0x00040000
#define X86_CR0_NW 0x20000000
@@ -64,6 +64,11 @@ static struct mbi_bootinfo *bootinfo;
#ifdef __x86_64__
void find_highmem(void)
{
+#ifdef TARGET_EFI
+ /* The largest free memory region is already chosen in setup_efi() */
+ return;
+#endif /* TARGET_EFI */
+
/* Memory above 4 GB is only supported on 64-bit systems. */
if (!(bootinfo->flags & 64))
return;
@@ -3,6 +3,7 @@
#include "vmalloc.h"
#include "alloc_page.h"
#include "smp.h"
+#include "tdx.h"
static pteval_t pte_opt_mask;
@@ -16,7 +17,12 @@ pteval_t *install_pte(pgd_t *cr3,
pteval_t *pt = cr3;
unsigned offset;
- for (level = PAGE_LEVEL; level > pte_level; --level) {
+ if (read_cr4() & X86_CR4_LA57)
+ level = 5;
+ else
+ level = PAGE_LEVEL;
+
+ for (; level > pte_level; --level) {
offset = PGDIR_OFFSET((uintptr_t)virt, level);
if (!(pt[offset] & PT_PRESENT_MASK)) {
pteval_t *new_pt = pt_page;
@@ -187,7 +193,11 @@ void *setup_mmu(phys_addr_t end_of_memory, void *opt_mask)
#ifndef __x86_64__
write_cr4(X86_CR4_PSE);
#endif
- write_cr0(X86_CR0_PG |X86_CR0_PE | X86_CR0_WP);
+ /* According to TDX module spec 10.6.1 CR0.NE should be 1 */
+ if (is_tdx_guest())
+ write_cr0(X86_CR0_PG | X86_CR0_PE | X86_CR0_WP | X86_CR0_NE);
+ else
+ write_cr0(X86_CR0_PG | X86_CR0_PE | X86_CR0_WP);
printf("paging enabled\n");
printf("cr0 = %lx\n", read_cr0());