179 lines
6 KiB
C
179 lines
6 KiB
C
/* Collection of junk for CRIS.
|
|
Copyright (C) 2004-2022 Free Software Foundation, Inc.
|
|
Contributed by Axis Communications.
|
|
|
|
This file is part of the GNU simulators.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
/* For other arch:s, this file is described as a "collection of junk", so
|
|
let's collect some nice junk of our own. Keep it; it might be useful
|
|
some day! */
|
|
|
|
#ifndef CRIS_SIM_H
|
|
#define CRIS_SIM_H
|
|
|
|
typedef struct {
|
|
/* Whether the branch for the current insn was taken. Placed first
|
|
here, in hope it'll get closer to the main simulator data. */
|
|
USI branch_taken;
|
|
|
|
/* PC of the insn of the branch. */
|
|
USI old_pc;
|
|
|
|
/* Static cycle count for all insns executed so far, including
|
|
non-context-specific stall cycles, for example when adding to PC. */
|
|
uint64_t basic_cycle_count;
|
|
|
|
/* Stall cycles for unaligned access of memory operands. FIXME:
|
|
Should or should not include unaligned [PC+] operands? */
|
|
uint64_t unaligned_mem_dword_count;
|
|
|
|
/* Context-specific stall cycles. */
|
|
uint64_t memsrc_stall_count;
|
|
uint64_t memraw_stall_count;
|
|
uint64_t movemsrc_stall_count;
|
|
uint64_t movemaddr_stall_count;
|
|
uint64_t movemdst_stall_count;
|
|
uint64_t mulsrc_stall_count;
|
|
uint64_t jumpsrc_stall_count;
|
|
uint64_t branch_stall_count;
|
|
uint64_t jumptarget_stall_count;
|
|
|
|
/* What kind of target-specific trace to perform. */
|
|
int flags;
|
|
|
|
/* Just the basic cycle count. */
|
|
#define FLAG_CRIS_MISC_PROFILE_SIMPLE 1
|
|
|
|
/* Show unaligned accesses. */
|
|
#define FLAG_CRIS_MISC_PROFILE_UNALIGNED 2
|
|
|
|
/* Show schedulable entities. */
|
|
#define FLAG_CRIS_MISC_PROFILE_SCHEDULABLE 4
|
|
|
|
/* Show everything. */
|
|
#define FLAG_CRIS_MISC_PROFILE_ALL \
|
|
(FLAG_CRIS_MISC_PROFILE_SIMPLE \
|
|
| FLAG_CRIS_MISC_PROFILE_UNALIGNED \
|
|
| FLAG_CRIS_MISC_PROFILE_SCHEDULABLE)
|
|
|
|
/* Emit trace of each insn, xsim style. */
|
|
#define FLAG_CRIS_MISC_PROFILE_XSIM_TRACE 8
|
|
|
|
#define N_CRISV32_BRANCH_PREDICTORS 256
|
|
unsigned char branch_predictors[N_CRISV32_BRANCH_PREDICTORS];
|
|
|
|
} CRIS_MISC_PROFILE;
|
|
|
|
/* Handler prototypes for functions called from the CGEN description. */
|
|
|
|
extern void cris_flush_simulator_decode_cache (SIM_CPU *, USI);
|
|
extern USI crisv10f_break_handler (SIM_CPU *, USI, USI);
|
|
extern USI crisv32f_break_handler (SIM_CPU *, USI, USI);
|
|
extern USI cris_break_13_handler (SIM_CPU *, USI, USI, USI, USI, USI, USI,
|
|
USI, USI);
|
|
extern char cris_have_900000xxif;
|
|
enum cris_unknown_syscall_action_type
|
|
{ CRIS_USYSC_MSG_STOP, CRIS_USYSC_MSG_ENOSYS, CRIS_USYSC_QUIET_ENOSYS };
|
|
extern enum cris_unknown_syscall_action_type cris_unknown_syscall_action;
|
|
enum cris_interrupt_type { CRIS_INT_NMI, CRIS_INT_RESET, CRIS_INT_INT };
|
|
extern int crisv10deliver_interrupt (SIM_CPU *,
|
|
enum cris_interrupt_type,
|
|
unsigned int);
|
|
extern int crisv32deliver_interrupt (SIM_CPU *,
|
|
enum cris_interrupt_type,
|
|
unsigned int);
|
|
|
|
/* Using GNU syntax (not C99) so we can compile this on RH 6.2
|
|
(egcs-1.1.2/gcc-2.91.66). */
|
|
#define cris_trace_printf(SD, CPU, FMT...) \
|
|
do \
|
|
{ \
|
|
if (TRACE_FILE (STATE_TRACE_DATA (SD)) != NULL) \
|
|
fprintf (TRACE_FILE (CPU_TRACE_DATA (CPU)), FMT); \
|
|
else \
|
|
sim_io_printf (SD, FMT); \
|
|
} \
|
|
while (0)
|
|
|
|
#if WITH_PROFILE_MODEL_P
|
|
#define crisv32f_branch_taken(cpu, oldpc, newpc, taken) \
|
|
do \
|
|
{ \
|
|
CPU_CRIS_MISC_PROFILE (cpu)->old_pc = oldpc; \
|
|
CPU_CRIS_MISC_PROFILE (cpu)->branch_taken = taken; \
|
|
} \
|
|
while (0)
|
|
#else
|
|
#define crisv32f_branch_taken(cpu, oldpc, newpc, taken)
|
|
#endif
|
|
|
|
#define crisv10f_branch_taken(cpu, oldpc, newpc, taken)
|
|
|
|
#define crisv32f_read_supr(cpu, index) \
|
|
(cgen_rtx_error (current_cpu, \
|
|
"Read of support register is unimplemented"), \
|
|
0)
|
|
|
|
#define crisv32f_write_supr(cpu, index, val) \
|
|
cgen_rtx_error (current_cpu, \
|
|
"Write to support register is unimplemented") \
|
|
|
|
#define crisv32f_rfg_handler(cpu, pc) \
|
|
cgen_rtx_error (current_cpu, "RFG isn't implemented")
|
|
|
|
#define crisv32f_halt_handler(cpu, pc) \
|
|
(cgen_rtx_error (current_cpu, "HALT isn't implemented"), 0)
|
|
|
|
#define crisv32f_fidxi_handler(cpu, pc, indx) \
|
|
(cgen_rtx_error (current_cpu, "FIDXI isn't implemented"), 0)
|
|
|
|
#define crisv32f_ftagi_handler(cpu, pc, indx) \
|
|
(cgen_rtx_error (current_cpu, "FTAGI isn't implemented"), 0)
|
|
|
|
#define crisv32f_fidxd_handler(cpu, pc, indx) \
|
|
(cgen_rtx_error (current_cpu, "FIDXD isn't implemented"), 0)
|
|
|
|
#define crisv32f_ftagd_handler(cpu, pc, indx) \
|
|
(cgen_rtx_error (current_cpu, "FTAGD isn't implemented"), 0)
|
|
|
|
/* We have nothing special to do when interrupts or NMI are enabled
|
|
after having been disabled, so empty macros are enough for these
|
|
hooks. */
|
|
#define crisv32f_interrupts_enabled(cpu)
|
|
#define crisv32f_nmi_enabled(cpu)
|
|
|
|
/* Better warn for this case here, because everything needed is
|
|
somewhere within the CPU. Compare to trying to use interrupts and
|
|
NMI, which would fail earlier, when trying to make nonexistent
|
|
external components generate those exceptions. */
|
|
#define crisv32f_single_step_enabled(cpu) \
|
|
((crisv32f_h_qbit_get (cpu) != 0 \
|
|
|| (crisv32f_h_sr_get (cpu, H_SR_SPC) & ~1) != 0) \
|
|
? (cgen_rtx_error (cpu, \
|
|
"single-stepping isn't implemented"), 0) \
|
|
: 0)
|
|
|
|
/* We don't need to track the value of the PID register here. */
|
|
#define crisv32f_write_pid_handler(cpu, val)
|
|
|
|
/* Neither do we need to know of transitions to user mode. */
|
|
#define crisv32f_usermode_enabled(cpu)
|
|
|
|
/* House-keeping exported from traps.c */
|
|
extern void cris_set_callbacks (host_callback *);
|
|
|
|
/* FIXME: Add more junk. */
|
|
#endif
|