1ed69e831SClaudio Fontana /* 2ed69e831SClaudio Fontana * TCG specific prototypes for helpers 3ed69e831SClaudio Fontana * 4ed69e831SClaudio Fontana * Copyright (c) 2003 Fabrice Bellard 5ed69e831SClaudio Fontana * 6ed69e831SClaudio Fontana * This library is free software; you can redistribute it and/or 7ed69e831SClaudio Fontana * modify it under the terms of the GNU Lesser General Public 8ed69e831SClaudio Fontana * License as published by the Free Software Foundation; either 9ed69e831SClaudio Fontana * version 2 of the License, or (at your option) any later version. 10ed69e831SClaudio Fontana * 11ed69e831SClaudio Fontana * This library is distributed in the hope that it will be useful, 12ed69e831SClaudio Fontana * but WITHOUT ANY WARRANTY; without even the implied warranty of 13ed69e831SClaudio Fontana * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14ed69e831SClaudio Fontana * Lesser General Public License for more details. 15ed69e831SClaudio Fontana * 16ed69e831SClaudio Fontana * You should have received a copy of the GNU Lesser General Public 17ed69e831SClaudio Fontana * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18ed69e831SClaudio Fontana */ 19ed69e831SClaudio Fontana 20ed69e831SClaudio Fontana #ifndef I386_HELPER_TCG_H 21ed69e831SClaudio Fontana #define I386_HELPER_TCG_H 22ed69e831SClaudio Fontana 23ed69e831SClaudio Fontana #include "exec/exec-all.h" 2424899cdcSPaolo Bonzini #include "qemu/host-utils.h" 25ed69e831SClaudio Fontana 26ed69e831SClaudio Fontana /* Maximum instruction code size */ 27ed69e831SClaudio Fontana #define TARGET_MAX_INSN_SIZE 16 28ed69e831SClaudio Fontana 29ed69e831SClaudio Fontana #if defined(TARGET_X86_64) 30ed69e831SClaudio Fontana # define TCG_PHYS_ADDR_BITS 40 31ed69e831SClaudio Fontana #else 32ed69e831SClaudio Fontana # define TCG_PHYS_ADDR_BITS 36 33ed69e831SClaudio Fontana #endif 34ed69e831SClaudio Fontana 35b8184135SPaolo Bonzini QEMU_BUILD_BUG_ON(TCG_PHYS_ADDR_BITS > TARGET_PHYS_ADDR_SPACE_BITS); 36ed69e831SClaudio Fontana 37ed69e831SClaudio Fontana /** 38ed69e831SClaudio Fontana * x86_cpu_do_interrupt: 39ed69e831SClaudio Fontana * @cpu: vCPU the interrupt is to be handled by. 40ed69e831SClaudio Fontana */ 41ed69e831SClaudio Fontana void x86_cpu_do_interrupt(CPUState *cpu); 4260466472SPhilippe Mathieu-Daudé #ifndef CONFIG_USER_ONLY 43408b2b3dSPeter Maydell bool x86_cpu_exec_halt(CPUState *cpu); 446ae75481SPhilippe Mathieu-Daudé bool x86_need_replay_interrupt(int interrupt_request); 45ed69e831SClaudio Fontana bool x86_cpu_exec_interrupt(CPUState *cpu, int int_req); 4660466472SPhilippe Mathieu-Daudé #endif 47ed69e831SClaudio Fontana 48ed69e831SClaudio Fontana void breakpoint_handler(CPUState *cs); 49ed69e831SClaudio Fontana 50ed69e831SClaudio Fontana /* n must be a constant to be efficient */ 51ed69e831SClaudio Fontana static inline target_long lshift(target_long x, int n) 52ed69e831SClaudio Fontana { 53ed69e831SClaudio Fontana if (n >= 0) { 54ed69e831SClaudio Fontana return x << n; 55ed69e831SClaudio Fontana } else { 56ed69e831SClaudio Fontana return x >> (-n); 57ed69e831SClaudio Fontana } 58ed69e831SClaudio Fontana } 59ed69e831SClaudio Fontana 60ed69e831SClaudio Fontana /* translate.c */ 61ed69e831SClaudio Fontana void tcg_x86_init(void); 62*e4a8e093SRichard Henderson void x86_translate_code(CPUState *cs, TranslationBlock *tb, 63*e4a8e093SRichard Henderson int *max_insns, vaddr pc, void *host_pc); 64ed69e831SClaudio Fontana 65ed69e831SClaudio Fontana /* excp_helper.c */ 668905770bSMarc-André Lureau G_NORETURN void raise_exception(CPUX86State *env, int exception_index); 678905770bSMarc-André Lureau G_NORETURN void raise_exception_ra(CPUX86State *env, int exception_index, 68ed69e831SClaudio Fontana uintptr_t retaddr); 698905770bSMarc-André Lureau G_NORETURN void raise_exception_err(CPUX86State *env, int exception_index, 70ed69e831SClaudio Fontana int error_code); 718905770bSMarc-André Lureau G_NORETURN void raise_exception_err_ra(CPUX86State *env, int exception_index, 72ed69e831SClaudio Fontana int error_code, uintptr_t retaddr); 7383280f6aSPaolo Bonzini G_NORETURN void raise_interrupt(CPUX86State *nenv, int intno, int next_eip_addend); 74958e1dd1SPaolo Bonzini G_NORETURN void handle_unaligned_access(CPUX86State *env, vaddr vaddr, 75958e1dd1SPaolo Bonzini MMUAccessType access_type, 76958e1dd1SPaolo Bonzini uintptr_t retaddr); 77958e1dd1SPaolo Bonzini #ifdef CONFIG_USER_ONLY 78958e1dd1SPaolo Bonzini void x86_cpu_record_sigsegv(CPUState *cs, vaddr addr, 79958e1dd1SPaolo Bonzini MMUAccessType access_type, 80958e1dd1SPaolo Bonzini bool maperr, uintptr_t ra); 81958e1dd1SPaolo Bonzini void x86_cpu_record_sigbus(CPUState *cs, vaddr addr, 82958e1dd1SPaolo Bonzini MMUAccessType access_type, uintptr_t ra); 83958e1dd1SPaolo Bonzini #else 84958e1dd1SPaolo Bonzini bool x86_cpu_tlb_fill(CPUState *cs, vaddr address, int size, 85958e1dd1SPaolo Bonzini MMUAccessType access_type, int mmu_idx, 86958e1dd1SPaolo Bonzini bool probe, uintptr_t retaddr); 87958e1dd1SPaolo Bonzini G_NORETURN void x86_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr, 88958e1dd1SPaolo Bonzini MMUAccessType access_type, 89958e1dd1SPaolo Bonzini int mmu_idx, uintptr_t retaddr); 90958e1dd1SPaolo Bonzini #endif 91ed69e831SClaudio Fontana 92ed69e831SClaudio Fontana /* cc_helper.c */ 9324899cdcSPaolo Bonzini static inline unsigned int compute_pf(uint8_t x) 9424899cdcSPaolo Bonzini { 9524899cdcSPaolo Bonzini return !parity8(x) * CC_P; 9624899cdcSPaolo Bonzini } 97ed69e831SClaudio Fontana 9869483f31SClaudio Fontana /* misc_helper.c */ 9969483f31SClaudio Fontana void cpu_load_eflags(CPUX86State *env, int eflags, int update_mask); 100ed69e831SClaudio Fontana 1013d4fce8bSRichard Henderson /* sysemu/svm_helper.c */ 1023d4fce8bSRichard Henderson #ifndef CONFIG_USER_ONLY 1038905770bSMarc-André Lureau G_NORETURN void cpu_vmexit(CPUX86State *nenv, uint32_t exit_code, 104ed69e831SClaudio Fontana uint64_t exit_info_1, uintptr_t retaddr); 10568775856SPaolo Bonzini void do_vmexit(CPUX86State *env); 1063d4fce8bSRichard Henderson #endif 107ed69e831SClaudio Fontana 108ed69e831SClaudio Fontana /* seg_helper.c */ 109ed69e831SClaudio Fontana void do_interrupt_x86_hardirq(CPUX86State *env, int intno, int is_hw); 11030493a03SClaudio Fontana void do_interrupt_all(X86CPU *cpu, int intno, int is_int, 11130493a03SClaudio Fontana int error_code, target_ulong next_eip, int is_hw); 11230493a03SClaudio Fontana void handle_even_inj(CPUX86State *env, int intno, int is_int, 11330493a03SClaudio Fontana int error_code, int is_hw, int rm); 11430493a03SClaudio Fontana int exception_has_error_code(int intno); 115ed69e831SClaudio Fontana 116ed69e831SClaudio Fontana /* smm_helper.c */ 117ed69e831SClaudio Fontana void do_smm_enter(X86CPU *cpu); 118ed69e831SClaudio Fontana 11973fb7b3cSPaolo Bonzini /* sysemu/bpt_helper.c */ 1206d8d1a03SClaudio Fontana bool check_hw_breakpoints(CPUX86State *env, bool force_dr6_update); 1216d8d1a03SClaudio Fontana 12273fb7b3cSPaolo Bonzini /* 12373fb7b3cSPaolo Bonzini * Do the tasks usually performed by gen_eob(). Callers of this function 12473fb7b3cSPaolo Bonzini * should also handle TF as appropriate. 12573fb7b3cSPaolo Bonzini */ 12673fb7b3cSPaolo Bonzini static inline void do_end_instruction(CPUX86State *env) 12773fb7b3cSPaolo Bonzini { 12873fb7b3cSPaolo Bonzini /* needed if sti is just before */ 12973fb7b3cSPaolo Bonzini env->hflags &= ~HF_INHIBIT_IRQ_MASK; 13073fb7b3cSPaolo Bonzini env->eflags &= ~HF_RF_MASK; 13173fb7b3cSPaolo Bonzini } 132ed69e831SClaudio Fontana #endif /* I386_HELPER_TCG_H */ 133