/[gxemul]/upstream/0.3.6/src/include/cpu.h
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /upstream/0.3.6/src/include/cpu.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 15 - (show annotations)
Mon Oct 8 16:18:56 2007 UTC (16 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 7538 byte(s)
0.3.6
1 #ifndef CPU_H
2 #define CPU_H
3
4 /*
5 * Copyright (C) 2005 Anders Gavare. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 *
30 *
31 * $Id: cpu.h,v 1.48 2005/09/17 17:14:28 debug Exp $
32 *
33 * See cpu.c.
34 */
35
36
37 #include <sys/types.h>
38 #include <inttypes.h>
39 #include <sys/time.h>
40
41 /* This is needed for undefining 'mips' or 'ppc', on weird systems: */
42 #include "../../config.h"
43
44 #include "cpu_alpha.h"
45 #include "cpu_arm.h"
46 #include "cpu_avr.h"
47 #include "cpu_hppa.h"
48 #include "cpu_i960.h"
49 #include "cpu_ia64.h"
50 #include "cpu_m68k.h"
51 #include "cpu_mips.h"
52 #include "cpu_ppc.h"
53 #include "cpu_sh.h"
54 #include "cpu_sparc.h"
55 #include "cpu_x86.h"
56
57 struct cpu;
58 struct emul;
59 struct machine;
60 struct memory;
61
62
63 struct cpu_family {
64 struct cpu_family *next;
65 int arch;
66
67 /* These are filled in by each CPU family's init function: */
68 char *name;
69 int (*cpu_new)(struct cpu *cpu, struct memory *mem,
70 struct machine *machine,
71 int cpu_id, char *cpu_type_name);
72 void (*list_available_types)(void);
73 void (*register_match)(struct machine *m,
74 char *name, int writeflag,
75 uint64_t *valuep, int *match_register);
76 int (*disassemble_instr)(struct cpu *cpu,
77 unsigned char *instr, int running,
78 uint64_t dumpaddr, int bintrans);
79 void (*register_dump)(struct cpu *cpu,
80 int gprs, int coprocs);
81 int (*run)(struct emul *emul,
82 struct machine *machine);
83 void (*dumpinfo)(struct cpu *cpu);
84 void (*show_full_statistics)(struct machine *m);
85 void (*tlbdump)(struct machine *m, int x,
86 int rawflag);
87 int (*interrupt)(struct cpu *cpu, uint64_t irq_nr);
88 int (*interrupt_ack)(struct cpu *cpu,
89 uint64_t irq_nr);
90 void (*functioncall_trace)(struct cpu *,
91 uint64_t f, int n_args);
92 };
93
94 #ifdef TRACE_NULL_CRASHES
95 #define TRACE_NULL_N_ENTRIES 16
96 #endif
97
98
99 /*
100 * Dynamic translation definitions:
101 *
102 * The translation cache begins with N_BASE_TABLE_ENTRIES uint32_t offsets
103 * into the cache, for possible translation cache structs for physical pages.
104 */
105
106 /* Physpage flags: */
107 #define TRANSLATIONS 1
108 #define COMBINATIONS 2
109
110 #define DYNTRANS_CACHE_SIZE (16*1048576)
111 #define DYNTRANS_CACHE_MARGIN 300000
112
113 #define N_BASE_TABLE_ENTRIES 32768
114 #define PAGENR_TO_TABLE_INDEX(a) ((a) & (N_BASE_TABLE_ENTRIES-1))
115
116
117 /*
118 * The generic CPU struct:
119 */
120
121 struct cpu {
122 /* Pointer back to the machine this CPU is in: */
123 struct machine *machine;
124
125 int byte_order;
126 int running;
127 int dead;
128 int bootstrap_cpu_flag;
129 int cpu_id;
130 int is_32bit; /* 0 for 64-bit, 1 for 32-bit */
131 char *name;
132
133 struct memory *mem;
134 int (*memory_rw)(struct cpu *cpu,
135 struct memory *mem, uint64_t vaddr,
136 unsigned char *data, size_t len,
137 int writeflag, int cache_flags);
138 int (*translate_address)(struct cpu *, uint64_t vaddr,
139 uint64_t *return_addr, int flags);
140 void (*update_translation_table)(struct cpu *,
141 uint64_t vaddr_page, unsigned char *host_page,
142 int writeflag, uint64_t paddr_page);
143 void (*invalidate_translation_caches_paddr)(struct cpu *,
144 uint64_t paddr, int flags);
145 void (*invalidate_code_translation)(struct cpu *,
146 uint64_t paddr, int flags);
147 void (*useremul_syscall)(struct cpu *cpu, uint32_t code);
148
149 uint64_t pc;
150
151 #ifdef TRACE_NULL_CRASHES
152 /* TODO: remove this, it's MIPS only */
153 int trace_null_index;
154 uint64_t trace_null_addr[TRACE_NULL_N_ENTRIES];
155 #endif
156
157 int trace_tree_depth;
158
159 /*
160 * Dynamic translation:
161 */
162 int running_translated;
163 int n_translated_instrs;
164 unsigned char *translation_cache;
165 size_t translation_cache_cur_ofs;
166
167 /*
168 * CPU-family dependent:
169 */
170 union {
171 struct alpha_cpu alpha;
172 struct arm_cpu arm;
173 struct avr_cpu avr;
174 struct hppa_cpu hppa;
175 struct i960_cpu i960;
176 struct ia64_cpu ia64;
177 struct m68k_cpu m68k;
178 struct mips_cpu mips;
179 struct ppc_cpu ppc;
180 struct sh_cpu sh;
181 struct sparc_cpu sparc;
182 struct x86_cpu x86;
183 } cd;
184 };
185
186
187 /* cpu.c: */
188 struct cpu *cpu_new(struct memory *mem, struct machine *machine,
189 int cpu_id, char *cpu_type_name);
190 void cpu_show_full_statistics(struct machine *m);
191 void cpu_tlbdump(struct machine *m, int x, int rawflag);
192 void cpu_register_match(struct machine *m, char *name,
193 int writeflag, uint64_t *valuep, int *match_register);
194 void cpu_register_dump(struct machine *m, struct cpu *cpu,
195 int gprs, int coprocs);
196 int cpu_disassemble_instr(struct machine *m, struct cpu *cpu,
197 unsigned char *instr, int running, uint64_t addr, int bintrans);
198 int cpu_interrupt(struct cpu *cpu, uint64_t irq_nr);
199 int cpu_interrupt_ack(struct cpu *cpu, uint64_t irq_nr);
200 void cpu_functioncall_trace(struct cpu *cpu, uint64_t f);
201 void cpu_functioncall_trace_return(struct cpu *cpu);
202 void cpu_create_or_reset_tc(struct cpu *cpu);
203 void cpu_run_init(struct machine *machine);
204 int cpu_run(struct emul *emul, struct machine *machine);
205 void cpu_run_deinit(struct machine *machine);
206 void cpu_dumpinfo(struct machine *m, struct cpu *cpu);
207 void cpu_list_available_types(void);
208 void cpu_show_cycles(struct machine *machine, int forced);
209 struct cpu_family *cpu_family_ptr_by_number(int arch);
210 void cpu_init(void);
211
212
213 #define JUST_MARK_AS_NON_WRITABLE 1
214 #define INVALIDATE_ALL 2
215 #define INVALIDATE_PADDR 4
216 #define INVALIDATE_VADDR 8
217
218
219 #define CPU_FAMILY_INIT(n,s) int n ## _cpu_family_init( \
220 struct cpu_family *fp) { \
221 /* Fill in the cpu_family struct with valid data for this arch. */ \
222 fp->name = s; \
223 fp->cpu_new = n ## _cpu_new; \
224 fp->list_available_types = n ## _cpu_list_available_types; \
225 fp->register_match = n ## _cpu_register_match; \
226 fp->disassemble_instr = n ## _cpu_disassemble_instr; \
227 fp->register_dump = n ## _cpu_register_dump; \
228 fp->run = n ## _cpu_run; \
229 fp->dumpinfo = n ## _cpu_dumpinfo; \
230 fp->show_full_statistics = n ## _cpu_show_full_statistics; \
231 fp->tlbdump = n ## _cpu_tlbdump; \
232 fp->interrupt = n ## _cpu_interrupt; \
233 fp->interrupt_ack = n ## _cpu_interrupt_ack; \
234 fp->functioncall_trace = n ## _cpu_functioncall_trace; \
235 return 1; \
236 }
237
238
239 #endif /* CPU_H */

  ViewVC Help
Powered by ViewVC 1.1.26