All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <aliguori@us.ibm.com>
To: "Kamble, Nitin A" <nitin.a.kamble@intel.com>
Cc: "Yu, Wilfred" <wilfred.yu@intel.com>,
	xen-devel@lists.xensource.com, Keir Fraser <keir@xensource.com>,
	"Nakajima, Jun" <jun.nakajima@intel.com>
Subject: Re: [PATCH][RFC] Emulating real mode with x86_emulate
Date: Fri, 30 Mar 2007 14:00:04 -0500	[thread overview]
Message-ID: <460D5E34.2080803@us.ibm.com> (raw)
In-Reply-To: <1175280781.32115.13.camel@lnitindesktop.sc.intel.com>

Kamble, Nitin A wrote:
> On Thu, 2007-03-29 at 22:20 -0500, Anthony Liguori wrote:
>> > ...                                               
>> > (XEN) hvm.c:446:d2 Triple fault on VCPU0 - invoking HVM system reset.
>>
>> The Triple fault you're seeing here is terribly curious.  Also the 
>> "deadbeef" output.  Just to sanity check, I threw the following printk 
>> in vmcs.c
>>
>>     
>
> Anthony,
>   To me the tripple fault makes sense.
>
> Your patch enables emulation only when "emulating" is set to 1.
>
>
> void arch_vmx_do_resume(struct vcpu *v)
> {
>      if ( v->arch.hvm_vmx.active_cpu == smp_processor_id() )
> @@ -508,7 +644,11 @@ void arch_vmx_do_resume(struct vcpu *v)
>      }
>
>      hvm_do_resume(v);
> -    reset_stack_and_jump(vmx_asm_do_vmentry);
> +
> +    if (v->arch.hvm_vmx.emulating)
> +        vmx_do_emulate(v);
> +    else
> +        reset_stack_and_jump(vmx_asm_do_vmentry);
> }
>
>
> And it is turned on only when guest (hvmloader) sets up CR0.
>
> -static int vmx_set_cr0(unsigned long value)
> +int vmx_set_cr0(unsigned long value)
> {
>      struct vcpu *v = current;
>      unsigned long mfn;
> @@ -1982,13 +1982,29 @@ static int vmx_set_cr0(unsigned long val
>              }
>          }
>
> -        if ( vmx_assist(v, VMX_ASSIST_INVOKE) )
> +        if ( v->arch.hvm_vcpu.emulate_realmode )
> +        {
> +            eip = __vmread(GUEST_RIP);
> +            HVM_DBG_LOG(DBG_LEVEL_1,
> +                        "Transfering control to x86_emulate %%eip 
> 0x%lx\n", eip);
> +            v->arch.hvm_vmx.emulating = 1;
> +            return 1;
> +        }
> +        else if ( vmx_assist(v, VMX_ASSIST_INVOKE) )
>          {
>
> And I don't see any code in the hvmloader for setting cr0 before 
> returning from the main.

My tip is 14462:3fd9b0c71b8c and in hvmloader.c, there is:

asm(
    "    .text                       \n"
    "    .globl _start               \n"
    "_start:                         \n"
    /* C runtime kickoff. */
    "    cld                         \n"
    "    cli                         \n"
    "    movl $stack_top,%esp        \n"
    "    movl %esp,%ebp              \n"
    "    call main                   \n"
    /* Relocate real-mode trampoline to 0x0. */
    "    mov  $trampoline_start,%esi \n"
    "    xor  %edi,%edi              \n"
    "    mov  $trampoline_end,%ecx   \n"
    "    sub  %esi,%ecx              \n"
    "    rep  movsb                  \n"
 <snip>
    /* Enter real mode, reload all segment registers and IDT. */
    "    ljmp $0x8,$0x0              \n"
    "trampoline_start: .code16       \n"
    "    mov  %eax,%cr0              \n"

That change was pretty recent so unless it was reverted it should Just Work.

Regards,

Anthony Liguori


> So the code flow is returning from main, which is causing the tripple 
> fault.
>
> I observe the vmx_do_emulate is never getting called.
>
> I think set cr0 instruction is needed just after the emulate_realmode 
> hypercall in the hvmloader code.
>
> Have you added more code lateron after sending the patch out?
>
> Thanks & Regards,
> Nitin
> Open Source Technology Center, Intel Corporation.
> -------------------------------------------------------------------------
> The mind is like a parachute; it works much better when it's open.
>
>
>
>>      while (!hypercall_preempt_check()) {
>> +        printk("eip = 0x%x\n", regs->eip);
>>          if (x86_emulate(&ctxt, &em_ops)) {
>>
>> And I get the following output with a FC5 guest:
>>
>> (XEN) 
>> hvmop_emulate_realmode                                                   
>> (XEN) guest requests real mode 
>> emulation                                       
>> (XEN) foo 
>> 221                                                                  
>> (XEN) eip = 
>> 0xd338d                                                            
>> (XEN) eip = 
>> 0xd338e                                                            
>> (XEN) eip = 
>> 0xffbf0000                                                         
>> (XEN) failed to emulate instruction at %eip = 
>> 0xd338d                          
>> (XEN) domain_crash_sync called from 
>> vmcs.c:625                                 
>> (XEN) Domain 1 (vcpu#0) crashed on 
>> cpu#0:                                      
>> (XEN) ----[ Xen-3.0-unstable  x86_32  debug=n  Not tainted 
>> ]----               
>> (XEN) CPU:    
>> 0                                                                
>> (XEN) EIP:    
>> 0010:[<000d338d>]                                                
>> (XEN) EFLAGS: 00000002   CONTEXT: 
>> hvm                                          
>> (XEN) eax: 00000076   ebx: 000d7324   ecx: 000d7324   edx: 
>> 000000e9            
>> (XEN) esi: 000d4e54   edi: 000d3380   ebp: 000d72a8   esp: 
>> 000d72a8            
>> (XEN) cr0: 00050032   cr4: 00000651   cr3: 00000000   cr2: 
>> 00000000            
>> (XEN) ds: 0000   es: 0000   fs: 0000   gs: 0000   ss: 0018   cs: 0010   
>>
>> So, perhaps it's the guest you're using?  Clearly, we're running in 
>> x86_emulate and hitting a 16 bit instruction we can't handle.  N.B. the 
>> printk in the error path for x86_emulate is wrong.  I should be looking 
>> at regs->eip, not GUEST_RIP since that wouldn't have been updated again.
>>
>> Regards,
>>
>> Anthony Liguori
>>     
>

  reply	other threads:[~2007-03-30 19:00 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-03-25 23:35 [PATCH][RFC] Emulating real mode with x86_emulate Anthony Liguori
2007-03-29 21:17 ` Kamble, Nitin A
2007-03-29 23:24   ` Anthony Liguori
2007-03-29 23:52     ` Kamble, Nitin A
2007-03-30  0:11       ` Anthony Liguori
2007-03-30  0:59         ` Kamble, Nitin A
2007-03-30  2:20           ` Kamble, Nitin A
2007-03-30  3:20             ` Anthony Liguori
2007-03-30  3:55               ` Anthony Liguori
2007-03-30 18:53               ` Kamble, Nitin A
2007-03-30 19:00                 ` Anthony Liguori [this message]
2007-03-30 21:08                   ` Kamble, Nitin A
2007-03-30 21:24                     ` Kamble, Nitin A
2007-03-30 22:11                       ` Anthony Liguori
2007-04-02 18:45                         ` Kamble, Nitin A
2007-04-02 18:54                           ` Anthony Liguori
2007-04-02 23:52                             ` Kamble, Nitin A
2007-04-03  6:25                               ` Keir Fraser
2007-04-03 14:03                               ` Anthony Liguori
2007-04-05  1:24                                 ` Kamble, Nitin A
2007-03-30 22:10 ` Andi Kleen
2007-03-30 21:20   ` Anthony Liguori
2007-03-30 21:25     ` Andi Kleen
2007-03-30 22:00       ` Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=460D5E34.2080803@us.ibm.com \
    --to=aliguori@us.ibm.com \
    --cc=jun.nakajima@intel.com \
    --cc=keir@xensource.com \
    --cc=nitin.a.kamble@intel.com \
    --cc=wilfred.yu@intel.com \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.