Utils: Update the firmware to carry section physical addresses
[gstreamer-omap:sysbios-rpmsg.git] / src / utils / elfload / include / dlw_debug.h
1 /*
2  *  Syslink-IPC for TI OMAP Processors
3  *
4  *  Copyright (c) 2008-2010, Texas Instruments Incorporated
5  *  All rights reserved.
6  *
7  *  Redistribution and use in source and binary forms, with or without
8  *  modification, are permitted provided that the following conditions
9  *  are met:
10  *
11  *  *  Redistributions of source code must retain the above copyright
12  *     notice, this list of conditions and the following disclaimer.
13  *
14  *  *  Redistributions in binary form must reproduce the above copyright
15  *     notice, this list of conditions and the following disclaimer in the
16  *     documentation and/or other materials provided with the distribution.
17  *
18  *  *  Neither the name of Texas Instruments Incorporated nor the names of
19  *     its contributors may be used to endorse or promote products derived
20  *     from this software without specific prior written permission.
21  *
22  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
24  *  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25  *  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
26  *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
29  *  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30  *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
31  *  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
32  *  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34 /*****************************************************************************/
35 /* dlw_debug.h                                                               */
36 /*                                                                           */
37 /* Define internal data structures used by DLW client side for DLL debug.    */
38 /*****************************************************************************/
39 #ifndef DLW_DEBUG_H
40 #define DLW_DEBUG_H
41
42 #include "dload_api.h"
43 #include "Queue.h"
44 #include "Stack.h"
45
46 /*---------------------------------------------------------------------------*/
47 /* DLL Debug Support                                                         */
48 /*                                                                           */
49 /* A host copy of the DLL View debug support data structure that will be     */
50 /* written into target memory to assist the debugger with mapping symbol     */
51 /* definitions to their dynamically loaded location in target memory.        */
52 /*---------------------------------------------------------------------------*/
53 #define INIT_VERSION    2
54 #define VERIFICATION    0x79
55
56 /*---------------------------------------------------------------------------*/
57 /* DL_Debug_List_Header - Address of this structure in target memory is      */
58 /*      recorded in DLModules symbol.  Provides directions to first          */
59 /*      DL_Module_Record in the list.                                        */
60 /*---------------------------------------------------------------------------*/
61 typedef struct {
62    uint32_t     first_module_ptr;
63    uint16_t     first_module_size;
64    uint16_t     update_flag;
65 } DL_Debug_List_Header;
66
67 /*---------------------------------------------------------------------------*/
68 /* DL_Segment - Debug information recorded about each segment in a module.   */
69 /*---------------------------------------------------------------------------*/
70 typedef struct {
71    uint32_t     load_address;
72    uint32_t     run_address;
73 } DL_Target_Segment;
74
75 typedef struct _DL_Host_Segment {
76    uint32_t                      load_address;
77    uint32_t                      run_address;
78    struct _DL_Host_Segment      *next_segment;
79 } DL_Host_Segment;
80
81 /*---------------------------------------------------------------------------*/
82 /* DL_Module_Debug_Record - Debug information about each module that has     */
83 /*      been loaded.                                                         */
84 /*---------------------------------------------------------------------------*/
85 /* We have a host version of the debug record which is built up while the    */
86 /* module is being loaded, and a target version of the debug record which    */
87 /* is built after the load has completed and we know all of the information  */
88 /* that needs to be written to target memory for this module.                */
89 /*---------------------------------------------------------------------------*/
90 typedef struct {
91    int                   handle;
92    char                 *module_name;
93    TARGET_ADDRESS        target_address;
94    uint32_t              next_module_ptr;
95    uint16_t              next_module_size;
96    int                   num_segments;
97    DL_Host_Segment      *segment_list_head;
98    DL_Host_Segment      *segment_list_tail;
99 } DL_Host_Module_Debug;
100
101 typedef struct {
102    uint32_t             next_module_ptr;
103    uint16_t             next_module_size;
104    uint16_t             tool_version;
105    uint16_t             verification_word;
106    uint16_t             num_segments;
107    uint32_t             timestamp;
108    DL_Target_Segment    segments[1];
109 } DL_Target_Module_Debug;
110
111 /*---------------------------------------------------------------------------*/
112 /* DLL Debug Support - context stack of module records.  We need to maintain */
113 /*      a stack of modules while creating the DLL module record list for     */
114 /*      debug support.  While we are building up a module record for one     */
115 /*      module, the loader may be asked to load dependent modules.  Note     */
116 /*      that we cannot emit a module record to target memory until loading   */
117 /*      of the module has been completed (need to know how many segments     */
118 /*      are in the module before we can allocate target memory for the       */
119 /*      module record).                                                      */
120 /*---------------------------------------------------------------------------*/
121
122 /*---------------------------------------------------------------------------*/
123 /* dl_debug                                                                  */
124 /*                                                                           */
125 /* Define a LIFO linked list "class" of DL_Module_Debug_Record pointers.     */
126 /*---------------------------------------------------------------------------*/
127 TYPE_STACK_DEFINITION(DL_Host_Module_Debug*, dl_debug)
128
129 /*---------------------------------------------------------------------------*/
130 /* mirror_debug_ptr                                                          */
131 /*                                                                           */
132 /* Define a linked list "class" of DL_Host_Module_Debug pointers.            */
133 /*---------------------------------------------------------------------------*/
134 TYPE_QUEUE_DEFINITION(DL_Host_Module_Debug*, mirror_debug_ptr)
135
136 /*---------------------------------------------------------------------------*/
137 /* Management functions for DLL debug support data structures.               */
138 /*---------------------------------------------------------------------------*/
139 extern void     DLDBG_add_host_record(void* client_handle,
140                                       const char *module_name);
141 extern void     DLDBG_add_target_record(void* client_handle,
142                                         int handle);
143 extern void     DLDBG_rm_target_record(void* client_handle,
144                                        int handle);
145 extern void     DLDBG_add_segment_record(void* client_handle,
146                                          struct DLOAD_MEMORY_SEGMENT *obj_desc);
147 extern void     DLDBG_dump_mirror_debug_list(void* client_handle);
148 #endif