]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - sim/cris/cris-sim.h
* sim/cris/c/clone5.c, sim/cris/c/mprotect1.c,
[thirdparty/binutils-gdb.git] / sim / cris / cris-sim.h
CommitLineData
f6bcefef 1/* Collection of junk for CRIS.
aad3b3cb 2 Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
f6bcefef
HPN
3 Contributed by Axis Communications.
4
5This file is part of the GNU simulators.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License along
18with this program; if not, write to the Free Software Foundation, Inc.,
1959 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21/* For other arch:s, this file is described as a "collection of junk", so
22 let's collect some nice junk of our own. Keep it; it might be useful
23 some day! */
24
25#ifndef CRIS_SIM_H
26#define CRIS_SIM_H
27
28typedef struct {
29 /* Whether the branch for the current insn was taken. Placed first
30 here, in hope it'll get closer to the main simulator data. */
31 USI branch_taken;
32
33 /* PC of the insn of the branch. */
34 USI old_pc;
35
36 /* Static cycle count for all insns executed so far, including
37 non-context-specific stall cycles, for example when adding to PC. */
38 unsigned64 basic_cycle_count;
39
40 /* Stall cycles for unaligned access of memory operands. FIXME:
41 Should or should not include unaligned [PC+] operands? */
42 unsigned64 unaligned_mem_dword_count;
43
44 /* Context-specific stall cycles. */
45 unsigned64 memsrc_stall_count;
46 unsigned64 memraw_stall_count;
47 unsigned64 movemsrc_stall_count;
48 unsigned64 movemaddr_stall_count;
49 unsigned64 movemdst_stall_count;
50 unsigned64 mulsrc_stall_count;
51 unsigned64 jumpsrc_stall_count;
52 unsigned64 branch_stall_count;
53 unsigned64 jumptarget_stall_count;
54
55 /* What kind of target-specific trace to perform. */
56 int flags;
57
58 /* Just the basic cycle count. */
59#define FLAG_CRIS_MISC_PROFILE_SIMPLE 1
60
61 /* Show unaligned accesses. */
62#define FLAG_CRIS_MISC_PROFILE_UNALIGNED 2
63
64 /* Show schedulable entities. */
65#define FLAG_CRIS_MISC_PROFILE_SCHEDULABLE 4
66
67 /* Show everything. */
68#define FLAG_CRIS_MISC_PROFILE_ALL \
69 (FLAG_CRIS_MISC_PROFILE_SIMPLE \
70 | FLAG_CRIS_MISC_PROFILE_UNALIGNED \
71 | FLAG_CRIS_MISC_PROFILE_SCHEDULABLE)
72
73 /* Emit trace of each insn, xsim style. */
74#define FLAG_CRIS_MISC_PROFILE_XSIM_TRACE 8
75
76#define N_CRISV32_BRANCH_PREDICTORS 256
77 unsigned char branch_predictors[N_CRISV32_BRANCH_PREDICTORS];
78
79} CRIS_MISC_PROFILE;
80
81/* Handler prototypes for functions called from the CGEN description. */
82
83extern USI cris_bmod_handler (SIM_CPU *, UINT, USI);
84extern void cris_flush_simulator_decode_cache (SIM_CPU *, USI);
85extern USI crisv10f_break_handler (SIM_CPU *, USI, USI);
86extern USI crisv32f_break_handler (SIM_CPU *, USI, USI);
87extern USI cris_break_13_handler (SIM_CPU *, USI, USI, USI, USI, USI, USI,
88 USI, USI);
aad3b3cb
HPN
89extern char cris_have_900000xxif;
90enum cris_interrupt_type { CRIS_INT_NMI, CRIS_INT_RESET, CRIS_INT_INT };
91extern int crisv10deliver_interrupt (SIM_CPU *,
92 enum cris_interrupt_type,
93 unsigned int);
94extern int crisv32deliver_interrupt (SIM_CPU *,
95 enum cris_interrupt_type,
96 unsigned int);
f6bcefef
HPN
97
98/* Using GNU syntax (not C99) so we can compile this on RH 6.2
99 (egcs-1.1.2/gcc-2.91.66). */
100#define cris_trace_printf(SD, CPU, FMT...) \
101 do \
102 { \
103 if (TRACE_FILE (STATE_TRACE_DATA (SD)) != NULL) \
104 fprintf (TRACE_FILE (CPU_TRACE_DATA (CPU)), FMT); \
105 else \
106 sim_io_printf (SD, FMT); \
107 } \
108 while (0)
109
110#if WITH_PROFILE_MODEL_P
111#define crisv32f_branch_taken(cpu, oldpc, newpc, taken) \
112 do \
113 { \
114 CPU_CRIS_MISC_PROFILE (cpu)->old_pc = oldpc; \
115 CPU_CRIS_MISC_PROFILE (cpu)->branch_taken = taken; \
116 } \
117 while (0)
118#else
119#define crisv32f_branch_taken(cpu, oldpc, newpc, taken)
120#endif
121
122#define crisv10f_branch_taken(cpu, oldpc, newpc, taken)
123
124#define crisv32f_read_supr(cpu, index) \
125 (cgen_rtx_error (current_cpu, \
126 "Read of support register is unimplemented"), \
127 0)
128
129#define crisv32f_write_supr(cpu, index, val) \
130 cgen_rtx_error (current_cpu, \
131 "Write to support register is unimplemented") \
132
133#define crisv32f_rfg_handler(cpu, pc) \
134 cgen_rtx_error (current_cpu, "RFG isn't implemented")
135
136#define crisv32f_halt_handler(cpu, pc) \
137 (cgen_rtx_error (current_cpu, "HALT isn't implemented"), 0)
138
139#define crisv32f_fidxi_handler(cpu, pc, indx) \
140 (cgen_rtx_error (current_cpu, "FIDXI isn't implemented"), 0)
141
142#define crisv32f_ftagi_handler(cpu, pc, indx) \
143 (cgen_rtx_error (current_cpu, "FTAGI isn't implemented"), 0)
144
145#define crisv32f_fidxd_handler(cpu, pc, indx) \
146 (cgen_rtx_error (current_cpu, "FIDXD isn't implemented"), 0)
147
148#define crisv32f_ftagd_handler(cpu, pc, indx) \
149 (cgen_rtx_error (current_cpu, "FTAGD isn't implemented"), 0)
150
151/* We have nothing special to do when interrupts or NMI are enabled
152 after having been disabled, so empty macros are enough for these
153 hooks. */
154#define crisv32f_interrupts_enabled(cpu)
155#define crisv32f_nmi_enabled(cpu)
156
157/* Better warn for this case here, because everything needed is
158 somewhere within the CPU. Compare to trying to use interrupts and
159 NMI, which would fail earlier, when trying to make nonexistent
160 external components generate those exceptions. */
161#define crisv32f_single_step_enabled(cpu) \
162 ((crisv32f_h_qbit_get (cpu) != 0 \
163 || (crisv32f_h_sr_get (cpu, H_SR_SPC) & ~1) != 0) \
164 ? (cgen_rtx_error (cpu, \
165 "single-stepping isn't implemented"), 0) \
166 : 0)
167
168/* We don't need to track the value of the PID register here. */
169#define crisv32f_write_pid_handler(cpu, val)
170
171/* Neither do we need to know of transitions to user mode. */
172#define crisv32f_usermode_enabled(cpu)
173
174/* House-keeping exported from traps.c */
175extern void cris_set_callbacks (host_callback *);
176
177/* FIXME: Add more junk. */
178#endif