blob: 5b27bbbd4dd5cd978ee0fdfec6bc93b3d56ea873 [file] [log] [blame]
/* --COPYRIGHT--,EPL
* Copyright (c) 2008-2020 Texas Instruments Incorporated
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Texas Instruments - initial implementation
*
* --/COPYRIGHT--*/
/*!
* ======== Program ========
* Root object for the ROV model
*
* This module is the main access point for all ROV operations.
* The Program APIs are used to retrieve the views for the
* requested modules.
*/
metaonly module Program {
/*!
* ======== FetchDesc ========
* Description of data to fetch
*
* A FetchDesc object is required as the first argument of the
* `{@link #fetchStruct}` and `{@link #fetchArray}` methods.
* The FetchDesc tells ROV the type of the data to be
* fetched so it knows how much data to read and how to decode it.
*
* Every reference-type field in a state structure has a FetchDesc
* generated for it, with the name `<field name>$fetchDesc`.
*
* For example, the instance structure
* @p(code)
* struct Instance_State {
* Char stack[];
* ];
* @p
* will have defined `obj.stack$fetchDesc`, which can be used to fetch
* the array:
* @p(code)
* var data = Program.fetchArray(obj.stack$fetchDesc, obj.stack, len);
* @p
*
* @field(type) the fully qualified name of a specified type; i.e.,
* a type declared in some .xdc file. For example,
* "xdc.runtime.Types.Timestamp64".
* @field(isScalar) if fetching an array, are the elements of the array
* really just one of the "scalar structs" defined by
* xdc.rov.support.ScalarStructs.
*
* @see #fetchStruct
* @see #fetchArray
*/
metaonly struct FetchDesc {
String type;
Bool isScalar;
}
/*!
* ======== InstDataView ========
* Instance view data returned from a scan
*
* @see #scanInstanceDataView
*/
metaonly struct InstDataView {
String label;
Any elements[];
}
/*!
* ======== InstDataViewArr ========
* Array of all instance view data objects
*
* @see #scanInstanceDataView
*/
typedef InstDataView InstDataViewArr[];
/*!
* ======== ModDataView ========
* Module view data returned from a scan
*
* @see #scanModuleDataView
*/
metaonly struct ModDataView {
Any elements[];
}
/*!
* ======== TreeNode ========
* Node for a generic "tree table" view
*
* @see #scanTreeTableView
* @see ViewInfo#TREE_TABLE
*/
metaonly struct TreeNode {
String label;
TreeNode children[];
Any properties[];
}
/*!
* ======== TreeNodeArr ========
* Array of tree table nodes
*
* @see #scanTreeTableView
* @see ViewInfo#TREE_TABLE
*/
typedef TreeNode TreeNodeArr[];
/*!
* ========= RawView ========
* Raw module view
*
* This is the structure returned by the `{@link scanRawView}` method.
* It contains the module's state, the instance states, and the module
* configuration fields and values.
*/
metaonly struct RawView {
Any modState;
Any instStates[];
Any modCfg;
}
/* -------- Scan Functions -------- */
/*!
* ======== scanInstanceView ========
* Retrieve the instance-type views for a module
*
* Returns an array of Instance_View structures, each structure
* representing an instance of the module.
*
* @param(modName) Full module name to return the views for.
* @param(tabName) Name of the tab to retrieve the views for.
*
* @a(Returns) Array of Instance_View structures, one for each instance.
*
* @a(Throws) Throws an exception in the event that a memory read of
* the specified instance view fails, the specified `tabName`
* isn't recognized, the specified `modName` doesn't support
* instances, or the module `modName` is not configured into
* the current program.
*/
Any scanInstanceView(String modName, String tabName);
/*!
* ======== scanModuleView ========
* Retrieve module-type view for a module.
*
* @param(modName) Full module name to return the view for.
* @param(tabName) Name of the tab to retreive the view for.
*
* @(Returns) Module_View structure.
*
* @a(Throws) Throws an exception in the event that a memory read of
* the specified module view fails, the specified `tabName`
* isn't recognized, or the module `modName` is not
* configured into the current program.
*/
Any scanModuleView(String modName, String tabName);
/*!
* ======== scanInstanceDataView ========
* Retrieve a module's specified INSTANCE_DATA type view
*
* @param(modName) Full module name to return the views for.
* @param(tabName) Name of the tab to retrieve the views for.
*
* @a(Throws) Throws an exception in the event that a memory read of
* the module's Raw view or any instance fails, the specified
* `tabName` isn't recognized, the specified `modName`
* doesn't support instances, or the module `modName` is not
* configured into the current program.
*/
InstDataViewArr scanInstanceDataView(String modName, String tabName);
/*!
* ======== scanModuleDataView ========
* Retrieve a module's specified MODULE_DATA type view
*
* @param(modName) Full module name to return the views for.
* @param(tabName) Name of the tab to retrieve the views for.
*
* @a(Throws) Throws an exception in the event that a memory read of
* the specified module view fails, the specified `tabName`
* isn't recognized, or the module `modName` is not
* configured into the current program.
*/
ModDataView scanModuleDataView(String modName, String tabName);
/*!
* ======== scanRawView ========
* Retrieve the raw view for a module.
*
* @param(modName) Full module name to return the raw view for.
*
* @(Returns) A RawView structure which contains the raw data.
*
* @a(Throws) Throws an exception in the event that a memory read of
* the specified instance view fails, the specified `tabName`
* isn't recognized, the specified `modName` doesn't support
* instances, or the module `modName` is not configured into
* the current program.
*
* @a(Throws) Throws an exception in the event that a memory read of
* the module's Raw view fails, or the module `modName` is
* not configured into the current program.
*/
RawView scanRawView(String modName);
/*!
* ======== scanTreeTableView ========
*/
TreeNodeArr scanTreeTableView(String modName, String tabName);
/*!
* ======== scanTreeView ========
*/
Any scanTreeView(String modName, String tabName);
/*!
* ======== scanHandle ========
* Scan single instance of a module
*
* Used from a view$init function to scan a single instance of a
* different module given that instance's address.
*
* @param(modName) Full module name to return the raw view for.
* @param(instAddr) Address of instance to scan.
* @param(tabName) Name of the tab to retrieve the view for.
*
* @a(Returns) An Instance_View object for the requested view.
*
* @a(Throws) Throws an exception in the event that a memory read of
* the specified instance view fails, the specified `tabName`
* isn't recognized, the specified `modName` doesn't support
* instances, or the module `modName` is not configured into
* the current program.
*/
Any scanHandleView(String modName, Ptr instAddr, String tabName);
/*!
* ======== scanObjectView ========
* Scan view for an embedded object
*
* Called from a view$init function to retrieve the specified view for
* an embedded object.
*
* Since XDC has no way of knowing what embedded objects are present in
* a system, embedded objects do not appear in the list of a module's
* instances until they have been scanned in this way.
*
* Calling Program.scanObjectView will not read any additional data from
* the target, since the state structure was already read as part of
* reading its parent structure.
*
* @param(modName) Full module name to return the view for.
* @param(obj) Actual object to retrieve the view for.
* @param(tabName) Name of the tab to retrieve the view for.
*
* @a(Returns) An Instance_View object for the requested view.
*
* @a(Throws) Throws an exception in the event that the specified
* `tabName` isn't recognized, the specified `modName`
* doesn't support instances, or the module `modName` is not
* configured into the current program.
*/
Any scanObjectView(String modName, Any obj, String tabName);
/* -------- Fetch Functions -------- */
/*!
* ======== fetchStruct ========
* Retrieve the specified structure from the target
*
* @param(desc) Fetch descriptor for the structure, indicating the type
* of the structure.
* @param(addr) Address of the structure to fetch.
* @param(addrCheck) Optional, defaults to true. Indicates whether the
* memory image should validate the read by comparing
* the address to section information.
*
* @a(Returns) Returns the requested structure as a JavaScript object.
*
* @a(Throws) Throws an exception in the event that `addr` is not in
* the program's memory map or some error occurs that
* prevents memory from being read.
*/
Any fetchStruct(FetchDesc desc, Ptr addr, Bool addrCheck = true);
/*!
* ======== fetchArray ========
* Retrieve the specified array from the target
*
* @param(desc) Fetch descriptor for the array, indicating the type of
* data in the array.
* @param(addr) Address of the array to fetch.
* @param(len) The number of arrray elements to fetch.
* @param(addrCheck) Optional, defaults to true. Indicates whether the
* memory image should validate the read by comparing
* the address to section information.
*
* @a(Returns) Returns a JavaScript array with the data in it.
*
* @a(Throws) Throws an exception in the event that `addr` is not in
* the program's memory map, some error occurs that
* prevents memory from being read, or if `len` = 0.
*/
Any fetchArray(FetchDesc desc, Ptr addr, Int len, Bool addrCheck = true);
/*!
* ======== fetchString ========
* Retrieve a string from the target
*
* @param(addr) Address of the string.
* @param(addrCheck) Optional, defaults to true. Indicates whether the
* memory image should validate the read by comparing
* the address to section information.
*
* @a(Returns) Requested string.
*
* @a(Throws) Throws an exception in the event that `addr` is not in
* the program's memory map or some error occurs that
* prevents memory from being read.
*/
String fetchString(Ptr addr, Bool addrCheck = true);
/*!
* ======== fetchStaticString ========
* Retrieves a static string from the executable.
*
* This API makes use of an object file reader to improve the string
* reading performance--it reads the string from the file rather than
* performing a target memory read. For this reason, it should only be
* used on static strings and not dynamic ones.
*
* @param(addr) Address of the string
*
* @a(Returns) Requested string or `null` if it can't be found.
*/
String fetchStaticString(Ptr addr);
/*!
* ======== fetchFromAddr ========
* Returns a JavaScript object that mirrors the C object at the supplied
* address
*
* The type of the object is also supplied by the user. There is no
* checking whether the object at that address is of the supplied type.
* By default, only one instance of the specified type will be fetched
* from the address.
*
* If the type `typename` is not found, an exception is raised.
*
* @param(addr) Address of the C object
* @param(typeName) Name of the C type read from the address
* @param(count) Number of C objects read from the address
*
* @a(Returns) JavaScript representation of the object at the address
*/
Any fetchFromAddr(Ptr addr, String typename, Int count = 1);
/*!
* ======== fetchVariable ========
* Returns a JavaScript object or a scalar that mirrors the content of the
* variable.
*
* This function replicates primitive or aggregate objects from memory,
* and returns them as JavaScript objects. If the variable is an array or
* a structure, its corresponding JavaScript elements can be accessed as
* JavaScript arrays or structures.
* Pointers are not followed, but they are represented as hexadecimal
* values.
*
* If the variable is not found in the object file, an exception is raised.
*
* @param(varName) name of the variable
*
* @a(Returns) content of the variable
*/
Any fetchVariable(String varName);
/*!
* ======== fetchVariableByPtr ========
* Returns a JavaScript representation of a C object or a scalar pointed to
* by the supplied pointer variable.
*
* This API first checks if there is such a variable, and if it is of a
* pointer type. If any of these checks fails, an exception is raised.
* Otherwise, the pointer variable is dereferenced, and the memory content
* is interpreted as a pointed-to type.
*/
Any fetchVariableByPtr(String varName);
/*!
* ======== getModuleConfig ========
* Get a module's configuration state
*
* Returns an object with all of the module configuration values used
* in configuring the application.
*
* This object includes the common$ config params.
*
* @param(modName) Full module name to get the configs for.
*
* @a(Returns) Object containing all of the module configs and
* their values.
*/
Any getModuleConfig(String modName);
/*!
* ======== getPrivateData ========
* Retrieves module's private ROV data.
*
* This API returns an object which can be used to store private data
* across different ROV API calls. The object is reset at every
* breakpoint.
*
* This object is also passed as the context to all view init functions,
* so it can also be accessed using 'this'. However, the context changes
* when you call other APIs in your module; that is when you will need
* this API. It can also be used to support metaonly APIs which are called
* by other modules.
*/
Any getPrivateData(String modName);
/*!
* ======== lookupDataSymbol ========
* Lookup symbolic names for an address
*
* Uses the ISymbolTable to look up the symbols at the given address.
*
* This API is separate from lookupFuncName to address paging concerns.
* Use lookupFuncName to get function names (or any symbols in PROGRAM
* memory) and use lookupDataSymbol to get data symbols (for symbols in
* DATA memory).
*
* @param(addr) Address of symbols
*
* @a(Returns) Array of symbols at the requested address.
*/
Any lookupDataSymbol(Int addr);
/*!
* ======== lookupFuncName ========
* Lookup function names for an address.
*
* Uses the ISymbolTable to look up the symbols at the given address.
*
* This API is separate from lookupDataSymbol to address paging concerns.
* Use lookupFuncName to get function names (or any symbols in PROGRAM
* memory) and use lookupDataSymbol to get data symbols (for symbols in
* DATA memory).
*
* @param(addr) Address of symbols
*
* @a(Returns) Array of symbols at the requested address.
*/
Any lookupFuncName(Int addr);
/*!
* ======== lookupType ========
* Creates a type specification from the Dwarf data.
*
* Returns null if the type doesn't exist.
*
* @param(type) type name
*/
Any lookupType(String type);
/*!
* ======== lookupTypeByVariable ========
* Creates a type specification from the Dwarf data for a variable.
*
* Returns null if the variable cannot be found.
*
* @param(varName) variable name
*/
Any lookupTypeByVariable(String varName);
/*!
* ======== lookupSymbolValue ========
* Returns the value for the given symbol.
*
* Returns -1 if the symbol does not exist.
*
* @param(symName) Name of symbol
*
* @a(Returns) Address or value of symbol, or -1 if symbol does not exist
*/
Int lookupSymbolValue(String symName);
/*!
* ======== getSymbolValue ========
* Returns the value for the given symbol.
*
* Returns -1 if the symbol does not exist.
*
* @param(symName) Name of symbol
*
* @a(Returns) Address or value of symbol, or -1 if symbol does not exist
*/
Int getSymbolValue(String symName);
/*!
* ======== displayError ========
*
*/
Void displayError(Any view, String fieldName, String errorMsg);
/*!
* ======== ptrToHex ========
* Convert pointer representation to hex string
*
* Convenience function for converting the 'at' symbol representation
* of a pointer to the form 0x80005846.
*/
String ptrToHex(Any ptr);
/*!
* ======== getShortName ========
* Convert canonical instance names to a short name
*
* Parses the full canonical instance name for the shorter name given
* by the user. If there is no shorter name, then it returns an empty
* string "".
*
* @param(name) Full canonical instance name.
*
* @a(Returns) The short name, if the user specified one. Empty string
* otherwise.
*/
String getShortName(String name);
/*!
* ======== debugPrint ========
* Conditional print API
*
* Output message if only debug printing is enabled. Output is sent to
* stdout as well as an ROV view.
*
* To enable output, either set the environment variable `XDC_ROV_TRACE`
* or the Java property `xdc.rov.traceEnable` to `"true"`.
*/
Void debugPrint(String msg);
/*!
* ======== print ========
* Unconditional print API
*
* Output is sent to stdout as well as an ROV view.
*/
Void print(String msg);
/*!
* ======== timestamp ========
* API for printing timestamp messages for performance analysis.
*/
Void timestamp(String msg);
/*!
* ======== setTimestampFunc ========
* Sets API to be used for printing timestamp.
*/
Void setTimestampFunc(Any func);
/*!
* ======== newViewStruct ========
* Creates a new instance of the view structure for the specified view.
*
* This API is called for views where the view structure is not already
* passed in as an argument to the view init function.
*
* It is necessary to instantiate a view structure in this way so that ROV
* is given an opportunity to initialize the status-reporting mechanisms
* of the view structure (to support, e.g., Program.displayError).
*/
Any newViewStruct(String modName, String tabName);
/*!
* ======== StatusEntry ========
* Single entry in the ROV status table.
*
* ROV maintains a table of all errors, warnings, etc. encountered while
* processing views. This table is cleared on each call to clear cache
* (e.g., at each breakpoint).
*/
metaonly struct StatusEntry {
String mod;
String tab;
String inst;
String field;
String message;
}
/*!
* ======== getStatusTable ========
* Returns the current table of all encountered status messages.
*
* This table is reset with every call to 'resetMods'. (e.g., at every
* breakpoint).
*/
Any getStatusTable();
/* -------- Used By ROV -------- */
/*!
* @_nodoc
* ======== moduleNames ========
* Array of all the module names in the application.
*/
readonly config String moduleNames[length];
/*!
* @_nodoc
* ======== getModuleDesc ========
* Used to retrieve the module descriptor object for the requested module.
*/
ROVModuleDesc *getModuleDesc(String modName);
/*!
* @_nodoc
* ======== getViewType ========
* This is a helper method which returns whether a given tabName is a
* module-level view, instance-level view, or raw view.
*/
String getViewType(String modName, String tabName);
/*!
* @_nodoc
* ======== Tab ========
* The type is an enum, but we can't use an enum from another module,
* so just use the String value of the type.
*/
metaonly struct Tab {
String name;
String type;
}
/*!
* @_nodoc
* ======== Tabs ========
*/
typedef Tab Tabs[];
/*!
* @_nodoc
* ======== getSupportedTabs ========
* Returns a string array of the tab names supported by the module.
*/
Tabs getSupportedTabs(String modName);
/*!
* @_nodoc
* ======== addCMod ========
*/
Void addCMod(Any mod);
/*!
* @_nodoc
* ======== getAbortFlag ========
* In CCS, indicates whether the abort flag has been set.
*/
Bool getAbortFlag();
/*!
* @_nodoc
* ======== resetMods ========
* Used to clear the cache of all scanned data and views. Should be called
* whenever the target data has changed.
*/
Void resetMods();
/*!
* @_nodoc
* ======== setThrowViewErrors ========
* Used to enable/disable exceptions when views detect errors
*/
Void setThrowViewErrors(Bool flag);
/*!
* @_nodoc
* ======== moduleIdToName ========
* Used by xdc.runtime.Log.decode
*/
String moduleIdToName(Int mid);
/*!
* ======== exToString ========
* Helper function for formatting exceptions into strings with filename
* and line number.
*/
String exToString(Any e);
/*!
* @_nodoc
* ========= ROVModuleDesc ========
* Structure containing all ROV-related data about an individual module.
*
* An instance of this structure is created for each module in the system.
* As various Program.scan APIs are called, this structure is gradually
* filled in with data.
*
* The structure's fields:
* name The module's name
* addr Address of the state object. Redundant with state.$addr,
* but available so that address is present even if fetch
* of state fails.
* loadFailed Indicates that the 'useModule' call on this module threw
* an exception.
* loadFailedMsg The exception message from the 'useModule' call
* cfg Object containing all of the mod's configuration values
* state Raw module state object
* instances Array of ROVInstanceDesc objects representing the mod's
* instances.
* objects Array of ROVInstanceDesc objects representing instances
* of the module which are embedded in other objects.
* viewMap Contains the module-level views. The key to the map is
* the string tab name for the view, and the value is the
* an instance of Module_View.
* errorMap For each view, contains any error that was encountered
* in processing the view outside of what was reported by
* the module. For example, an unhandled exception from the
* view code would be stored here.
*/
metaonly struct ROVModuleDesc {
String name;
Any addr;
Bool loadFailed;
String loadFailedMsg;
Any cfg;
Any useMod;
Any viewInfo;
Any state;
Any staticInstAddrs[];
Any dynInstAddrs[];
Bool readAllAddrs;
ROVInstanceDesc *instances[];
Any viewMap[string];
String errorMap[string];
String error; // Deprecated, replaced by errorMap
Any instMap;
Any userPrivate;
};
/*!
* @_nodoc
* ========= ROVInstanceDesc ========
* Structure containing all ROV-related data about an individual instance.
*
* The ROVInstanceDesc objects are stored in the 'instances' array of the
* respective module's ROVModuleDesc structure.
*
* The structure's fields:
* state Raw instance state object
* addr Address of the state object. Redundant with state.$addr,
* but available so that address is present even if fetch of
* statefails.
* viewMap Contains the instance-level views. The key to the map is
* the string tab name for the view, and the value is the
* an instance of Instance_View.
* errorMap For each view, contains any error that was encountered
* in processing the view outside of what was reported by
* the module. For example, an unhandled exception from the
* view code would be stored here.
*/
metaonly struct ROVInstanceDesc {
Any state;
Any addr;
Any viewMap[string];
String errorMap[string];
String error; // Deprecated, replaced by errorMap
};
}