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