Changeset 442 for soft/giet_vm/giet_common
- Timestamp:
- Nov 3, 2014, 11:29:19 AM (10 years ago)
- Location:
- soft/giet_vm/giet_common
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
soft/giet_vm/giet_common/pmem.c
r408 r442 24 24 if ( (base & 0x1FFFFF) || (size & 0x1FFFFF) ) 25 25 { 26 _printf("\n[GIET ERROR] in _pmem_alloc_init() : " 27 " pseg in cluster[%d][%d] not aligned on 2 Mbytes\n", x, y ); 26 _puts("\n[GIET ERROR] in _pmem_alloc_init() : pseg in cluster["); 27 _putd( x ); 28 _puts(","); 29 _putd( y ); 30 _puts("] not aligned on 2 Mbytes\n"); 28 31 _exit(); 29 32 } … … 58 61 if ( (bpi + n) > p->max_bppi ) 59 62 { 60 _printf("\n[GIET ERROR] in _get_big_ppn() : " 61 " not enough big physical pages in cluster[%d][%d]", x, y ); 63 _puts("\n[GIET ERROR] in _get_big_ppn() : not enough BPP in cluster["); 64 _putd( x ); 65 _puts(","); 66 _putd( y ); 67 _puts("]\n"); 62 68 _exit(); 63 69 } … … 85 91 if ( p->nxt_bppi + 1 > p->max_bppi ) 86 92 { 87 _printf("\n[GIET ERROR] in _get_small_ppn() : " 88 " not enough big physical pages in cluster[%d][%d]", x, y ); 93 _puts("\n[GIET ERROR] in _get_small_ppn() : not enough BPP in cluster["); 94 _putd( x ); 95 _puts(","); 96 _putd( y ); 97 _puts("]\n"); 89 98 _exit(); 90 99 } -
soft/giet_vm/giet_common/utils.c
r433 r442 11 11 /////////////////////////////////////////////////////////////////////////////////// 12 12 13 #include <utils.h> 13 14 #include <giet_config.h> 14 15 #include <hard_config.h> 15 16 #include <mapping_info.h> 16 #include < utils.h>17 #include <tty_driver.h> 17 18 #include <ctx_handler.h> 18 #include <tty_driver.h>19 #include <stdarg.h>20 19 21 20 // This global variable is allocated in the boot.c file or in kernel_init.c file … … 172 171 //////////////////////////////////////////////////////////////////////////// 173 172 174 /////////////////////////////////////////////////////// /////////////////////173 /////////////////////////////////////////////////////// 175 174 unsigned int _physical_read( unsigned long long paddr ) 176 175 { … … 198 197 return value; 199 198 } 200 //////////////////////////////////////////////// ////////////////////////////199 //////////////////////////////////////////////// 201 200 void _physical_write( unsigned long long paddr, 202 201 unsigned int value ) … … 225 224 } 226 225 227 ///////////////////////////////////////////////////////////////// ///////////226 ///////////////////////////////////////////////////////////////// 228 227 unsigned long long _physical_read_ull( unsigned long long paddr ) 229 228 { … … 256 255 } 257 256 258 /////////////////////////////////////////////////// /////////////////////////257 /////////////////////////////////////////////////// 259 258 void _physical_write_ull( unsigned long long paddr, 260 259 unsigned long long value ) … … 286 285 } 287 286 288 /////////////////////////////////////////////////////////////////////////////////// 289 // This function makes a memcpy from a source buffer to a destination buffer 290 // using physical addresses, after a temporary DTLB de-activation. 291 // source and destination buffers must be word aligned, and size must be 292 // multiple of 4 bytes. 293 /////////////////////////////////////////////////////////////////////////////////// 287 //////////////////////////////////////////////////// 294 288 void _physical_memcpy( unsigned long long dst_paddr, // destination buffer paddr 295 289 unsigned long long src_paddr, // source buffer paddr … … 299 293 if ( (dst_paddr & 3) || (src_paddr & 3) || (size & 3) ) 300 294 { 301 _p rintf("\n[GIET ERROR] in _physical_memcpy() : buffer unaligned\n");295 _puts("\n[GIET ERROR] in _physical_memcpy() : buffer unaligned\n"); 302 296 _exit(); 303 297 } … … 342 336 } // end _physical_memcpy() 343 337 344 //////////////////////////////////////////////// /////////////////////////////////338 //////////////////////////////////////////////// 345 339 void _physical_memset( unsigned long long paddr, // destination buffer paddr 346 340 unsigned int size, // bytes … … 350 344 if ( (paddr & 3) || (size & 7) ) 351 345 { 352 _p rintf("\n[GIET ERROR] in _physical_memset() : buffer unaligned\n");346 _puts("\n[GIET ERROR] in _physical_memset() : buffer unaligned\n"); 353 347 _exit(); 354 348 } … … 381 375 } // _physical_memset() 382 376 383 /////////////////////////////////////////////// ////////////////////////////////////377 /////////////////////////////////////////////// 384 378 void _io_extended_write( unsigned int* vaddr, 385 379 unsigned int value ) … … 400 394 } 401 395 402 ////////////////////////////////////////////////////// /////////////////////////////396 ////////////////////////////////////////////////////// 403 397 unsigned int _io_extended_read( unsigned int* vaddr ) 404 398 { … … 418 412 419 413 /////////////////////////////////////////////////////////////////////////////////// 420 // Locks access functions421 /////////////////////////////////////////////////////////////////////////////////// 422 423 /////////////////////////////////// ////////////////////////////////////////////////424 void _get_lock( giet_lock_t* lock)414 // Locks access functions 415 /////////////////////////////////////////////////////////////////////////////////// 416 417 /////////////////////////////////// 418 void _get_lock( giet_lock_t* lock ) 425 419 { 426 420 register unsigned int* plock = &(lock->value); … … 470 464 } 471 465 472 /////////////////////////////////////// ////////////////////////////////////////////473 void _release_lock( giet_lock_t* lock)466 /////////////////////////////////////// 467 void _release_lock( giet_lock_t* lock ) 474 468 { 475 469 asm volatile ( "sync\n" ::: "memory" ); … … 479 473 480 474 /////////////////////////////////////////////////////////////////////////////////// 481 // Access functions to system terminal TTY0 482 /////////////////////////////////////////////////////////////////////////////////// 483 484 /////////////////////////////////////////////////////////////////////////////////// 485 // Display "string" argument on TTY0. 486 // It uses the low level access functions from TTY driver, using a busy waiting 487 // policy if TTY buffer is full. 488 // The exclusive access lock should be taken by the caller. 489 /////////////////////////////////////////////////////////////////////////////////// 475 // Access functions to kernel terminal TTY0 476 /////////////////////////////////////////////////////////////////////////////////// 477 478 ////////////////////////// 490 479 void _puts( char* string ) 491 480 { … … 506 495 } 507 496 508 /////////////////////////////////////////////////////////////////////////////////// 509 // Display a 32 bits unsigned int as an hexadecimal string on TTY0. 510 /////////////////////////////////////////////////////////////////////////////////// 497 ////////////////////////////// 511 498 void _putx( unsigned int val ) 512 499 { … … 527 514 } 528 515 529 /////////////////////////////////////////////////////////////////////////////////// 530 // Display a 64 bits unsigned long as an hexadecimal string on TTY0. 531 /////////////////////////////////////////////////////////////////////////////////// 516 //////////////////////////////////// 532 517 void _putl( unsigned long long val ) 533 518 { … … 548 533 } 549 534 550 /////////////////////////////////////////////////////////////////////////////////// 551 // Display a 32 bits unsigned int as a decimal string on TTY0. 552 /////////////////////////////////////////////////////////////////////////////////// 535 ////////////////////////////// 553 536 void _putd( unsigned int val ) 554 537 { … … 576 559 } 577 560 578 /////////////////////////////////////////////////////////////////////////////////// 579 // Display a format on TTY0. 580 // To provide an atomic display, this function takes the lock protecting 581 // exclusive access to TTY0, entering a critical section until the lock 582 // is released. 583 // Only a limited number of formats are supported: 584 // - %d : 32 bits signed decimal 585 // - %u : 32 bits unsigned decimal 586 // - %x : 32 bits unsigned hexa 587 // - %l : 64 bits unsigned hexa 588 // - %c : char 589 // - %s : string 590 /////////////////////////////////////////////////////////////////////////////////// 591 void _printf( char * format, ... ) 592 { 593 va_list ap; 594 va_start(ap, format); 595 unsigned int save_sr; // to save SR value in critical section 596 597 // get TTY0 lock 598 _tty_get_lock( 0, &save_sr ); 599 600 printf_text: 601 602 while (*format) 603 { 604 unsigned int i; 605 for (i = 0 ; format[i] && (format[i] != '%') ; i++); 606 if (i) 607 { 608 if ( _tty_write( format, i, 0 ) != i ) goto return_error; 609 format += i; 610 } 611 if (*format == '%') 612 { 613 format++; 614 goto printf_arguments; 615 } 616 } 617 618 // release TTY0 lock 619 _tty_release_lock( 0, &save_sr ); 620 621 va_end(ap); 622 return; 623 624 printf_arguments: 625 626 { 627 char buf[20]; 628 char * pbuf; 629 unsigned int len = 0; 630 static const char HexaTab[] = "0123456789ABCDEF"; 631 unsigned int i; 632 633 switch (*format++) 634 { 635 case ('c'): /* char conversion */ 636 { 637 int val = va_arg( ap, int ); 638 len = 1; 639 buf[0] = val; 640 pbuf = &buf[0]; 641 break; 642 } 643 case ('d'): /* 32 bits decimal signed */ 644 { 645 int val = va_arg( ap, int ); 646 if (val < 0) 647 { 648 val = -val; 649 if ( _tty_write( "-" , 1, 0 ) != 1 ) goto return_error; 650 } 651 for(i = 0; i < 10; i++) 652 { 653 buf[9 - i] = HexaTab[val % 10]; 654 if (!(val /= 10)) break; 655 } 656 len = i + 1; 657 pbuf = &buf[9 - i]; 658 break; 659 } 660 case ('u'): /* 32 bits decimal unsigned */ 661 { 662 unsigned int val = va_arg( ap, unsigned int ); 663 for(i = 0; i < 10; i++) 664 { 665 buf[9 - i] = HexaTab[val % 10]; 666 if (!(val /= 10)) break; 667 } 668 len = i + 1; 669 pbuf = &buf[9 - i]; 670 break; 671 } 672 case ('x'): /* 32 bits hexadecimal unsigned */ 673 { 674 unsigned int val = va_arg( ap, unsigned int ); 675 if ( _tty_write( "0x" , 2, 0 ) != 2 ) goto return_error; 676 for(i = 0; i < 8; i++) 677 { 678 buf[7 - i] = HexaTab[val % 16]; 679 if (!(val /= 16)) break; 680 } 681 len = i + 1; 682 pbuf = &buf[7 - i]; 683 break; 684 } 685 case ('l'): /* 64 bits hexadecimal unsigned */ 686 { 687 unsigned long long val = va_arg( ap, unsigned long long ); 688 if ( _tty_write( "0x" , 2, 0 ) != 2 ) goto return_error; 689 for(i = 0; i < 16; i++) 690 { 691 buf[15 - i] = HexaTab[val % 16]; 692 if (!(val /= 16)) break; 693 } 694 len = i + 1; 695 pbuf = &buf[15 - i]; 696 break; 697 } 698 case ('s'): /* string */ 699 { 700 char* str = va_arg( ap, char* ); 701 while (str[len]) 702 { 703 len++; 704 } 705 pbuf = str; 706 break; 707 } 708 default: 709 goto return_error; 710 } 711 712 if ( _tty_write( pbuf, len, 0 ) != len ) goto return_error; 713 714 goto printf_text; 715 } 716 717 return_error: 718 719 { 720 unsigned int procid = _get_procid(); 721 unsigned int x = (procid >> (Y_WIDTH + P_WIDTH)) & ((1<<X_WIDTH)-1); 722 unsigned int y = (procid >> P_WIDTH) & ((1<<Y_WIDTH)-1); 723 unsigned int lpid = procid & ((1<<P_WIDTH)-1); 724 725 _puts("\n\n[GIET ERROR] in _printf() for processor["); 726 _putd( x ); 727 _puts(","); 728 _putd( y ); 729 _puts(","); 730 _putd( lpid ); 731 _puts("]\n"); 732 733 // release TTY0 lock 734 _tty_release_lock( 0, &save_sr ); 735 736 _exit(); 737 } 738 } 739 740 /////////////////////////////////////////////////////////////////////////////////// 741 // Get a character from TTY0. 742 /////////////////////////////////////////////////////////////////////////////////// 743 void _getc( char* byte ) 561 ///////////////////////// 562 void _getc( char* byte ) 744 563 { 745 564 // test status register … … 756 575 757 576 758 /////////////////////////////////// /////////////////////////////////////////////////577 /////////////////////////////////// 759 578 unsigned int _get_current_task_id() 760 579 { … … 762 581 return (unsigned int) (psched->current); 763 582 } 764 //////////////////////////////////////////////////////////////////////////////////// 583 584 //////////////////////////////////////////// 765 585 unsigned int _get_task_slot( unsigned int x, 766 586 unsigned int y, … … 772 592 return psched->context[ltid][slot]; 773 593 } 774 //////////////////////////////////////////////////////////////////////////////////// 594 595 //////////////////////////////////// 775 596 void _set_task_slot( unsigned int x, 776 597 unsigned int y, … … 783 604 psched->context[ltid][slot] = value; 784 605 } 785 //////////////////////////////////////////////////////////////////////////////////// 606 607 /////////////////////////////////////////////////// 786 608 unsigned int _get_context_slot( unsigned int slot ) 787 609 { … … 790 612 return psched->context[task_id][slot]; 791 613 } 792 //////////////////////////////////////////////////////////////////////////////////// 614 615 /////////////////////////////////////////// 793 616 void _set_context_slot( unsigned int slot, 794 617 unsigned int value ) … … 802 625 // Access functions to mapping_info data structure 803 626 ///////////////////////////////////////////////////////////////////////////// 627 628 //////////////////////////////////////////////////////////////// 804 629 mapping_cluster_t * _get_cluster_base(mapping_header_t * header) 805 630 { … … 807 632 MAPPING_HEADER_SIZE); 808 633 } 809 ////////////////////////////////////////////////////////// ///////////////////634 ////////////////////////////////////////////////////////// 810 635 mapping_pseg_t * _get_pseg_base(mapping_header_t * header) 811 636 { … … 814 639 MAPPING_CLUSTER_SIZE * X_SIZE * Y_SIZE); 815 640 } 816 ////////////////////////////////////////////////////////////// ///////////////641 ////////////////////////////////////////////////////////////// 817 642 mapping_vspace_t * _get_vspace_base(mapping_header_t * header) 818 643 { … … 822 647 MAPPING_PSEG_SIZE * header->psegs); 823 648 } 824 ////////////////////////////////////////////////////////// ///////////////////649 ////////////////////////////////////////////////////////// 825 650 mapping_vseg_t * _get_vseg_base(mapping_header_t * header) 826 651 { … … 831 656 MAPPING_VSPACE_SIZE * header->vspaces); 832 657 } 833 ////////////////////////////////////////////////////////// ///////////////////658 ////////////////////////////////////////////////////////// 834 659 mapping_vobj_t * _get_vobj_base(mapping_header_t * header) 835 660 { … … 841 666 MAPPING_VSEG_SIZE * header->vsegs ); 842 667 } 843 ////////////////////////////////////////////////////////// ///////////////////668 ////////////////////////////////////////////////////////// 844 669 mapping_task_t * _get_task_base(mapping_header_t * header) 845 670 { … … 852 677 MAPPING_VSEG_SIZE * header->vsegs); 853 678 } 854 ///////////////////////////////////////////////////////// ////////////////////679 ///////////////////////////////////////////////////////// 855 680 mapping_proc_t *_get_proc_base(mapping_header_t * header) 856 681 { … … 864 689 MAPPING_TASK_SIZE * header->tasks); 865 690 } 866 /////////////////////////////////////////////////////// //////////////////////691 /////////////////////////////////////////////////////// 867 692 mapping_irq_t *_get_irq_base(mapping_header_t * header) 868 693 { … … 877 702 MAPPING_PROC_SIZE * header->procs); 878 703 } 879 ///////////////////////////////////////////////////////////// ////////////////704 ///////////////////////////////////////////////////////////// 880 705 mapping_coproc_t *_get_coproc_base(mapping_header_t * header) 881 706 { … … 891 716 MAPPING_IRQ_SIZE * header->irqs); 892 717 } 893 /////////////////////////////////////////////////////////////// ////////////////////718 /////////////////////////////////////////////////////////////// 894 719 mapping_cp_port_t *_get_cp_port_base(mapping_header_t * header) 895 720 { … … 906 731 MAPPING_COPROC_SIZE * header->coprocs); 907 732 } 908 ///////////////////////////////////////////////////////////// //////////////////////733 ///////////////////////////////////////////////////////////// 909 734 mapping_periph_t *_get_periph_base(mapping_header_t * header) 910 735 { … … 924 749 925 750 /////////////////////////////////////////////////////////////////////////////////// 926 // Miscelaneous functions 927 /////////////////////////////////////////////////////////////////////////////////// 928 929 /////////////////////////////////////////////////////////////////////////////////// 930 // This function implements a pseudo-random delay. 931 // The val argument define approximately an exponentially increasing mean delay, 932 // and should not be larger than 32. 933 /////////////////////////////////////////////////////////////////////////////////// 751 // Miscelaneous functions 752 /////////////////////////////////////////////////////////////////////////////////// 753 754 ////////////////////////////////////// 755 __attribute__((noreturn)) void _exit() 756 { 757 unsigned int procid = _get_procid(); 758 unsigned int x = (procid >> (Y_WIDTH + P_WIDTH)) & ((1<<X_WIDTH)-1); 759 unsigned int y = (procid >> P_WIDTH) & ((1<<Y_WIDTH)-1); 760 unsigned int lpid = procid & ((1<<P_WIDTH)-1); 761 762 763 _puts("\n[GIET PANIC] processor["); 764 _putd( x ); 765 _puts(","); 766 _putd( y ); 767 _puts(","); 768 _putd( lpid ); 769 _puts("] exit at cycle"); 770 _putd( _get_proctime() ); 771 _puts(" ...\n"); 772 773 while (1) { asm volatile ("nop"); } 774 } 775 776 ///////////////////////////////////// 934 777 void _random_wait( unsigned int val ) 935 778 { … … 945 788 : "$3" ); 946 789 } 947 ////////////////////////////////////////////////////////////////////////////////// 948 // This function implements an interactive break for debug. 949 // Execution continue when typing any character on TTY0. 950 // The "str" argument is supposed to indicate the break location. 951 ////////////////////////////////////////////////////////////////////////////////// 790 791 /////////////////////////// 952 792 void _break( char* string ) 953 793 { 954 794 char byte; 955 795 956 _printf("\n[GIET DEBUG] break from %s / continue ?\n", string ); 796 _puts("\n[GIET DEBUG] break from "); 797 _puts( string ); 798 _puts(" / stoke any key to continue\n"); 957 799 _getc( &byte ); 958 800 } 959 801 960 ////////////////////////////////////////////////////////////////////////////////// 961 // Processor suicide: infinite loop 962 ////////////////////////////////////////////////////////////////////////////////// 963 __attribute__((noreturn)) 964 void _exit() 965 { 966 unsigned int procid = _get_procid(); 967 unsigned int x = (procid >> (Y_WIDTH + P_WIDTH)) & ((1<<X_WIDTH)-1); 968 unsigned int y = (procid >> P_WIDTH) & ((1<<Y_WIDTH)-1); 969 unsigned int lpid = procid & ((1<<P_WIDTH)-1); 970 971 972 _printf("\n[GIET PANIC] processor[%d,%d,%d] suicide...\n", x, y, lpid ); 973 974 while (1) { asm volatile ("nop"); } 975 } 976 /////////////////////////////////////////////////////////////////////////////////// 977 // Compare two strings s1 & s2 (no more than n characters) 978 /////////////////////////////////////////////////////////////////////////////////// 802 /////////////////////////////////////// 979 803 unsigned int _strncmp( const char * s1, 980 804 const char * s2, … … 990 814 } 991 815 992 /////////////////////////////////////////////////////////////////////////////////// 993 // Copy source string to dest string 994 /////////////////////////////////////////////////////////////////////////////////// 816 ///////////////////////////////////////// 995 817 char* _strcpy( char* dest, char* source ) 996 818 { … … 1003 825 } 1004 826 1005 /////////////////////////////////////////////////////////////////////////////////// 1006 // Invalidate all data cache lines corresponding to a memory 1007 // buffer (identified by virtual base address and size). 1008 /////////////////////////////////////////////////////////////////////////////////// 827 ///////////////////////////////////////////////////// 1009 828 void _dcache_buf_invalidate( unsigned int buf_vbase, 1010 829 unsigned int buf_size ) … … 1028 847 } 1029 848 } 1030 /////////////////////////////////////////////////////////////////////////////////// 1031 // This function returns the information associated to a heap : vaddr and length. 1032 // - If (x < X_SIZE) and (y < Y_SIZE), it return the heap associated to any task 1033 // running in cluster(x,y). 1034 // - Else, it return the heap associated to the calling task. 1035 // It uses the global task index (CTX_GTID_ID, unique for each giet task) and the 1036 // vspace index (CTX_VSID_ID), that are defined in the calling task context 1037 // to find the vobj_id containing the heap. 1038 // Return 0 if success. Return non zero if not found. 1039 /////////////////////////////////////////////////////////////////////////////////// 1040 unsigned int _heap_info( unsigned int* vaddr, 1041 unsigned int* length, 1042 unsigned int x, 1043 unsigned int y ) 1044 { 1045 mapping_header_t * header = (mapping_header_t *)SEG_BOOT_MAPPING_BASE; 1046 mapping_task_t * tasks = _get_task_base(header); 1047 mapping_vobj_t * vobjs = _get_vobj_base(header); 1048 mapping_vspace_t * vspaces = _get_vspace_base(header); 1049 1050 unsigned int task_id; 1051 unsigned int vspace_id; 1052 unsigned int vobj_id = 0xFFFFFFFF; 1053 1054 // searching the heap vobj_id 1055 if ( (x < X_SIZE) && (y < Y_SIZE) ) // searching a task in cluster(x,y) 1056 { 1057 // get vspace global index 1058 vspace_id = _get_context_slot(CTX_VSID_ID); 1059 1060 // scan all tasks in vspace 1061 unsigned int min = vspaces[vspace_id].task_offset ; 1062 unsigned int max = min + vspaces[vspace_id].tasks ; 1063 for ( task_id = min ; task_id < max ; task_id++ ) 1064 { 1065 if ( tasks[task_id].clusterid == (x * Y_SIZE + y) ) 1066 { 1067 vobj_id = tasks[task_id].heap_vobj_id; 1068 if ( vobj_id != 0xFFFFFFFF ) break; 1069 } 1070 } 1071 } 1072 else // searching in the calling task 1073 { 1074 task_id = _get_context_slot(CTX_GTID_ID); 1075 vobj_id = tasks[task_id].heap_vobj_id; 1076 } 1077 1078 // analysing the vobj_id 1079 if ( vobj_id != 0xFFFFFFFF ) 1080 { 1081 *vaddr = vobjs[vobj_id].vbase; 1082 *length = vobjs[vobj_id].length; 1083 return 0; 1084 } 1085 else 1086 { 1087 *vaddr = 0; 1088 *length = 0; 1089 return 1; 1090 } 1091 } // end _heap_info() 849 1092 850 1093 851 … … 1096 854 /////////////////////////////////////////////////////////////////////////////////// 1097 855 1098 /////////////////////////////////////////////////////////////////////////////////// 1099 // Copy a source memory buffer content to a dest memory buffer (size bytes) 1100 // Code taken from MutekH. 1101 /////////////////////////////////////////////////////////////////////////////////// 856 //////////////////////////////// 1102 857 void* memcpy( void* dest, // dest buffer vbase 1103 858 const void* source, // source buffer vbase … … 1127 882 return dest; 1128 883 } 1129 ////////////////////////////////////////////////////////////////////////////////// 1130 // Fill a byte string with a byte value. 1131 ////////////////////////////////////////////////////////////////////////////////// 1132 void * memset( void* dest, 1133 int value, 1134 unsigned int count ) 884 885 ///////////////////////////////// 886 void * memset( void* dst, 887 int value, 888 unsigned int count ) 1135 889 { 1136 890 // word-by-word copy 1137 unsigned int* idst = d est;891 unsigned int* idst = dst; 1138 892 unsigned int data = (((unsigned char)value) ) | 1139 893 (((unsigned char)value) << 8) | … … 1151 905 1152 906 // byte-by-byte copy 1153 unsigned char* cdst = d est;907 unsigned char* cdst = dst; 1154 908 while (count--) 1155 909 { 1156 910 *cdst++ = (unsigned char)value; 1157 911 } 1158 return d est;912 return dst; 1159 913 } 1160 914 -
soft/giet_vm/giet_common/utils.h
r430 r442 15 15 16 16 #include <mapping_info.h> 17 #include <giet_config.h>18 17 19 18 ////////////////////////////////////////////////////////////////////////////////// … … 45 44 46 45 /////////////////////////////////////////////////////////////////////////////////// 47 ///////////////////////////////////////////////////////////////////////////////////48 46 // CP0 registers access functions 49 47 /////////////////////////////////////////////////////////////////////////////////// 50 /////////////////////////////////////////////////////////////////////////////////// 51 52 /////////////////////////////////////////////////////////////////////////////////// 53 // Returns CP0_SCHED register content 54 // (virtual base address of the processor scheduler) 55 /////////////////////////////////////////////////////////////////////////////////// 48 56 49 extern unsigned int _get_sched(void); 57 50 58 ///////////////////////////////////////////////////////////////////////////////////59 // Returns CP0_EPC register content.60 ///////////////////////////////////////////////////////////////////////////////////61 51 extern unsigned int _get_epc(void); 62 52 63 ///////////////////////////////////////////////////////////////////////////////////64 // Returns CP0_BVAR register content.65 ///////////////////////////////////////////////////////////////////////////////////66 53 extern unsigned int _get_bvar(void); 67 54 68 ///////////////////////////////////////////////////////////////////////////////////69 // Returns CP0_CR register content.70 ///////////////////////////////////////////////////////////////////////////////////71 55 extern unsigned int _get_cr(void); 72 56 73 ///////////////////////////////////////////////////////////////////////////////////74 // Returns CP0_SR register content.75 ///////////////////////////////////////////////////////////////////////////////////76 57 extern unsigned int _get_sr(void); 77 58 78 ///////////////////////////////////////////////////////////////////////////////////79 // Returns CP0_PROCID register content.80 // Processor identifier (12 bits)81 ///////////////////////////////////////////////////////////////////////////////////82 59 extern unsigned int _get_procid(void); 83 60 84 ///////////////////////////////////////////////////////////////////////////////////85 // Returns CP0_TIME register content.86 // Processor local time (32 bits)87 ///////////////////////////////////////////////////////////////////////////////////88 61 extern unsigned int _get_proctime(void); 89 62 90 ///////////////////////////////////////////////////////////////////////////////////91 // Save CP0_SR value to variable pointed by save_sr_ptr and disable IRQs.92 ///////////////////////////////////////////////////////////////////////////////////93 63 extern void _it_disable( unsigned int* save_sr_ptr ); 94 64 95 ///////////////////////////////////////////////////////////////////////////////////96 // Restore CP0_SR register from variable pointed by save_sr_ptr.97 ///////////////////////////////////////////////////////////////////////////////////98 65 extern void _it_restore( unsigned int* save_sr_ptr ); 99 66 100 ///////////////////////////////////////////////////////////////////////////////////101 // Set a new value in CP0_SCHED register.102 // (virtual base address of the processor scheduler)103 ///////////////////////////////////////////////////////////////////////////////////104 67 extern void _set_sched(unsigned int value); 105 68 106 ///////////////////////////////////////////////////////////////////////////////////107 // Set a new value in CP0_SR register.108 ///////////////////////////////////////////////////////////////////////////////////109 69 extern void _set_sr(unsigned int value); 110 70 111 112 ///////////////////////////////////////////////////////////////////////////////////113 71 /////////////////////////////////////////////////////////////////////////////////// 114 72 // CP2 registers access functions 115 73 /////////////////////////////////////////////////////////////////////////////////// 116 /////////////////////////////////////////////////////////////////////////////////// 117 118 /////////////////////////////////////////////////////////////////////////////////// 119 // Returns CP2_PTPR register value. 120 // Page table physical base address for the running context. 121 // Contains only the 27 MSB bits, right justified. 122 /////////////////////////////////////////////////////////////////////////////////// 74 123 75 extern unsigned int _get_mmu_ptpr(void); 124 76 125 ///////////////////////////////////////////////////////////////////////////////////126 // Returns CP2_MODE register value.127 // MMU current mode, defined by 4 bits, right justified: ITLB/DTLB/ICACHE/DCACHE128 ///////////////////////////////////////////////////////////////////////////////////129 77 extern unsigned int _get_mmu_mode(void); 130 78 131 ///////////////////////////////////////////////////////////////////////////////////132 // Set a new value in CP2_PTPR register.133 ///////////////////////////////////////////////////////////////////////////////////134 79 extern void _set_mmu_ptpr(unsigned int value); 135 80 136 ///////////////////////////////////////////////////////////////////////////////////137 // Set a new value in CP2_MODE register.138 ///////////////////////////////////////////////////////////////////////////////////139 81 extern void _set_mmu_mode(unsigned int value); 140 82 141 ///////////////////////////////////////////////////////////////////////////////////142 // Set a value in CP2_DCACHE_INVAL register.143 // It invalidates the data cache line, if the virtual address defined by the144 // value argument hit in DCACHE.145 ///////////////////////////////////////////////////////////////////////////////////146 83 extern void _set_mmu_dcache_inval(unsigned int value); 147 84 148 149 150 ///////////////////////////////////////////////////////////////////////////////////151 85 /////////////////////////////////////////////////////////////////////////////////// 152 86 // Physical addressing functions 153 87 /////////////////////////////////////////////////////////////////////////////////// 154 /////////////////////////////////////////////////////////////////////////////////// 155 156 //////////////////////////////////////////////////////////////////////////// 157 // This function makes a physical read access to a 32 bits word in memory, 158 // after a temporary DTLB de-activation and paddr extension. 159 //////////////////////////////////////////////////////////////////////////// 88 160 89 extern unsigned int _physical_read( unsigned long long paddr ); 161 90 162 ////////////////////////////////////////////////////////////////////////////163 // This function makes a physical write access to a 32 bits word in memory,164 // after a temporary DTLB de-activation and paddr extension.165 ////////////////////////////////////////////////////////////////////////////166 91 extern void _physical_write( unsigned long long paddr, 167 92 unsigned int value ); 168 93 169 ////////////////////////////////////////////////////////////////////////////170 // This function makes a physical read access to a 64 bits word in memory,171 // after a temporary DTLB de-activation and paddr extension.172 ////////////////////////////////////////////////////////////////////////////173 94 extern unsigned long long _physical_read_ull( unsigned long long paddr ); 174 95 175 ////////////////////////////////////////////////////////////////////////////176 // This function makes a physical write access to a 64 bits word in memory,177 // after a temporary DTLB de-activation and paddr extension.178 ////////////////////////////////////////////////////////////////////////////179 96 extern void _physical_write_ull( unsigned long long paddr, 180 97 unsigned long long value ); 181 98 182 ///////////////////////////////////////////////////////////////////////////////////183 // This function makes a memcpy from a source buffer to a destination buffer,184 // using physical addresses, after a temporary DTLB de-activation.185 // The source and destination buffers must be word aligned, and size must be186 // multiple of 4 bytes.187 ///////////////////////////////////////////////////////////////////////////////////188 99 extern void _physical_memcpy( unsigned long long dst_paddr, 189 100 unsigned long long src_paddr, 190 101 unsigned int size ); 191 102 192 ///////////////////////////////////////////////////////////////////////////////////193 // This function set a data value in all words of a destination buffer,194 // using physical addresses, after a temporary DTLB de-activation.195 // The destination buffer must be word aligned, and size multiple of 4 bytes.196 ///////////////////////////////////////////////////////////////////////////////////197 103 extern void _physical_memset( unsigned long long buf_paddr, 198 104 unsigned int size, 199 105 unsigned int data ); 200 106 201 ///////////////////////////////////////////////////////////////////////////////////202 // This function is used by several drivers (_xxx_get_register() function).203 // If the MMU is not activated, the virtual address is extended using204 // X_IO and Y_IO to reach the cluster_io.205 ///////////////////////////////////////////////////////////////////////////////////206 107 extern unsigned int _io_extended_read( unsigned int* vaddr ); 207 108 208 ///////////////////////////////////////////////////////////////////////////////////209 // This function is used by all drivers (_xxx_set_register() function)210 // If the MMU is not activated, the virtual address is extended using211 // X_IO and Y_IO to reach the cluster_io.212 ///////////////////////////////////////////////////////////////////////////////////213 109 extern void _io_extended_write( unsigned int* vaddr, 214 110 unsigned int value ); 215 111 216 112 /////////////////////////////////////////////////////////////////////////////////// 217 // Locks access functions 218 /////////////////////////////////////////////////////////////////////////////////// 219 220 221 /////////////////////////////////////////////////////////////////////////////////// 222 // Takes a lock with a blocking ll/sc atomic access. 223 // - When the cache coherence is granted by the hardware, 224 // the first read is a standard (cacheable) lw, as the local copy 225 // can be polled when the lock is already taken by another task, reducing 226 // trafic on the interconnect. When the lock is released by the owner task, 227 // the local copy is updated or invalidated by the coherence protocol. 228 // - If there is no hardware cache coherence a random delay is introduced 229 // between two successive retry. 230 /////////////////////////////////////////////////////////////////////////////////// 113 // Locks access functions 114 /////////////////////////////////////////////////////////////////////////////////// 115 231 116 extern void _get_lock(giet_lock_t* lock); 232 117 233 ///////////////////////////////////////////////////////////////////////////////////234 // Release a previouly taken lock.235 ///////////////////////////////////////////////////////////////////////////////////236 118 extern void _release_lock(giet_lock_t* lock); 237 119 238 239 // /////////////////////////////////////////////////////////////////////////////////240 // TTY0 access functions241 /////////////////////////////////////////////////////////////////////////////////// 242 243 extern void _puts( char* string ); 120 /////////////////////////////////////////////////////////////////////////////////// 121 // Access functions to kernel terminal TTY0 122 /////////////////////////////////////////////////////////////////////////////////// 123 124 extern void _puts( char* string ); 125 244 126 extern void _putx( unsigned int val ); 127 128 extern void _putl( unsigned long long val ); 129 245 130 extern void _putd( unsigned int val ); 246 extern void _putl( unsigned long long val ); 247 248 extern void _printf(char* format, ...); 249 250 extern void _getc( char* byte ); 251 252 253 /////////////////////////////////////////////////////////////////////////////////// 254 // Scheduler and task context access functions 255 /////////////////////////////////////////////////////////////////////////////////// 256 257 258 /////////////////////////////////////////////////////////////////////////////////// 259 // Returns index of the currently running task from the processor scheduler. 260 /////////////////////////////////////////////////////////////////////////////////// 131 132 extern void _getc( char* byte ); 133 134 135 /////////////////////////////////////////////////////////////////////////////////// 136 // Scheduler and task context access functions 137 /////////////////////////////////////////////////////////////////////////////////// 138 261 139 extern unsigned int _get_current_task_id(void); 262 140 263 ////////////////////////////////////////////////////////////////////////////////////264 // This function returns the content of a context slot265 // for a task identified by the ltid argument (local task index),266 // and a processor identified by the (x,y,p) arguments.267 ////////////////////////////////////////////////////////////////////////////////////268 141 extern unsigned int _get_task_slot( unsigned int x, 269 142 unsigned int y, … … 272 145 unsigned int slot ); 273 146 274 ////////////////////////////////////////////////////////////////////////////////////275 // This function updates the content of a context slot276 // for any task identified by the ltid argument (local task index),277 // and a processor identified by the (x,y,p) arguments.278 ////////////////////////////////////////////////////////////////////////////////////279 147 extern void _set_task_slot( unsigned int x, 280 148 unsigned int y, … … 284 152 unsigned int value ); 285 153 286 ////////////////////////////////////////////////////////////////////////////////////287 // This function returns the content of a context slot for the running task.288 ////////////////////////////////////////////////////////////////////////////////////289 154 extern unsigned int _get_context_slot( unsigned int slot ); 290 155 291 ////////////////////////////////////////////////////////////////////////////////////292 // This function updates the content of a context slot for the running task.293 ////////////////////////////////////////////////////////////////////////////////////294 156 extern void _set_context_slot( unsigned int slot, 295 157 unsigned int value ); … … 331 193 unsigned int buf_size ); 332 194 333 extern unsigned int _heap_info( unsigned int* vaddr,334 unsigned int* length,335 unsigned int x,336 unsigned int y );337 338 195 /////////////////////////////////////////////////////////////////////////////////// 339 196 // Required by GCC 340 197 /////////////////////////////////////////////////////////////////////////////////// 341 198 342 extern void* memcpy( void* _dst, 343 const void* _src, 199 /////////////////////////////////////////////////////////////////////////////////// 200 extern void* memcpy( void* dst, 201 const void* src, 344 202 unsigned int size ); 345 203 346 extern void* memset( void* dst,347 int s,204 extern void* memset( void* dst, 205 int value, 348 206 unsigned int count ); 349 207 -
soft/giet_vm/giet_common/vmem.c
r408 r442 35 35 if ( (pte1 & PTE_V) == 0 ) 36 36 { 37 _p rintf("\n[VMEM ERROR] _v2p_translate() : pte1 unmapped\n");37 _puts("\n[VMEM ERROR] _v2p_translate() : pte1 unmapped\n"); 38 38 _exit(); 39 39 } … … 86 86 if ( (flags_value & PTE_V) == 0 ) 87 87 { 88 _p rintf("\n[VMEM ERROR] _v2p_translate() : pte2 unmapped\n");88 _puts("\n[VMEM ERROR] _v2p_translate() : pte2 unmapped\n"); 89 89 _exit(); 90 90 }
Note: See TracChangeset
for help on using the changeset viewer.