WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] cygwin longjmp error on Xen guest - gs not restored?

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] cygwin longjmp error on Xen guest - gs not restored?
From: Mikel Ward <mward@xxxxxxxxxx>
Date: Wed, 16 Sep 2009 19:59:09 +1000
Delivery-date: Mon, 21 Sep 2009 04:54:54 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
[resending to xen-devel instead of xen-users as suggested]

Hi All

A colleague tells me there is a problem with Xen 3.0.3 on RHEL5 where
Cygwin's bash fails to call longjmp() in a Windows guest.

The consensus is that Xen and KVM both had a bug, but that Xen has not
yet fixed it.  Indeed I couldn't find any proof that it had been
reported to Xen, hence this email.

Original KVM bug report:
http://sourceforge.net/tracker/?func=detail&atid=893831&aid=1872255&group_id=180599

Test case:
http://article.gmane.org/gmane.comp.emulators.kvm.devel/28099

#include <setjmp.h>

  jmp_buf env;
  main()
  {
       if(setjmp(env)) return;
       longjmp(env, 1);
  }

More details: it's something to do with the GS register:
http://markmail.org/message/5aqlqtrld4ti4gse

#include <stdio.h>

int main()
{
  unsigned short gs;
  unsigned x;

  asm ("mov %%gs, %0\n" : "=g"(gs));
  asm ("movl %%gs:0x30, %0\n" : "=r"(x));

  printf("gs: %x\n", gs);
  printf("gs:0x30: %x\n", x);

  asm ("mov %0, %%gs\n" : : "g"(gs));

  printf("test\n");

  asm ("movl %%gs:0x30, %0\n" : "=r"(x));

  return 0;
}


KVM fix:
http://article.gmane.org/gmane.comp.emulators.kvm.devel/28418

diff --git a/kernel/x86/vmx.c b/kernel/x86/vmx.c
index 7507ce2..048460d 100644
--- a/kernel/x86/vmx.c
+++ b/kernel/x86/vmx.c
@@ -910,6 +910,7 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, u32 
msr_index, u64 *pdata)
                data = vmcs_readl(GUEST_SYSENTER_ESP);
                break;
        default:
+               vmx_load_host_state(vcpu);
                msr = find_msr_entry(to_vmx(vcpu), msr_index);
                if (msr) {
                        data = msr->data;


Another related KVM thread:
http://markmail.org/message/owy3x7pf6oywdx5e

Cygwin developers:
http://www.cygwin.com/ml/cygwin/2009-05/msg00841.html
http://www.cygwin.com/ml/cygwin/2008-08/msg00437.html


I'll be happy to spend some time helping to test/diagnose if you can
tell me what you need me to do.

Thanks

Mike



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>