| 1 | //////////////////////////////////////////////////////////////////////////// | 
|---|
| 2 | // File     : mapping_info.h | 
|---|
| 3 | // Date     : 01/04/2012 | 
|---|
| 4 | // Author   : alain greiner | 
|---|
| 5 | // Copyright (c) UPMC-LIP6 | 
|---|
| 6 | //////////////////////////////////////////////////////////////////////////// | 
|---|
| 7 | // The MAPPING_INFO data structure can be used with the GIET. | 
|---|
| 8 | // It contains the mapping directive for one or several virtual spaces. | 
|---|
| 9 | // Ech virtual space contains a variable number of virtual segments | 
|---|
| 10 | // and a variable number of tasks. The number of virtual space can be one. | 
|---|
| 11 | // | 
|---|
| 12 | // The mapping table data structure is organised as the concatenation of | 
|---|
| 13 | // a fixed size header, and 6 variable size arrays: | 
|---|
| 14 | // | 
|---|
| 15 | // - mapping_header_t   header              (MAPPING_HEADER_SIZE) | 
|---|
| 16 | // - mapping_cluster_t  cluster[clusters]   (MAPPING_CLUSTER_SIZE * clusters) | 
|---|
| 17 | // - mapping_pseg_t     pseg[psegs]         (MAPPING_PSEG_SIZE * psegs) | 
|---|
| 18 | // - mapping_vspace_t   vspace[vspaces]     (MAPPING_VSPACE_SIZE * vspaces) | 
|---|
| 19 | // - mapping_vseg_t     vseg[vsegs]         (MAPPING_VSEG_SIZE * vsegs) | 
|---|
| 20 | // - mapping_vseg_t     vobj[vsegs]         (MAPPING_VOBJ_SIZE * vsegs) | 
|---|
| 21 | // - mapping_task_t     task[tasks]         (MAPPING_TASK_SIZE * tasks) | 
|---|
| 22 | // | 
|---|
| 23 | // The number of clusters and the number of vspaces are defined in the header. | 
|---|
| 24 | // The number of psegs are defined in each cluster. | 
|---|
| 25 | // The number of vsegs, tasks ans mwmrs are defined in each vspace. | 
|---|
| 26 | // | 
|---|
| 27 | // It is intended to be stored in the boot ROM at address MAPPING_BOOT_BASE.  | 
|---|
| 28 | // For each cluster, the base address of the first pseg descriptor | 
|---|
| 29 | // is defined by a pseg_offset relative to MAPPING_BOOT_BASE. | 
|---|
| 30 | // For each vspace, the base address of the first vseg descriptor | 
|---|
| 31 | // is defined by a vseg_offset relative to MAPPING_BOOT_BASE. | 
|---|
| 32 | // For each vspace, the base address of the first task desciptor | 
|---|
| 33 | // is defined by a task_offset relative to MAPPING_BOOT_BASE. | 
|---|
| 34 | // For each vspace, the base address of the first mwmr desciptor | 
|---|
| 35 | // is defined by a mwmr_offset relative to MAPPING_BOOT_BASE. | 
|---|
| 36 | //////////////////////////////////////////////////////////////////////////// | 
|---|
| 37 |  | 
|---|
| 38 | #ifndef _MAPPING_INFO_H_ | 
|---|
| 39 | #define _MAPPING_INFO_H_ | 
|---|
| 40 |  | 
|---|
| 41 | #define MAPPING_HEADER_SIZE     sizeof(mapping_header_t) | 
|---|
| 42 | #define MAPPING_CLUSTER_SIZE    sizeof(mapping_cluster_t) | 
|---|
| 43 | #define MAPPING_VSPACE_SIZE     sizeof(mapping_vspace_t) | 
|---|
| 44 | #define MAPPING_VSEG_SIZE           sizeof(mapping_vseg_t) | 
|---|
| 45 | #define MAPPING_VOBJ_SIZE           sizeof(mapping_vobj_t) | 
|---|
| 46 | #define MAPPING_PSEG_SIZE           sizeof(mapping_pseg_t) | 
|---|
| 47 | #define MAPPING_TASK_SIZE           sizeof(mapping_task_t) | 
|---|
| 48 |  | 
|---|
| 49 | #define C_MODE_MASK     0b1000      // cacheable | 
|---|
| 50 | #define X_MODE_MASK     0b0100      // executable | 
|---|
| 51 | #define W_MODE_MASK     0b0010      // writable | 
|---|
| 52 | #define U_MODE_MASK     0b0001      // user access | 
|---|
| 53 |  | 
|---|
| 54 | #define IN_MAPPING_SIGNATURE    0xDEADBEEF | 
|---|
| 55 | #define OUT_MAPPING_SIGNATURE   0xBABEF00D | 
|---|
| 56 |  | 
|---|
| 57 | enum  | 
|---|
| 58 | { | 
|---|
| 59 |     VOBJ_TYPE_ELF     = 0,     // loadable code object | 
|---|
| 60 |     VOBJ_TYPE_PTAB    = 1,     // page table  | 
|---|
| 61 |     VOBJ_TYPE_PERI    = 2,     // hardware component | 
|---|
| 62 |     VOBJ_TYPE_MWMR    = 3,     // MWMR channel | 
|---|
| 63 |     VOBJ_TYPE_LOCK    = 4,     // Lock | 
|---|
| 64 |     VOBJ_TYPE_BUFFER  = 5,     // Any "no intialiasation needed" objects (stacks...) | 
|---|
| 65 |     VOBJ_TYPE_BARRIER = 6,     // Barrier | 
|---|
| 66 | }; | 
|---|
| 67 |  | 
|---|
| 68 |  | 
|---|
| 69 | /////////////////////////////// | 
|---|
| 70 | typedef struct mapping_header_s | 
|---|
| 71 | { | 
|---|
| 72 |     unsigned int    signature;      // must contain MAPPING_SIGNATURE | 
|---|
| 73 |         unsigned int    clusters;           // number of clusters | 
|---|
| 74 |         unsigned int    psegs;          // number of psegs | 
|---|
| 75 |     unsigned int    ttys;           // number of TTY terminals  | 
|---|
| 76 |     unsigned int    fbs;            // number of Frame Buffer DMA channels | 
|---|
| 77 |         unsigned int    globals;                // number of vsegs mapped in all vspaces | 
|---|
| 78 |         unsigned int    vspaces;                // number of virtual spaces | 
|---|
| 79 |         unsigned int    vsegs;                  // total number of virtual segments (for all vspaces) | 
|---|
| 80 |         unsigned int    vobjs;                  // total number of virtual objects (for all vspaces) | 
|---|
| 81 |         unsigned int    tasks;                  // total number of tasks (for all vspaces) | 
|---|
| 82 |     char            name[32];       // mapping name | 
|---|
| 83 | } mapping_header_t; | 
|---|
| 84 |  | 
|---|
| 85 | //////////////////////////////// | 
|---|
| 86 | typedef struct mapping_cluster_s | 
|---|
| 87 | { | 
|---|
| 88 |     unsigned int    procs;          // number of processors in cluster | 
|---|
| 89 | } mapping_cluster_t; | 
|---|
| 90 |  | 
|---|
| 91 | ///////////////////////////// | 
|---|
| 92 | typedef struct mapping_pseg_s  | 
|---|
| 93 | { | 
|---|
| 94 |     char            name[32];       // pseg name (unique in a cluster) | 
|---|
| 95 |         unsigned int    base;           // base address in physical space | 
|---|
| 96 |         unsigned int    length;         // size (bytes) | 
|---|
| 97 |     unsigned int    next_base;      // first free page base address | 
|---|
| 98 | } mapping_pseg_t; | 
|---|
| 99 |  | 
|---|
| 100 | /////////////////////////////// | 
|---|
| 101 | typedef struct mapping_vspace_s | 
|---|
| 102 | { | 
|---|
| 103 |     char            name[32];       // virtual space name | 
|---|
| 104 |     unsigned int    start_offset;   // offset of the vobj containing the start vector | 
|---|
| 105 |         unsigned int    vsegs;              // number of vsegs in vspace | 
|---|
| 106 |         unsigned int    vobjs;              // number of vobjs in vspace | 
|---|
| 107 |         unsigned int    tasks;              // number of tasks in vspace | 
|---|
| 108 |     unsigned int    vseg_offset;    // index of first vseg in vspace  | 
|---|
| 109 |     unsigned int    vobj_offset;    // index of first vobjs in vspace | 
|---|
| 110 |     unsigned int    task_offset;    // index of first task in vspace | 
|---|
| 111 | } mapping_vspace_t; | 
|---|
| 112 |  | 
|---|
| 113 | ///////////////////////////// | 
|---|
| 114 | typedef struct mapping_vseg_s  | 
|---|
| 115 | { | 
|---|
| 116 |         char            name[32];       // vseg name (unique in vspace) | 
|---|
| 117 |         unsigned int    vbase;          // base address in virtual space (hexa) | 
|---|
| 118 |         unsigned int    pbase;          // base address in physical space (hexa) | 
|---|
| 119 |         unsigned int    length;         // size (bytes) | 
|---|
| 120 |         unsigned int    psegid;         // physical segment index | 
|---|
| 121 |         unsigned int    mode;           // C-X-W-U flags | 
|---|
| 122 |     unsigned int    ident;          // identity mapping if non zero | 
|---|
| 123 |         unsigned int    vobjs;              // number of vobjs in vseg | 
|---|
| 124 |     unsigned int    vobj_offset;    // index of first vobjs in vseg | 
|---|
| 125 | } mapping_vseg_t; | 
|---|
| 126 |  | 
|---|
| 127 | ///////////////////////////// | 
|---|
| 128 | typedef struct mapping_task_s  | 
|---|
| 129 | { | 
|---|
| 130 |         char            name[32];       // task name (unique in vspace) | 
|---|
| 131 |         unsigned int    clusterid;          // physical cluster index | 
|---|
| 132 |         unsigned int    proclocid;      // processor local index (inside cluster) | 
|---|
| 133 |     unsigned int    vobjlocid;      // stack vobj index in vspace | 
|---|
| 134 |     unsigned int    startid;        // index in start_vector  | 
|---|
| 135 |     unsigned int    use_tty;        // TTY terminal required | 
|---|
| 136 |     unsigned int    use_fb;         // DMA channel to frame buffer required | 
|---|
| 137 | } mapping_task_t; | 
|---|
| 138 |  | 
|---|
| 139 | ///////////////////////////// | 
|---|
| 140 | typedef struct mapping_vobj_s  | 
|---|
| 141 | { | 
|---|
| 142 |     char            name[32];       // vobj name (unique in a vspace) | 
|---|
| 143 |     char            binpath[64];    // path for the binary code ("*.elf") | 
|---|
| 144 |         unsigned int    type;           // type of vobj | 
|---|
| 145 |         unsigned int    length;         // size (bytes) | 
|---|
| 146 |         unsigned int    align;          // required alignement (logarithm of 2) | 
|---|
| 147 |         unsigned int    vaddr;          // virtual base addresse of the vobj | 
|---|
| 148 |         unsigned int    paddr;          // physical base addresse of the vobj | 
|---|
| 149 |         unsigned int    init;           // init value (number of participants for a barrier) | 
|---|
| 150 | } mapping_vobj_t; | 
|---|
| 151 |  | 
|---|
| 152 | #endif | 
|---|
| 153 |  | 
|---|
| 154 | // Local Variables: | 
|---|
| 155 | // tab-width: 4 | 
|---|
| 156 | // c-basic-offset: 4 | 
|---|
| 157 | // c-file-offsets:((innamespace . 0)(inline-open . 0)) | 
|---|
| 158 | // indent-tabs-mode: nil | 
|---|
| 159 | // End: | 
|---|
| 160 |  | 
|---|
| 161 | // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4 | 
|---|
| 162 |  | 
|---|