Changeset 238 for soft/giet_vm/sys/common.c
- Timestamp:
- May 29, 2013, 1:24:09 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
soft/giet_vm/sys/common.c
r232 r238 20 20 /////////////////////////////////////////////////////////////////////////////////// 21 21 22 // current context cache TODO23 24 22 // SR save (used by _it_mask() / it_restore() 25 23 unsigned int _status_register_save[NB_CLUSTERS*NB_PROCS_MAX]; … … 27 25 /////////////////////////////////////////////////////////////////////////////////// 28 26 // _get_sched() 29 // Access CP0 and returns scheduler physical address. 30 /////////////////////////////////////////////////////////////////////////////////// 31 inline unsigned int _get_sched() { 32 unsigned int ret; 33 asm volatile( 34 "mfc0 %0, $22" 35 : "=r"(ret)); 36 return ret; 37 } 38 27 // Access CP0 and returns a pointer (virtual address) on the calling 28 // processor scheduler (taking into account the processor local index). 29 /////////////////////////////////////////////////////////////////////////////////// 30 static_scheduler_t* _get_sched() 31 { 32 static_scheduler_t* psched; 33 unsigned int vaddr; 34 unsigned int lpid = _procid() % NB_PROCS_MAX; 35 36 asm volatile( 37 "mfc0 %0, $22 \n" 38 : "=r"(vaddr) ); 39 40 psched = (static_scheduler_t*)vaddr; 41 return (psched + lpid); 42 } 39 43 40 44 /////////////////////////////////////////////////////////////////////////////////// … … 42 46 // Access CP2 and returns PTPR register. 43 47 /////////////////////////////////////////////////////////////////////////////////// 44 inline unsigned int _get_ptpr() { 48 inline unsigned int _get_ptpr() 49 { 45 50 unsigned int ret; 46 51 asm volatile( … … 50 55 } 51 56 52 53 57 /////////////////////////////////////////////////////////////////////////////////// 54 58 // _get_epc() 55 59 // Access CP0 and returns EPC register. 56 60 /////////////////////////////////////////////////////////////////////////////////// 57 inline unsigned int _get_epc() { 61 inline unsigned int _get_epc() 62 { 58 63 unsigned int ret; 59 64 asm volatile("mfc0 %0, $14" … … 62 67 } 63 68 64 65 69 /////////////////////////////////////////////////////////////////////////////////// 66 70 // _get_bar() 67 71 // Access CP0 and returns BAR register. 68 72 /////////////////////////////////////////////////////////////////////////////////// 69 inline unsigned int _get_bvar() { 73 inline unsigned int _get_bvar() 74 { 70 75 unsigned int ret; 71 76 asm volatile( … … 75 80 } 76 81 77 78 82 /////////////////////////////////////////////////////////////////////////////////// 79 83 // _get_cr() 80 84 // Access CP0 and returns CR register. 81 85 /////////////////////////////////////////////////////////////////////////////////// 82 inline unsigned int _get_cause() { 86 inline unsigned int _get_cause() 87 { 83 88 unsigned int ret; 84 89 asm volatile("mfc0 %0, $13" … … 87 92 } 88 93 89 90 94 /////////////////////////////////////////////////////////////////////////////////// 91 95 // _get_sr() 92 96 // Access CP0 and returns SR register. 93 97 /////////////////////////////////////////////////////////////////////////////////// 94 inline unsigned int _get_sr() { 98 inline unsigned int _get_sr() 99 { 95 100 unsigned int ret; 96 101 asm volatile( … … 106 111 // This function is NOT USED and NOT TESTED 107 112 /////////////////////////////////////////////////////////////////////////////////// 108 inline void _it_mask() { 113 inline void _it_mask() 114 { 109 115 unsigned int sr_value; 110 116 unsigned int proc_id; … … 121 127 } 122 128 123 124 129 /////////////////////////////////////////////////////////////////////////////////// 125 130 // _it_restore() … … 128 133 // This function is NOT USED and NOT TESTED 129 134 /////////////////////////////////////////////////////////////////////////////////// 130 inline void _it_restore() { 135 inline void _it_restore() 136 { 131 137 unsigned int proc_id; 132 138 // get the processor id to index the _status_register_save table … … 140 146 // Access CP0 and disables IRQs 141 147 /////////////////////////////////////////////////////////////////////////////////// 142 inline void _it_disable() { 148 inline void _it_disable() 149 { 143 150 asm volatile( 144 151 "li $3, 0xFFFFFFFE \n" … … 153 160 // Access CP0 and enables IRQs 154 161 /////////////////////////////////////////////////////////////////////////////////// 155 inline void _it_enable() { 162 inline void _it_enable() 163 { 156 164 asm volatile( 157 165 "li $3, 0x00000001 \n" … … 162 170 } 163 171 164 165 172 //////////////////////////////////////////////////////////////////////////// 166 173 // _get_lock() … … 169 176 // (delay average value = 100 cycles) 170 177 //////////////////////////////////////////////////////////////////////////// 171 inline void _get_lock(unsigned int * plock) { 178 inline void _get_lock(unsigned int * plock) 179 { 172 180 register unsigned int delay = ( _proctime() ^ _procid() << 4) & 0xFF; 173 181 … … 191 199 } 192 200 193 194 201 //////////////////////////////////////////////////////////////////////////// 195 202 // _release_lock() 196 203 //////////////////////////////////////////////////////////////////////////// 197 inline void _release_lock(unsigned int * plock) { 204 inline void _release_lock(unsigned int * plock) 205 { 198 206 asm volatile ( 199 207 "sync\n" /* necessary because of the consistency model in tsar */ … … 202 210 } 203 211 204 205 212 //////////////////////////////////////////////////////////////////////////// 206 213 // _puts() 207 214 // display a string on TTY0 / used for system code debug and log 208 215 //////////////////////////////////////////////////////////////////////////// 209 void _puts(char * buffer) { 216 void _puts(char * buffer) 217 { 210 218 unsigned int * tty_address = (unsigned int *) &seg_tty_base; 211 219 unsigned int n; 212 220 213 for (n = 0; n < 100; n++) { 214 if (buffer[n] == 0) { 215 break; 216 } 221 for (n = 0; n < 100; n++) 222 { 223 if (buffer[n] == 0) break; 217 224 tty_address[TTY_WRITE] = (unsigned int) buffer[n]; 218 225 } 219 226 } 220 227 221 222 228 //////////////////////////////////////////////////////////////////////////// 223 229 // _putx() 224 // display an int (hexa) on TTY0 / used for system code debug and log 225 //////////////////////////////////////////////////////////////////////////// 226 void _putx(unsigned int val) { 230 // display a 32 bits unsigned int as an hexadecimal string on TTY0 231 //////////////////////////////////////////////////////////////////////////// 232 void _putx(unsigned int val) 233 { 227 234 static const char HexaTab[] = "0123456789ABCDEF"; 228 235 char buf[11]; … … 233 240 buf[10] = 0; 234 241 235 for (c = 0; c < 8; c++) { 242 for (c = 0; c < 8; c++) 243 { 236 244 buf[9 - c] = HexaTab[val & 0xF]; 237 245 val = val >> 4; … … 240 248 } 241 249 250 //////////////////////////////////////////////////////////////////////////// 251 // _putl() 252 // display a 64 bits unsigned long as an hexadecimal string on TTY0 253 //////////////////////////////////////////////////////////////////////////// 254 void _putl(paddr_t val) 255 { 256 static const char HexaTab[] = "0123456789ABCDEF"; 257 char buf[19]; 258 unsigned int c; 259 260 buf[0] = '0'; 261 buf[1] = 'x'; 262 buf[18] = 0; 263 264 for (c = 0; c < 16; c++) 265 { 266 buf[17 - c] = HexaTab[(unsigned int)val & 0xF]; 267 val = val >> 4; 268 } 269 _puts(buf); 270 } 242 271 243 272 //////////////////////////////////////////////////////////////////////////// … … 266 295 } 267 296 268 269 297 //////////////////////////////////////////////////////////////////////////// 270 298 // _strncmp() … … 284 312 } 285 313 286 287 314 //////////////////////////////////////////////////////////////////////////// 288 315 // _dcache_buf_invalidate() … … 310 337 } 311 338 312 313 //////////////////////////////////////////////////////////////////////////// 314 // _physical_read_access() 315 // This function makes a physical read access to a 32 bits word in memory, 316 // after a temporary DTLB desactivation. 317 //////////////////////////////////////////////////////////////////////////// 318 unsigned int _physical_read_access(unsigned int * paddr) { 319 unsigned int value; 320 321 asm volatile( 322 "li $3, 0xFFFFFFFE \n" 323 "mfc0 $2, $12 \n" /* $2 <= SR */ 324 "and $3, $3, $2 \n" 325 "mtc0 $3, $12 \n" /* interrupt masked */ 326 "li $3, 0xB \n" 327 "mtc2 $3, $1 \n" /* DTLB off */ 328 329 "lw %0, 0(%1) \n" /* entry <= *pslot */ 330 331 "li $3, 0xF \n" 332 "mtc2 $3, $1 \n" /* DTLB on */ 333 "mtc0 $2, $12 \n" /* restore SR */ 334 : "=r" (value) 335 : "r" (paddr) 336 : "$2", "$3"); 337 return value; 338 } 339 340 341 //////////////////////////////////////////////////////////////////////////// 342 // _physical_write_access() 343 // This function makes a physical write access to a 32 bits word in memory, 344 // after a temporary DTLB desactivation. 345 //////////////////////////////////////////////////////////////////////////// 346 void _physical_write_access(unsigned int * paddr, unsigned int value) { 347 asm volatile( 348 "li $3, 0xFFFFFFFE \n" 349 "mfc0 $2, $12 \n" /* $26 <= SR */ 350 "and $3, $3, $2 \n" 351 "mtc0 $3, $12 \n" /* interrupt masked */ 352 "li $3, 0xB \n" 353 "mtc2 $3, $1 \n" /* DTLB off */ 354 355 "sw %0, 0(%1) \n" /* entry <= *pslot */ 356 357 "li $3, 0xF \n" 358 "mtc2 $3, $1 \n" /* DTLB on */ 359 "mtc0 $2, $12 \n" /* restore SR */ 360 : 361 : "r" (value), "r" (paddr) 362 : "$2", "$3"); 363 } 364 365 366 //////////////////////////////////////////////////////////////////////////// 367 // _get_tasks_number() 368 // This function returns the number of tasks allocated to processor. 369 //////////////////////////////////////////////////////////////////////////// 370 unsigned int _get_tasks_number() { 371 static_scheduler_t * psched = (static_scheduler_t *) _get_sched(); 372 return _physical_read_access(&(psched->tasks)); 373 } 374 375 376 //////////////////////////////////////////////////////////////////////////// 377 // _get_proc_task_id() 378 // This function returns the index of the currently running task. 379 //////////////////////////////////////////////////////////////////////////// 380 unsigned int _get_proc_task_id() { 381 static_scheduler_t * psched = (static_scheduler_t *) _get_sched(); 382 return _physical_read_access(&(psched->current)); 383 } 384 385 386 //////////////////////////////////////////////////////////////////////////// 387 // _set_proc_task_id() 388 // This function returns the index of the currently running task. 389 //////////////////////////////////////////////////////////////////////////// 390 void _set_proc_task_id(unsigned int value) { 391 static_scheduler_t * psched = (static_scheduler_t *) _get_sched(); 392 _physical_write_access(&(psched->current), value); 393 } 394 395 396 //////////////////////////////////////////////////////////////////////////// 397 // _get_global_task_id() 398 // This function returns the global index of the running task. 399 //////////////////////////////////////////////////////////////////////////// 400 unsigned int _get_global_task_id() { 401 return _get_context_slot(_get_proc_task_id(), CTX_GTID_ID); 402 } 403 404 405 /////////////////////////////////////////////////////////////////////////////// 406 // _get_context_slot() 407 // This function returns a slot content for the task defined by task_id. 408 /////////////////////////////////////////////////////////////////////////////// 409 unsigned int _get_context_slot(unsigned int task_id, unsigned int slot_id) { 410 static_scheduler_t * psched = (static_scheduler_t *) _get_sched(); 411 return _physical_read_access(&(psched->context[task_id][slot_id])); 412 } 413 414 415 /////////////////////////////////////////////////////////////////////////////// 416 // _set_context_slot() 417 // This function returns a slot content for the task defined by task_id. 418 /////////////////////////////////////////////////////////////////////////////// 419 void _set_context_slot( unsigned int task_id, 420 unsigned int slot_id, 421 unsigned int value) { 422 static_scheduler_t * psched = (static_scheduler_t *) _get_sched(); 423 _physical_write_access(&(psched->context[task_id][slot_id]), value); 424 } 425 426 427 //////////////////////////////////////////////////////////////////////////////// 428 // _get_interrupt_vector_entry() 429 // This function returns the interrupt_vector entry defined by argument index. 430 //////////////////////////////////////////////////////////////////////////////// 431 unsigned int _get_interrupt_vector_entry(unsigned int index) { 432 static_scheduler_t * psched = (static_scheduler_t *) _get_sched(); 433 return _physical_read_access( &(psched->interrupt_vector[index])); 434 } 435 339 ///////////////////////////////////////////////////////////////////////////// 340 // _get_task_slot() 341 // This function returns the content of a context slot 342 // for the task identified by the ltid argument (local index). 343 ///////////////////////////////////////////////////////////////////////////// 344 unsigned int _get_task_slot( unsigned int ltid, 345 unsigned int slot ) 346 { 347 static_scheduler_t* psched = _get_sched(); 348 return psched->context[ltid][slot]; 349 } 350 351 ///////////////////////////////////////////////////////////////////////////// 352 // _set_task_slot() 353 // This function updates the content of a context slot 354 // for the task identified by the ltid argument (local index). 355 ///////////////////////////////////////////////////////////////////////////// 356 void _set_task_slot( unsigned int ltid, 357 unsigned int slot, 358 unsigned int value ) 359 { 360 static_scheduler_t* psched = _get_sched(); 361 psched->context[ltid][slot] = value; 362 } 363 364 ///////////////////////////////////////////////////////////////////////////// 365 // _get_context_slot() 366 // This function returns the content of a context slot 367 // for the running task (defined by the scheduler current field). 368 ///////////////////////////////////////////////////////////////////////////// 369 unsigned int _get_context_slot( unsigned int slot ) 370 { 371 static_scheduler_t* psched = _get_sched(); 372 unsigned int task_id = psched->current; 373 return psched->context[task_id][slot]; 374 } 375 376 ///////////////////////////////////////////////////////////////////////////// 377 // _set_context_slot() 378 // This function updates the content of a context slot for the running task. 379 ///////////////////////////////////////////////////////////////////////////// 380 void _set_context_slot( unsigned int slot, 381 unsigned int value ) 382 { 383 static_scheduler_t* psched = _get_sched(); 384 unsigned int task_id = psched->current; 385 psched->context[task_id][slot] = value; 386 } 436 387 437 388 ///////////////////////////////////////////////////////////////////////////// 438 389 // access functions to mapping_info data structure 439 390 ///////////////////////////////////////////////////////////////////////////// 440 mapping_cluster_t * _get_cluster_base(mapping_header_t * header) { 391 mapping_cluster_t * _get_cluster_base(mapping_header_t * header) 392 { 441 393 return (mapping_cluster_t *) ((char *) header + 442 394 MAPPING_HEADER_SIZE); 443 395 } 444 445 446 ///////////////////////////////////////////////////////////////////////////// 447 mapping_pseg_t * _get_pseg_base(mapping_header_t * header) { 396 ///////////////////////////////////////////////////////////////////////////// 397 mapping_pseg_t * _get_pseg_base(mapping_header_t * header) 398 { 448 399 return (mapping_pseg_t *) ((char *) header + 449 400 MAPPING_HEADER_SIZE + … … 451 402 } 452 403 ///////////////////////////////////////////////////////////////////////////// 453 mapping_vspace_t * _get_vspace_base(mapping_header_t * header) { 404 mapping_vspace_t * _get_vspace_base(mapping_header_t * header) 405 { 454 406 return (mapping_vspace_t *) ((char *) header + 455 407 MAPPING_HEADER_SIZE + … … 471 423 472 424 ///////////////////////////////////////////////////////////////////////////// 473 mapping_vobj_t * _get_vobj_base(mapping_header_t * header) { 425 mapping_vobj_t * _get_vobj_base(mapping_header_t * header) 426 { 474 427 return (mapping_vobj_t *) ((char *) header + 475 428 MAPPING_HEADER_SIZE + … … 482 435 483 436 ///////////////////////////////////////////////////////////////////////////// 484 mapping_task_t * _get_task_base(mapping_header_t * header) { 437 mapping_task_t * _get_task_base(mapping_header_t * header) 438 { 485 439 return (mapping_task_t *) ((char *) header + 486 440 MAPPING_HEADER_SIZE +
Note: See TracChangeset
for help on using the changeset viewer.