[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] CC_DST problem
From: |
Alexander Graf |
Subject: |
[Qemu-devel] CC_DST problem |
Date: |
Wed, 29 Aug 2007 18:27:23 +0200 |
User-agent: |
Thunderbird 2.0.0.4 (X11/20070613) |
Hi,
I'm still trying to implement SVM correctly and hit a serious problem.
If I set CC_OP to EFLAGS / DYNAMIC after each instruction (so most
conditional operations are based on EFLAGS) everything works as expected.
If using CC_OP==CC_OP_EFLAGS only CC_SRC should be used and CC_DST is
supposed to be completely ignored.
So I set CC_DST to 0 (this happens when leaving and rejoining the
virtual machine, so this is the real problem) and if I do that, I get
funny segmentation faults in x86_64 guest userspace programs running in
the virtual machine (this is exactly what I see in kvm with my current
patchset as well), while 32 bit userspace programs simply hang.
So I guess this is the real problem.
Is there any logical reason CC_DST could be used with CC_OP==CC_OP_EFLAGS?
Attached to this email you will find a small patch that triggers this
problem.
Thanks for any reply that could help on this,
Alexander Graf
Index: qemu/target-i386/op.c
===================================================================
--- qemu.orig/target-i386/op.c
+++ qemu/target-i386/op.c
@@ -1248,6 +1248,13 @@ void OPPROTO op_movl_crN_T0(void)
helper_movl_crN_T0(PARAM1);
}
+void OPPROTO op_geneflags(void)
+{
+ CC_SRC = cc_table[CC_OP].compute_all();
+ CC_DST = 0;
+ CC_OP = CC_OP_EFLAGS;
+}
+
#if !defined(CONFIG_USER_ONLY)
void OPPROTO op_movtl_T0_cr8(void)
{
Index: qemu/target-i386/translate.c
===================================================================
--- qemu.orig/target-i386/translate.c
+++ qemu/target-i386/translate.c
@@ -3154,6 +3154,12 @@ static target_ulong disas_insn(DisasCont
target_ulong next_eip, tval;
int rex_w, rex_r;
+ ////// DEBUG
+ if (s->cc_op != CC_OP_DYNAMIC)
+ gen_op_set_cc_op(s->cc_op);
+ gen_op_geneflags();
+ s->cc_op = CC_OP_DYNAMIC;
+ ///////////////////
s->pc = pc_start;
prefixes = 0;
aflag = s->code32;
- [Qemu-devel] CC_DST problem,
Alexander Graf <=