qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 29/32] sysret/sysexit arch specific accelerator


From: Glauber Costa
Subject: [Qemu-devel] [PATCH 29/32] sysret/sysexit arch specific accelerator
Date: Thu, 23 Oct 2008 12:19:13 -0200

let arch-specific accelerator hook into the end of syscall
return functions sysret and sysexit.

Signed-off-by: Glauber Costa <address@hidden>
---
 kqemu.c                 |   11 +++++++++++
 target-i386/accel86.h   |    8 ++++++++
 target-i386/op_helper.c |   15 +--------------
 3 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/kqemu.c b/kqemu.c
index 0bea20e..1934aa5 100644
--- a/kqemu.c
+++ b/kqemu.c
@@ -1195,10 +1195,21 @@ static void kqemu_interrupt_return(CPUState *env)
     }
 }
 
+static void kqemu_syscall_return(CPUState *env)
+{
+    if (kqemu_kernel_flags_ok(env)) {
+        if (env->hflags & HF_LMA_MASK)
+            CC_OP = CC_OP_EFLAGS;
+        env->exception_index = -1;
+        cpu_loop_exit();
+    }
+}
+
 QEMUAccel86 kqemu_accel86 = {
     .get_msr = kqemu_get_msr,
     .set_msr = kqemu_set_msr,
     .interrupt_return = kqemu_interrupt_return,
+    .syscall_return = kqemu_syscall_return,
 };
 
 QEMUAccel kqemu_accel = {
diff --git a/target-i386/accel86.h b/target-i386/accel86.h
index c3201f5..1624a64 100644
--- a/target-i386/accel86.h
+++ b/target-i386/accel86.h
@@ -7,6 +7,7 @@ typedef struct QEMUAccel86 {
        int (*get_msr)(int msr, uint64_t *value);
        int (*set_msr)(int msr, uint64_t value);
     void (*interrupt_return)(CPUState *env);
+    void (*syscall_return)(CPUState *env);
 } QEMUAccel86;
 
 #define accel86_call_func ((QEMUAccel86 *)(current_accel->arch))
@@ -32,5 +33,12 @@ static inline void accel_interrupt_return(CPUState *env)
     accel86_call_func->interrupt_return(env);
 }
 
+static inline void accel_syscall_return(CPUState *env)
+{
+    if (!current_accel->arch)
+        return;
+    accel86_call_func->syscall_return(env);
+}
+
 #endif
 
diff --git a/target-i386/op_helper.c b/target-i386/op_helper.c
index 61ba6fc..a831a4d 100644
--- a/target-i386/op_helper.c
+++ b/target-i386/op_helper.c
@@ -1104,14 +1104,7 @@ void helper_sysret(int dflag)
         env->eflags |= IF_MASK;
         cpu_x86_set_cpl(env, 3);
     }
-#ifdef USE_KQEMU
-    if (kqemu_is_ok(env)) {
-        if (env->hflags & HF_LMA_MASK)
-            CC_OP = CC_OP_EFLAGS;
-        env->exception_index = -1;
-        cpu_loop_exit();
-    }
-#endif
+    accel_syscall_return(env);
 }
 
 /* real mode interrupt */
@@ -3003,12 +2996,6 @@ void helper_sysexit(int dflag)
     }
     ESP = ECX;
     EIP = EDX;
-#ifdef USE_KQEMU
-    if (kqemu_is_ok(env)) {
-        env->exception_index = -1;
-        cpu_loop_exit();
-    }
-#endif
 }
 
 #if defined(CONFIG_USER_ONLY)
-- 
1.5.5.1





reply via email to

[Prev in Thread] Current Thread [Next in Thread]