Changeset 442 for soft/giet_vm/giet_common/utils.c
- Timestamp:
- Nov 3, 2014, 11:29:19 AM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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
Note: See TracChangeset
for help on using the changeset viewer.