svn commit: r364531 - in head: sys/amd64/include sys/amd64/vmm sys/amd64/vmm/intel usr.sbin/bhyve

Konstantin Belousov kib at FreeBSD.org
Sun Aug 23 20:37:22 UTC 2020


Author: kib
Date: Sun Aug 23 20:37:21 2020
New Revision: 364531
URL: https://svnweb.freebsd.org/changeset/base/364531

Log:
  Add bhyve support for LA57 guest mode.
  
  Noted and reviewed by:	grehan
  Sponsored by:	The FreeBSD Foundation
  Differential revision:	https://reviews.freebsd.org/D25273

Modified:
  head/sys/amd64/include/vmm.h
  head/sys/amd64/vmm/intel/vmx.c
  head/sys/amd64/vmm/vmm_instruction_emul.c
  head/usr.sbin/bhyve/gdb.c

Modified: head/sys/amd64/include/vmm.h
==============================================================================
--- head/sys/amd64/include/vmm.h	Sun Aug 23 20:32:13 2020	(r364530)
+++ head/sys/amd64/include/vmm.h	Sun Aug 23 20:37:21 2020	(r364531)
@@ -522,6 +522,7 @@ enum vm_paging_mode {
 	PAGING_MODE_32,
 	PAGING_MODE_PAE,
 	PAGING_MODE_64,
+	PAGING_MODE_64_LA57,
 };
 
 struct vm_guest_paging {

Modified: head/sys/amd64/vmm/intel/vmx.c
==============================================================================
--- head/sys/amd64/vmm/intel/vmx.c	Sun Aug 23 20:32:13 2020	(r364530)
+++ head/sys/amd64/vmm/intel/vmx.c	Sun Aug 23 20:37:21 2020	(r364531)
@@ -1940,14 +1940,18 @@ vmx_cpu_mode(void)
 static enum vm_paging_mode
 vmx_paging_mode(void)
 {
+	uint64_t cr4;
 
 	if (!(vmcs_read(VMCS_GUEST_CR0) & CR0_PG))
 		return (PAGING_MODE_FLAT);
-	if (!(vmcs_read(VMCS_GUEST_CR4) & CR4_PAE))
+	cr4 = vmcs_read(VMCS_GUEST_CR4);
+	if (!(cr4 & CR4_PAE))
 		return (PAGING_MODE_32);
-	if (vmcs_read(VMCS_GUEST_IA32_EFER) & EFER_LME)
-		return (PAGING_MODE_64);
-	else
+	if (vmcs_read(VMCS_GUEST_IA32_EFER) & EFER_LME) {
+		if (!(cr4 & CR4_LA57))
+			return (PAGING_MODE_64);
+		return (PAGING_MODE_64_LA57);
+	} else
 		return (PAGING_MODE_PAE);
 }
 

Modified: head/sys/amd64/vmm/vmm_instruction_emul.c
==============================================================================
--- head/sys/amd64/vmm/vmm_instruction_emul.c	Sun Aug 23 20:32:13 2020	(r364530)
+++ head/sys/amd64/vmm/vmm_instruction_emul.c	Sun Aug 23 20:37:21 2020	(r364531)
@@ -2189,8 +2189,12 @@ restart:
 		ptpphys = pte;
 
 		nlevels = 2;
-	} else
+	} else if (paging->paging_mode == PAGING_MODE_64_LA57) {
+		nlevels = 5;
+	} else {
 		nlevels = 4;
+	}
+
 	while (--nlevels >= 0) {
 		/* Zero out the lower 12 bits and the upper 12 bits */
 		ptpphys >>= 12; ptpphys <<= 24; ptpphys >>= 12;

Modified: head/usr.sbin/bhyve/gdb.c
==============================================================================
--- head/usr.sbin/bhyve/gdb.c	Sun Aug 23 20:32:13 2020	(r364530)
+++ head/usr.sbin/bhyve/gdb.c	Sun Aug 23 20:37:21 2020	(r364531)
@@ -251,7 +251,8 @@ guest_paging_info(int vcpu, struct vm_guest_paging *pa
 	else if (!(regs[2] & CR4_PAE))
 		paging->paging_mode = PAGING_MODE_32;
 	else if (regs[3] & EFER_LME)
-		paging->paging_mode = PAGING_MODE_64;
+		paging->paging_mode = (regs[2] & CR4_LA57) ?
+		    PAGING_MODE_64_LA57 :  PAGING_MODE_64;
 	else
 		paging->paging_mode = PAGING_MODE_PAE;
 	return (0);


More information about the svn-src-head mailing list