mtkernel_3/kernel/sysdepend/cpu/core/armv7a/cpu_status.h | bare source | permlink (0.01 seconds) |
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_ */