Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Jun 2012 23:08:35 +0000
From:      syuu@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r238304 - soc2012/syuu/bhyve-bios/lib/libvmmapi
Message-ID:  <20120625230835.990D41065672@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: syuu
Date: Mon Jun 25 23:08:35 2012
New Revision: 238304
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=238304

Log:
  remove unnecessary codes, set entry point to 0x0 temporarily, set up registers as initial value of PC startup(referencing Intel SDM vol.3 section 9.1)

Modified:
  soc2012/syuu/bhyve-bios/lib/libvmmapi/vmmapi.h
  soc2012/syuu/bhyve-bios/lib/libvmmapi/vmmapi_bios.c

Modified: soc2012/syuu/bhyve-bios/lib/libvmmapi/vmmapi.h
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libvmmapi/vmmapi.h	Mon Jun 25 23:05:03 2012	(r238303)
+++ soc2012/syuu/bhyve-bios/lib/libvmmapi/vmmapi.h	Mon Jun 25 23:08:35 2012	(r238304)
@@ -101,8 +101,5 @@
 /*
  * BIOS boot specific APIs
  */
-int	vm_setup_bios_registers(struct vmctx *ctx, int vcpu,
-				uint64_t rip, uint64_t cr3, uint64_t gdtbase,
-				uint64_t rsp);
-void	vm_setup_bios_gdt(uint64_t *gdtr);
+int	vm_setup_bios_registers(struct vmctx *ctx, int vcpu);
 #endif	/* _VMMAPI_H_ */

Modified: soc2012/syuu/bhyve-bios/lib/libvmmapi/vmmapi_bios.c
==============================================================================
--- soc2012/syuu/bhyve-bios/lib/libvmmapi/vmmapi_bios.c	Mon Jun 25 23:05:03 2012	(r238303)
+++ soc2012/syuu/bhyve-bios/lib/libvmmapi/vmmapi_bios.c	Mon Jun 25 23:08:35 2012	(r238304)
@@ -37,145 +37,189 @@
 
 #include "vmmapi.h"
 
-#ifndef	CR4_VMXE
-#define	CR4_VMXE	(1UL << 13)
-#endif
-
-#define	DESC_UNUSABLE		0x00010000
-
-#define	GUEST_NULL_SEL		0
-#define	GUEST_CODE_SEL		1
-#define	GUEST_DATA_SEL		2
-#define	GUEST_GDTR_LIMIT	(3 * 8 - 1)
-
-void     
-vm_setup_bios_gdt(uint64_t *gdtr)
-{       
-	gdtr[GUEST_NULL_SEL] = 0;
-	gdtr[GUEST_CODE_SEL] = 0x0020980000000000;
-	gdtr[GUEST_DATA_SEL] = 0x0000900000000000;
-}
-
 /*
  * Setup the 'vcpu' register set such that it will begin execution at
  * 'rip' in long mode.
  */
 int
-vm_setup_bios_registers(struct vmctx *vmctx, int vcpu,
-			uint64_t rip, uint64_t cr3, uint64_t gdtbase,
-			uint64_t rsp)
+vm_setup_bios_registers(struct vmctx *vmctx, int vcpu)
 {
 	int error;
-	uint64_t cr0, cr4, efer, rflags, desc_base;
+	uint64_t rip, cr0, cr3, cr4, efer, rflags, rax, rbx, rcx, rdx;
+	uint64_t rsi, rdi, rbp, rsp, desc_base;
 	uint32_t desc_access, desc_limit;
+	uint16_t gsel;
 
-	cr0 = CR0_NE;
+#if 0
+	rip = 0xfff0;
+#endif
+	rip = 0x0;
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_RIP, rip)) != 0)
+		goto done;
+
+	rflags = 0x2;
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_RFLAGS, rflags))	!= 0)
+		goto done;
+
+	cr0 = 0x60000010;
 	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_CR0, cr0)) != 0)
 		goto done;
 
+	cr3 = 0;
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_CR3, cr3)) != 0)
+		goto done;
+
 	cr4 = 0;
 	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_CR4, cr4)) != 0)
 		goto done;
 
-	efer = 0;
-	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_EFER, efer)))
+#if 0
+	desc_base = 0xffff0000;
+#endif
+	desc_base = 0x0;
+	desc_limit = 0xffff;
+	/* PRESENT | DESC_TYPE_CODEDATA | SEG_TYPE_DATA_RW_ACCESSED */
+	desc_access = 0x00000093;
+	error = vm_set_desc(vmctx, vcpu, VM_REG_GUEST_CS,
+			    desc_base, desc_limit, desc_access);
+	if (error)
 		goto done;
 
-	rflags = 0x2;
-	error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_RFLAGS, rflags);
-	if (error)
+#if 0
+	gsel = 0xf000;
+#endif
+	gsel = 0x0;
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_CS, gsel)) != 0)
 		goto done;
 
-	desc_base = 0;
-	desc_limit = 0;
-	desc_access = 0x0000209B;
-	error = vm_set_desc(vmctx, vcpu, VM_REG_GUEST_CS,
+	desc_base = 0x0;
+	desc_limit = 0xffff;
+	/* PRESENT | DESC_TYPE_CODEDATA | SEG_TYPE_DATA_RW_ACCESSED */
+	desc_access = 0x00000093;
+	error = vm_set_desc(vmctx, vcpu, VM_REG_GUEST_SS,
 			    desc_base, desc_limit, desc_access);
 	if (error)
 		goto done;
 
-	desc_access = 0x00000093;
+	gsel = 0x0;
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_SS, gsel)) != 0)
+		goto done;
+
+	/* same as SS */
 	error = vm_set_desc(vmctx, vcpu, VM_REG_GUEST_DS,
 			    desc_base, desc_limit, desc_access);
 	if (error)
 		goto done;
 
