binutils-gdb/gdb/tdesc.h

330 lines
9.3 KiB
C
Raw Normal View History

1991-03-28 17:28:29 +01:00
/* This file has been modified by Data General Corporation, November 1989. */
#ifndef _tdesc_h
#define _tdesc_h
#ifdef __STDC__
#define _ARGS(x) x
#else
#define _ARGS(x) ()
#endif
/*
This file provides an abstract interface to "tdesc" information.
It is designed to be used in a uniform manner by several kinds
of debuggers:
(1) code in live debugged process (e.g., a traceback routine)
(2) a separate-process debugger debugging a live process
(3) a separate-process debugger debugging a memory dump
Dcontext model notes
* captures machine context
* partial: excludes memory
* frames
* kinds
* make one for starters, chain in reverse order to previous ones
* representation: pointer to opaque
* alloc/free protocol
Overall model
* access functions
* handle
* error handling
*/
typedef int dc_boolean_t; /* range 0 .. 1 */
#define DC_FALSE 0
#define DC_TRUE 1
typedef int dc_tristate_t; /* range 0 .. 2 */
#define DC_NO 0
#define DC_YES 1
#define DC_MAYBE 2
#define DC_MII_PRECEDING_TDESC_END (1<<0)
#define DC_MII_FOLLOWING_TDESC_START (1<<1)
#define DC_MIO_ENTRY_POINT (1<< 0)
#define DC_MIO_PROLOGUE_END (1<< 1)
#define DC_MIO_EPILOGUE_START (1<< 2)
#define DC_MIO_IMPLICIT_PROLOGUE_END (1<<16)
#define DC_MIO_LITERAL_ENTRY_POINT (1<<17)
#define DC_MIO_LITERAL_EPILOGUE_START (1<<18)
/*
A word is 32 bits of information. In memory, a word is word-aligned.
A common and important use of word_t is to represent values in the
target process, including (byte) addresses in the target process.
In this case, C arithmetic can be used to simulate machine address
arithmetic on the target. (Unsigned arithmetic is actually modulus
arithmetic.)
*/
typedef unsigned int dc_word_t;
/*----------------*/
/* The exactness of locations may not be certainly known. */
typedef dc_tristate_t dc_exactness_t;
/*
The model includes five kinds of contexts. Because each context
has an associated region and frame, these describe region kinds
and frame kinds as well.
[more description needed]
Currently, only call contexts exist.
*/
typedef int dc_kind_t; /* range 0 .. 4 */
#define DC_CALL_KIND 0
#define DC_SAVE_KIND 1
#define DC_EXCEPTION_KIND 2
#define DC_PROTECTION_KIND 3
#define DC_SPECIAL_KIND 4
#define DC_NUM_KINDS 5
typedef struct dc_debug_info {
unsigned int protocol; /* 1 for this structure */
dc_word_t tdesc_ptr;
unsigned int text_words_count;
dc_word_t text_words_ptr;
unsigned int data_words_count;
dc_word_t data_words_ptr;
} dc_debug_info_t;
typedef struct dc_mstate {
dc_word_t reg[32]; /* general registers */
dc_word_t xip;
dc_word_t nip;
dc_word_t fip;
dc_word_t fpsr;
dc_word_t fpcr;
dc_word_t psr;
} dc_mstate_t;
#if 0
void error_fcn (env, continuable, message)
dc_word_t env; /* environment (arbitrary datum) */
boolean_t continuable; /* whether error function may return */
char *message; /* string (no trailing newline) */
/* In the future, we probably want the error_fcn to be: */
void error_fcn (env, continuable, code, ...)
dc_word_t env; /* environment (arbitrary datum) */
boolean_t continuable; /* whether error function may return */
int code; /* error code */
... /* parameters to message associated
with the code */
void read_fcn (env, memory, length, buffer)
dc_word_t env; /* environment (arbitrary datum) */
dc_word_t memory; /* start address in image */
int length; /* in bytes */
char *buffer; /* start address of buffer */
/* There are no alignment assumptions for the read function. */
void write_fcn (env, memory, length, buffer)
dc_word_t env; /* environment (arbitrary datum) */
dc_word_t memory; /* start address in image */
int length; /* in bytes */
char *buffer; /* start address of buffer */
/* There are no alignment assumptions for the write function. */
/* The write function is optional. It must be provided if changes
to writable registers are to be made. */
void exec_fcn (env, mstate)
dc_word_t env; /* environment (arbitrary datum) */
dc_mstate_t *mstate; /* machine state (read-write) */
/* The execute function is optional. It would be used (in the future)
by the implementation of a procedurally specified tdesc mechanism. */
#endif
/*----------------*/
typedef struct dc_map_info_in {
dc_word_t flags;
dc_word_t preceding_tdesc_end;
dc_word_t following_tdesc_start;
} dc_map_info_in_t;
typedef struct dc_map_info_out {
dc_word_t flags;
dc_word_t entry_point;
dc_word_t prologue_end;
dc_word_t epilogue_start;
} dc_map_info_out_t;
typedef void *dc_handle_t;
typedef void (*tdesc_error_fcn_type) _ARGS((
dc_word_t env, /* environment (arbitrary datum) */
dc_boolean_t continuable, /* whether error function may return */
const char *message /* string (no trailing newline) */
));
typedef void (*tdesc_io_fcn_type) _ARGS((
dc_word_t env, /* environment (arbitrary datum) */
dc_word_t memory, /* start address in image */
int length, /* in bytes */
void *buffer /* start address of buffer */
));
typedef void (*tdesc_exec_fcn_type) _ARGS((
dc_word_t env, /* environment (arbitrary datum) */
dc_mstate_t *mstate /* machine state (read-write) */
));
typedef void (*tdesc_map_fcn_type) _ARGS((
dc_word_t map_env,
dc_word_t loc,
dc_map_info_in_t map_info_in,
dc_map_info_out_t *map_info_out
));
extern dc_handle_t dc_initiate _ARGS((
dc_word_t debug_info_ptr,
tdesc_error_fcn_type error_fcn,
dc_word_t error_env,
tdesc_io_fcn_type read_fcn,
dc_word_t read_env,
tdesc_io_fcn_type write_fcn, /* NULL => absent */
dc_word_t write_env,
tdesc_exec_fcn_type exec_fcn, /* NULL => absent */
dc_word_t exec_env,
tdesc_map_fcn_type map_fcn, /* NULL => absent */
dc_word_t map_env
));
extern void dc_terminate _ARGS((
dc_handle_t handle
));
typedef int dc_register_state_t; /* range 0 to 2 */
#define DC_INVALID 0
#define DC_READABLE 1
#define DC_WRITABLE 2
#define DC_NUM_REG 32
#define DC_AUX_LOC 0
#define DC_AUX_SXIP 1
#define DC_AUX_SNIP 2
#define DC_AUX_SFIP 3
#define DC_AUX_FPSR 4
#define DC_AUX_FPCR 5
#define DC_NUM_AUX 6
typedef void *dc_dcontext_t;
extern dc_dcontext_t dc_make_dcontext _ARGS((
dc_handle_t handle,
dc_word_t reg_info[DC_NUM_REG],
dc_word_t reg_flags[2],
dc_word_t aux_info[DC_NUM_AUX],
dc_word_t aux_flags[2],
dc_exactness_t loc_exact,
dc_word_t psr_info,
dc_boolean_t psr_ind,
dc_word_t psr_flags[2]
));
extern void dc_free_dcontext _ARGS((
dc_dcontext_t dcontext
));
extern dc_register_state_t dc_location_state _ARGS((
dc_dcontext_t dcontext
));
extern dc_exactness_t dc_location_exactness _ARGS((
dc_dcontext_t dcontext
));
extern dc_word_t dc_location _ARGS((
dc_dcontext_t dcontext
));
extern void dc_set_location _ARGS((
dc_dcontext_t dcontext,
dc_word_t value
));
extern dc_register_state_t dc_general_register_state _ARGS((
dc_dcontext_t dcontext,
int reg
));
extern dc_word_t dc_general_register _ARGS((
dc_dcontext_t dcontext,
int reg
));
extern void dc_set_general_register _ARGS((
dc_dcontext_t dcontext,
int reg,
dc_word_t value
));
extern dc_register_state_t dc_auxiliary_register_state _ARGS((
dc_dcontext_t dcontext,
int reg
));
extern dc_word_t dc_auxiliary_register _ARGS((
dc_dcontext_t dcontext,
int reg
));
extern void dc_set_auxiliary_register _ARGS((
dc_dcontext_t dcontext,
int reg,
dc_word_t value
));
extern dc_register_state_t dc_psr_register_bit_state _ARGS((
dc_dcontext_t dcontext,
int bit
));
extern dc_word_t dc_psr_register _ARGS((
dc_dcontext_t dcontext
));
extern void dc_set_psr_register _ARGS((
dc_dcontext_t dcontext,
dc_word_t mask,
dc_word_t value
));
extern dc_word_t dc_frame_address _ARGS((
dc_dcontext_t dcontext
));
extern dc_kind_t dc_context_kind _ARGS((
dc_dcontext_t dcontext
));
extern dc_register_state_t dc_return_address_state _ARGS((
dc_dcontext_t dcontext
));
extern dc_exactness_t dc_return_address_exactness _ARGS((
dc_dcontext_t dcontext
));
extern dc_word_t dc_return_address _ARGS((
dc_dcontext_t dcontext
));
extern void dc_set_return_address _ARGS((
dc_dcontext_t dcontext,
dc_word_t value
));
extern void dc_get_exception_info();
extern void dc_get_protection_info();
extern void dc_get_special_info();
extern dc_dcontext_t dc_previous_dcontext _ARGS((
dc_dcontext_t dcontext
));
extern dc_boolean_t dc_location_in_text_chunk _ARGS((
dc_dcontext_t dcontext,
dc_word_t value
));
#endif