提交 92fc4b58 编写于 作者: B Blue Swirl

x86: switch to AREG0 free mode

Add an explicit CPUX86State parameter instead of relying on AREG0.

Remove temporary wrappers and switch to AREG0 free mode.
Signed-off-by: NBlue Swirl <blauwirbel@gmail.com>
上级 2999a0b2
...@@ -3778,7 +3778,7 @@ symlink "$source_path/Makefile.target" "$target_dir/Makefile" ...@@ -3778,7 +3778,7 @@ symlink "$source_path/Makefile.target" "$target_dir/Makefile"
case "$target_arch2" in case "$target_arch2" in
alpha | or32 | sparc* | xtensa* | ppc*) alpha | i386 | or32 | sparc* | x86_64 | xtensa* | ppc*)
echo "CONFIG_TCG_PASS_AREG0=y" >> $config_target_mak echo "CONFIG_TCG_PASS_AREG0=y" >> $config_target_mak
;; ;;
esac esac
......
...@@ -274,6 +274,28 @@ extern unsigned long reserved_va; ...@@ -274,6 +274,28 @@ extern unsigned long reserved_va;
#define cpu_ldsw_code(env1, p) ldsw_raw(p) #define cpu_ldsw_code(env1, p) ldsw_raw(p)
#define cpu_ldl_code(env1, p) ldl_raw(p) #define cpu_ldl_code(env1, p) ldl_raw(p)
#define cpu_ldq_code(env1, p) ldq_raw(p) #define cpu_ldq_code(env1, p) ldq_raw(p)
#define cpu_ldub_data(env, addr) ldub_raw(addr)
#define cpu_lduw_data(env, addr) lduw_raw(addr)
#define cpu_ldsw_data(env, addr) ldsw_raw(addr)
#define cpu_ldl_data(env, addr) ldl_raw(addr)
#define cpu_ldq_data(env, addr) ldq_raw(addr)
#define cpu_stb_data(env, addr, data) stb_raw(addr, data)
#define cpu_stw_data(env, addr, data) stw_raw(addr, data)
#define cpu_stl_data(env, addr, data) stl_raw(addr, data)
#define cpu_stq_data(env, addr, data) stq_raw(addr, data)
#define cpu_ldub_kernel(env, addr) ldub_raw(addr)
#define cpu_lduw_kernel(env, addr) lduw_raw(addr)
#define cpu_ldsw_kernel(env, addr) ldsw_raw(addr)
#define cpu_ldl_kernel(env, addr) ldl_raw(addr)
#define cpu_ldq_kernel(env, addr) ldq_raw(addr)
#define cpu_stb_kernel(env, addr, data) stb_raw(addr, data)
#define cpu_stw_kernel(env, addr, data) stw_raw(addr, data)
#define cpu_stl_kernel(env, addr, data) stl_raw(addr, data)
#define cpu_stq_kernel(env, addr, data) stq_raw(addr, data)
#endif #endif
#define ldub_kernel(p) ldub_raw(p) #define ldub_kernel(p) ldub_raw(p)
......
...@@ -6,5 +6,3 @@ obj-$(CONFIG_KVM) += kvm.o hyperv.o ...@@ -6,5 +6,3 @@ obj-$(CONFIG_KVM) += kvm.o hyperv.o
obj-$(CONFIG_NO_KVM) += kvm-stub.o obj-$(CONFIG_NO_KVM) += kvm-stub.o
obj-$(CONFIG_LINUX_USER) += ioport-user.o obj-$(CONFIG_LINUX_USER) += ioport-user.o
obj-$(CONFIG_BSD_USER) += ioport-user.o obj-$(CONFIG_BSD_USER) += ioport-user.o
$(obj)/mem_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS)
...@@ -1138,25 +1138,4 @@ void do_smm_enter(CPUX86State *env1); ...@@ -1138,25 +1138,4 @@ void do_smm_enter(CPUX86State *env1);
void cpu_report_tpr_access(CPUX86State *env, TPRAccess access); void cpu_report_tpr_access(CPUX86State *env, TPRAccess access);
/* temporary wrappers */
uint32_t cpu_ldub_data(CPUX86State *env, target_ulong ptr);
uint32_t cpu_lduw_data(CPUX86State *env, target_ulong ptr);
uint32_t cpu_ldl_data(CPUX86State *env, target_ulong ptr);
uint64_t cpu_ldq_data(CPUX86State *env, target_ulong ptr);
void cpu_stb_data(CPUX86State *env, target_ulong ptr, uint32_t data);
void cpu_stw_data(CPUX86State *env, target_ulong ptr, uint32_t data);
void cpu_stl_data(CPUX86State *env, target_ulong ptr, uint32_t data);
void cpu_stq_data(CPUX86State *env, target_ulong ptr, uint64_t data);
uint32_t cpu_ldub_kernel(CPUX86State *env, target_ulong ptr);
uint32_t cpu_lduw_kernel(CPUX86State *env, target_ulong ptr);
uint32_t cpu_ldl_kernel(CPUX86State *env, target_ulong ptr);
uint64_t cpu_ldq_kernel(CPUX86State *env, target_ulong ptr);
void cpu_stb_kernel(CPUX86State *env, target_ulong ptr, uint32_t data);
void cpu_stw_kernel(CPUX86State *env, target_ulong ptr, uint32_t data);
void cpu_stl_kernel(CPUX86State *env, target_ulong ptr, uint32_t data);
void cpu_stq_kernel(CPUX86State *env, target_ulong ptr, uint64_t data);
#endif /* CPU_I386_H */ #endif /* CPU_I386_H */
...@@ -21,6 +21,10 @@ ...@@ -21,6 +21,10 @@
#include "cpu.h" #include "cpu.h"
#include "helper.h" #include "helper.h"
#if !defined(CONFIG_USER_ONLY)
#include "softmmu_exec.h"
#endif /* !defined(CONFIG_USER_ONLY) */
#define FPU_RC_MASK 0xc00 #define FPU_RC_MASK 0xc00
#define FPU_RC_NEAR 0x000 #define FPU_RC_NEAR 0x000
#define FPU_RC_DOWN 0x400 #define FPU_RC_DOWN 0x400
......
...@@ -69,13 +69,13 @@ DEF_HELPER_1(cli, void, env) ...@@ -69,13 +69,13 @@ DEF_HELPER_1(cli, void, env)
DEF_HELPER_1(sti, void, env) DEF_HELPER_1(sti, void, env)
DEF_HELPER_1(set_inhibit_irq, void, env) DEF_HELPER_1(set_inhibit_irq, void, env)
DEF_HELPER_1(reset_inhibit_irq, void, env) DEF_HELPER_1(reset_inhibit_irq, void, env)
DEF_HELPER_2(boundw, void, tl, int) DEF_HELPER_3(boundw, void, env, tl, int)
DEF_HELPER_2(boundl, void, tl, int) DEF_HELPER_3(boundl, void, env, tl, int)
DEF_HELPER_1(rsm, void, env) DEF_HELPER_1(rsm, void, env)
DEF_HELPER_2(into, void, env, int) DEF_HELPER_2(into, void, env, int)
DEF_HELPER_1(cmpxchg8b, void, tl) DEF_HELPER_2(cmpxchg8b, void, env, tl)
#ifdef TARGET_X86_64 #ifdef TARGET_X86_64
DEF_HELPER_1(cmpxchg16b, void, tl) DEF_HELPER_2(cmpxchg16b, void, env, tl)
#endif #endif
DEF_HELPER_1(single_step, void, env) DEF_HELPER_1(single_step, void, env)
DEF_HELPER_1(cpuid, void, env) DEF_HELPER_1(cpuid, void, env)
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
*/ */
#include "cpu.h" #include "cpu.h"
#include "dyngen-exec.h"
#include "helper.h" #include "helper.h"
#if !defined(CONFIG_USER_ONLY) #if !defined(CONFIG_USER_ONLY)
...@@ -39,19 +38,19 @@ void helper_unlock(void) ...@@ -39,19 +38,19 @@ void helper_unlock(void)
spin_unlock(&global_cpu_lock); spin_unlock(&global_cpu_lock);
} }
void helper_cmpxchg8b(target_ulong a0) void helper_cmpxchg8b(CPUX86State *env, target_ulong a0)
{ {
uint64_t d; uint64_t d;
int eflags; int eflags;
eflags = cpu_cc_compute_all(env, CC_OP); eflags = cpu_cc_compute_all(env, CC_OP);
d = ldq(a0); d = cpu_ldq_data(env, a0);
if (d == (((uint64_t)EDX << 32) | (uint32_t)EAX)) { if (d == (((uint64_t)EDX << 32) | (uint32_t)EAX)) {
stq(a0, ((uint64_t)ECX << 32) | (uint32_t)EBX); cpu_stq_data(env, a0, ((uint64_t)ECX << 32) | (uint32_t)EBX);
eflags |= CC_Z; eflags |= CC_Z;
} else { } else {
/* always do the store */ /* always do the store */
stq(a0, d); cpu_stq_data(env, a0, d);
EDX = (uint32_t)(d >> 32); EDX = (uint32_t)(d >> 32);
EAX = (uint32_t)d; EAX = (uint32_t)d;
eflags &= ~CC_Z; eflags &= ~CC_Z;
...@@ -60,7 +59,7 @@ void helper_cmpxchg8b(target_ulong a0) ...@@ -60,7 +59,7 @@ void helper_cmpxchg8b(target_ulong a0)
} }
#ifdef TARGET_X86_64 #ifdef TARGET_X86_64
void helper_cmpxchg16b(target_ulong a0) void helper_cmpxchg16b(CPUX86State *env, target_ulong a0)
{ {
uint64_t d0, d1; uint64_t d0, d1;
int eflags; int eflags;
...@@ -69,16 +68,16 @@ void helper_cmpxchg16b(target_ulong a0) ...@@ -69,16 +68,16 @@ void helper_cmpxchg16b(target_ulong a0)
raise_exception(env, EXCP0D_GPF); raise_exception(env, EXCP0D_GPF);
} }
eflags = cpu_cc_compute_all(env, CC_OP); eflags = cpu_cc_compute_all(env, CC_OP);
d0 = ldq(a0); d0 = cpu_ldq_data(env, a0);
d1 = ldq(a0 + 8); d1 = cpu_ldq_data(env, a0 + 8);
if (d0 == EAX && d1 == EDX) { if (d0 == EAX && d1 == EDX) {
stq(a0, EBX); cpu_stq_data(env, a0, EBX);
stq(a0 + 8, ECX); cpu_stq_data(env, a0 + 8, ECX);
eflags |= CC_Z; eflags |= CC_Z;
} else { } else {
/* always do the store */ /* always do the store */
stq(a0, d0); cpu_stq_data(env, a0, d0);
stq(a0 + 8, d1); cpu_stq_data(env, a0 + 8, d1);
EDX = d1; EDX = d1;
EAX = d0; EAX = d0;
eflags &= ~CC_Z; eflags &= ~CC_Z;
...@@ -87,24 +86,24 @@ void helper_cmpxchg16b(target_ulong a0) ...@@ -87,24 +86,24 @@ void helper_cmpxchg16b(target_ulong a0)
} }
#endif #endif
void helper_boundw(target_ulong a0, int v) void helper_boundw(CPUX86State *env, target_ulong a0, int v)
{ {
int low, high; int low, high;
low = ldsw(a0); low = cpu_ldsw_data(env, a0);
high = ldsw(a0 + 2); high = cpu_ldsw_data(env, a0 + 2);
v = (int16_t)v; v = (int16_t)v;
if (v < low || v > high) { if (v < low || v > high) {
raise_exception(env, EXCP05_BOUND); raise_exception(env, EXCP05_BOUND);
} }
} }
void helper_boundl(target_ulong a0, int v) void helper_boundl(CPUX86State *env, target_ulong a0, int v)
{ {
int low, high; int low, high;
low = ldl(a0); low = cpu_ldl_data(env, a0);
high = ldl(a0 + 4); high = cpu_ldl_data(env, a0 + 4);
if (v < low || v > high) { if (v < low || v > high) {
raise_exception(env, EXCP05_BOUND); raise_exception(env, EXCP05_BOUND);
} }
...@@ -133,15 +132,11 @@ void helper_boundl(target_ulong a0, int v) ...@@ -133,15 +132,11 @@ void helper_boundl(target_ulong a0, int v)
NULL, it means that the function was called in C code (i.e. not NULL, it means that the function was called in C code (i.e. not
from generated code or from helper.c) */ from generated code or from helper.c) */
/* XXX: fix it to restore all registers */ /* XXX: fix it to restore all registers */
void tlb_fill(CPUX86State *env1, target_ulong addr, int is_write, int mmu_idx, void tlb_fill(CPUX86State *env, target_ulong addr, int is_write, int mmu_idx,
uintptr_t retaddr) uintptr_t retaddr)
{ {
TranslationBlock *tb; TranslationBlock *tb;
int ret; int ret;
CPUX86State *saved_env;
saved_env = env;
env = env1;
ret = cpu_x86_handle_mmu_fault(env, addr, is_write, mmu_idx); ret = cpu_x86_handle_mmu_fault(env, addr, is_write, mmu_idx);
if (ret) { if (ret) {
...@@ -156,65 +151,5 @@ void tlb_fill(CPUX86State *env1, target_ulong addr, int is_write, int mmu_idx, ...@@ -156,65 +151,5 @@ void tlb_fill(CPUX86State *env1, target_ulong addr, int is_write, int mmu_idx,
} }
raise_exception_err(env, env->exception_index, env->error_code); raise_exception_err(env, env->exception_index, env->error_code);
} }
env = saved_env;
} }
#endif #endif
/* temporary wrappers */
#if defined(CONFIG_USER_ONLY)
#define ldub_data(addr) ldub_raw(addr)
#define lduw_data(addr) lduw_raw(addr)
#define ldl_data(addr) ldl_raw(addr)
#define ldq_data(addr) ldq_raw(addr)
#define stb_data(addr, data) stb_raw(addr, data)
#define stw_data(addr, data) stw_raw(addr, data)
#define stl_data(addr, data) stl_raw(addr, data)
#define stq_data(addr, data) stq_raw(addr, data)
#endif
#define WRAP_LD(rettype, fn) \
rettype cpu_ ## fn(CPUX86State *env1, target_ulong addr) \
{ \
CPUX86State *saved_env; \
rettype ret; \
\
saved_env = env; \
env = env1; \
ret = fn(addr); \
env = saved_env; \
return ret; \
}
WRAP_LD(uint32_t, ldub_data)
WRAP_LD(uint32_t, lduw_data)
WRAP_LD(uint32_t, ldl_data)
WRAP_LD(uint64_t, ldq_data)
WRAP_LD(uint32_t, ldub_kernel)
WRAP_LD(uint32_t, lduw_kernel)
WRAP_LD(uint32_t, ldl_kernel)
WRAP_LD(uint64_t, ldq_kernel)
#undef WRAP_LD
#define WRAP_ST(datatype, fn) \
void cpu_ ## fn(CPUX86State *env1, target_ulong addr, datatype val) \
{ \
CPUX86State *saved_env; \
\
saved_env = env; \
env = env1; \
fn(addr, val); \
env = saved_env; \
}
WRAP_ST(uint32_t, stb_data)
WRAP_ST(uint32_t, stw_data)
WRAP_ST(uint32_t, stl_data)
WRAP_ST(uint64_t, stq_data)
WRAP_ST(uint32_t, stb_kernel)
WRAP_ST(uint32_t, stw_kernel)
WRAP_ST(uint32_t, stl_kernel)
WRAP_ST(uint64_t, stq_kernel)
#undef WRAP_ST
...@@ -21,6 +21,10 @@ ...@@ -21,6 +21,10 @@
#include "ioport.h" #include "ioport.h"
#include "helper.h" #include "helper.h"
#if !defined(CONFIG_USER_ONLY)
#include "softmmu_exec.h"
#endif /* !defined(CONFIG_USER_ONLY) */
/* check if Port I/O is allowed in TSS */ /* check if Port I/O is allowed in TSS */
static inline void check_io(CPUX86State *env, int addr, int size) static inline void check_io(CPUX86State *env, int addr, int size)
{ {
......
...@@ -24,6 +24,10 @@ ...@@ -24,6 +24,10 @@
//#define DEBUG_PCALL //#define DEBUG_PCALL
#if !defined(CONFIG_USER_ONLY)
#include "softmmu_exec.h"
#endif /* !defined(CONFIG_USER_ONLY) */
#ifdef DEBUG_PCALL #ifdef DEBUG_PCALL
# define LOG_PCALL(...) qemu_log_mask(CPU_LOG_PCALL, ## __VA_ARGS__) # define LOG_PCALL(...) qemu_log_mask(CPU_LOG_PCALL, ## __VA_ARGS__)
# define LOG_PCALL_STATE(env) \ # define LOG_PCALL_STATE(env) \
......
...@@ -21,6 +21,10 @@ ...@@ -21,6 +21,10 @@
#include "cpu-all.h" #include "cpu-all.h"
#include "helper.h" #include "helper.h"
#if !defined(CONFIG_USER_ONLY)
#include "softmmu_exec.h"
#endif /* !defined(CONFIG_USER_ONLY) */
/* Secure Virtual Machine helpers */ /* Secure Virtual Machine helpers */
#if defined(CONFIG_USER_ONLY) #if defined(CONFIG_USER_ONLY)
......
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册