From: Claudio Fontana <cfontana@suse.de>
To: "Paolo Bonzini" <pbonzini@redhat.com>,
"Thomas Huth" <thuth@redhat.com>,
"Richard Henderson" <rth@twiddle.net>,
"Stefano Stabellini" <sstabellini@kernel.org>,
"Wenchao Wang" <wenchao.wang@intel.com>,
"Roman Bolshakov" <r.bolshakov@yadro.com>,
"Sunil Muthuswamy" <sunilmut@microsoft.com>,
"Philippe Mathieu-Daudé" <philmd@redhat.com>
Cc: Laurent Vivier <lvivier@redhat.com>,
Eduardo Habkost <ehabkost@redhat.com>,
Paul Durrant <paul@xen.org>, Jason Wang <jasowang@redhat.com>,
Marcelo Tosatti <mtosatti@redhat.com>,
qemu-devel@nongnu.org, Peter Xu <peterx@redhat.com>,
Dario Faggioli <dfaggioli@suse.com>,
haxm-team@intel.com, Cameron Esfahani <dirty@apple.com>,
Anthony Perard <anthony.perard@citrix.com>,
Bruce Rogers <brogers@suse.com>, Colin Xu <colin.xu@intel.com>
Subject: Re: [RFC v1 07/10] i386: move TCG cpu class initialization out of helper.c
Date: Tue, 10 Nov 2020 11:05:54 +0100 [thread overview]
Message-ID: <2dbed61d-b4be-aedf-fe62-f97b72308927@suse.de> (raw)
In-Reply-To: <3855be8b-0488-4fb3-f794-cab91382cc28@redhat.com>
On 11/9/20 6:39 PM, Paolo Bonzini wrote:
> On 09/11/20 18:27, Claudio Fontana wrote:
>> Signed-off-by: Claudio Fontana <cfontana@suse.de>
>> ---
>> target/i386/accel/tcg/bpt_helper.c | 1 +
>> target/i386/accel/tcg/cc_helper.c | 1 +
>> target/i386/accel/tcg/excp_helper.c | 1 +
>> target/i386/accel/tcg/fpu_helper.c | 33 ++++----
>> target/i386/accel/tcg/int_helper.c | 1 +
>> target/i386/accel/tcg/mem_helper.c | 1 +
>> target/i386/accel/tcg/misc_helper.c | 1 +
>> target/i386/accel/tcg/mpx_helper.c | 1 +
>> target/i386/accel/tcg/seg_helper.c | 1 +
>> target/i386/accel/tcg/smm_helper.c | 2 +
>> target/i386/accel/tcg/svm_helper.c | 1 +
>> target/i386/accel/tcg/translate.c | 1 +
>> target/i386/cpu.c | 33 +++-----
>> target/i386/cpu.h | 97 ++----------------------
>> target/i386/helper-tcg.h | 112 ++++++++++++++++++++++++++++
>> target/i386/helper.c | 23 ------
>> target/i386/meson.build | 1 +
>> target/i386/tcg-cpu.c | 71 ++++++++++++++++++
>> target/i386/tcg-cpu.h | 15 ++++
>> 19 files changed, 244 insertions(+), 153 deletions(-)
>> create mode 100644 target/i386/helper-tcg.h
>> create mode 100644 target/i386/tcg-cpu.c
>> create mode 100644 target/i386/tcg-cpu.h
>>
>> diff --git a/target/i386/accel/tcg/bpt_helper.c b/target/i386/accel/tcg/bpt_helper.c
>> index c3a8ea73c9..5a551ce06e 100644
>> --- a/target/i386/accel/tcg/bpt_helper.c
>> +++ b/target/i386/accel/tcg/bpt_helper.c
>> @@ -21,6 +21,7 @@
>> #include "cpu.h"
>> #include "exec/exec-all.h"
>> #include "exec/helper-proto.h"
>> +#include "helper-tcg.h"
>>
>>
>> #ifndef CONFIG_USER_ONLY
>> diff --git a/target/i386/accel/tcg/cc_helper.c b/target/i386/accel/tcg/cc_helper.c
>> index c9c90e10db..0b4c5b2cee 100644
>> --- a/target/i386/accel/tcg/cc_helper.c
>> +++ b/target/i386/accel/tcg/cc_helper.c
>> @@ -20,6 +20,7 @@
>> #include "qemu/osdep.h"
>> #include "cpu.h"
>> #include "exec/helper-proto.h"
>> +#include "helper-tcg.h"
>>
>> const uint8_t parity_table[256] = {
>> CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
>> diff --git a/target/i386/accel/tcg/excp_helper.c b/target/i386/accel/tcg/excp_helper.c
>> index b10c7ecbcc..7cf690652e 100644
>> --- a/target/i386/accel/tcg/excp_helper.c
>> +++ b/target/i386/accel/tcg/excp_helper.c
>> @@ -23,6 +23,7 @@
>> #include "qemu/log.h"
>> #include "sysemu/runstate.h"
>> #include "exec/helper-proto.h"
>> +#include "helper-tcg.h"
>>
>> void helper_raise_interrupt(CPUX86State *env, int intno, int next_eip_addend)
>> {
>> diff --git a/target/i386/accel/tcg/fpu_helper.c b/target/i386/accel/tcg/fpu_helper.c
>> index 4ea73874d8..28703a41a2 100644
>> --- a/target/i386/accel/tcg/fpu_helper.c
>> +++ b/target/i386/accel/tcg/fpu_helper.c
>> @@ -26,6 +26,7 @@
>> #include "exec/cpu_ldst.h"
>> #include "fpu/softfloat.h"
>> #include "fpu/softfloat-macros.h"
>> +#include "helper-tcg.h"
>>
>> #ifdef CONFIG_SOFTMMU
>> #include "hw/irq.h"
>> @@ -2986,23 +2987,21 @@ void update_mxcsr_status(CPUX86State *env)
>>
>> void update_mxcsr_from_sse_status(CPUX86State *env)
>> {
>> - if (tcg_enabled()) {
>> - uint8_t flags = get_float_exception_flags(&env->sse_status);
>> - /*
>> - * The MXCSR denormal flag has opposite semantics to
>> - * float_flag_input_denormal (the softfloat code sets that flag
>> - * only when flushing input denormals to zero, but SSE sets it
>> - * only when not flushing them to zero), so is not converted
>> - * here.
>> - */
>> - env->mxcsr |= ((flags & float_flag_invalid ? FPUS_IE : 0) |
>> - (flags & float_flag_divbyzero ? FPUS_ZE : 0) |
>> - (flags & float_flag_overflow ? FPUS_OE : 0) |
>> - (flags & float_flag_underflow ? FPUS_UE : 0) |
>> - (flags & float_flag_inexact ? FPUS_PE : 0) |
>> - (flags & float_flag_output_denormal ? FPUS_UE | FPUS_PE :
>> - 0));
>> - }
>> + uint8_t flags = get_float_exception_flags(&env->sse_status);
>> + /*
>> + * The MXCSR denormal flag has opposite semantics to
>> + * float_flag_input_denormal (the softfloat code sets that flag
>> + * only when flushing input denormals to zero, but SSE sets it
>> + * only when not flushing them to zero), so is not converted
>> + * here.
>> + */
>> + env->mxcsr |= ((flags & float_flag_invalid ? FPUS_IE : 0) |
>> + (flags & float_flag_divbyzero ? FPUS_ZE : 0) |
>> + (flags & float_flag_overflow ? FPUS_OE : 0) |
>> + (flags & float_flag_underflow ? FPUS_UE : 0) |
>> + (flags & float_flag_inexact ? FPUS_PE : 0) |
>> + (flags & float_flag_output_denormal ? FPUS_UE | FPUS_PE :
>> + 0));
>> }
>>
>> void helper_update_mxcsr(CPUX86State *env)
>> diff --git a/target/i386/accel/tcg/int_helper.c b/target/i386/accel/tcg/int_helper.c
>> index 334469ca8c..5fedb851f3 100644
>> --- a/target/i386/accel/tcg/int_helper.c
>> +++ b/target/i386/accel/tcg/int_helper.c
>> @@ -24,6 +24,7 @@
>> #include "exec/helper-proto.h"
>> #include "qapi/error.h"
>> #include "qemu/guest-random.h"
>> +#include "helper-tcg.h"
>>
>> //#define DEBUG_MULDIV
>>
>> diff --git a/target/i386/accel/tcg/mem_helper.c b/target/i386/accel/tcg/mem_helper.c
>> index 3a6d3ae2ef..1f6808d311 100644
>> --- a/target/i386/accel/tcg/mem_helper.c
>> +++ b/target/i386/accel/tcg/mem_helper.c
>> @@ -25,6 +25,7 @@
>> #include "qemu/int128.h"
>> #include "qemu/atomic128.h"
>> #include "tcg/tcg.h"
>> +#include "helper-tcg.h"
>>
>> void helper_cmpxchg8b_unlocked(CPUX86State *env, target_ulong a0)
>> {
>> diff --git a/target/i386/accel/tcg/misc_helper.c b/target/i386/accel/tcg/misc_helper.c
>> index b6b1d41b14..9afcd11ea1 100644
>> --- a/target/i386/accel/tcg/misc_helper.c
>> +++ b/target/i386/accel/tcg/misc_helper.c
>> @@ -24,6 +24,7 @@
>> #include "exec/exec-all.h"
>> #include "exec/cpu_ldst.h"
>> #include "exec/address-spaces.h"
>> +#include "helper-tcg.h"
>>
>> void helper_outb(CPUX86State *env, uint32_t port, uint32_t data)
>> {
>> diff --git a/target/i386/accel/tcg/mpx_helper.c b/target/i386/accel/tcg/mpx_helper.c
>> index ade5d245d2..329aeef780 100644
>> --- a/target/i386/accel/tcg/mpx_helper.c
>> +++ b/target/i386/accel/tcg/mpx_helper.c
>> @@ -22,6 +22,7 @@
>> #include "exec/helper-proto.h"
>> #include "exec/cpu_ldst.h"
>> #include "exec/exec-all.h"
>> +#include "helper-tcg.h"
>>
>>
>> void helper_bndck(CPUX86State *env, uint32_t fail)
>> diff --git a/target/i386/accel/tcg/seg_helper.c b/target/i386/accel/tcg/seg_helper.c
>> index be88938c2a..bad751c495 100644
>> --- a/target/i386/accel/tcg/seg_helper.c
>> +++ b/target/i386/accel/tcg/seg_helper.c
>> @@ -25,6 +25,7 @@
>> #include "exec/exec-all.h"
>> #include "exec/cpu_ldst.h"
>> #include "exec/log.h"
>> +#include "helper-tcg.h"
>>
>> //#define DEBUG_PCALL
>>
>> diff --git a/target/i386/accel/tcg/smm_helper.c b/target/i386/accel/tcg/smm_helper.c
>> index eb5aa6eb3d..ede197a379 100644
>> --- a/target/i386/accel/tcg/smm_helper.c
>> +++ b/target/i386/accel/tcg/smm_helper.c
>> @@ -22,6 +22,8 @@
>> #include "cpu.h"
>> #include "exec/helper-proto.h"
>> #include "exec/log.h"
>> +#include "helper-tcg.h"
>> +
>>
>> /* SMM support */
>>
>> diff --git a/target/i386/accel/tcg/svm_helper.c b/target/i386/accel/tcg/svm_helper.c
>> index 6224387eab..202832762e 100644
>> --- a/target/i386/accel/tcg/svm_helper.c
>> +++ b/target/i386/accel/tcg/svm_helper.c
>> @@ -22,6 +22,7 @@
>> #include "exec/helper-proto.h"
>> #include "exec/exec-all.h"
>> #include "exec/cpu_ldst.h"
>> +#include "helper-tcg.h"
>>
>> /* Secure Virtual Machine helpers */
>>
>> diff --git a/target/i386/accel/tcg/translate.c b/target/i386/accel/tcg/translate.c
>> index caea6f5fb1..bb64070365 100644
>> --- a/target/i386/accel/tcg/translate.c
>> +++ b/target/i386/accel/tcg/translate.c
>> @@ -28,6 +28,7 @@
>>
>> #include "exec/helper-proto.h"
>> #include "exec/helper-gen.h"
>> +#include "helper-tcg.h"
>>
>> #include "trace-tcg.h"
>> #include "exec/log.h"
>> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
>> index b1a55a2b79..b185789d88 100644
>> --- a/target/i386/cpu.c
>> +++ b/target/i386/cpu.c
>> @@ -24,6 +24,8 @@
>> #include "qemu/qemu-print.h"
>>
>> #include "cpu.h"
>> +#include "tcg-cpu.h"
>> +#include "helper-tcg.h"
>> #include "exec/exec-all.h"
>> #include "sysemu/kvm.h"
>> #include "sysemu/reset.h"
>> @@ -1495,7 +1497,8 @@ static inline uint64_t x86_cpu_xsave_components(X86CPU *cpu)
>> cpu->env.features[FEAT_XSAVE_COMP_LO];
>> }
>>
>> -const char *get_register_name_32(unsigned int reg)
>> +/* Return name of 32-bit register, from a R_* constant */
>> +static const char *get_register_name_32(unsigned int reg)
>> {
>> if (reg >= CPU_NB_REGS32) {
>> return NULL;
>> @@ -7012,13 +7015,6 @@ static void x86_cpu_set_pc(CPUState *cs, vaddr value)
>> cpu->env.eip = value;
>> }
>>
>> -static void x86_cpu_synchronize_from_tb(CPUState *cs, TranslationBlock *tb)
>> -{
>> - X86CPU *cpu = X86_CPU(cs);
>> -
>> - cpu->env.eip = tb->pc - tb->cs_base;
>> -}
>> -
>> int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request)
>> {
>> X86CPU *cpu = X86_CPU(cs);
>> @@ -7252,17 +7248,18 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
>> cc->class_by_name = x86_cpu_class_by_name;
>> cc->parse_features = x86_cpu_parse_featurestr;
>> cc->has_work = x86_cpu_has_work;
>> +
>> #ifdef CONFIG_TCG
>> - cc->do_interrupt = x86_cpu_do_interrupt;
>> - cc->cpu_exec_interrupt = x86_cpu_exec_interrupt;
>> -#endif
>> + tcg_cpu_common_class_init(cc);
>> +#endif /* CONFIG_TCG */
>> +
>> cc->dump_state = x86_cpu_dump_state;
>> cc->set_pc = x86_cpu_set_pc;
>> - cc->synchronize_from_tb = x86_cpu_synchronize_from_tb;
>> cc->gdb_read_register = x86_cpu_gdb_read_register;
>> cc->gdb_write_register = x86_cpu_gdb_write_register;
>> cc->get_arch_id = x86_cpu_get_arch_id;
>> cc->get_paging_enabled = x86_cpu_get_paging_enabled;
>> +
>> #ifndef CONFIG_USER_ONLY
>> cc->asidx_from_attrs = x86_asidx_from_attrs;
>> cc->get_memory_mapping = x86_cpu_get_memory_mapping;
>> @@ -7273,7 +7270,8 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
>> cc->write_elf32_note = x86_cpu_write_elf32_note;
>> cc->write_elf32_qemunote = x86_cpu_write_elf32_qemunote;
>> cc->vmsd = &vmstate_x86_cpu;
>> -#endif
>> +#endif /* !CONFIG_USER_ONLY */
>> +
>> cc->gdb_arch_name = x86_gdb_arch_name;
>> #ifdef TARGET_X86_64
>> cc->gdb_core_xml_file = "i386-64bit.xml";
>> @@ -7281,15 +7279,6 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
>> #else
>> cc->gdb_core_xml_file = "i386-32bit.xml";
>> cc->gdb_num_core_regs = 50;
>> -#endif
>> -#if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
>> - cc->debug_excp_handler = breakpoint_handler;
>> -#endif
>> - cc->cpu_exec_enter = x86_cpu_exec_enter;
>> - cc->cpu_exec_exit = x86_cpu_exec_exit;
>> -#ifdef CONFIG_TCG
>> - cc->tcg_initialize = tcg_x86_init;
>> - cc->tlb_fill = x86_cpu_tlb_fill;
>> #endif
>> cc->disas_set_info = x86_disas_set_info;
>>
>> diff --git a/target/i386/cpu.h b/target/i386/cpu.h
>> index d4772185df..f1bce16b53 100644
>> --- a/target/i386/cpu.h
>> +++ b/target/i386/cpu.h
>> @@ -31,9 +31,6 @@
>>
>> #define KVM_HAVE_MCE_INJECTION 1
>>
>> -/* Maximum instruction code size */
>> -#define TARGET_MAX_INSN_SIZE 16
>> -
>> /* support for self modifying code even if the modified instruction is
>> close to the modifying instruction */
>> #define TARGET_HAS_PRECISE_SMC
>> @@ -1037,6 +1034,12 @@ typedef uint64_t FeatureWordArray[FEATURE_WORDS];
>> * using this information. Condition codes are not generated if they
>> * are only needed for conditional branches.
>> */
>> +
>> +#define CC_DST (env->cc_dst)
>> +#define CC_SRC (env->cc_src)
>> +#define CC_SRC2 (env->cc_src2)
>> +#define CC_OP (env->cc_op)
>> +
>> typedef enum {
>> CC_OP_DYNAMIC, /* must use dynamic code to get cc_op */
>> CC_OP_EFLAGS, /* all cc are explicitly computed, CC_SRC = flags */
>> @@ -1765,12 +1768,6 @@ struct X86CPU {
>> extern VMStateDescription vmstate_x86_cpu;
>> #endif
>>
>> -/**
>> - * x86_cpu_do_interrupt:
>> - * @cpu: vCPU the interrupt is to be handled by.
>> - */
>> -void x86_cpu_do_interrupt(CPUState *cpu);
>> -bool x86_cpu_exec_interrupt(CPUState *cpu, int int_req);
>> int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request);
>>
>> int x86_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cpu,
>> @@ -1793,9 +1790,6 @@ hwaddr x86_cpu_get_phys_page_attrs_debug(CPUState *cpu, vaddr addr,
>> int x86_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
>> int x86_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
>>
>> -void x86_cpu_exec_enter(CPUState *cpu);
>> -void x86_cpu_exec_exit(CPUState *cpu);
>> -
>> void x86_cpu_list(void);
>> int cpu_x86_support_mca_broadcast(CPUX86State *env);
>>
>> @@ -1920,9 +1914,6 @@ void host_cpuid(uint32_t function, uint32_t count,
>> void host_vendor_fms(char *vendor, int *family, int *model, int *stepping);
>>
>> /* helper.c */
>> -bool x86_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
>> - MMUAccessType access_type, int mmu_idx,
>> - bool probe, uintptr_t retaddr);
>> void x86_cpu_set_a20(X86CPU *cpu, int a20_state);
>>
>> #ifndef CONFIG_USER_ONLY
>> @@ -1947,8 +1938,6 @@ void x86_stl_phys(CPUState *cs, hwaddr addr, uint32_t val);
>> void x86_stq_phys(CPUState *cs, hwaddr addr, uint64_t val);
>> #endif
>>
>> -void breakpoint_handler(CPUState *cs);
>> -
>> /* will be suppressed */
>> void cpu_x86_update_cr0(CPUX86State *env, uint32_t new_cr0);
>> void cpu_x86_update_cr3(CPUX86State *env, target_ulong new_cr3);
>> @@ -1958,16 +1947,6 @@ void cpu_x86_update_dr7(CPUX86State *env, uint32_t new_dr7);
>> /* hw/pc.c */
>> uint64_t cpu_get_tsc(CPUX86State *env);
>>
>> -/* XXX: This value should match the one returned by CPUID
>> - * and in exec.c */
>> -# if defined(TARGET_X86_64)
>> -# define TCG_PHYS_ADDR_BITS 40
>> -# else
>> -# define TCG_PHYS_ADDR_BITS 36
>> -# endif
>> -
>> -#define PHYS_ADDR_MASK MAKE_64BIT_MASK(0, TCG_PHYS_ADDR_BITS)
>> -
>> #define X86_CPU_TYPE_SUFFIX "-" TYPE_X86_CPU
>> #define X86_CPU_TYPE_NAME(name) (name X86_CPU_TYPE_SUFFIX)
>> #define CPU_RESOLVING_TYPE TYPE_X86_CPU
>> @@ -1999,30 +1978,6 @@ static inline int cpu_mmu_index_kernel(CPUX86State *env)
>> ? MMU_KNOSMAP_IDX : MMU_KSMAP_IDX;
>> }
>>
>> -#define CC_DST (env->cc_dst)
>> -#define CC_SRC (env->cc_src)
>> -#define CC_SRC2 (env->cc_src2)
>> -#define CC_OP (env->cc_op)
>> -
>> -/* n must be a constant to be efficient */
>> -static inline target_long lshift(target_long x, int n)
>> -{
>> - if (n >= 0) {
>> - return x << n;
>> - } else {
>> - return x >> (-n);
>> - }
>> -}
>> -
>> -/* float macros */
>> -#define FT0 (env->ft0)
>> -#define ST0 (env->fpregs[env->fpstt].d)
>> -#define ST(n) (env->fpregs[(env->fpstt + (n)) & 7].d)
>> -#define ST1 ST(1)
>> -
>> -/* translate.c */
>> -void tcg_x86_init(void);
>> -
>> typedef CPUX86State CPUArchState;
>> typedef X86CPU ArchCPU;
>>
>> @@ -2052,19 +2007,6 @@ void cpu_x86_inject_mce(Monitor *mon, X86CPU *cpu, int bank,
>> uint64_t status, uint64_t mcg_status, uint64_t addr,
>> uint64_t misc, int flags);
>>
>> -/* excp_helper.c */
>> -void QEMU_NORETURN raise_exception(CPUX86State *env, int exception_index);
>> -void QEMU_NORETURN raise_exception_ra(CPUX86State *env, int exception_index,
>> - uintptr_t retaddr);
>> -void QEMU_NORETURN raise_exception_err(CPUX86State *env, int exception_index,
>> - int error_code);
>> -void QEMU_NORETURN raise_exception_err_ra(CPUX86State *env, int exception_index,
>> - int error_code, uintptr_t retaddr);
>> -void QEMU_NORETURN raise_interrupt(CPUX86State *nenv, int intno, int is_int,
>> - int error_code, int next_eip_addend);
>> -
>> -/* cc_helper.c */
>> -extern const uint8_t parity_table[256];
>> uint32_t cpu_cc_compute_all(CPUX86State *env1, int op);
>>
>> static inline uint32_t cpu_compute_eflags(CPUX86State *env)
>> @@ -2076,18 +2018,6 @@ static inline uint32_t cpu_compute_eflags(CPUX86State *env)
>> return eflags;
>> }
>>
>> -/* NOTE: the translator must set DisasContext.cc_op to CC_OP_EFLAGS
>> - * after generating a call to a helper that uses this.
>> - */
>> -static inline void cpu_load_eflags(CPUX86State *env, int eflags,
>> - int update_mask)
>> -{
>> - CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
>> - CC_OP = CC_OP_EFLAGS;
>> - env->df = 1 - (2 * ((eflags >> 10) & 1));
>> - env->eflags = (env->eflags & ~update_mask) |
>> - (eflags & update_mask) | 0x2;
>> -}
>>
>> /* load efer and update the corresponding hflags. XXX: do consistency
>> checks with cpuid bits? */
>> @@ -2176,16 +2106,6 @@ void helper_lock_init(void);
>> /* svm_helper.c */
>> void cpu_svm_check_intercept_param(CPUX86State *env1, uint32_t type,
>> uint64_t param, uintptr_t retaddr);
>> -void QEMU_NORETURN cpu_vmexit(CPUX86State *nenv, uint32_t exit_code,
>> - uint64_t exit_info_1, uintptr_t retaddr);
>> -void do_vmexit(CPUX86State *env, uint32_t exit_code, uint64_t exit_info_1);
>> -
>> -/* seg_helper.c */
>> -void do_interrupt_x86_hardirq(CPUX86State *env, int intno, int is_hw);
>> -
>> -/* smm_helper.c */
>> -void do_smm_enter(X86CPU *cpu);
>> -
>> /* apic.c */
>> void cpu_report_tpr_access(CPUX86State *env, TPRAccess access);
>> void apic_handle_tpr_access_report(DeviceState *d, target_ulong ip,
>> @@ -2224,11 +2144,6 @@ typedef int X86CPUVersion;
>> */
>> void x86_cpu_set_default_version(X86CPUVersion version);
>>
>> -/* Return name of 32-bit register, from a R_* constant */
>> -const char *get_register_name_32(unsigned int reg);
>> -
>> -void enable_compat_apic_id_mode(void);
>> -
>> #define APIC_DEFAULT_ADDRESS 0xfee00000
>> #define APIC_SPACE_SIZE 0x100000
>>
>> diff --git a/target/i386/helper-tcg.h b/target/i386/helper-tcg.h
>> new file mode 100644
>> index 0000000000..57b4391a7d
>> --- /dev/null
>> +++ b/target/i386/helper-tcg.h
>> @@ -0,0 +1,112 @@
>> +/*
>> + * TCG specific prototypes for helpers
>> + *
>> + * Copyright (c) 2003 Fabrice Bellard
>> + *
>> + * This library is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU Lesser General Public
>> + * License as published by the Free Software Foundation; either
>> + * version 2 of the License, or (at your option) any later version.
>> + *
>> + * This library is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
>> + * Lesser General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU Lesser General Public
>> + * License along with this library; if not, see <http://www.gnu.org/licenses/>.
>> + */
>> +
>> +#ifndef I386_HELPER_TCG_H
>> +#define I386_HELPER_TCG_H
>> +
>> +#include "exec/exec-all.h"
>> +
>> +/* Maximum instruction code size */
>> +#define TARGET_MAX_INSN_SIZE 16
>> +
>> +/*
>> + * XXX: This value should match the one returned by CPUID
>> + * and in exec.c
>> + */
>> +# if defined(TARGET_X86_64)
>> +# define TCG_PHYS_ADDR_BITS 40
>> +# else
>> +# define TCG_PHYS_ADDR_BITS 36
>> +# endif
>> +
>> +#define PHYS_ADDR_MASK MAKE_64BIT_MASK(0, TCG_PHYS_ADDR_BITS)
>> +
>> +/**
>> + * x86_cpu_do_interrupt:
>> + * @cpu: vCPU the interrupt is to be handled by.
>> + */
>> +void x86_cpu_do_interrupt(CPUState *cpu);
>> +bool x86_cpu_exec_interrupt(CPUState *cpu, int int_req);
>> +
>> +/* helper.c */
>> +bool x86_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
>> + MMUAccessType access_type, int mmu_idx,
>> + bool probe, uintptr_t retaddr);
>> +
>> +void breakpoint_handler(CPUState *cs);
>> +
>> +/* n must be a constant to be efficient */
>> +static inline target_long lshift(target_long x, int n)
>> +{
>> + if (n >= 0) {
>> + return x << n;
>> + } else {
>> + return x >> (-n);
>> + }
>> +}
>> +
>> +/* float macros */
>> +#define FT0 (env->ft0)
>> +#define ST0 (env->fpregs[env->fpstt].d)
>> +#define ST(n) (env->fpregs[(env->fpstt + (n)) & 7].d)
>> +#define ST1 ST(1)
>> +
>> +/* translate.c */
>> +void tcg_x86_init(void);
>> +
>> +/* excp_helper.c */
>> +void QEMU_NORETURN raise_exception(CPUX86State *env, int exception_index);
>> +void QEMU_NORETURN raise_exception_ra(CPUX86State *env, int exception_index,
>> + uintptr_t retaddr);
>> +void QEMU_NORETURN raise_exception_err(CPUX86State *env, int exception_index,
>> + int error_code);
>> +void QEMU_NORETURN raise_exception_err_ra(CPUX86State *env, int exception_index,
>> + int error_code, uintptr_t retaddr);
>> +void QEMU_NORETURN raise_interrupt(CPUX86State *nenv, int intno, int is_int,
>> + int error_code, int next_eip_addend);
>> +
>> +/* cc_helper.c */
>> +extern const uint8_t parity_table[256];
>> +
>> +/*
>> + * NOTE: the translator must set DisasContext.cc_op to CC_OP_EFLAGS
>> + * after generating a call to a helper that uses this.
>> + */
>> +static inline void cpu_load_eflags(CPUX86State *env, int eflags,
>> + int update_mask)
>> +{
>> + CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
>> + CC_OP = CC_OP_EFLAGS;
>> + env->df = 1 - (2 * ((eflags >> 10) & 1));
>> + env->eflags = (env->eflags & ~update_mask) |
>> + (eflags & update_mask) | 0x2;
>> +}
>> +
>> +/* svm_helper.c */
>> +void QEMU_NORETURN cpu_vmexit(CPUX86State *nenv, uint32_t exit_code,
>> + uint64_t exit_info_1, uintptr_t retaddr);
>> +void do_vmexit(CPUX86State *env, uint32_t exit_code, uint64_t exit_info_1);
>> +
>> +/* seg_helper.c */
>> +void do_interrupt_x86_hardirq(CPUX86State *env, int intno, int is_hw);
>> +
>> +/* smm_helper.c */
>> +void do_smm_enter(X86CPU *cpu);
>> +
>> +#endif /* I386_HELPER_TCG_H */
>> diff --git a/target/i386/helper.c b/target/i386/helper.c
>> index a78fc4b4aa..0af4c1adf2 100644
>> --- a/target/i386/helper.c
>> +++ b/target/i386/helper.c
>> @@ -24,10 +24,8 @@
>> #include "sysemu/runstate.h"
>> #include "accel/kvm/kvm_i386.h"
>> #ifndef CONFIG_USER_ONLY
>> -#include "sysemu/tcg.h"
>> #include "sysemu/hw_accel.h"
>> #include "monitor/monitor.h"
>> -#include "hw/i386/apic_internal.h"
>> #endif
>>
>> void cpu_sync_bndcs_hflags(CPUX86State *env)
>> @@ -574,27 +572,6 @@ void do_cpu_sipi(X86CPU *cpu)
>> }
>> #endif
>>
>> -/* Frob eflags into and out of the CPU temporary format. */
>> -
>> -void x86_cpu_exec_enter(CPUState *cs)
>> -{
>> - X86CPU *cpu = X86_CPU(cs);
>> - CPUX86State *env = &cpu->env;
>> -
>> - CC_SRC = env->eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
>> - env->df = 1 - (2 * ((env->eflags >> 10) & 1));
>> - CC_OP = CC_OP_EFLAGS;
>> - env->eflags &= ~(DF_MASK | CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
>> -}
>> -
>> -void x86_cpu_exec_exit(CPUState *cs)
>> -{
>> - X86CPU *cpu = X86_CPU(cs);
>> - CPUX86State *env = &cpu->env;
>> -
>> - env->eflags = cpu_compute_eflags(env);
>> -}
>> -
>> #ifndef CONFIG_USER_ONLY
>> uint8_t x86_ldub_phys(CPUState *cs, hwaddr addr)
>> {
>> diff --git a/target/i386/meson.build b/target/i386/meson.build
>> index 7da5521364..50c8fba6cb 100644
>> --- a/target/i386/meson.build
>> +++ b/target/i386/meson.build
>> @@ -6,6 +6,7 @@ i386_ss.add(files(
>> 'xsave_helper.c',
>> 'cpu-dump.c',
>> ))
>> +i386_ss.add(when: 'CONFIG_TCG', if_true: files('tcg-cpu.c'))
>> i386_ss.add(when: 'CONFIG_SEV', if_true: files('sev.c'), if_false: files('sev-stub.c'))
>>
>> i386_softmmu_ss = ss.source_set()
>> diff --git a/target/i386/tcg-cpu.c b/target/i386/tcg-cpu.c
>> new file mode 100644
>> index 0000000000..628dd29fe7
>> --- /dev/null
>> +++ b/target/i386/tcg-cpu.c
>> @@ -0,0 +1,71 @@
>> +/*
>> + * i386 TCG cpu class initialization
>> + *
>> + * Copyright (c) 2003 Fabrice Bellard
>> + *
>> + * This library is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU Lesser General Public
>> + * License as published by the Free Software Foundation; either
>> + * version 2 of the License, or (at your option) any later version.
>> + *
>> + * This library is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
>> + * Lesser General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU Lesser General Public
>> + * License along with this library; if not, see <http://www.gnu.org/licenses/>.
>> + */
>> +
>> +#include "qemu/osdep.h"
>> +#include "cpu.h"
>> +#include "tcg-cpu.h"
>> +#include "exec/exec-all.h"
>> +#include "sysemu/runstate.h"
>> +#include "helper-tcg.h"
>> +
>> +#if !defined(CONFIG_USER_ONLY)
>> +#include "hw/i386/apic.h"
>> +#endif
>> +
>> +/* Frob eflags into and out of the CPU temporary format. */
>> +
>> +static void x86_cpu_exec_enter(CPUState *cs)
>> +{
>> + X86CPU *cpu = X86_CPU(cs);
>> + CPUX86State *env = &cpu->env;
>> +
>> + CC_SRC = env->eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
>> + env->df = 1 - (2 * ((env->eflags >> 10) & 1));
>> + CC_OP = CC_OP_EFLAGS;
>> + env->eflags &= ~(DF_MASK | CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
>> +}
>> +
>> +static void x86_cpu_exec_exit(CPUState *cs)
>> +{
>> + X86CPU *cpu = X86_CPU(cs);
>> + CPUX86State *env = &cpu->env;
>> +
>> + env->eflags = cpu_compute_eflags(env);
>> +}
>> +
>> +static void x86_cpu_synchronize_from_tb(CPUState *cs, TranslationBlock *tb)
>> +{
>> + X86CPU *cpu = X86_CPU(cs);
>> +
>> + cpu->env.eip = tb->pc - tb->cs_base;
>> +}
>> +
>> +void tcg_cpu_common_class_init(CPUClass *cc)
>> +{
>> + cc->do_interrupt = x86_cpu_do_interrupt;
>> + cc->cpu_exec_interrupt = x86_cpu_exec_interrupt;
>> + cc->synchronize_from_tb = x86_cpu_synchronize_from_tb;
>> + cc->cpu_exec_enter = x86_cpu_exec_enter;
>> + cc->cpu_exec_exit = x86_cpu_exec_exit;
>> + cc->tcg_initialize = tcg_x86_init;
>> + cc->tlb_fill = x86_cpu_tlb_fill;
>> +#ifndef CONFIG_USER_ONLY
>> + cc->debug_excp_handler = breakpoint_handler;
>> +#endif
>> +}
>> diff --git a/target/i386/tcg-cpu.h b/target/i386/tcg-cpu.h
>> new file mode 100644
>> index 0000000000..81f02e562e
>> --- /dev/null
>> +++ b/target/i386/tcg-cpu.h
>> @@ -0,0 +1,15 @@
>> +/*
>> + * i386 TCG CPU class initialization
>> + *
>> + * Copyright 2020 SUSE LLC
>> + *
>> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
>> + * See the COPYING file in the top-level directory.
>> + */
>> +
>> +#ifndef TCG_CPU_H
>> +#define TCG_CPU_H
>> +
>> +void tcg_cpu_common_class_init(CPUClass *cc);
>> +
>> +#endif /* TCG_CPU_H */
>>
>
> Up to this patch I think it's a no brainer, modulo the bikeshedding on
> paths.
>
> Paolo
>
>
Ok, the paths: I kinda liked the symmetry between:
$(top_srcdir)/accel/kvm
$(top_srcdir)/target/i386/accel/kvm
but yeah, minor think that can be dropped if necessary.
Ciao,
CLaudio
next prev parent reply other threads:[~2020-11-10 10:06 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-09 17:27 [RFC v1 00/10] i386 cleanup Claudio Fontana
2020-11-09 17:27 ` [RFC v1 01/10] i386: move kvm accel files into accel/kvm/ Claudio Fontana
2020-11-09 17:27 ` [RFC v1 02/10] i386: move whpx accel files to accel/whpx/ Claudio Fontana
2020-11-09 17:27 ` [RFC v1 03/10] i386: move hax accel files to accel/hax/ Claudio Fontana
2020-11-09 17:27 ` [RFC v1 04/10] i386: move hvf accel files into accel/hvf/ Claudio Fontana
2020-11-09 17:27 ` [RFC v1 05/10] i386: move TCG accel files into accel/tcg/ Claudio Fontana
2020-11-09 17:27 ` [RFC v1 06/10] i386: move cpu dump out of helper.c into cpu-dump.c Claudio Fontana
2020-11-09 17:27 ` [RFC v1 07/10] i386: move TCG cpu class initialization out of helper.c Claudio Fontana
2020-11-09 17:39 ` Paolo Bonzini
2020-11-10 10:05 ` Claudio Fontana [this message]
2020-11-10 10:42 ` Paolo Bonzini
2020-11-09 17:27 ` [RFC v1 08/10] module: introduce MODULE_INIT_ACCEL_CPU Claudio Fontana
2020-11-09 17:27 ` [RFC v1 09/10] i386: split cpu.c and defer x86 models registration Claudio Fontana
2020-11-09 17:34 ` Paolo Bonzini
2020-11-09 17:37 ` Paolo Bonzini
2020-11-09 18:03 ` Daniel P. Berrangé
2020-11-10 9:40 ` Claudio Fontana
2020-11-10 10:04 ` Daniel P. Berrangé
2020-11-10 10:13 ` Claudio Fontana
2020-11-10 10:41 ` Paolo Bonzini
2020-11-10 15:23 ` Eduardo Habkost
2020-11-10 16:05 ` Paolo Bonzini
2020-11-10 17:55 ` Eduardo Habkost
2020-11-10 20:39 ` Paolo Bonzini
2020-11-10 20:45 ` Eduardo Habkost
2020-11-10 17:38 ` Claudio Fontana
2020-11-10 18:14 ` Eduardo Habkost
2020-11-11 12:59 ` Claudio Fontana
2020-11-16 17:53 ` Claudio Fontana
2020-11-09 19:04 ` Eduardo Habkost
2020-11-10 9:49 ` Claudio Fontana
2020-11-09 17:27 ` [RFC v1 10/10] module: add priority to module_init Claudio Fontana
2020-11-09 17:45 ` [RFC v1 00/10] i386 cleanup no-reply
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=2dbed61d-b4be-aedf-fe62-f97b72308927@suse.de \
--to=cfontana@suse.de \
--cc=anthony.perard@citrix.com \
--cc=brogers@suse.com \
--cc=colin.xu@intel.com \
--cc=dfaggioli@suse.com \
--cc=dirty@apple.com \
--cc=ehabkost@redhat.com \
--cc=haxm-team@intel.com \
--cc=jasowang@redhat.com \
--cc=lvivier@redhat.com \
--cc=mtosatti@redhat.com \
--cc=paul@xen.org \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=philmd@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=r.bolshakov@yadro.com \
--cc=rth@twiddle.net \
--cc=sstabellini@kernel.org \
--cc=sunilmut@microsoft.com \
--cc=thuth@redhat.com \
--cc=wenchao.wang@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).