Line 150... |
Line 150... |
#define DRR_DPFE (0x00000400)
|
#define DRR_DPFE (0x00000400)
|
#define DRR_BUSEE (0x00000800)
|
#define DRR_BUSEE (0x00000800)
|
#define DRR_RSTE (0x00001000)
|
#define DRR_RSTE (0x00001000)
|
|
|
/* Number of matchpoints */
|
/* Number of matchpoints */
|
|
|
#define NUM_MATCHPOINTS (or1k_implementation.num_matchpoints)
|
#define NUM_MATCHPOINTS (or1k_implementation.num_matchpoints)
|
|
#define MAX_MATCHPOINTS (8)
|
|
|
/* Number of machine GPR registers */
|
/* Number of machine GPR registers */
|
|
|
#define NUM_GPR_REGS (or1k_implementation.num_gpr_regs)
|
#define NUM_GPR_REGS (or1k_implementation.num_gpr_regs)
|
#define MAX_GPR_REGS (32)
|
#define MAX_GPR_REGS (32)
|
|
|
/* Number of machine VF registers */
|
/* Number of machine VF registers */
|
|
|
#define NUM_VF_REGS (or1k_implementation.num_vfpr_regs)
|
#define NUM_VF_REGS (or1k_implementation.num_vfpr_regs)
|
#define MAX_VF_REGS (32)
|
#define MAX_VF_REGS (32)
|
|
|
/* gdb mapping of registers */
|
/* gdb mapping of registers */
|
#ifndef NUM_REGS
|
#ifndef NUM_REGS
|
#define NUM_REGS (MAX_GPR_REGS+MAX_VF_REGS+3)
|
#define NUM_REGS (MAX_GPR_REGS+MAX_VF_REGS+3)
|
#endif
|
#endif
|
|
|
/* Can act like a little or big endian. */
|
/* Can act like a little or big endian. */
|
|
|
#if !defined (TARGET_BYTE_ORDER_DEFAULT)
|
#if !defined (TARGET_BYTE_ORDER_DEFAULT)
|
#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN
|
#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN
|
#define TARGET_BYTE_ORDER_SELECTABLE_P (1)
|
#define TARGET_BYTE_ORDER_SELECTABLE_P (1)
|
#endif
|
#endif
|
|
|
/* Size (in bytes) of registers. */
|
/* Size (in bytes) of registers. */
|
|
|
#define OR1K_SPR_REGSIZE (4)
|
#define OR1K_SPR_REGSIZE (4)
|
#define OR1K_VF_REGSIZE (8)
|
#define OR1K_VF_REGSIZE (8)
|
#define OR1K_GPR_REGSIZE ((OR1K_64BIT_IMPLEMENTATION)?(8):(4))
|
#define OR1K_GPR_REGSIZE ((OR1K_64BIT_IMPLEMENTATION)?(8):(4))
|
#define OR1K_VF_DOUBLE (0)
|
#define OR1K_VF_DOUBLE (0)
|
|
|
#define OR1K_IS_GPR(N) ((N) >= 0 && (N) < MAX_GPR_REGS)
|
#define OR1K_IS_GPR(N) ((N) >= 0 && (N) < MAX_GPR_REGS)
|
#define OR1K_IS_VF(N) ((N) >= MAX_GPR_REGS && (N) < MAX_GPR_REGS + MAX_VF_REGS)
|
#define OR1K_IS_VF(N) ((N) >= MAX_GPR_REGS && (N) < MAX_GPR_REGS + MAX_VF_REGS)
|
|
|
/* Register representation is the same as in memory. */
|
/* Register representation is the same as in memory. */
|
|
|
#define REGISTER_CONVERTIBLE(N) (0)
|
#define REGISTER_CONVERTIBLE(N) (0)
|
|
|
/* Given the register index, return the name of the corresponding
|
/* Given the register index, return the name of the corresponding
|
register. */
|
register. */
|
|
|
extern char *or1k_register_name PARAMS ((int regno));
|
extern char *or1k_register_name PARAMS ((int regno));
|
#define REGISTER_NAME(regno) or1k_register_name (regno)
|
#define REGISTER_NAME(regno) or1k_register_name (regno)
|
|
|
/* Is this implementation 64 or 32 bit.
|
/* Is this implementation 64 or 32 bit.
|
WARNING: gdb or1k port is not yet prepared for 64b implementations! */
|
WARNING: gdb or1k port is not yet prepared for 64b implementations! */
|
Line 208... |
Line 202... |
#define REGISTER_RAW_SIZE(N) ((OR1K_IS_GPR(N)?((OR1K_64BIT_IMPLEMENTATION)?\
|
#define REGISTER_RAW_SIZE(N) ((OR1K_IS_GPR(N)?((OR1K_64BIT_IMPLEMENTATION)?\
|
(8):(4)):(OR1K_SPR_REGSIZE)))
|
(8):(4)):(OR1K_SPR_REGSIZE)))
|
|
|
/* Number of bytes of storage in the program's representation
|
/* Number of bytes of storage in the program's representation
|
for register N. Same as RAW_SIZE. */
|
for register N. Same as RAW_SIZE. */
|
|
|
#define REGISTER_VIRTUAL_SIZE(N) TYPE_LENGTH (REGISTER_VIRTUAL_TYPE (N))
|
#define REGISTER_VIRTUAL_SIZE(N) TYPE_LENGTH (REGISTER_VIRTUAL_TYPE (N))
|
|
|
/* Return the GDB type object for the "standard" data type of data in
|
/* Return the GDB type object for the "standard" data type of data in
|
register N. */
|
register N. */
|
|
|
#define REGISTER_VIRTUAL_TYPE(N) ((OR1K_IS_GPR(N))?(\
|
#define REGISTER_VIRTUAL_TYPE(N) ((OR1K_IS_GPR(N))?(\
|
(OR1K_64BIT_IMPLEMENTATION)?builtin_type_int64:builtin_type_int\
|
(OR1K_64BIT_IMPLEMENTATION)?builtin_type_int64:builtin_type_int\
|
):(OR1K_IS_VF(N) ? builtin_type_float : builtin_type_uint32))
|
):(OR1K_IS_VF(N) ? builtin_type_float : builtin_type_uint32))
|
|
|
/* Largest value REGISTER_RAW_SIZE can have. */
|
/* Largest value REGISTER_RAW_SIZE can have. */
|
|
|
#define MAX_REGISTER_RAW_SIZE ((OR1K_64BIT_IMPLEMENTATION)?(8):(4))
|
#define MAX_REGISTER_RAW_SIZE ((OR1K_64BIT_IMPLEMENTATION)?(8):(4))
|
|
|
/* Largest value REGISTER_VIRTUAL_SIZE can have. */
|
/* Largest value REGISTER_VIRTUAL_SIZE can have. */
|
|
|
#define MAX_REGISTER_VIRTUAL_SIZE ((OR1K_64BIT_IMPLEMENTATION)?(8):(4))
|
#define MAX_REGISTER_VIRTUAL_SIZE ((OR1K_64BIT_IMPLEMENTATION)?(8):(4))
|
|
|
#define REGISTER_SIZE (MAX_REGISTER_VIRTUAL_SIZE)
|
#define REGISTER_SIZE (MAX_REGISTER_VIRTUAL_SIZE)
|
|
|
/* ABI uses R3 through R8 for args. */
|
/* ABI uses R3 through R8 for args. */
|
#define OR1K_LAST_ARG_REGNUM (A5_REGNUM)
|
#define OR1K_LAST_ARG_REGNUM (A5_REGNUM)
|
#define OR1K_NUM_ARG_REGS (6)
|
#define OR1K_NUM_ARG_REGS (6)
|
|
|
/* ABI uses VFR0 through VFR5 for float args. */
|
/* ABI uses VFR0 through VFR5 for float args. */
|
#define OR1K_LAST_FP_ARG_REGNUM (VFA5_REGNUM)
|
#define OR1K_LAST_FP_ARG_REGNUM (VFA5_REGNUM)
|
#define OR1K_NUM_FP_ARG_REGS (6)
|
#define OR1K_NUM_FP_ARG_REGS (6)
|
|
|
/* Should not store into R0. */
|
/* Should not store into R0. */
|
|
|
#define CANNOT_STORE_REGISTER(N) ((N) == 0)
|
#define CANNOT_STORE_REGISTER(N) ((N) == 0)
|
|
|
/* Index within `registers' of the first byte of the space for
|
/* Index within `registers' of the first byte of the space for
|
register N. */
|
register N. */
|
|
|
#define REGISTER_BYTE(N) ((N) * OR1K_SPR_REGSIZE)
|
#define REGISTER_BYTE(N) ((N) * OR1K_SPR_REGSIZE)
|
|
|
/* Total amount of space needed to store our copies of the machine's
|
/* Total amount of space needed to store our copies of the machine's
|
register state, the array `registers'. */
|
register state, the array `registers'. */
|
|
|
#define REGISTER_BYTES (NUM_REGS * OR1K_SPR_REGSIZE)
|
#define REGISTER_BYTES (NUM_REGS * OR1K_SPR_REGSIZE)
|
|
|
extern void or1k_do_registers_info PARAMS ((int, int));
|
extern void or1k_do_registers_info PARAMS ((int, int));
|
#define DO_REGISTERS_INFO(regnum, fp) or1k_do_registers_info(regnum, fp)
|
#define DO_REGISTERS_INFO(regnum, fp) or1k_do_registers_info(regnum, fp)
|
|
|
Line 266... |
Line 254... |
#define BREAKPOINT_FROM_PC(pcptr, lenptr) or1k_breakpoint_from_pc (pcptr, lenptr)
|
#define BREAKPOINT_FROM_PC(pcptr, lenptr) or1k_breakpoint_from_pc (pcptr, lenptr)
|
|
|
/* Amount PC must be decremented by after a breakpoint.
|
/* Amount PC must be decremented by after a breakpoint.
|
This is often the number of bytes in BREAKPOINT
|
This is often the number of bytes in BREAKPOINT
|
but not always. */
|
but not always. */
|
|
|
#define DECR_PC_AFTER_BREAK 0
|
#define DECR_PC_AFTER_BREAK 0
|
|
|
/* Amount PC must be decremented by after a breakpoint.
|
/* Amount PC must be decremented by after a breakpoint.
|
This is often the number of bytes in BREAKPOINT
|
This is often the number of bytes in BREAKPOINT
|
but not always. */
|
but not always. */
|
|
|
#define DECR_PC_AFTER_BREAK 0
|
#define DECR_PC_AFTER_BREAK 0
|
|
|
extern int or1k_insert_breakpoint (CORE_ADDR addr, char *contents_cache);
|
extern int or1k_insert_breakpoint (CORE_ADDR addr, char *contents_cache);
|
#define target_insert_hw_breakpoint(addr, cache) or1k_insert_breakpoint (addr, cache)
|
#define target_insert_hw_breakpoint(addr, cache) or1k_insert_breakpoint (addr, cache)
|
|
|
extern int or1k_remove_breakpoint (CORE_ADDR addr, char *contents_cache);
|
extern int or1k_remove_breakpoint (CORE_ADDR addr, char *contents_cache);
|
#define target_remove_hw_breakpoint(addr, cache) or1k_remove_breakpoint (addr, cache)
|
#define target_remove_hw_breakpoint(addr, cache) or1k_remove_breakpoint (addr, cache)
|
|
|
/* Watchpoint support. */
|
/* Watchpoint support. */
|
|
|
#define TARGET_HAS_HARDWARE_WATCHPOINTS
|
#define TARGET_HAS_HARDWARE_WATCHPOINTS
|
|
|
/* Use these macros for watchpoint insertion/deletion. */
|
/* Use these macros for watchpoint insertion/deletion. */
|
/* type can be 0: write watch, 1: read watch, 2: access watch (read/write) */
|
/* type can be 0: write watch, 1: read watch, 2: access watch (read/write) */
|
extern int or1k_insert_watchpoint PARAMS ((CORE_ADDR addr, int len, int type));
|
extern int or1k_insert_watchpoint PARAMS ((CORE_ADDR addr, int len, int type));
|
Line 301... |
Line 286... |
#define HAVE_NONSTEPPABLE_WATCHPOINT
|
#define HAVE_NONSTEPPABLE_WATCHPOINT
|
|
|
extern int or1k_stopped_by_watchpoint PARAMS ((void));
|
extern int or1k_stopped_by_watchpoint PARAMS ((void));
|
#define STOPPED_BY_WATCHPOINT(w) or1k_stopped_by_watchpoint ()
|
#define STOPPED_BY_WATCHPOINT(w) or1k_stopped_by_watchpoint ()
|
|
|
//#include "breakpoint.h"
|
|
typedef enum bptype;
|
typedef enum bptype;
|
extern int or1k_can_use_hardware_watchpoint PARAMS ((enum bptype, int));
|
extern int or1k_can_use_hardware_watchpoint PARAMS ((enum bptype, int));
|
#define TARGET_CAN_USE_HARDWARE_WATCHPOINT(bp_type, cnt, ot) \
|
#define TARGET_CAN_USE_HARDWARE_WATCHPOINT(bp_type, cnt, ot) \
|
or1k_can_use_hardware_watchpoint(bp_type, cnt)
|
or1k_can_use_hardware_watchpoint(bp_type, cnt)
|
|
|
|
|
/* Catchpoint support. */
|
/* Catchpoint support. */
|
/* HACK: how do we hook to signal namings otherwise? */
|
/* HACK: how do we hook to signal namings otherwise? */
|
#include "target.h"
|
#include "target.h"
|
extern char *target_signal_to_string PARAMS ((enum target_signal));
|
extern char *target_signal_to_string PARAMS ((enum target_signal));
|
|
|
/* Return the name (SIGHUP, etc.) for a signal. */
|
/* Return the name (SIGHUP, etc.) for a signal. */
|
extern char *or1k_signal_to_name PARAMS ((enum target_signal));
|
extern char *or1k_signal_to_name PARAMS ((enum target_signal));
|
|
|
/* Given a name (SIGHUP, etc.), return its signal. */
|
/* Given a name (SIGHUP, etc.), return its signal. */
|
extern enum target_signal or1k_signal_from_name PARAMS ((char *));
|
extern enum target_signal or1k_signal_from_name PARAMS ((char *));
|
|
|
#define NUM_OR1K_SIGNALS (10)
|
#define NUM_OR1K_SIGNALS (10)
|
|
|
/* Extract from an array REGBUF containing the (raw) register state
|
/* Extract from an array REGBUF containing the (raw) register state
|
a function return value of type TYPE, and copy that, in virtual format,
|
a function return value of type TYPE, and copy that, in virtual format,
|
into VALBUF. */
|
into VALBUF. */
|
|
|
extern void or1k_extract_return_value PARAMS ((struct type *, char[], char *));
|
extern void or1k_extract_return_value PARAMS ((struct type *, char[], char *));
|
#define EXTRACT_RETURN_VALUE(TYPE, REGBUF, VALBUF) \
|
#define EXTRACT_RETURN_VALUE(TYPE, REGBUF, VALBUF) \
|
or1k_extract_return_value (TYPE, REGBUF, VALBUF)
|
or1k_extract_return_value (TYPE, REGBUF, VALBUF)
|
|
|
/* Write into appropriate registers a function return value
|
/* Write into appropriate registers a function return value
|
of type TYPE, given in virtual format. */
|
of type TYPE, given in virtual format. */
|
|
|
#define STORE_RETURN_VALUE(TYPE,VALBUF) \
|
#define STORE_RETURN_VALUE(TYPE,VALBUF) \
|
{\
|
{\
|
if (TYPE_CODE (TYPE) == TYPE_CODE_FLT)\
|
if (TYPE_CODE (TYPE) == TYPE_CODE_FLT)\
|
write_register_bytes (REGISTER_BYTE (VFRV_REGNUM), VALBUF, TYPE_LENGTH (TYPE));\
|
write_register_bytes (REGISTER_BYTE (VFRV_REGNUM), VALBUF, TYPE_LENGTH (TYPE));\
|
else\
|
else\
|
Line 345... |
Line 329... |
as a CORE_ADDR (or an expression that can be used as one). */
|
as a CORE_ADDR (or an expression that can be used as one). */
|
/* The address is passed in a0 upon entry to the function, but when
|
/* The address is passed in a0 upon entry to the function, but when
|
the function exits, the compiler has copied the value to v0. This
|
the function exits, the compiler has copied the value to v0. This
|
convention is specified by the System V ABI, so I think we can rely
|
convention is specified by the System V ABI, so I think we can rely
|
on it. */
|
on it. */
|
|
|
#define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) \
|
#define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) \
|
(extract_address (REGBUF + REGISTER_BYTE (RV_REGNUM), \
|
(extract_address (REGBUF + REGISTER_BYTE (RV_REGNUM), \
|
REGISTER_RAW_SIZE (RV_REGNUM)))
|
REGISTER_RAW_SIZE (RV_REGNUM)))
|
|
|
#define EXTRACT_STRUCT_VALUE_ADDRESS_P 1
|
#define EXTRACT_STRUCT_VALUE_ADDRESS_P 1
|
Line 358... |
Line 341... |
to reach some "real" code. */
|
to reach some "real" code. */
|
extern CORE_ADDR or1k_skip_prologue PARAMS ((CORE_ADDR addr));
|
extern CORE_ADDR or1k_skip_prologue PARAMS ((CORE_ADDR addr));
|
#define SKIP_PROLOGUE(pc) (or1k_skip_prologue (pc))
|
#define SKIP_PROLOGUE(pc) (or1k_skip_prologue (pc))
|
|
|
/* FRAMES */
|
/* FRAMES */
|
|
|
#define FRAME_ARGS_ADDRESS(fi) (fi)->frame
|
#define FRAME_ARGS_ADDRESS(fi) (fi)->frame
|
|
|
#define FRAME_LOCALS_ADDRESS(fi) (fi)->frame
|
#define FRAME_LOCALS_ADDRESS(fi) (fi)->frame
|
|
|
/* FRAME_CHAIN takes a frame's nominal address
|
/* FRAME_CHAIN takes a frame's nominal address
|
and produces the frame's chain-pointer. */
|
and produces the frame's chain-pointer. */
|
|
|
#define FRAME_CHAIN(thisframe) (CORE_ADDR) or1k_frame_chain (thisframe)
|
#define FRAME_CHAIN(thisframe) (CORE_ADDR) or1k_frame_chain (thisframe)
|
extern CORE_ADDR or1k_frame_chain PARAMS ((struct frame_info *));
|
extern CORE_ADDR or1k_frame_chain PARAMS ((struct frame_info *));
|
|
|
/* Discard from the stack the innermost frame, restoring all registers. */
|
/* Discard from the stack the innermost frame, restoring all registers. */
|
|
|
extern void or1k_pop_frame PARAMS ((void));
|
extern void or1k_pop_frame PARAMS ((void));
|
#define POP_FRAME or1k_pop_frame()
|
#define POP_FRAME or1k_pop_frame()
|
|
|
|
|
/* Return number of args passed to a frame.
|
/* Return number of args passed to a frame.
|
Can return -1, meaning no way to tell. */
|
Can return -1, meaning no way to tell. */
|
|
|
#define FRAME_NUM_ARGS(fi) (-1)
|
#define FRAME_NUM_ARGS(fi) (-1)
|
|
|
/* Return number of bytes at start of arglist that are not really args. */
|
/* Return number of bytes at start of arglist that are not really args. */
|
|
|
#define FRAME_ARGS_SKIP 0
|
#define FRAME_ARGS_SKIP 0
|
|
|
/* Put here the code to store, into a struct frame_saved_regs,
|
/* Put here the code to store, into a struct frame_saved_regs,
|
the addresses of the saved registers of frame described by FRAME_INFO.
|
the addresses of the saved registers of frame described by FRAME_INFO.
|
This includes special registers such as pc and fp saved in special
|
This includes special registers such as pc and fp saved in special
|
ways in the stack frame. sp is even more special:
|
ways in the stack frame. sp is even more special:
|
the address we return for it IS the sp for the next frame. */
|
the address we return for it IS the sp for the next frame. */
|
|
|
extern void or1k_init_saved_regs PARAMS ((struct frame_info *));
|
extern void or1k_init_saved_regs PARAMS ((struct frame_info *));
|
#define FRAME_INIT_SAVED_REGS(frame_info) or1k_init_saved_regs (frame_info);
|
#define FRAME_INIT_SAVED_REGS(frame_info) or1k_init_saved_regs (frame_info);
|
|
|
/* Saved Pc. */
|
/* Saved Pc. */
|
|
|
extern CORE_ADDR or1k_frame_saved_pc PARAMS ((struct frame_info *));
|
extern CORE_ADDR or1k_frame_saved_pc PARAMS ((struct frame_info *));
|
#define FRAME_SAVED_PC(FRAME) (or1k_frame_saved_pc(FRAME))
|
#define FRAME_SAVED_PC(FRAME) (or1k_frame_saved_pc(FRAME))
|
|
|
/* Set the return address register to point to the entry
|
/* Set the return address register to point to the entry
|
point of the program, where a breakpoint lies in wait. */
|
point of the program, where a breakpoint lies in wait. */
|
|
|
extern CORE_ADDR or1k_push_return_address PARAMS ((CORE_ADDR pc, CORE_ADDR sp));
|
extern CORE_ADDR or1k_push_return_address PARAMS ((CORE_ADDR pc, CORE_ADDR sp));
|
#define PUSH_RETURN_ADDRESS(PC, SP) (or1k_push_return_address ((PC), (SP)))
|
#define PUSH_RETURN_ADDRESS(PC, SP) (or1k_push_return_address ((PC), (SP)))
|
|
|
/* Immediately after a function call, return the saved pc.
|
/* Immediately after a function call, return the saved pc.
|
Can't always go through the frames for this because on some machines
|
Can't always go through the frames for this because on some machines
|
the new frame is not set up until the new function executes
|
the new frame is not set up until the new function executes
|
some instructions. */
|
some instructions. */
|
|
|
#define SAVED_PC_AFTER_CALL(frame) read_register(LR_REGNUM)
|
#define SAVED_PC_AFTER_CALL(frame) read_register(LR_REGNUM)
|
|
|
/* Offset from address of function to start of its code.
|
/* Offset from address of function to start of its code.
|
Zero on most machines. */
|
Zero on most machines. */
|
|
|
#define FUNCTION_START_OFFSET (0)
|
#define FUNCTION_START_OFFSET (0)
|
|
|
/* Floating point is IEEE compliant */
|
/* Floating point is IEEE compliant */
|
#define IEEE_FLOAT
|
#define IEEE_FLOAT
|
|
|
Line 429... |
Line 402... |
/* Stack grows downward. */
|
/* Stack grows downward. */
|
#define INNER_THAN(lhs,rhs) ((lhs) < (rhs))
|
#define INNER_THAN(lhs,rhs) ((lhs) < (rhs))
|
|
|
/* Size of stack entry - in bytes. */
|
/* Size of stack entry - in bytes. */
|
#define OR1K_STACK_ALIGN (8)
|
#define OR1K_STACK_ALIGN (8)
|
|
|
/* Maximum struct size, that is still stored onto stack. */
|
/* Maximum struct size, that is still stored onto stack. */
|
#define OR1K_STRUCT_CONV_SIZE (8)
|
#define OR1K_STRUCT_CONV_SIZE (8)
|
#define STACK_ALIGN(addr) OR1K_STACK_ALIGN
|
#define STACK_ALIGN(addr) OR1K_STACK_ALIGN
|
|
|
#define USE_STRUCT_CONVENTION(gcc_p, type) (TYPE_LENGTH (type) > OR1K_STRUCT_CONV_SIZE)
|
#define USE_STRUCT_CONVENTION(gcc_p, type) (TYPE_LENGTH (type) > OR1K_STRUCT_CONV_SIZE)
|
Line 474... |
Line 448... |
|
|
/* Defined in remote-or1k.c */
|
/* Defined in remote-or1k.c */
|
|
|
/* Target state names. */
|
/* Target state names. */
|
extern const char *status_name[];
|
extern const char *status_name[];
|
|
|
/* Target state. */
|
/* Target state. */
|
enum target_status
|
enum target_status
|
{
|
{
|
TARGET_UNDEFINED,
|
TARGET_UNDEFINED,
|
TARGET_CONNECTING,
|
TARGET_CONNECTING,
|
Line 490... |
Line 465... |
#define REG_SPACE_END 0x7FFFFFFF
|
#define REG_SPACE_END 0x7FFFFFFF
|
#define MEM_SPACE 0x80000000
|
#define MEM_SPACE 0x80000000
|
#define MEM_SPACE_END 0xFFFFFFFF
|
#define MEM_SPACE_END 0xFFFFFFFF
|
|
|
/* Compare conditions for DCRx registers. */
|
/* Compare conditions for DCRx registers. */
|
|
|
enum enum_compare_condition
|
enum enum_compare_condition
|
{
|
{
|
CC_MASKED, CC_EQUAL, CC_LESS, CC_LESSE, CC_GREATE, CC_NEQUAL
|
CC_MASKED, CC_EQUAL, CC_LESS, CC_LESSE, CC_GREAT, CC_GREATE, CC_NEQUAL
|
};
|
};
|
|
|
/* Compare operand to compare DVRx to. */
|
/* Compare operand to compare DVRx to. */
|
|
|
enum enum_compare_to
|
enum enum_compare_to
|
{
|
{
|
CT_DISABLED, CT_FETCH, CT_LEA, CT_SEA, CT_LDATA, CT_SDATA, CT_ADATA
|
CT_DISABLED, CT_FETCH, CT_LEA, CT_SEA, CT_AEA, CT_LDATA, CT_SDATA, CT_ADATA
|
};
|
};
|
|
|
|
/* Matchpoint chaining types. */
|
|
enum enum_chaining
|
|
{
|
|
CHAINING_NONE, CHAINING_AND, CHAINING_OR
|
|
};
|
|
|
|
/* Names for cts. */
|
|
#define NUM_CT_NAMES 8
|
|
extern const char *compare_to_names[NUM_CT_NAMES];
|
|
|
/* DRCx struct */
|
/* DRCx struct */
|
struct dcr_struct
|
struct dcr_struct
|
{
|
{
|
enum enum_compare_to ct:3;
|
enum enum_compare_to ct:3;
|
unsigned int sc:1;
|
unsigned int sc:1;
|
enum enum_compare_condition cc:3;
|
enum enum_compare_condition cc:3;
|
unsigned int dp:1;
|
unsigned int dp:1;
|
};
|
};
|
|
|
/* Possible errors are listed here. */
|
/* All data needed for a matchpoint. */
|
|
struct matchpoint
|
|
{
|
|
struct dcr_struct dcr;
|
|
unsigned int dvr;
|
|
unsigned int chain_type;
|
|
unsigned int cause_breakpoint;
|
|
};
|
|
|
|
/* Trace related structures and data. */
|
|
#define TRACE_FILENAME_SIZE (128)
|
|
extern char trace_filename[TRACE_FILENAME_SIZE];
|
|
#define TRACE_FILENAME (&trace_filename[0])
|
|
#define TRACE_DATA_SIZE (sizeof(struct htrace_data_struct))
|
|
|
|
struct htrace_data_struct
|
|
{
|
|
unsigned int unused:24;
|
|
unsigned int data:32;
|
|
unsigned int type:4;
|
|
unsigned int reserved:3;
|
|
unsigned int valid:1;
|
|
};
|
|
|
|
enum enum_operation
|
|
{
|
|
TRIGOP_ANY, TRIGOP_OR, TRIGOP_AND
|
|
};
|
|
|
|
struct htrace_event_struct
|
|
{
|
|
enum enum_operation operation:2;
|
|
unsigned int reserved1:6;
|
|
unsigned int is_valid:1;
|
|
unsigned int is_trig:2;
|
|
unsigned int ls_valid:1;
|
|
unsigned int ls_trig:4;
|
|
unsigned int reserved2:2;
|
|
unsigned int bp_valid:1;
|
|
unsigned int bp_trig:1;
|
|
unsigned int wp_valid:1;
|
|
unsigned int wp_trig:11;
|
|
};
|
|
|
|
struct htrace_record_struct
|
|
{
|
|
unsigned int reserved:25;
|
|
unsigned int rec:7;
|
|
};
|
|
|
|
struct htrace_moder_struct
|
|
{
|
|
unsigned int reserved:29;
|
|
unsigned int rec_sel_dep:1;
|
|
unsigned int trace_enable:1;
|
|
unsigned int contin:1;
|
|
};
|
|
|
|
/* Number of records as defined in TAP. */
|
|
#define NUM_RECORDS (8)
|
|
|
|
struct htrace_struct
|
|
{
|
|
/* Local copy of HW regs for trace. */
|
|
struct htrace_event_struct trig, qual, stop;
|
|
struct htrace_record_struct recwp[MAX_MATCHPOINTS], recbp;
|
|
struct htrace_moder_struct moder;
|
|
/* Which matchpoints does record use? Bitmask. */
|
|
unsigned int wp_record_uses[MAX_MATCHPOINTS];
|
|
};
|
|
|
|
extern struct htrace_struct or1k_htrace;
|
|
extern int trace_size;
|
|
|
|
#define MAX_RECORD_NAMES 7
|
|
extern const char *or1k_record_names[MAX_RECORD_NAMES];
|
|
#define MAX_IS_NAMES 4
|
|
extern const char *or1k_is_names[MAX_IS_NAMES];
|
|
#define MAX_LS_NAMES 16
|
|
extern const char *or1k_ls_names[MAX_LS_NAMES];
|
|
|
|
/* Stuff for HW watches. */
|
|
#define MAX_HW_WATCHES MAX_MATCHPOINTS
|
|
|
|
struct hwatch_struct
|
|
{
|
|
int matchpoint_start;
|
|
};
|
|
|
|
extern int num_hw_watches;
|
|
extern struct hwatch_struct or1k_hwatch[MAX_HW_WATCHES];
|
|
|
|
/* Possible errors are listed here. */
|
enum enum_errors
|
enum enum_errors
|
{
|
{
|
ERR_NONE, ERR_CRC
|
ERR_NONE, ERR_CRC
|
};
|
};
|
|
|
|
/* All JTAG chains. */
|
enum jtag_chains
|
enum jtag_chains
|
{
|
{
|
SC_GLOBAL, /* 0 Global BS Chain */
|
SC_GLOBAL, /* 0 Global BS Chain */
|
SC_RISC_DEBUG, /* 1 RISC Debug Interface chain */
|
SC_RISC_DEBUG, /* 1 RISC Debug Interface chain */
|
SC_RISC_TEST, /* 2 RISC Test Chain */
|
SC_RISC_TEST, /* 2 RISC Test Chain */
|
SC_TRACE, /* 3 Trace Chain */
|
SC_TRACE, /* 3 Trace Chain */
|
SC_REGISTER, /* Register Chain */
|
SC_REGISTER, /* Register Chain */
|
SC_BLOCK, /* Block Chains */
|
SC_BLOCK, /* Block Chains */
|
};
|
};
|
|
|
|
/* See JTAG documentation about these. */
|
|
#define JI_SIZE (4)
|
|
enum jtag_instr
|
|
{
|
|
JI_EXTEST,
|
|
JI_SAMPLE_PRELOAD,
|
|
JI_IDCODE,
|
|
JI_CHAIN_SELECT,
|
|
JI_INTEST,
|
|
JI_CLAMP,
|
|
JI_CLAMPZ,
|
|
JI_HIGHZ,
|
|
JI_DEBUG,
|
|
JI_BYPASS = 0xF
|
|
};
|
|
|
/* JTAG registers. */
|
/* JTAG registers. */
|
|
#define JTAG_MODER (0x0)
|
|
#define JTAG_TSEL (0x1)
|
|
#define JTAG_QSEL (0x2)
|
|
#define JTAG_SSEL (0x3)
|
#define JTAG_RISCOP (0x9)
|
#define JTAG_RISCOP (0x9)
|
|
#define JTAG_RECWP0 (0x10)
|
|
#define JTAG_RECBP0 (0x1b)
|
|
|
|
|
|
/* Current register values. */
|
|
extern unsigned int dmr1;
|
|
extern unsigned int dmr2;
|
|
extern unsigned int dsr;
|
|
extern unsigned int drr;
|
|
|
|
extern int matchpoint_user_count[MAX_MATCHPOINTS];
|
|
|
|
/* Current watchpoints. */
|
|
extern unsigned int dvr[MAX_MATCHPOINTS];
|
|
extern struct dcr_struct dcr[MAX_MATCHPOINTS];
|
|
extern int debug_regs_changed;
|
|
|
|
/* Returns error name. */
|
extern const char *or1k_err_name PARAMS ((int e));
|
extern const char *or1k_err_name PARAMS ((int e));
|
|
|
|
/* Last error number. */
|
|
extern int err;
|
|
|
extern struct struct_or1k_implementation or1k_implementation;
|
extern struct struct_or1k_implementation or1k_implementation;
|
extern unsigned int or1k_fetch_instruction PARAMS ((CORE_ADDR addr));
|
extern unsigned int or1k_fetch_instruction PARAMS ((CORE_ADDR addr));
|
extern void or1k_fetch_registers PARAMS ((int regno));
|
extern void or1k_fetch_registers PARAMS ((int regno));
|
|
|
/* Sets register/memory regno to data. */
|
/* Sets register/memory regno to data. */
|
extern void or1k_write_spr_reg PARAMS ((unsigned int regno, unsigned int data));
|
extern void or1k_write_spr_reg PARAMS ((unsigned int regno, unsigned int data));
|
|
|
/* Sets register/memory regno to data. */
|
/* Sets register/memory regno to data. */
|
extern unsigned int or1k_read_spr_reg PARAMS ((unsigned int regno));
|
extern unsigned int or1k_read_spr_reg PARAMS ((unsigned int regno));
|
extern int err;
|
|
|
|
|
/* Flushes or1k's pipeline. */
|
extern void or1k_flush_pipeline PARAMS ((void));
|
extern void or1k_flush_pipeline PARAMS ((void));
|
|
|
|
/* Sifts unused matchpoints to higher indexses. */
|
|
extern void sift_matchpoints ();
|
|
|
#endif /* TM_OR1K_H */
|
#endif /* TM_OR1K_H */
|
|
|
No newline at end of file
|
No newline at end of file
|