Ignore:
Timestamp:
Mar 26, 2014, 6:10:01 PM (11 years ago)
Author:
alain
Message:

Introducing support for IOPIC component.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/giet_kernel/sys_handler.c

    r267 r294  
    3535    &_timer_start,         /* 0x04 */
    3636    &_timer_stop,          /* 0x05 */
    37     &_sys_ukn,             /* 0x06 */
    38     &_sys_ukn,             /* 0x07 */
     37    &_tty_get_lock,        /* 0x06 */
     38    &_tty_release_lock,    /* 0x07 */
    3939    &_heap_info,           /* 0x08 */
    4040    &_local_task_id,       /* 0x09 */
     
    4949    &_fb_sync_read,        /* 0x11 */
    5050    &_thread_id,           /* 0x12 */
    51     &_tty_get_release_lock,/* 0x13 */
     51    &_sys_ukn,             /* 0x13 */
    5252    &_sys_ukn,             /* 0x14 */
    5353    &_sys_ukn,             /* 0x15 */
     
    103103void _sys_ukn()
    104104{
    105     unsigned int epc;
    106     asm volatile("mfc0 %0, $14" : "=r" (epc));
    107 
    108     _tty_get_lock( 0 );
    109     _puts("\n\n!!! Undefined System Call !!!\n");
    110     _puts("\nEPC = ");
    111     _putx(epc);
    112     _tty_release_lock( 0 );
     105    _printf("\n\n[GIET ERROR] Undefined System Call / EPC = %x\n", _get_epc() );
    113106    _exit();
    114107}
    115108
    116109////////////////////////////////////////////////////////////////////////////
    117 // _exit()
    118110// Task suicide... after printing a death message.
    119111////////////////////////////////////////////////////////////////////////////
    120 void _task_exit()
    121 {
    122     unsigned int date    = _get_proctime();
    123     unsigned int proc_id = _get_procid();
    124     unsigned int task_id = _get_context_slot(CTX_LTID_ID);
     112void _task_exit( char* string )
     113{
     114    unsigned int date       = _get_proctime();
     115    unsigned int proc_id    = _get_procid();
     116    unsigned int cluster_xy = proc_id / NB_PROCS_MAX;
     117    unsigned int y          = cluster_xy & ((1<<Y_WIDTH)-1);
     118    unsigned int x          = cluster_xy >> Y_WIDTH;
     119    unsigned int lpid       = proc_id % NB_PROCS_MAX;
     120    unsigned int task_id    = _get_context_slot(CTX_LTID_ID);
    125121
    126122    // print death message
    127     _tty_get_lock( 0 );
    128     _puts("\n[GIET] Exit task ");
    129     _putd(task_id);
    130     _puts(" on processor ");
    131     _putd(proc_id);
    132     _puts(" at cycle ");
    133     _putd(date);
    134     _puts("\n\n");
    135     _tty_release_lock( 0 );
     123    _printf("\n[GIET] Exit task %d on processor[%d,%d,%d] at cycle %d"
     124            "\n       Cause : %s\n\n",
     125            task_id, x, y, lpid, date, string );
    136126
    137127    // goes to sleeping state
     
    143133
    144134//////////////////////////////////////////////////////////////////////////////
    145 // _procnumber()
    146135// returns in buffer argument the number of processors in the cluster
    147136// specified by the cluster_id argument.
     
    165154
    166155/////////////////////////////////////////////////////////////////////////////
    167 // _local_task_id()
    168156// Returns current task local index.
    169157/////////////////////////////////////////////////////////////////////////////
     
    174162
    175163/////////////////////////////////////////////////////////////////////////////
    176 // _global_task_id()
    177164// Returns current task global index.
    178165/////////////////////////////////////////////////////////////////////////////
     
    183170
    184171/////////////////////////////////////////////////////////////////////////////
    185 // _thread_id()
    186172// Returns current thread index.
    187173/////////////////////////////////////////////////////////////////////////////
     
    192178
    193179/////////////////////////////////////////////////////////////////////////////
    194 // _tty_get_release_lock(int val)
    195 // Get or release the hardware TTY lock depending on val (0: get,1: release)
    196 /////////////////////////////////////////////////////////////////////////////
    197 int _tty_get_release_lock(unsigned int val)
    198 {
    199     unsigned int channel = _get_context_slot(CTX_TTY_ID);
    200 
    201     if      ( val == 0 ) _tty_get_lock(channel);
    202     else if ( val == 1 ) _tty_release_lock(channel);
    203     else return -1; // Wrong action
    204 
    205     return 0;
    206 }
    207 
    208 /////////////////////////////////////////////////////////////////////////////
    209 // _get_vobj()
    210180// This function writes in res_vobj a pointer on a vobj
    211181// identified by the (vspace_name / vobj_name ) couple.
    212 // The vobj_type argument is here only for the purpose of checking .
    213 // returns 0: success, else: failed.
     182// returns 0 if success, >0 if not found
    214183/////////////////////////////////////////////////////////////////////////////
    215184int _get_vobj( char*             vspace_name,
    216185               char*             vobj_name,
    217                unsigned int      vobj_type,
    218186               mapping_vobj_t**  res_vobj )
    219187{
     
    237205                if (_strncmp(vobj[vobj_id].name, vobj_name, 31) == 0)
    238206                {
    239                     if (vobj[vobj_id].type != vobj_type)
    240                     {
    241                         _tty_get_lock( 0 );
    242                         _puts("*** Error in _get_obj: wrong type\n");
    243                         _tty_release_lock( 0 );
    244                         return -1; // wrong type
    245                     }
    246207                    *res_vobj = &vobj[vobj_id];
    247208                    return 0;
     
    250211        }
    251212    }
    252     _tty_get_lock( 0 );
    253     _puts("*** Error in _get_obj: object not found\n");
    254     _tty_release_lock( 0 );
    255 
    256     return -2; //not found
    257 }
    258 
    259 /////////////////////////////////////////////////////////////////////////////
    260 // _vobj_get_vbase()
     213    return 1;    //not found
     214}
     215
     216/////////////////////////////////////////////////////////////////////////////
    261217// This function writes in vobj_vaddr the virtual base address of a vobj
    262218// identified by the (vspace_name / vobj_name ) couple.
    263 // The vobj_type argument is here only for the purpose of checking .
    264 // returns 0: success, else: failed.
     219// returns 0 if success, >0 if not found
    265220/////////////////////////////////////////////////////////////////////////////
    266221unsigned int _vobj_get_vbase( char*         vspace_name,
    267222                              char*         vobj_name,
    268                               unsigned int  vobj_type,
    269                               unsigned int* vobj_vaddr )
     223                              unsigned int* vobj_vbase )
    270224{
    271225    mapping_vobj_t* res_vobj;
    272226    unsigned int    ret;
    273     if ((ret = _get_vobj(vspace_name, vobj_name, vobj_type, &res_vobj)))
     227    if ((ret = _get_vobj(vspace_name, vobj_name, &res_vobj)))
    274228    {
    275229        return ret;
    276230    }
    277     *vobj_vaddr = res_vobj->vaddr;
     231    *vobj_vbase = res_vobj->vaddr;
    278232    return 0;
    279233}
    280234
    281235/////////////////////////////////////////////////////////////////////////////
    282 // _vobj_get_length()
    283 // This function writes in vobj_length the virtual base address of a vobj
     236// This function writes in vobj_length the length of a vobj
    284237// identified by the (vspace_name / vobj_name ) couple.
    285 // The vobj_type argument is here only for the purpose of checking .
    286 // returns 0: success, else: failed.
     238// returns 0 if success, >0 if not found
    287239/////////////////////////////////////////////////////////////////////////////
    288240unsigned int _vobj_get_length( char*         vspace_name,
    289241                               char*         vobj_name,
    290                                unsigned int  vobj_type,
    291242                               unsigned int* vobj_length )
    292243{
    293244    mapping_vobj_t * res_vobj;
    294245    unsigned int ret;
    295     if ((ret = _get_vobj(vspace_name, vobj_name, vobj_type, &res_vobj)))
     246    if ((ret = _get_vobj(vspace_name, vobj_name, &res_vobj)))
    296247    {
    297248        return ret;
     
    301252}
    302253
    303 
    304 ////////////////////////////////////////////////////////////////
    305 // _context_switch()
    306 // This functions masks interruptions before calling _ctx_switch
    307 // (They are usually masked when we receive a isr_switch interrupt
    308 // because we execute ISRs with interrupt masked)
    309 ////////////////////////////////////////////////////////////////
     254////////////////////////////////////////////////////////////////////////////
     255// This sysrem function deschedule the requestint task.
     256// It mask interrupts before calling the _ctx_switch, and restore it
     257// when the task is rescheduled.
     258////////////////////////////////////////////////////////////////////////////
    310259void _context_switch()
    311260{
    312     _it_disable();
     261    unsigned int save_sr;
     262
     263    _it_disable( &save_sr );
    313264    _ctx_switch();
    314 }
    315 
     265    _it_restore( &save_sr );
     266}
    316267
    317268// Local Variables:
Note: See TracChangeset for help on using the changeset viewer.