On 2013-07-24 11:56, Arthur Chunqi Li wrote: > So what about this one. I merged all the exit reason to "ret" and > remove the flag detection after vmlaunch/vmresume (because I think > this detection is useless). Currently we support only one guest, so > variant "launched" is located in vmx_run(). If we want to support > multiple guest, we could move it to some structures (e.g. > environment_ctxt). Now I just put it here. > > static int vmx_run() > { > u32 ret = 0; > bool launched = 0; > > asm volatile( > "mov %%rsp, %%rsi\n\t" > "mov %2, %%edi\n\t" > "call vmcs_write\n\t" > > "0: " > LOAD_GPR_C > "cmp $0, %1\n\t" > "jne 1f\n\t" > "vmlaunch\n\t" > SAVE_GPR_C > /* vmlaunch error, return VMX_TEST_LAUNCH_ERR */ > "mov %3, %0\n\t" > "jmp 2f\n\t" > "1: " > "vmresume\n\t" > SAVE_GPR_C > /* vmresume error, return VMX_TEST_RESUME_ERR */ > "mov %4, %0\n\t" > "jmp 2f\n\t" Where do you store the flags now? You may want to differentiate / test if ZF of CF is set. Jan > "vmx_return:\n\t" > SAVE_GPR_C > "call exit_handler\n\t" > /* set launched = 1 */ > "mov $0x1, %1\n\t" > "cmp %5, %%eax\n\t" > "je 0b\n\t" > "mov %%eax, %0\n\t" > "2: " > : "=r"(ret), "=r"(launched) > : "i"(HOST_RSP), "i"(VMX_TEST_LAUNCH_ERR), > "i"(VMX_TEST_RESUME_ERR), "i"(VMX_TEST_RESUME) > : "rax", "rbx", "rdi", "rsi", > "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", > "memory", "cc" > ); > switch (ret) { > case VMX_TEST_VMEXIT: > return 0; > case VMX_TEST_LAUNCH_ERR: > printf("%s : vmlaunch failed.\n", __func__); > break; > case VMX_TEST_RESUME_ERR: > printf("%s : vmresume failed.\n", __func__); > break; > default: > printf("%s : unhandled ret from exit_handler, ret=%d.\n", > __func__, ret); > break; > } > return 1; > } >
Attachment:
signature.asc
Description: OpenPGP digital signature