| /* |
| * dspbridge/mpu_driver/src/dynload/module_list.h |
| * |
| * DSP-BIOS Bridge driver support functions for TI OMAP processors. |
| * |
| * Copyright (C) 2008 Texas Instruments, Inc. |
| * |
| * This package is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR |
| * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED |
| * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
| */ |
| |
| /* |
| * This C header file gives the layout of the data structure created by the |
| * dynamic loader to describe the set of modules loaded into the DSP. |
| * |
| * Linked List Structure: |
| * ---------------------- |
| * The data structure defined here is a singly-linked list. The list |
| * represents the set of modules which are currently loaded in the DSP memory. |
| * The first entry in the list is a header record which contains a flag |
| * representing the state of the list. The rest of the entries in the list |
| * are module records. |
| * |
| * Global symbol _DLModules designates the first record in the list (i.e. the |
| * header record). This symbol must be defined in any program that wishes to |
| * use DLLview plug-in. |
| * |
| * String Representation: |
| * ---------------------- |
| * The string names of the module and its sections are stored in a block of |
| * memory which follows the module record itself. The strings are ordered: |
| * module name first, followed by section names in order from the first |
| * section to the last. String names are tightly packed arrays of 8-bit |
| * characters (two characters per 16-bit word on the C55x). Strings are |
| * zero-byte-terminated. |
| * |
| * Creating and updating the list: |
| * ------------------------------- |
| * Upon loading a new module into the DSP memory the dynamic loader inserts a |
| * new module record as the first module record in the list. The fields of |
| * this module record are initialized to reflect the properties of the module. |
| * The dynamic loader does NOT increment the flag/counter in the list's header |
| * record. |
| * |
| * Upon unloading a module from the DSP memory the dynamic loader removes the |
| * module's record from this list. The dynamic loader also increments the |
| * flag/counter in the list's header record to indicate that the list has been |
| * changed. |
| */ |
| |
| #ifndef _MODULE_LIST_H_ |
| #define _MODULE_LIST_H_ |
| |
| #include <linux/types.h> |
| |
| /* Global pointer to the modules_header structure */ |
| #define MODULES_HEADER "_DLModules" |
| #define MODULES_HEADER_NO_UNDERSCORE "DLModules" |
| |
| /* Initial version number */ |
| #define INIT_VERSION 1 |
| |
| /* Verification number -- to be recorded in each module record */ |
| #define VERIFICATION 0x79 |
| |
| /* forward declarations */ |
| struct dll_module; |
| struct dll_sect; |
| |
| /* the first entry in the list is the modules_header record; |
| * its address is contained in the global _DLModules pointer */ |
| struct modules_header { |
| |
| /* |
| * Address of the first dll_module record in the list or NULL. |
| * Note: for C55x this is a word address (C55x data is |
| * word-addressable) |
| */ |
| u32 first_module; |
| |
| /* Combined storage size (in target addressable units) of the |
| * dll_module record which follows this header record, or zero |
| * if the list is empty. This size includes the module's string table. |
| * Note: for C55x the unit is a 16-bit word */ |
| u16 first_module_size; |
| |
| /* Counter is incremented whenever a module record is removed from |
| * the list */ |
| u16 update_flag; |
| |
| }; |
| |
| /* for each 32-bits in above structure, a bitmap, LSB first, whose bits are: |
| * 0 => a 32-bit value, 1 => 2 16-bit values */ |
| /* swapping bitmap for type modules_header */ |
| #define MODULES_HEADER_BITMAP 0x2 |
| |
| /* information recorded about each section in a module */ |
| struct dll_sect { |
| |
| /* Load-time address of the section. |
| * Note: for C55x this is a byte address for program sections, and |
| * a word address for data sections. C55x program memory is |
| * byte-addressable, while data memory is word-addressable. */ |
| u32 sect_load_adr; |
| |
| /* Run-time address of the section. |
| * Note 1: for C55x this is a byte address for program sections, and |
| * a word address for data sections. |
| * Note 2: for C55x two most significant bits of this field indicate |
| * the section type: '00' for a code section, '11' for a data section |
| * (C55 addresses are really only 24-bits wide). */ |
| u32 sect_run_adr; |
| |
| }; |
| |
| /* the rest of the entries in the list are module records */ |
| struct dll_module { |
| |
| /* Address of the next dll_module record in the list, or 0 if this is |
| * the last record in the list. |
| * Note: for C55x this is a word address (C55x data is |
| * word-addressable) */ |
| u32 next_module; |
| |
| /* Combined storage size (in target addressable units) of the |
| * dll_module record which follows this one, or zero if this is the |
| * last record in the list. This size includes the module's string |
| * table. |
| * Note: for C55x the unit is a 16-bit word. */ |
| u16 next_module_size; |
| |
| /* version number of the tooling; set to INIT_VERSION for Phase 1 */ |
| u16 version; |
| |
| /* the verification word; set to VERIFICATION */ |
| u16 verification; |
| |
| /* Number of sections in the sects array */ |
| u16 num_sects; |
| |
| /* Module's "unique" id; copy of the timestamp from the host |
| * COFF file */ |
| u32 timestamp; |
| |
| /* Array of num_sects elements of the module's section records */ |
| struct dll_sect sects[1]; |
| }; |
| |
| /* for each 32 bits in above structure, a bitmap, LSB first, whose bits are: |
| * 0 => a 32-bit value, 1 => 2 16-bit values */ |
| #define DLL_MODULE_BITMAP 0x6 /* swapping bitmap for type dll_module */ |
| |
| #endif /* _MODULE_LIST_H_ */ |