1 /* Main header for the CRIS simulator, based on the m32r header.
2 Copyright (C) 2004-2015 Free Software Foundation, Inc.
3 Contributed by Axis Communications.
5 This file is part of the GNU simulators.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 /* All FIXME:s present in m32r apply here too; I just refuse to blindly
21 carry them over, as I don't know if they're really things that need
27 #define USING_SIM_BASE_H
30 #include "sim-basics.h"
31 #include "cgen-types.h"
32 #include "cris-desc.h"
36 #define SIM_ENGINE_HALT_HOOK(sd, cpu, cia) \
38 if (cpu) /* Null if ctrl-c. */ \
39 sim_pc_set ((cpu), (cia)); \
41 #define SIM_ENGINE_RESTART_HOOK(sd, cpu, cia) \
43 sim_pc_set ((cpu), (cia)); \
50 struct cris_sim_mmapped_page
{
52 struct cris_sim_mmapped_page
*prev
;
55 struct cris_thread_info
{
56 /* Identifier for this thread. */
57 unsigned int threadid
;
59 /* Identifier for parent thread. */
60 unsigned int parent_threadid
;
62 /* Signal to send to parent at exit. */
68 /* Only as storage to return the "set" value to the "get" method.
69 I'm not sure whether this is useful per-thread. */
80 char blocked_suspendsave
;
81 /* The handler stub unblocks the signal, so we don't need a separate
82 "temporary save" for that. */
85 /* Register context, swapped with _sim_cpu.cpu_data. */
88 /* Similar, temporary copy for the state at a signal call. */
89 void *cpu_context_atsignal
;
91 /* The number of the reading and writing ends of a pipe if waiting for
92 the reader, else 0. */
96 /* System time at last context switch when this thread ran. */
99 /* Nonzero if we just executed a syscall. */
102 /* Nonzero if any of sigaction[0..64].pending is true. */
105 /* Nonzero if in (rt_)sigsuspend call. Cleared at every sighandler
110 typedef int (*cris_interrupt_delivery_fn
) (SIM_CPU
*,
111 enum cris_interrupt_type
,
115 /* sim/common cpu base. */
118 /* Static parts of cgen. */
121 CRIS_MISC_PROFILE cris_misc_profile
;
122 #define CPU_CRIS_MISC_PROFILE(cpu) (& (cpu)->cris_misc_profile)
124 /* Copy of previous data; only valid when emitting trace-data after
126 CRIS_MISC_PROFILE cris_prev_misc_profile
;
127 #define CPU_CRIS_PREV_MISC_PROFILE(cpu) (& (cpu)->cris_prev_misc_profile)
130 cris_interrupt_delivery_fn deliver_interrupt
;
131 #define CPU_CRIS_DELIVER_INTERRUPT(cpu) (cpu->deliver_interrupt)
134 /* Simulator environment data. */
138 struct cris_sim_mmapped_page
*highest_mmapped_page
;
140 /* Number of syscalls performed or in progress, counting once extra
141 for every time a blocked thread (internally, when threading) polls
142 the (pipe) blockage. By default, this is also a time counter: to
143 minimize performance noise from minor compiler changes,
144 instructions take no time and syscalls always take 1ms. */
147 /* Number of execution contexts minus one. */
150 /* Current thread number; index into thread_data when m1threads != 0. */
153 /* When a new thread is created, it gets a unique number, which we
157 /* Thread-specific info, for simulator thread support, created at
158 "clone" call. Vector of [threads+1] when m1threads > 0. */
159 struct cris_thread_info
*thread_data
;
161 /* "If CLONE_SIGHAND is set, the calling process and the child pro-
162 cesses share the same table of signal handlers." ... "However, the
163 calling process and child processes still have distinct signal
164 masks and sets of pending signals." See struct cris_thread_info
165 for sigmasks and sigpendings. */
168 /* This is a hack to implement just the parts of fcntl F_GETFL that
169 are used in open+fdopen calls for the standard scenario: for such
170 a call we check that the last syscall was open, we check that the
171 passed fd is the same returned then, and so we return the same
172 flags passed to open. This way, we avoid complicating the
173 generic sim callback machinery by introducing fcntl
179 /* Function for initializing CPU thread context, which varies in size
180 with each CPU model. They should be in some constant parts or
181 initialized in *_init_cpu, but we can't modify that for now. */
182 void* (*make_thread_cpu_data
) (SIM_CPU
*, void *);
183 size_t thread_cpu_data_size
;
185 /* The register differs, so we dispatch to a CPU-specific function. */
186 void (*set_target_thread_data
) (SIM_CPU
*, USI
);
188 /* CPU-model specific parts go here.
189 Note that in files that don't need to access these pieces WANT_CPU_FOO
190 won't be defined and thus these parts won't appear. This is ok in the
191 sense that things work. It is a source of bugs though.
192 One has to of course be careful to not take the size of this
193 struct and no structure members accessed in non-cpu specific files can
195 #if defined (WANT_CPU_CRISV0F)
196 CRISV0F_CPU_DATA cpu_data
;
197 #elif defined (WANT_CPU_CRISV3F)
198 CRISV3F_CPU_DATA cpu_data
;
199 #elif defined (WANT_CPU_CRISV8F)
200 CRISV8F_CPU_DATA cpu_data
;
201 #elif defined (WANT_CPU_CRISV10F)
202 CRISV10F_CPU_DATA cpu_data
;
203 #elif defined (WANT_CPU_CRISV32F)
204 CRISV32F_CPU_DATA cpu_data
;
206 /* Let's assume all cpu_data have the same alignment requirements, so
207 they all are laid out at the same address. Since we can't get the
208 exact definition, we also assume that it has no higher alignment
209 requirements than a vector of, say, 16 pointers. (A single member
210 is often special-cased, and possibly two as well so we don't want
212 union { void *dummy
[16]; } cpu_data_placeholder
;
216 /* The sim_state struct. */
219 sim_cpu
*cpu
[MAX_NR_PROCESSORS
];
221 CGEN_STATE cgen_state
;
228 /* Catch address exceptions. */
229 extern SIM_CORE_SIGNAL_FN cris_core_signal
;
230 #define SIM_CORE_SIGNAL(SD,CPU,CIA,MAP,NR_BYTES,ADDR,TRANSFER,ERROR) \
231 cris_core_signal ((SD), (CPU), (CIA), (MAP), (NR_BYTES), (ADDR), \
234 /* Default memory size. */
235 #define CRIS_DEFAULT_MEM_SIZE 0x800000 /* 8M */
237 extern device cris_devices
;
239 #endif /* SIM_MAIN_H */