xref: /openbmc/qemu/target/i386/tcg/tcg-cpu.c (revision 04a37d4ca4bfef595b2e9bec99eac8bfc806c76b)
1ed69e831SClaudio Fontana /*
2ed69e831SClaudio Fontana  * i386 TCG cpu class initialization
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 #include "qemu/osdep.h"
21ed69e831SClaudio Fontana #include "cpu.h"
22ed69e831SClaudio Fontana #include "tcg-cpu.h"
23ed69e831SClaudio Fontana #include "exec/exec-all.h"
24ed69e831SClaudio Fontana #include "sysemu/runstate.h"
25ed69e831SClaudio Fontana #include "helper-tcg.h"
26ed69e831SClaudio Fontana 
27ed69e831SClaudio Fontana #if !defined(CONFIG_USER_ONLY)
28ed69e831SClaudio Fontana #include "hw/i386/apic.h"
29ed69e831SClaudio Fontana #endif
30ed69e831SClaudio Fontana 
31ed69e831SClaudio Fontana /* Frob eflags into and out of the CPU temporary format.  */
32ed69e831SClaudio Fontana 
33ed69e831SClaudio Fontana static void x86_cpu_exec_enter(CPUState *cs)
34ed69e831SClaudio Fontana {
35ed69e831SClaudio Fontana     X86CPU *cpu = X86_CPU(cs);
36ed69e831SClaudio Fontana     CPUX86State *env = &cpu->env;
37ed69e831SClaudio Fontana 
38ed69e831SClaudio Fontana     CC_SRC = env->eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
39ed69e831SClaudio Fontana     env->df = 1 - (2 * ((env->eflags >> 10) & 1));
40ed69e831SClaudio Fontana     CC_OP = CC_OP_EFLAGS;
41ed69e831SClaudio Fontana     env->eflags &= ~(DF_MASK | CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
42ed69e831SClaudio Fontana }
43ed69e831SClaudio Fontana 
44ed69e831SClaudio Fontana static void x86_cpu_exec_exit(CPUState *cs)
45ed69e831SClaudio Fontana {
46ed69e831SClaudio Fontana     X86CPU *cpu = X86_CPU(cs);
47ed69e831SClaudio Fontana     CPUX86State *env = &cpu->env;
48ed69e831SClaudio Fontana 
49ed69e831SClaudio Fontana     env->eflags = cpu_compute_eflags(env);
50ed69e831SClaudio Fontana }
51ed69e831SClaudio Fontana 
52*04a37d4cSRichard Henderson static void x86_cpu_synchronize_from_tb(CPUState *cs,
53*04a37d4cSRichard Henderson                                         const TranslationBlock *tb)
54ed69e831SClaudio Fontana {
55ed69e831SClaudio Fontana     X86CPU *cpu = X86_CPU(cs);
56ed69e831SClaudio Fontana 
57ed69e831SClaudio Fontana     cpu->env.eip = tb->pc - tb->cs_base;
58ed69e831SClaudio Fontana }
59ed69e831SClaudio Fontana 
60ed69e831SClaudio Fontana void tcg_cpu_common_class_init(CPUClass *cc)
61ed69e831SClaudio Fontana {
62ed69e831SClaudio Fontana     cc->do_interrupt = x86_cpu_do_interrupt;
63ed69e831SClaudio Fontana     cc->cpu_exec_interrupt = x86_cpu_exec_interrupt;
64ed69e831SClaudio Fontana     cc->synchronize_from_tb = x86_cpu_synchronize_from_tb;
65ed69e831SClaudio Fontana     cc->cpu_exec_enter = x86_cpu_exec_enter;
66ed69e831SClaudio Fontana     cc->cpu_exec_exit = x86_cpu_exec_exit;
67ed69e831SClaudio Fontana     cc->tcg_initialize = tcg_x86_init;
68ed69e831SClaudio Fontana     cc->tlb_fill = x86_cpu_tlb_fill;
69ed69e831SClaudio Fontana #ifndef CONFIG_USER_ONLY
70ed69e831SClaudio Fontana     cc->debug_excp_handler = breakpoint_handler;
71ed69e831SClaudio Fontana #endif
72ed69e831SClaudio Fontana }
73