2 * dspbridge/mpu_driver/src/dynload/module_list.h
4 * DSP-BIOS Bridge driver support functions for TI OMAP processors.
6 * Copyright (C) 2008 Texas Instruments, Inc.
8 * This package is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
12 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
13 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
14 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18 * This C header file gives the layout of the data structure created by the
19 * dynamic loader to describe the set of modules loaded into the DSP.
21 * Linked List Structure:
22 * ----------------------
23 * The data structure defined here is a singly-linked list. The list
24 * represents the set of modules which are currently loaded in the DSP memory.
25 * The first entry in the list is a header record which contains a flag
26 * representing the state of the list. The rest of the entries in the list
29 * Global symbol _DLModules designates the first record in the list (i.e. the
30 * header record). This symbol must be defined in any program that wishes to
31 * use DLLview plug-in.
33 * String Representation:
34 * ----------------------
35 * The string names of the module and its sections are stored in a block of
36 * memory which follows the module record itself. The strings are ordered:
37 * module name first, followed by section names in order from the first
38 * section to the last. String names are tightly packed arrays of 8-bit
39 * characters (two characters per 16-bit word on the C55x). Strings are
40 * zero-byte-terminated.
42 * Creating and updating the list:
43 * -------------------------------
44 * Upon loading a new module into the DSP memory the dynamic loader inserts a
45 * new module record as the first module record in the list. The fields of
46 * this module record are initialized to reflect the properties of the module.
47 * The dynamic loader does NOT increment the flag/counter in the list's header
50 * Upon unloading a module from the DSP memory the dynamic loader removes the
51 * module's record from this list. The dynamic loader also increments the
52 * flag/counter in the list's header record to indicate that the list has been
56 #ifndef _MODULE_LIST_H_
57 #define _MODULE_LIST_H_
59 #include <linux/types.h>
61 /* Global pointer to the modules_header structure */
62 #define MODULES_HEADER "_DLModules"
63 #define MODULES_HEADER_NO_UNDERSCORE "DLModules"
65 /* Initial version number */
66 #define INIT_VERSION 1
68 /* Verification number -- to be recorded in each module record */
69 #define VERIFICATION 0x79
71 /* forward declarations */
75 /* the first entry in the list is the modules_header record;
76 * its address is contained in the global _DLModules pointer */
77 struct modules_header {
80 * Address of the first dll_module record in the list or NULL.
81 * Note: for C55x this is a word address (C55x data is
86 /* Combined storage size (in target addressable units) of the
87 * dll_module record which follows this header record, or zero
88 * if the list is empty. This size includes the module's string table.
89 * Note: for C55x the unit is a 16-bit word */
90 u16 first_module_size;
92 /* Counter is incremented whenever a module record is removed from
98 /* for each 32-bits in above structure, a bitmap, LSB first, whose bits are:
99 * 0 => a 32-bit value, 1 => 2 16-bit values */
100 /* swapping bitmap for type modules_header */
101 #define MODULES_HEADER_BITMAP 0x2
103 /* information recorded about each section in a module */
106 /* Load-time address of the section.
107 * Note: for C55x this is a byte address for program sections, and
108 * a word address for data sections. C55x program memory is
109 * byte-addressable, while data memory is word-addressable. */
112 /* Run-time address of the section.
113 * Note 1: for C55x this is a byte address for program sections, and
114 * a word address for data sections.
115 * Note 2: for C55x two most significant bits of this field indicate
116 * the section type: '00' for a code section, '11' for a data section
117 * (C55 addresses are really only 24-bits wide). */
122 /* the rest of the entries in the list are module records */
125 /* Address of the next dll_module record in the list, or 0 if this is
126 * the last record in the list.
127 * Note: for C55x this is a word address (C55x data is
128 * word-addressable) */
131 /* Combined storage size (in target addressable units) of the
132 * dll_module record which follows this one, or zero if this is the
133 * last record in the list. This size includes the module's string
135 * Note: for C55x the unit is a 16-bit word. */
136 u16 next_module_size;
138 /* version number of the tooling; set to INIT_VERSION for Phase 1 */
141 /* the verification word; set to VERIFICATION */
144 /* Number of sections in the sects array */
147 /* Module's "unique" id; copy of the timestamp from the host
151 /* Array of num_sects elements of the module's section records */
152 struct dll_sect sects[1];
155 /* for each 32 bits in above structure, a bitmap, LSB first, whose bits are:
156 * 0 => a 32-bit value, 1 => 2 16-bit values */
157 #define DLL_MODULE_BITMAP 0x6 /* swapping bitmap for type dll_module */
159 #endif /* _MODULE_LIST_H_ */