+	/* same as SS */
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_DS, gsel)) != 0)
+		goto done;
+
+	/* same as SS */
 	error = vm_set_desc(vmctx, vcpu, VM_REG_GUEST_ES,
 			    desc_base, desc_limit, desc_access);
 	if (error)
 		goto done;
 
+	/* same as SS */
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_ES, gsel)) != 0)
+		goto done;
+
+	/* same as SS */
 	error = vm_set_desc(vmctx, vcpu, VM_REG_GUEST_FS,
 			    desc_base, desc_limit, desc_access);
 	if (error)
 		goto done;
 
+	/* same as SS */
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_FS, gsel)) != 0)
+		goto done;
+
+	/* same as SS */
 	error = vm_set_desc(vmctx, vcpu, VM_REG_GUEST_GS,
 			    desc_base, desc_limit, desc_access);
 	if (error)
 		goto done;
 
-	error = vm_set_desc(vmctx, vcpu, VM_REG_GUEST_SS,
-			    desc_base, desc_limit, desc_access);
-	if (error)
+	/* same as SS */
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_GS, gsel)) != 0)
 		goto done;
 
-	/*
-	 * XXX TR is pointing to null selector even though we set the
-	 * TSS segment to be usable with a base address and limit of 0.
-	 */
-	desc_access = 0x0000008b;
-	error = vm_set_desc(vmctx, vcpu, VM_REG_GUEST_TR, 0, 0, desc_access);
-	if (error)
+	rdx = 0xf00;
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_RDX, rdx)) != 0)
 		goto done;
 
-	error = vm_set_desc(vmctx, vcpu, VM_REG_GUEST_LDTR, 0, 0,
-			    DESC_UNUSABLE);
-	if (error)
+	rax = 0x0;
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_RAX, rax)) != 0)
 		goto done;
 
-	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_CS, 0)) != 0)
+	rbx = 0x0;
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_RBX, rbx)) != 0)
 		goto done;
-	
-	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_DS, 0)) != 0)
+
+	rcx = 0x0;
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_RCX, rcx)) != 0)
 		goto done;
-	
-	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_ES, 0)) != 0)
+
+	rsi = 0;
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_RSI, rsi)) != 0)
 		goto done;
 
-	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_FS, 0)) != 0)
+	rdi = 0;
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_RDI, rdi)) != 0)
 		goto done;
-	
-	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_GS, 0)) != 0)
+
+	rbp = 0;
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_RBP, rbp)) != 0)
 		goto done;
-	
-	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_SS, 0)) != 0)
+
+	rsp = 0;
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_RSP, rsp)) != 0)
 		goto done;
 
-	/* XXX TR is pointing to the null selector */
-	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_TR, 0)) != 0)
+	desc_base = 0x0;
+	desc_limit = 0xffff;
+	/* PRESENT | DESC_TYPE_CODEDATA | SEG_TYPE_DATA_RW */
+	desc_access = 0x00000092;
+	error = vm_set_desc(vmctx, vcpu, VM_REG_GUEST_GDTR,
+			    desc_base, desc_limit, desc_access);
+	if (error != 0)
 		goto done;
 
-	/* LDTR is pointing to the null selector */
-	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_LDTR, 0)) != 0)
+	/* same as GDTR */
+	error = vm_set_desc(vmctx, vcpu, VM_REG_GUEST_IDTR,
+			    desc_base, desc_limit, desc_access);
+	if (error != 0)
 		goto done;
 
-	/* entry point */
-	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_RIP, rip)) != 0)
+	desc_base = 0x0;
+	desc_limit = 0xffff;
+	/* PRESENT | SEG_TYPE_16BIT_BUSY_TSS */
+	desc_access = 0x00000083;
+	error = vm_set_desc(vmctx, vcpu, VM_REG_GUEST_TR,
+			    desc_base, desc_limit, desc_access);
+	if (error)
 		goto done;
 
-	/* page table base */
-	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_CR3, 0)) != 0)
+	gsel = 0x0;
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_TR, gsel)) != 0)
 		goto done;
 
-	desc_base = gdtbase;
-	desc_limit = GUEST_GDTR_LIMIT;
-	error = vm_set_desc(vmctx, vcpu, VM_REG_GUEST_GDTR,
-			    desc_base, desc_limit, 0);
-	if (error != 0)
+	desc_base = 0x0;
+	desc_limit = 0xffff;
+	/* PRESENT | SEG_TYPE_LDT */
+	desc_access = 0x00000082;
+	error = vm_set_desc(vmctx, vcpu, VM_REG_GUEST_LDTR,
+			    desc_base, desc_limit, desc_access);
+	if (error)
 		goto done;
 
-	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_RSP, rsp)) != 0)
+	/* same as TR */
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_LDTR, gsel)) != 0)
+		goto done;
+
+	efer = 0x9;
+	if ((error = vm_set_register(vmctx, vcpu, VM_REG_GUEST_EFER, efer)) != 0)
 		goto done;
 
 	error = 0;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120625230835.990D41065672>