/* 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