qemu-devel
[Top][All Lists]
Advanced

[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





reply via email to

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