| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- /* Header file for TRAX control Library */
- /*
- * Copyright (c) 2012-2013 Tensilica Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
- #ifndef _TRAX_H
- #define _TRAX_H
- #ifdef __cplusplus
- extern "C" {
- #endif
- #define TRAX_STOP_HALT 0x0001
- #define TRAX_STOP_QUIET 0x0002
- /* Flag values to indicate if the user wanted to reverse the pcstop
- * parameters */
- #define TRAX_PCSTOP_REVERSE 0x0001
- #define TRAX_PCSTOP_NO_REVERSE 0x0000
- /* Indicating whether postsize should be in terms of bytes, instructions
- * or percentage of trace size captured */
- #define TRAX_POSTSIZE_BYTES 0x0000
- #define TRAX_POSTSIZE_INSTR 0x0001
- #define TRAX_POSTSIZE_PERCENT 0x0002
- /* Size of the header inside the trace file */
- #define TRAX_HEADER_SIZE 256
- /* Minimum size between start and end addresses */
- #define TRAX_MIN_TRACEMEM 64
- /* For basic debugging */
- #define DEBUG 0
- #include <stdbool.h>
- #define ffs(i) __builtin_ffs(i)
- /* Data structures */
- /* Represents the context of the TRAX unit and the current TRAX session.
- * To be used by set and show function calls to set and show appropriate
- * parameters of appropriate TRAX unit.
- */
- typedef struct {
- int trax_version; /* TRAX PC version information */
- unsigned long trax_tram_size; /* If trace RAM is present,size of it */
- int hflags; /* Flags that can be used to debug,
- print info, etc. */
- int address_read_last; /* During saving of the trace, this
- indicates the address from which
- the current trace reading must
- resume */
- unsigned long bytes_read; /* bytes read uptil now */
- unsigned long total_memlen; /* Total bytes to be read based on the
- trace collected in the trace RAM */
- bool get_trace_started; /* indicates that the first chunk of
- bytes (which include the header) has
- been read */
- } trax_context;
- /* -----------------------TRAX Initialization ------------------------------*/
- /* Initializing the trax context. Reads registers and sets values for version,
- * trace RAM size, total memory length, etc. Most of the other values are
- * initialized to their default case.
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- *
- * returns : 0 if successful, -1 if unsuccessful, -2 if ram_size if
- * incorrect
- */
- int trax_context_init_eri (trax_context *context);
- /* -----------------Starting/Stopping TRAX session -------------------------*/
- /* Start tracing with current parameter setting. If tracing is already in
- * progress, an error is reported. Otherwise, tracing starts and any unsaved
- * contents of the TraceRAM is discarded
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * returns : 0 if successful, 1 if trace is already active,
- * -1 if unsuccessful
- */
- int trax_start (trax_context *context);
- /* This command initiates a stop trigger or halts a trace session based of the
- * value of the flag parameter passed. In case stop trigger is initiated, any
- * selected post-stop-trigger capture proceeds normally.
- * If trace capture was not in progress, or a stop was already triggered, the
- * return value indicates appropriately.
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * flags : To differentiate between stopping trace without any
- * post-size-trigger capture (trax_halt) or with that.
- * A zero value would stop the trace based on trigger and a
- * value of one would halt it
- *
- * returns : 0 if successful, 1 if already stopped, -1 if unsuccessful
- */
- int trax_stop_halt (trax_context *context, int flags);
- /* Resets the TRAX parameters to their default values which would internally
- * involve resetting the TRAX registers. To invoke another trace session or
- * reset the current tracing mechanism, this function needs to be called as
- * it resets parameters of the context that deal with tracing information
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- *
- * returns : 0 if successful, -1 if unsuccessful
- */
- int trax_reset (trax_context *context);
- /* ---------------Set/Get several TRAX parameters --------------------------*/
- /* Sets the start address and end address (word aligned) of the trace in the
- * TraceRAM. Care must be taken to ensure that the difference between the
- * start and the end addresses is atleast TRAX_MIN_TRACEMEM bytes. If not,
- * the values are reset to default, which is 0 for startaddr and
- * traceRAM_words -1 for endaddr
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * startaddr : value to which the start address must be set. Can be
- * any value between 0 - (traceRAM_words - 1)
- * endaddr : value to which the end address must be set. Can be any value
- * between 0 - (traceRAM_words - 1)
- *
- * returns : 0 if successful, -1 if unsuccessful, -2 if the difference
- * between the start and end addresses is less than
- * TRAX_MIN_TRACEMEM bytes or if they are passed incorrect
- * values, -3 if memory shared option is not configured, in
- * which case, start and end addresses are set to default
- * values instead of those passed by the user
- */
- int trax_set_ram_boundaries (trax_context *context, unsigned startaddr,
- unsigned endaddr);
- /* Shows the start address and end address(word aligned) of the trace in the
- * TraceRAM. If incorrect, the startaddress and the endaddress values are
- * set to default, i.e. 0 for startaddr and traceRAM_words - 1 for endaddr
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * startaddr : pointer to value which will contain the start address
- * endaddr : pointer to value which will contain the end address
- *
- * returns : 0 if successful, -1 if unsuccessful
- *
- */
- int trax_get_ram_boundaries (trax_context *context, unsigned *startaddr,
- unsigned *endaddr);
- /* Selects stop trigger via cross-trigger input
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * value : 0 = off (reset value), 1 = on
- *
- * returns : 0 if successful, -1 if unsuccessful
- */
- int trax_set_ctistop (trax_context *context, unsigned value);
- /* Shows if stop-trigger via cross-trigger input is off or on
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * returns : 0 if off, 1 if on, -1 if unsuccessful
- */
- int trax_get_ctistop (trax_context *context);
- /* Selects stop trigger via processor-trigger input
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * value : 0 = off (reset value), 1 = on
- *
- * returns : 0 if successful, -1 if unsuccessful
- */
- int trax_set_ptistop (trax_context *context, unsigned value);
- /* Shows if stop trigger visa processor-trigger input is off or on
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * returns : 0 if off, 1 if on, -1 if unsuccessful
- */
- int trax_get_ptistop (trax_context *context);
- /* Reports cross trigger output state
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * returns : 0 if CTO bit is reset, 1 if CTO bit is set
- */
- int trax_get_cto (trax_context *context);
- /* Reports processor trigger output state
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * returns : 0 if PTO bit is reset, 1 if PTO bit is set
- */
- int trax_get_pto (trax_context *context);
- /* Selects condition that asserts cross trigger output
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * option : 0 = off(reset value)/1 = ontrig/2 = onhalt
- *
- * returns : 0 if successful, -1 if unsuccessful
- */
- int trax_set_ctowhen (trax_context *context, int option);
- /* Shows condition that asserted cross trigger output. It can be
- * any of: ontrig or onhalt or even off
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- *
- * returns : 0 if off, 1 if ontrig, 2 if onhalt, -1 if unsuccessful
- */
- int trax_get_ctowhen (trax_context *context);
- /* Selects condition that asserts processor trigger output
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * option : 0 = off(reset value)/1 = ontrig/2 = onhalt
- *
- * returns : 0 if successful, -1 if unsuccessful
- */
- int trax_set_ptowhen (trax_context *context, int option);
- /* Shows condition that asserted processor trigger output. It can be
- * any of: ontrig or onhalt or even off
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * returns : 0 if off, 1 if ontrig, 2 if onhalt, -1 if unsuccessful
- */
- int trax_get_ptowhen (trax_context *context);
- /* Selects the trace synchronization message period.
- * If ATEN enabled, we cannot allow syncper to be off, set it to reset value.
- * Also, if no trace RAM, and ATEN enabled, set syncper to be reset value
- * i.e. 256. A value of 1 i.e. on indicates that internally the message
- * frequency is set to an optimal value. This option should be preferred
- * if the user is not sure what message frequency option to set for the
- * trace session.
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * option : 0 = off, 1 = on, -1 = auto, 8, 16, 32, 64, 128,
- * 256 (reset value)
- *
- * returns : 0 if successful, -1 if unsuccessful, -2 if incorrect
- * arguments
- */
- int trax_set_syncper (trax_context *context, int option);
- /* Shows trace synchronization message period. Can be one of:
- * off, on, auto, 8, 16, 32, 64, 128, 256 (reset value)
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * returns : value of sync period, 0 if off, -1 if unsuccessful
- */
- int trax_get_syncper (trax_context *context);
- /* Selects stop trigger via PC match. Specifies the address or
- * address range to match against program counter. Trace stops when the
- * processor executes an instruction matching the specified address
- * or range.
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * index : indicates the number of stop trigger (currently there is
- * only one i.e. index = 0)
- * startaddress : start range of the address at which the stop trigger
- * should be activated
- * enaddress : end range of the address at which the stop trigger should
- * be activated
- * flags : If non-zero, this inverts the range. i.e. trace stops
- * when the processor executes an instruction that does not
- * match the specified address or range
- *
- * returns : 0 if successful, -1 if unsuccessful, -2 if incorrect
- * arguments (unaligned)
- *
- * Note : For the current version of TRAX library, the endaddress and
- * startaddress can differ by at most 31 bytes and the total
- * range i.e. (endaddress - startaddress + 1) has to be a power
- * of two
- */
- int trax_set_pcstop (trax_context *context, int index, unsigned long startaddress,
- unsigned long endaddress, int flags);
- /* Shows the stop trigger via PC match
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * index : container of information about the number of stop triggers
- * startaddress : container of start range of stop trigger
- * endaddress : container of end range of stop trigger
- * flags : container of information whcih indicates whether the
- * pc stop range is inverted or not.
- *
- * returns : 0 if successful, -1 if unsuccessful
- */
- int trax_get_pcstop (trax_context *context, int *index,
- unsigned long *startaddress,
- unsigned long *endaddress, int *flags);
- /* This function is used to set the amount of trace to be captured past
- * the stop trigger.
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * count_unit : contains the count of units (instructions or bytes) to be
- * captured post trigger. If 0, it implies that this is off
- * unit : unit of measuring the count. 0 is bytes, 1 is instructions
- * 2 is percentage of trace
- *
- * returns : 0 if successful, -1 if unsuccessful, -2 if incorrect
- * arguments
- *
- */
- int trax_set_postsize (trax_context *context, int count_unit, int unit);
- /* This function shows the amount of TraceRAM in terms of the number of
- * instructions or bytes, captured post the stop trigger
- *
- * context : pointer to structure which contains information about the
- * current TRAX session
- * count_unit : will contain the count of units(instructions or bytes) post
- * trigger
- * unit : will contain information about the events that are counted
- * 0 implies that the traceRAM words consumed are counted and
- * 1 implies that the target processor instructions executed and
- * excpetions/interrupts taken are counted
- *
- * returns : 0 if postsize was got successfully, -1 if unsuccessful
- */
- int trax_get_postsize (trax_context *context, int *count_unit, int *unit);
- /* -------------------------- TRAX save routines ---------------------------*/
- /* This function should be called by the user to return a chunk of
- * bytes in buf. It can be a lower layer function of save, or can be
- * called by the user explicitly. If bytes_actually_read contains a 0
- * after a call to this function has been made, it implies that the entire
- * trace has been read successfully.
- *
- * context : pointer to structure which contains information about
- * the current TRAX session
- * buf : Buffer that is allocated by the user, all the trace
- * data read would be put in this buffer, which can then
- * be used to generate a tracefile.
- * The first TRAX_HEADER_SIZE of the buffer will always
- * contain the header information.
- * bytes_to_be_read : Indicates the bytes the user wants to read. The first
- * invocation would need this parameter to be
- * TRAX_HEADER_SIZE at least.
- *
- * returns : bytes actually read during the call to this function.
- * 0 implies that all the bytes in the trace have been
- * read, -1 if unsuccessful read/write of
- * registers or memory, -2 if trace was active while
- * this function was called, -3 if user enters
- * bytes_to_be_read < TRAX_HEADER_SIZE in the first
- * pass
- */
- int trax_get_trace (trax_context *context, void *buf,
- int bytes_to_be_read);
- #ifdef __cplusplus
- }
- #endif
- #endif /* _TRAX_H */
|