| 1 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 2 | // File     : utils.h | 
|---|
| 3 | // Date     : 18/10/2013 | 
|---|
| 4 | // Author   : alain greiner | 
|---|
| 5 | // Copyright (c) UPMC-LIP6 | 
|---|
| 6 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 7 | // The utils.c and utils.h files are part of the GIET-VM nano-kernel. | 
|---|
| 8 | // They define more or less the GIET-VM Hardware Abstraction Layer, | 
|---|
| 9 | // and contains various utility functions, that can be used by both the  | 
|---|
| 10 | // boot code and the kernel code (but not by the user applications). | 
|---|
| 11 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 12 |  | 
|---|
| 13 | #ifndef GIET_UTILS_H | 
|---|
| 14 | #define GIET_UTILS_H | 
|---|
| 15 |  | 
|---|
| 16 | #include <mapping_info.h> | 
|---|
| 17 |  | 
|---|
| 18 | ////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 19 | // NULL pointer definition | 
|---|
| 20 | ////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 21 |  | 
|---|
| 22 | #define NULL (void *)0 | 
|---|
| 23 |  | 
|---|
| 24 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 25 | // This structure is used to have one single lock in a cache line | 
|---|
| 26 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 27 |  | 
|---|
| 28 | typedef struct giet_lock_s { unsigned int value; | 
|---|
| 29 |                              unsigned int padding[15]; } giet_lock_t; | 
|---|
| 30 |  | 
|---|
| 31 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 32 | // To access the virtual addresses defined in the giet_vsegs.ld file. | 
|---|
| 33 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 34 |  | 
|---|
| 35 | typedef struct _ld_symbol_s _ld_symbol_t; | 
|---|
| 36 |  | 
|---|
| 37 | extern _ld_symbol_t boot_code_vbase; | 
|---|
| 38 | extern _ld_symbol_t boot_data_vbase; | 
|---|
| 39 |  | 
|---|
| 40 | extern _ld_symbol_t kernel_code_vbase; | 
|---|
| 41 | extern _ld_symbol_t kernel_data_vbase; | 
|---|
| 42 | extern _ld_symbol_t kernel_uncdata_vbase; | 
|---|
| 43 | extern _ld_symbol_t kernel_init_vbase; | 
|---|
| 44 |  | 
|---|
| 45 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 46 | //     CP0 registers access functions | 
|---|
| 47 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 48 |  | 
|---|
| 49 | extern unsigned int _get_sched(void); | 
|---|
| 50 |  | 
|---|
| 51 | extern unsigned int _get_epc(void); | 
|---|
| 52 |  | 
|---|
| 53 | extern unsigned int _get_bvar(void); | 
|---|
| 54 |  | 
|---|
| 55 | extern unsigned int _get_cr(void); | 
|---|
| 56 |  | 
|---|
| 57 | extern unsigned int _get_sr(void); | 
|---|
| 58 |  | 
|---|
| 59 | extern unsigned int _get_procid(void); | 
|---|
| 60 |  | 
|---|
| 61 | extern unsigned int _get_proctime(void); | 
|---|
| 62 |  | 
|---|
| 63 | extern void         _it_disable( unsigned int* save_sr_ptr ); | 
|---|
| 64 |  | 
|---|
| 65 | extern void         _it_restore( unsigned int* save_sr_ptr ); | 
|---|
| 66 |  | 
|---|
| 67 | extern void         _set_sched(unsigned int value); | 
|---|
| 68 |  | 
|---|
| 69 | extern void         _set_sr(unsigned int value); | 
|---|
| 70 |  | 
|---|
| 71 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 72 | //     CP2 registers access functions | 
|---|
| 73 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 74 |  | 
|---|
| 75 | extern unsigned int _get_mmu_ptpr(void); | 
|---|
| 76 |  | 
|---|
| 77 | extern unsigned int _get_mmu_mode(void); | 
|---|
| 78 |  | 
|---|
| 79 | extern void         _set_mmu_ptpr(unsigned int value); | 
|---|
| 80 |  | 
|---|
| 81 | extern void         _set_mmu_mode(unsigned int value); | 
|---|
| 82 |  | 
|---|
| 83 | extern void         _set_mmu_dcache_inval(unsigned int value); | 
|---|
| 84 |  | 
|---|
| 85 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 86 | //     Physical addressing functions | 
|---|
| 87 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 88 |  | 
|---|
| 89 | extern unsigned int _physical_read(  unsigned long long paddr ); | 
|---|
| 90 |  | 
|---|
| 91 | extern void         _physical_write( unsigned long long paddr, | 
|---|
| 92 |                                      unsigned int       value ); | 
|---|
| 93 |  | 
|---|
| 94 | extern unsigned long long _physical_read_ull(  unsigned long long paddr ); | 
|---|
| 95 |  | 
|---|
| 96 | extern void               _physical_write_ull( unsigned long long paddr, | 
|---|
| 97 |                                                unsigned long long value ); | 
|---|
| 98 |  | 
|---|
| 99 | extern void         _physical_memcpy( unsigned long long dst_paddr, | 
|---|
| 100 |                                       unsigned long long src_paddr, | 
|---|
| 101 |                                       unsigned int       size ); | 
|---|
| 102 |  | 
|---|
| 103 | extern void         _physical_memset( unsigned long long buf_paddr,  | 
|---|
| 104 |                                       unsigned int       size,  | 
|---|
| 105 |                                       unsigned int       data ); | 
|---|
| 106 |  | 
|---|
| 107 | extern unsigned int _io_extended_read(  unsigned int* vaddr ); | 
|---|
| 108 |  | 
|---|
| 109 | extern void         _io_extended_write( unsigned int* vaddr, | 
|---|
| 110 |                                         unsigned int  value ); | 
|---|
| 111 |  | 
|---|
| 112 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 113 | //      Locks access functions | 
|---|
| 114 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 115 |  | 
|---|
| 116 | extern void         _get_lock(giet_lock_t* lock); | 
|---|
| 117 |  | 
|---|
| 118 | extern void         _release_lock(giet_lock_t* lock); | 
|---|
| 119 |  | 
|---|
| 120 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 121 | //       Access functions to kernel terminal TTY0 | 
|---|
| 122 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 123 |  | 
|---|
| 124 | extern void         _puts( char*  string ); | 
|---|
| 125 |  | 
|---|
| 126 | extern void         _putx( unsigned int val ); | 
|---|
| 127 |  | 
|---|
| 128 | extern void         _putl( unsigned long long val ); | 
|---|
| 129 |  | 
|---|
| 130 | extern void         _putd( unsigned int val );  | 
|---|
| 131 |  | 
|---|
| 132 | extern void         _getc( char* byte );        | 
|---|
| 133 |  | 
|---|
| 134 |  | 
|---|
| 135 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 136 | //       Scheduler and task context access functions | 
|---|
| 137 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 138 |  | 
|---|
| 139 | extern unsigned int _get_current_task_id(void); | 
|---|
| 140 |  | 
|---|
| 141 | extern unsigned int _get_task_slot( unsigned int x, | 
|---|
| 142 |                                     unsigned int y, | 
|---|
| 143 |                                     unsigned int p, | 
|---|
| 144 |                                     unsigned int ltid, | 
|---|
| 145 |                                     unsigned int slot ); | 
|---|
| 146 |  | 
|---|
| 147 | extern void         _set_task_slot( unsigned int x, | 
|---|
| 148 |                                     unsigned int y, | 
|---|
| 149 |                                     unsigned int p, | 
|---|
| 150 |                                     unsigned int ltid, | 
|---|
| 151 |                                     unsigned int slot, | 
|---|
| 152 |                                     unsigned int value ); | 
|---|
| 153 |  | 
|---|
| 154 | extern unsigned int _get_context_slot( unsigned int slot ); | 
|---|
| 155 |  | 
|---|
| 156 | extern void         _set_context_slot( unsigned int slot, | 
|---|
| 157 |                                        unsigned int value ); | 
|---|
| 158 |  | 
|---|
| 159 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 160 | //     Mapping access functions | 
|---|
| 161 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 162 |  | 
|---|
| 163 | extern mapping_cluster_t *  _get_cluster_base(mapping_header_t* header); | 
|---|
| 164 | extern mapping_pseg_t *     _get_pseg_base(mapping_header_t* header); | 
|---|
| 165 | extern mapping_vspace_t *   _get_vspace_base(mapping_header_t* header); | 
|---|
| 166 | extern mapping_vseg_t *     _get_vseg_base(mapping_header_t* header); | 
|---|
| 167 | extern mapping_vobj_t *     _get_vobj_base(mapping_header_t* header); | 
|---|
| 168 | extern mapping_task_t *     _get_task_base(mapping_header_t* header); | 
|---|
| 169 | extern mapping_proc_t *     _get_proc_base(mapping_header_t* header); | 
|---|
| 170 | extern mapping_irq_t *      _get_irq_base(mapping_header_t* header); | 
|---|
| 171 | extern mapping_coproc_t *   _get_coproc_base(mapping_header_t* header); | 
|---|
| 172 | extern mapping_cp_port_t *  _get_cp_port_base(mapping_header_t* header); | 
|---|
| 173 | extern mapping_periph_t *   _get_periph_base(mapping_header_t* header); | 
|---|
| 174 |  | 
|---|
| 175 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 176 | //     Miscelaneous functions | 
|---|
| 177 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 178 |  | 
|---|
| 179 | extern void         _exit(void); | 
|---|
| 180 |  | 
|---|
| 181 | extern void         _random_wait( unsigned int value ); | 
|---|
| 182 |  | 
|---|
| 183 | extern void         _break( char* str); | 
|---|
| 184 |  | 
|---|
| 185 | extern unsigned int _strncmp(const char*  s1,  | 
|---|
| 186 |                              const char*  s2,  | 
|---|
| 187 |                              unsigned int n); | 
|---|
| 188 |  | 
|---|
| 189 | extern char*        _strcpy( char*        dest, | 
|---|
| 190 |                              char*        source ); | 
|---|
| 191 |  | 
|---|
| 192 | extern void         _dcache_buf_invalidate( unsigned int buf_vbase,  | 
|---|
| 193 |                                             unsigned int buf_size ); | 
|---|
| 194 |  | 
|---|
| 195 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 196 | //     Required by GCC | 
|---|
| 197 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 198 |  | 
|---|
| 199 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 200 | extern void* memcpy( void*        dst,  | 
|---|
| 201 |                      const void*  src,  | 
|---|
| 202 |                      unsigned int size ); | 
|---|
| 203 |  | 
|---|
| 204 | extern void* memset( void*        dst,  | 
|---|
| 205 |                      int          value,  | 
|---|
| 206 |                      unsigned int count ); | 
|---|
| 207 |  | 
|---|
| 208 |  | 
|---|
| 209 | #endif | 
|---|
| 210 |  | 
|---|
| 211 | // Local Variables: | 
|---|
| 212 | // tab-width: 4 | 
|---|
| 213 | // c-basic-offset: 4 | 
|---|
| 214 | // c-file-offsets:((innamespace . 0)(inline-open . 0)) | 
|---|
| 215 | // indent-tabs-mode: nil | 
|---|
| 216 | // End: | 
|---|
| 217 | // vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4 | 
|---|
| 218 |  | 
|---|