[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC v1 07/10] i386: move TCG cpu class initialization out of helper
From: |
Claudio Fontana |
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 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.12.0 |
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
- [RFC v1 00/10] i386 cleanup, Claudio Fontana, 2020/11/09
- [RFC v1 02/10] i386: move whpx accel files to accel/whpx/, Claudio Fontana, 2020/11/09
- [RFC v1 03/10] i386: move hax accel files to accel/hax/, Claudio Fontana, 2020/11/09
- [RFC v1 01/10] i386: move kvm accel files into accel/kvm/, Claudio Fontana, 2020/11/09
- [RFC v1 04/10] i386: move hvf accel files into accel/hvf/, Claudio Fontana, 2020/11/09
- [RFC v1 05/10] i386: move TCG accel files into accel/tcg/, Claudio Fontana, 2020/11/09
- [RFC v1 08/10] module: introduce MODULE_INIT_ACCEL_CPU, Claudio Fontana, 2020/11/09
- [RFC v1 07/10] i386: move TCG cpu class initialization out of helper.c, Claudio Fontana, 2020/11/09
- [RFC v1 06/10] i386: move cpu dump out of helper.c into cpu-dump.c, Claudio Fontana, 2020/11/09
- [RFC v1 09/10] i386: split cpu.c and defer x86 models registration, Claudio Fontana, 2020/11/09