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>