Date: Thu, 14 Jun 2012 17:26:54 +0900 From: Takuya ASADA <syuu@dokukino.com> To: soc-status@freebsd.org, Peter Grehan <grehan@freebsd.org> Subject: [status report #3] BHyVe BIOS emulation to boot legacy systems Message-ID: <CALG4x-W3h1NWTx_Av9%2BNts8bYUdKQ4mh%2BzLkoGiFZ8hj_zf_RA@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
* project summary The project goal is to support BIOS emulation on BHyVe, enabling boot from disk image. I going to focus booting FreeBSD/amd64 from disk image on this GSoC, but final goal is to make BHyVe able to support more guest OSes. * implement BIOS emulation mode on /usr/sbin/bhyve Just does vm_set_capability(ctx, BSP, VM_CAP_UNRESTRICTED_GUEST, 1) when passed -b argument, for now. svn diff -r r237668:r237669 https://socsvn.freebsd.org/socsvn/soc2012/syuu/bhyve-bios * vmmctl --get-all For more easy debugging guest environment, added a option for vmmctl. It simply shows up ALL information which can fetch from vmmctl. svn diff -r r237669:r237670 https://socsvn.freebsd.org/socsvn/soc2012/syuu/bhyve-bios * implement /usr/sbin/bhyvebiosload Loads ${vm_path}/pseudo_bios.bin to 0x0 of virtual machine memory space, initialize CPU0 as real mode state, set RIP to 0x0. (RIP = 0x0 is just for testing) svn diff -r r237670:r237672 https://socsvn.freebsd.org/socsvn/soc2012/syuu/bhyve-bios * test result Looks like a CPU looking correct memory address and could fetch VMCALL instruction, because bhyve says "inst_length 3". When I tried to change VMCALL intruction to NOP intruction, inst_length had changed to 1, so probably it's okay. Though, it's getting triple fault. Maybe some CPU initialization is wrong , so it faults just after VMLAUNCH. I'm trying to figure out why it's faulting... $ sudo ./bhyvebiosload -m 128 -M 256 -h /usr/bhyve-guest/ vm0 $ cd ../bhyve $ sudo vmmctl --get-all --vm=vm0 lowmem 0x0000000100000000/134217728 highmem 0x0000000108000000/268435456 efer[0] 0x0000000000000000 cr0[0] 0x0000000000000020 cr3[0] 0x0000000000000000 cr4[0] 0x0000000000002000 dr7[0] 0x0000000000000000 rsp[0] 0x0000000000000000 rip[0] 0x0000000000000000 rax[0] 0x0000000000000000 rbx[0] 0x0000000000000000 rcx[0] 0x0000000000000000 rdx[0] 0x0000000000000000 rsi[0] 0x0000000000000000 rdi[0] 0x0000000000000000 rbp[0] 0x0000000000000000 r8[0] 0x0000000000000000 r9[0] 0x0000000000000000 r10[0] 0x0000000000000000 r11[0] 0x0000000000000000 r12[0] 0x0000000000000000 r13[0] 0x0000000000000000 r14[0] 0x0000000000000000 r15[0] 0x0000000000000000 rflags[0] 0x0000000000000002 vcpu0 vcpu migration across host cpus 0 vcpu total runtime 0 vm exits due to external interrupt 0 ds desc[0] 0x0000000000000000/0x00000000/0x00000093 es desc[0] 0x0000000000000000/0x00000000/0x00000093 fs desc[0] 0x0000000000000000/0x00000000/0x00000093 gs desc[0] 0x0000000000000000/0x00000000/0x00000093 ss desc[0] 0x0000000000000000/0x00000000/0x00000093 cs desc[0] 0x0000000000000000/0x00000000/0x0000209b tr desc[0] 0x0000000000000000/0x00000000/0x0000008b ldtr desc[0] 0x0000000000000000/0x00000000/0x00010000 gdtr[0] 0x0000000000005000/0x00000017 idtr[0] 0x0000000000000000/0x00000000 cs[0] 0x0000 ds[0] 0x0000 es[0] 0x0000 fs[0] 0x0000 gs[0] 0x0000 ss[0] 0x0000 tr[0] 0x0000 ldtr[0] 0x0000 pincpu[0] unpinned pinbased_ctls[0] 0x0000003f procbased_ctls[0] 0x95006172 procbased_ctls2[0] 0x00000022 gla[0] 0x0000000000000000 gpa[0] 0x0000000000000000 entry_interruption_info[0] 0x00000000 eptp[0] 0x000000007b08801e exception_bitmap[0] 0x00040000 io_bitmap_a[0] 0x00000000 io_bitmap_b[0] 0x00000000 tsc_offset[0] 0x0000000000000000 cr0_mask[0] 0xffffffff60000020 cr0_shadow[0] 0x0000000000000020 cr4_mask[0] 0x0000000000000000 cr4_shadow[0] 0x0000000000000000 cr3_target_count[0] 0x00000000 cr3_target0[0] 0x0000000000000000 cr3_target1[0] 0x0000000000000000 cr3_target2[0] 0x0000000000000000 cr3_target3[0] 0x0000000000000000 apic_access_addr[0] 0x0000000000000000 virtual_apic_addr[0] 0x0000000000000000 tpr_threshold[0] 0x00000000 msr_bitmap[0] 0x000000006ef31000 msr 0xc0000080[0] RW msr 0xc0000100[0] RW msr 0xc0000101[0] RW msr 0xc0000102[0] RW msr 0x00000277[0] RW vpid[0] 0x00c9 ple_window[0] 0x00000000 ple_gap[0] 0x00000000 instruction_error[0] 0x00000000 exit_ctls[0] 0x003f6ffb entry_ctls[0] 0x0000d1fb host_pat[0] 0x0001050600070406 guest_pat[0] 0x0007040600070406 host_cr0[0] 0x0000000080050033 host_cr3[0] 0x0000000000000000 host_cr4[0] 0x00000000000026f0 host_rip[0] 0xffffffff81812090 host_rip[0] 0xffffff8002aaa000 guest_sysenter_cs[0] 0x00000000 guest_sysenter_sp[0] 0x0000000000000000 guest_sysenter_ip[0] 0x0000000000000000 vmcs_pointer[0] 0xffffffffffffffff vmcs_exit_reason[0] 0x0000000000000000 vmcs_exit_qualification[0] 0x0000000000000000 vmcs_exit_interruption_info[0] 0x00000000 vmcs_exit_interruption_error[0] 0x00000000 vmcs_guest_interruptibility[0] 0x00000000 errno = 22 $ sudo ./bhyve -m 128 -M 256 -b vm0 vm exit[0] reason VMX rip 0x0000000000000000 inst_length 3 error 0 exit_reason 2 qualification 0x0000000000000000 $ sudo vmmctl --get-all --vm=vm0 lowmem 0x0000000100000000/134217728 highmem 0x0000000108000000/268435456 efer[0] 0x0000000000000000 cr0[0] 0x0000000000000030 cr3[0] 0x0000000000000000 cr4[0] 0x0000000000002000 dr7[0] 0x0000000000000000 rsp[0] 0x0000000000000000 rip[0] 0x0000000000000000 rax[0] 0x0000000000000000 rbx[0] 0x0000000000000000 rcx[0] 0x0000000000000000 rdx[0] 0x0000000000000000 rsi[0] 0x0000000000000000 rdi[0] 0x0000000000000000 rbp[0] 0x0000000000000000 r8[0] 0x0000000000000000 r9[0] 0x0000000000000000 r10[0] 0x0000000000000000 r11[0] 0x0000000000000000 r12[0] 0x0000000000000000 r13[0] 0x0000000000000000 r14[0] 0x0000000000000000 r15[0] 0x0000000000000000 rflags[0] 0x0000000000010002 vcpu0 vcpu migration across host cpus 1 vcpu total runtime 23841 vm exits due to external interrupt 0 ds desc[0] 0x0000000000000000/0x00000000/0x00000093 es desc[0] 0x0000000000000000/0x00000000/0x00000093 fs desc[0] 0x0000000000000000/0x00000000/0x00000093 gs desc[0] 0x0000000000000000/0x00000000/0x00000093 ss desc[0] 0x0000000000000000/0x00000000/0x00000093 cs desc[0] 0x0000000000000000/0x00000000/0x0000209b tr desc[0] 0x0000000000000000/0x00000000/0x0000008b ldtr desc[0] 0x0000000000000000/0x00000000/0x00010000 gdtr[0] 0x0000000000005000/0x00000017 idtr[0] 0x0000000000000000/0x00000000 cs[0] 0x0000 ds[0] 0x0000 es[0] 0x0000 fs[0] 0x0000 gs[0] 0x0000 ss[0] 0x0000 tr[0] 0x0000 ldtr[0] 0x0000 pincpu[0] unpinned pinbased_ctls[0] 0x0000003f procbased_ctls[0] 0x95006172 procbased_ctls2[0] 0x000000a2 gla[0] 0x0000000000000000 gpa[0] 0x0000000000000000 entry_interruption_info[0] 0x00000000 eptp[0] 0x000000007b08801e exception_bitmap[0] 0x00040000 io_bitmap_a[0] 0x00000000 io_bitmap_b[0] 0x00000000 tsc_offset[0] 0x0000000000000000 cr0_mask[0] 0xffffffff60000020 cr0_shadow[0] 0x0000000000000020 cr4_mask[0] 0x0000000000000000 cr4_shadow[0] 0x0000000000000000 cr3_target_count[0] 0x00000000 cr3_target0[0] 0x0000000000000000 cr3_target1[0] 0x0000000000000000 cr3_target2[0] 0x0000000000000000 cr3_target3[0] 0x0000000000000000 apic_access_addr[0] 0x0000000000000000 virtual_apic_addr[0] 0x0000000000000000 tpr_threshold[0] 0x00000000 msr_bitmap[0] 0x000000006ef31000 msr 0xc0000080[0] RW msr 0xc0000100[0] RW msr 0xc0000101[0] RW msr 0xc0000102[0] RW msr 0x00000277[0] RW vpid[0] 0x00c9 ple_window[0] 0x00000000 ple_gap[0] 0x00000000 instruction_error[0] 0x00000000 exit_ctls[0] 0x003f6ffb entry_ctls[0] 0x0000d1fb host_pat[0] 0x0001050600070406 guest_pat[0] 0x0007040600070406 host_cr0[0] 0x0000000080050033 host_cr3[0] 0x000000002c71c000 host_cr4[0] 0x00000000000026f0 host_rip[0] 0xffffffff81812090 host_rip[0] 0xffffff8002aaa000 guest_sysenter_cs[0] 0x00000000 guest_sysenter_sp[0] 0x0000000000000000 guest_sysenter_ip[0] 0x0000000000000000 vmcs_pointer[0] 0xffffffffffffffff vmcs_exit_reason[0] 0x0000000000000002 vmcs_exit_qualification[0] 0x0000000000000000 vmcs_exit_interruption_info[0] 0x00000000 vmcs_exit_interruption_error[0] 0x00000000 vmcs_guest_interruptibility[0] 0x00000000 errno = 22
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CALG4x-W3h1NWTx_Av9%2BNts8bYUdKQ4mh%2BzLkoGiFZ8hj_zf_RA>