gonzui


Format: Advanced Search

mtkernel_3/kernel/sysdepend/cpu/core/armv7a/cpu_status.hbare sourcepermlink (0.01 seconds)

Search this content:

    1: /*
    2:  *----------------------------------------------------------------------
    3:  *    micro T-Kernel 3.00.05
    4:  *
    5:  *    Copyright (C) 2006-2021 by Ken Sakamura.
    6:  *    This software is distributed under the T-License 2.2.
    7:  *----------------------------------------------------------------------
    8:  *
    9:  *    Released by TRON Forum(http://www.tron.org) at 2021/11.
   10:  *
   11:  *----------------------------------------------------------------------
   12:  */
   13: 
   14: /*
   15:  *      cpu_status.h (ARMv7-A)
   16:  *      CPU-Dependent Status Definition
   17:  */
   18: 
   19: #ifndef _SYSDEPEND_CPU_CORE_STATUS_
   20: #define _SYSDEPEND_CPU_CORE_STATUS_
   21: 
   22: #include <tk/syslib.h>
   23: #include <sys/sysdef.h>
   24: 
   25: #include "sysdepend.h"
   26: /*
   27:  * Start/End critical section
   28:  */
   29: #define BEGIN_CRITICAL_SECTION  { UINT _intsts_ = disint();
   30: #define END_CRITICAL_SECTION    if ( !isDI(_intsts_)                       \
   31:                                   && knl_ctxtsk != knl_schedtsk             \
   32:                                   && !knl_isTaskIndependent()               \
   33:                                   && !knl_dispatch_disabled ) {             \
   34:                                         knl_dispatch();                    \
   35:                                 }                                   \
   36:                                 enaint(_intsts_); }
   37: 
   38: /*
   39:  * Start/End interrupt disable section
   40:  */
   41: #define BEGIN_DISABLE_INTERRUPT { UINT _intsts_ = disint();
   42: #define END_DISABLE_INTERRUPT   enaint(_intsts_); }
   43: 
   44: /*
   45:  * Interrupt enable/disable
   46:  */
   47: #define ENABLE_INTERRUPT        { enaint(0); }
   48: #define DISABLE_INTERRUPT       { disint(); }
   49: 
   50: /*
   51:  * Enable interrupt nesting
   52:  *      Enable the interrupt that has a higher priority than 'level.'
   53:  */
   54: #define ENABLE_INTERRUPT_UPTO(level)    { enaint(0); }
   55: 
   56: /*
   57:  *  Task-independent control
   58:  */
   59: IMPORT  W        knl_taskindp;          /* Task independent status */
   60: 
   61: /*
   62:  * If it is the task-independent part, TRUE
   63:  */
   64: Inline BOOL knl_isTaskIndependent( void )
   65: {
   66:         return ( knl_taskindp > 0 )? TRUE: FALSE;
   67: }
   68: /*
   69:  * Move to/Restore task independent part
   70:  */
   71: Inline void knl_EnterTaskIndependent( void )
   72: {
   73:         knl_taskindp++;
   74: }
   75: Inline void knl_LeaveTaskIndependent( void )
   76: {
   77:         knl_taskindp--;
   78: }
   79: 
   80: /*
   81:  * Move to/Restore task independent part
   82:  */
   83: #define ENTER_TASK_INDEPENDENT  { knl_EnterTaskIndependent(); }
   84: #define LEAVE_TASK_INDEPENDENT  { knl_LeaveTaskIndependent(); }
   85: 
   86: /* ----------------------------------------------------------------------- */
   87: /*
   88:  *      Check system state
   89:  */
   90: 
   91: /*
   92:  * When a system call is called from the task independent part, TRUE
   93:  */
   94: #define in_indp()       ( knl_isTaskIndependent() || knl_ctxtsk == NULL )
   95: 
   96: 
   97: Inline UINT knl_getCPSR(void)
   98: {
   99:         UINT rtn;
  100:         asm("mrs     %0, cpsr":"=r"(rtn));     /* save CPSR to ret */
  101:         return rtn;
  102: }
  103: 
  104: /*
  105:  * When a system call is called during dispatch disable, TRUE
  106:  * Also include the task independent part as during dispatch disable.
  107:  */
  108: #define in_ddsp()       ( knl_dispatch_disabled               \
  109:                         || in_indp()                         \
  110:                         || (knl_getCPSR() & PSR_I) )
  111: 
  112: /*
  113:  * When a system call is called during CPU lock (interrupt disable), TRUE
  114:  * Also include the task independent part as during CPU lock.
  115:  */
  116: #define in_loc()        ( (knl_getCPSR() & PSR_I)      \
  117:                         || in_indp() )
  118: 
  119: /*
  120:  * When a system call is called during executing the quasi task part, TRUE
  121:  * Valid only when in_indp() == FALSE because it is not discriminated from 
  122:  * the task independent part. 
  123:  */
  124: #define in_qtsk()       ( knl_ctxtsk->sysmode > knl_ctxtsk->isysmode )
  125: 
  126: /* ----------------------------------------------------------------------- */
  127: /*
  128:  *      Task dispatcher startup
  129:  */
  130: Inline void knl_force_dispatch( void )
  131: {
  132:         Asm("svc %0"::"i"(SVC_FORCE_DISPATCH):"lr");
  133: }
  134: Inline void knl_dispatch( void )
  135: {
  136:         Asm("svc %0"::"i"(SVC_DISPATCH):"lr");
  137: }
  138: 
  139: #endif /* _SYSDEPEND_CPU_CORE_STATUS_ */