root / target-mips / cpu.c @ feature-archipelago
History | View | Annotate | Download (3.3 kB)
1 | 0f71a709 | Andreas Färber | /*
|
---|---|---|---|
2 | 0f71a709 | Andreas Färber | * QEMU MIPS CPU
|
3 | 0f71a709 | Andreas Färber | *
|
4 | 0f71a709 | Andreas Färber | * Copyright (c) 2012 SUSE LINUX Products GmbH
|
5 | 0f71a709 | Andreas Färber | *
|
6 | 0f71a709 | Andreas Färber | * This library is free software; you can redistribute it and/or
|
7 | 0f71a709 | Andreas Färber | * modify it under the terms of the GNU Lesser General Public
|
8 | 0f71a709 | Andreas Färber | * License as published by the Free Software Foundation; either
|
9 | 0f71a709 | Andreas Färber | * version 2.1 of the License, or (at your option) any later version.
|
10 | 0f71a709 | Andreas Färber | *
|
11 | 0f71a709 | Andreas Färber | * This library is distributed in the hope that it will be useful,
|
12 | 0f71a709 | Andreas Färber | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | 0f71a709 | Andreas Färber | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | 0f71a709 | Andreas Färber | * Lesser General Public License for more details.
|
15 | 0f71a709 | Andreas Färber | *
|
16 | 0f71a709 | Andreas Färber | * You should have received a copy of the GNU Lesser General Public
|
17 | 0f71a709 | Andreas Färber | * License along with this library; if not, see
|
18 | 0f71a709 | Andreas Färber | * <http://www.gnu.org/licenses/lgpl-2.1.html>
|
19 | 0f71a709 | Andreas Färber | */
|
20 | 0f71a709 | Andreas Färber | |
21 | 0f71a709 | Andreas Färber | #include "cpu.h" |
22 | 0f71a709 | Andreas Färber | #include "qemu-common.h" |
23 | 0f71a709 | Andreas Färber | |
24 | 0f71a709 | Andreas Färber | |
25 | f45748f1 | Andreas Färber | static void mips_cpu_set_pc(CPUState *cs, vaddr value) |
26 | f45748f1 | Andreas Färber | { |
27 | f45748f1 | Andreas Färber | MIPSCPU *cpu = MIPS_CPU(cs); |
28 | f45748f1 | Andreas Färber | CPUMIPSState *env = &cpu->env; |
29 | f45748f1 | Andreas Färber | |
30 | f45748f1 | Andreas Färber | env->active_tc.PC = value & ~(target_ulong)1;
|
31 | f45748f1 | Andreas Färber | if (value & 1) { |
32 | f45748f1 | Andreas Färber | env->hflags |= MIPS_HFLAG_M16; |
33 | f45748f1 | Andreas Färber | } else {
|
34 | f45748f1 | Andreas Färber | env->hflags &= ~(MIPS_HFLAG_M16); |
35 | f45748f1 | Andreas Färber | } |
36 | f45748f1 | Andreas Färber | } |
37 | f45748f1 | Andreas Färber | |
38 | bdf7ae5b | Andreas Färber | static void mips_cpu_synchronize_from_tb(CPUState *cs, TranslationBlock *tb) |
39 | bdf7ae5b | Andreas Färber | { |
40 | bdf7ae5b | Andreas Färber | MIPSCPU *cpu = MIPS_CPU(cs); |
41 | bdf7ae5b | Andreas Färber | CPUMIPSState *env = &cpu->env; |
42 | bdf7ae5b | Andreas Färber | |
43 | bdf7ae5b | Andreas Färber | env->active_tc.PC = tb->pc; |
44 | bdf7ae5b | Andreas Färber | env->hflags &= ~MIPS_HFLAG_BMASK; |
45 | bdf7ae5b | Andreas Färber | env->hflags |= tb->flags & MIPS_HFLAG_BMASK; |
46 | bdf7ae5b | Andreas Färber | } |
47 | bdf7ae5b | Andreas Färber | |
48 | 0f71a709 | Andreas Färber | /* CPUClass::reset() */
|
49 | 0f71a709 | Andreas Färber | static void mips_cpu_reset(CPUState *s) |
50 | 0f71a709 | Andreas Färber | { |
51 | 0f71a709 | Andreas Färber | MIPSCPU *cpu = MIPS_CPU(s); |
52 | 0f71a709 | Andreas Färber | MIPSCPUClass *mcc = MIPS_CPU_GET_CLASS(cpu); |
53 | 0f71a709 | Andreas Färber | CPUMIPSState *env = &cpu->env; |
54 | 0f71a709 | Andreas Färber | |
55 | 0f71a709 | Andreas Färber | mcc->parent_reset(s); |
56 | 0f71a709 | Andreas Färber | |
57 | 55e5c285 | Andreas Färber | memset(env, 0, offsetof(CPUMIPSState, breakpoints));
|
58 | 55e5c285 | Andreas Färber | tlb_flush(env, 1);
|
59 | 55e5c285 | Andreas Färber | |
60 | 0f71a709 | Andreas Färber | cpu_state_reset(env); |
61 | 0f71a709 | Andreas Färber | } |
62 | 0f71a709 | Andreas Färber | |
63 | c1caf1d9 | Andreas Färber | static void mips_cpu_realizefn(DeviceState *dev, Error **errp) |
64 | c1caf1d9 | Andreas Färber | { |
65 | 14a10fc3 | Andreas Färber | CPUState *cs = CPU(dev); |
66 | c1caf1d9 | Andreas Färber | MIPSCPUClass *mcc = MIPS_CPU_GET_CLASS(dev); |
67 | c1caf1d9 | Andreas Färber | |
68 | 14a10fc3 | Andreas Färber | cpu_reset(cs); |
69 | 14a10fc3 | Andreas Färber | qemu_init_vcpu(cs); |
70 | c1caf1d9 | Andreas Färber | |
71 | c1caf1d9 | Andreas Färber | mcc->parent_realize(dev, errp); |
72 | c1caf1d9 | Andreas Färber | } |
73 | c1caf1d9 | Andreas Färber | |
74 | 5b0c40f7 | Andreas Färber | static void mips_cpu_initfn(Object *obj) |
75 | 5b0c40f7 | Andreas Färber | { |
76 | c05efcb1 | Andreas Färber | CPUState *cs = CPU(obj); |
77 | 5b0c40f7 | Andreas Färber | MIPSCPU *cpu = MIPS_CPU(obj); |
78 | 5b0c40f7 | Andreas Färber | CPUMIPSState *env = &cpu->env; |
79 | 5b0c40f7 | Andreas Färber | |
80 | c05efcb1 | Andreas Färber | cs->env_ptr = env; |
81 | 5b0c40f7 | Andreas Färber | cpu_exec_init(env); |
82 | 78ce64f4 | Andreas Färber | |
83 | 78ce64f4 | Andreas Färber | if (tcg_enabled()) {
|
84 | 78ce64f4 | Andreas Färber | mips_tcg_init(); |
85 | 78ce64f4 | Andreas Färber | } |
86 | 5b0c40f7 | Andreas Färber | } |
87 | 5b0c40f7 | Andreas Färber | |
88 | 0f71a709 | Andreas Färber | static void mips_cpu_class_init(ObjectClass *c, void *data) |
89 | 0f71a709 | Andreas Färber | { |
90 | 0f71a709 | Andreas Färber | MIPSCPUClass *mcc = MIPS_CPU_CLASS(c); |
91 | 0f71a709 | Andreas Färber | CPUClass *cc = CPU_CLASS(c); |
92 | c1caf1d9 | Andreas Färber | DeviceClass *dc = DEVICE_CLASS(c); |
93 | c1caf1d9 | Andreas Färber | |
94 | c1caf1d9 | Andreas Färber | mcc->parent_realize = dc->realize; |
95 | c1caf1d9 | Andreas Färber | dc->realize = mips_cpu_realizefn; |
96 | 0f71a709 | Andreas Färber | |
97 | 0f71a709 | Andreas Färber | mcc->parent_reset = cc->reset; |
98 | 0f71a709 | Andreas Färber | cc->reset = mips_cpu_reset; |
99 | 97a8ea5a | Andreas Färber | |
100 | 97a8ea5a | Andreas Färber | cc->do_interrupt = mips_cpu_do_interrupt; |
101 | 878096ee | Andreas Färber | cc->dump_state = mips_cpu_dump_state; |
102 | f45748f1 | Andreas Färber | cc->set_pc = mips_cpu_set_pc; |
103 | bdf7ae5b | Andreas Färber | cc->synchronize_from_tb = mips_cpu_synchronize_from_tb; |
104 | 5b50e790 | Andreas Färber | cc->gdb_read_register = mips_cpu_gdb_read_register; |
105 | 5b50e790 | Andreas Färber | cc->gdb_write_register = mips_cpu_gdb_write_register; |
106 | 00b941e5 | Andreas Färber | #ifndef CONFIG_USER_ONLY
|
107 | 00b941e5 | Andreas Färber | cc->do_unassigned_access = mips_cpu_unassigned_access; |
108 | 00b941e5 | Andreas Färber | cc->get_phys_page_debug = mips_cpu_get_phys_page_debug; |
109 | 00b941e5 | Andreas Färber | #endif
|
110 | a0e372f0 | Andreas Färber | |
111 | a0e372f0 | Andreas Färber | cc->gdb_num_core_regs = 73;
|
112 | 0f71a709 | Andreas Färber | } |
113 | 0f71a709 | Andreas Färber | |
114 | 0f71a709 | Andreas Färber | static const TypeInfo mips_cpu_type_info = { |
115 | 0f71a709 | Andreas Färber | .name = TYPE_MIPS_CPU, |
116 | 0f71a709 | Andreas Färber | .parent = TYPE_CPU, |
117 | 0f71a709 | Andreas Färber | .instance_size = sizeof(MIPSCPU),
|
118 | 5b0c40f7 | Andreas Färber | .instance_init = mips_cpu_initfn, |
119 | 0f71a709 | Andreas Färber | .abstract = false,
|
120 | 0f71a709 | Andreas Färber | .class_size = sizeof(MIPSCPUClass),
|
121 | 0f71a709 | Andreas Färber | .class_init = mips_cpu_class_init, |
122 | 0f71a709 | Andreas Färber | }; |
123 | 0f71a709 | Andreas Färber | |
124 | 0f71a709 | Andreas Färber | static void mips_cpu_register_types(void) |
125 | 0f71a709 | Andreas Färber | { |
126 | 0f71a709 | Andreas Färber | type_register_static(&mips_cpu_type_info); |
127 | 0f71a709 | Andreas Färber | } |
128 | 0f71a709 | Andreas Färber | |
129 | 0f71a709 | Andreas Färber | type_init(mips_cpu_register_types) |