Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenpic.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS HAL 00003 * LICENSE: BSD - See COPYING.ARM in the top level directory 00004 * FILE: hal/halarm/generic/pic.c 00005 * PURPOSE: HAL PIC Management and Control Code 00006 * PROGRAMMERS: ReactOS Portable Systems Group 00007 */ 00008 00009 /* INCLUDES *******************************************************************/ 00010 00011 #include <hal.h> 00012 #define NDEBUG 00013 #include <debug.h> 00014 00015 #undef KeGetCurrentIrql 00016 00017 /* GLOBALS ********************************************************************/ 00018 00019 ULONG HalpIrqlTable[HIGH_LEVEL + 1] = 00020 { 00021 0xFFFFFFFF, // IRQL 0 PASSIVE_LEVEL 00022 0xFFFFFFFD, // IRQL 1 APC_LEVEL 00023 0xFFFFFFF9, // IRQL 2 DISPATCH_LEVEL 00024 0xFFFFFFD9, // IRQL 3 00025 0xFFFFFF99, // IRQL 4 00026 0xFFFFFF19, // IRQL 5 00027 0xFFFFFE19, // IRQL 6 00028 0xFFFFFC19, // IRQL 7 00029 0xFFFFF819, // IRQL 8 00030 0xFFFFF019, // IRQL 9 00031 0xFFFFE019, // IRQL 10 00032 0xFFFFC019, // IRQL 11 00033 0xFFFF8019, // IRQL 12 00034 0xFFFF0019, // IRQL 13 00035 0xFFFE0019, // IRQL 14 00036 0xFFFC0019, // IRQL 15 00037 0xFFF80019, // IRQL 16 00038 0xFFF00019, // IRQL 17 00039 0xFFE00019, // IRQL 18 00040 0xFFC00019, // IRQL 19 00041 0xFF800019, // IRQL 20 00042 0xFF000019, // IRQL 21 00043 0xFE000019, // IRQL 22 00044 0xFC000019, // IRQL 23 00045 0xF0000019, // IRQL 24 00046 0x80000019, // IRQL 25 00047 0x19, // IRQL 26 00048 0x18, // IRQL 27 PROFILE_LEVEL 00049 0x10, // IRQL 28 CLOCK2_LEVEL 00050 0x00, // IRQL 29 IPI_LEVEL 00051 0x00, // IRQL 30 POWER_LEVEL 00052 0x00, // IRQL 31 HIGH_LEVEL 00053 }; 00054 00055 UCHAR HalpMaskTable[HIGH_LEVEL + 1] = 00056 { 00057 PROFILE_LEVEL, // INT 0 WATCHDOG 00058 APC_LEVEL, // INT 1 SOFTWARE INTERRUPT 00059 DISPATCH_LEVEL,// INT 2 COMM RX 00060 IPI_LEVEL, // INT 3 COMM TX 00061 CLOCK2_LEVEL, // INT 4 TIMER 0 00062 3, 00063 4, 00064 5, 00065 6, 00066 7, 00067 8, 00068 9, 00069 10, 00070 11, 00071 12, 00072 13, 00073 14, 00074 15, 00075 16, 00076 17, 00077 18, 00078 19, 00079 20, 00080 21, 00081 22, 00082 23, 00083 24, 00084 25, 00085 26, 00086 26, 00087 26 00088 }; 00089 00090 /* FUNCTIONS ******************************************************************/ 00091 00092 VOID 00093 HalpInitializeInterrupts(VOID) 00094 { 00095 PKIPCR Pcr = (PKIPCR)KeGetPcr(); 00096 00097 /* Fill out the IRQL mappings */ 00098 RtlCopyMemory(Pcr->IrqlTable, HalpIrqlTable, sizeof(Pcr->IrqlTable)); 00099 RtlCopyMemory(Pcr->IrqlMask, HalpMaskTable, sizeof(Pcr->IrqlMask)); 00100 } 00101 00102 /* IRQL MANAGEMENT ************************************************************/ 00103 00104 /* 00105 * @implemented 00106 */ 00107 ULONG 00108 HalGetInterruptSource(VOID) 00109 { 00110 ULONG InterruptStatus; 00111 00112 /* Get the interrupt status, and return the highest bit set */ 00113 InterruptStatus = READ_REGISTER_ULONG(VIC_INT_STATUS); 00114 return 31 - _clz(InterruptStatus); 00115 } 00116 00117 /* 00118 * @implemented 00119 */ 00120 KIRQL 00121 NTAPI 00122 KeGetCurrentIrql(VOID) 00123 { 00124 /* Return the IRQL */ 00125 return KeGetPcr()->Irql; 00126 } 00127 00128 /* 00129 * @implemented 00130 */ 00131 KIRQL 00132 NTAPI 00133 KeRaiseIrqlToDpcLevel(VOID) 00134 { 00135 PKPCR Pcr = KeGetPcr(); 00136 KIRQL CurrentIrql; 00137 00138 /* Save and update IRQL */ 00139 CurrentIrql = Pcr->Irql; 00140 Pcr->Irql = DISPATCH_LEVEL; 00141 00142 #ifdef IRQL_DEBUG 00143 /* Validate correct raise */ 00144 if (CurrentIrql > DISPATCH_LEVEL) KeBugCheck(IRQL_NOT_GREATER_OR_EQUAL); 00145 #endif 00146 00147 /* Return the previous value */ 00148 return CurrentIrql; 00149 } 00150 00151 /* 00152 * @implemented 00153 */ 00154 KIRQL 00155 NTAPI 00156 KeRaiseIrqlToSynchLevel(VOID) 00157 { 00158 PKPCR Pcr = KeGetPcr(); 00159 KIRQL CurrentIrql; 00160 00161 /* Save and update IRQL */ 00162 CurrentIrql = Pcr->Irql; 00163 Pcr->Irql = SYNCH_LEVEL; 00164 00165 #ifdef IRQL_DEBUG 00166 /* Validate correct raise */ 00167 if (CurrentIrql > SYNCH_LEVEL) 00168 { 00169 /* Crash system */ 00170 KeBugCheckEx(IRQL_NOT_GREATER_OR_EQUAL, 00171 CurrentIrql, 00172 SYNCH_LEVEL, 00173 0, 00174 1); 00175 } 00176 #endif 00177 00178 /* Return the previous value */ 00179 return CurrentIrql; 00180 } 00181 00182 /* 00183 * @implemented 00184 */ 00185 KIRQL 00186 FASTCALL 00187 KfRaiseIrql(IN KIRQL NewIrql) 00188 { 00189 ARM_STATUS_REGISTER Flags; 00190 PKIPCR Pcr = (PKIPCR)KeGetPcr(); 00191 KIRQL CurrentIrql; 00192 ULONG InterruptMask; 00193 00194 /* Disable interrupts */ 00195 Flags = KeArmStatusRegisterGet(); 00196 _disable(); 00197 00198 /* Read current IRQL */ 00199 CurrentIrql = Pcr->Irql; 00200 00201 #ifdef IRQL_DEBUG 00202 /* Validate correct raise */ 00203 if (CurrentIrql > NewIrql) 00204 { 00205 /* Crash system */ 00206 Pcr->Irql = PASSIVE_LEVEL; 00207 KeBugCheck(IRQL_NOT_GREATER_OR_EQUAL); 00208 } 00209 #endif 00210 /* Clear interrupts associated to the old IRQL */ 00211 WRITE_REGISTER_ULONG(VIC_INT_CLEAR, 0xFFFFFFFF); 00212 00213 /* Set the new interrupt mask */ 00214 InterruptMask = Pcr->IrqlTable[NewIrql]; 00215 WRITE_REGISTER_ULONG(VIC_INT_ENABLE, InterruptMask); 00216 00217 /* Set new IRQL */ 00218 Pcr->Irql = NewIrql; 00219 00220 /* Restore interrupt state */ 00221 if (!Flags.IrqDisable) _enable(); 00222 00223 /* Return old IRQL */ 00224 return CurrentIrql; 00225 } 00226 00227 /* 00228 * @implemented 00229 */ 00230 VOID 00231 FASTCALL 00232 KfLowerIrql(IN KIRQL NewIrql) 00233 { 00234 ARM_STATUS_REGISTER Flags; 00235 PKIPCR Pcr = (PKIPCR)KeGetPcr(); 00236 ULONG InterruptMask; 00237 00238 /* Disableinterrupts */ 00239 Flags = KeArmStatusRegisterGet(); 00240 _disable(); 00241 00242 #ifdef IRQL_DEBUG 00243 /* Validate correct lower */ 00244 if (OldIrql > Pcr->Irql) 00245 { 00246 /* Crash system */ 00247 Pcr->Irql = HIGH_LEVEL; 00248 KeBugCheck(IRQL_NOT_LESS_OR_EQUAL); 00249 } 00250 #endif 00251 00252 /* Clear interrupts associated to the old IRQL */ 00253 WRITE_REGISTER_ULONG(VIC_INT_CLEAR, 0xFFFFFFFF); 00254 00255 /* Set the new interrupt mask */ 00256 InterruptMask = Pcr->IrqlTable[NewIrql]; 00257 WRITE_REGISTER_ULONG(VIC_INT_ENABLE, InterruptMask); 00258 00259 /* Save the new IRQL and restore interrupt state */ 00260 Pcr->Irql = NewIrql; 00261 if (!Flags.IrqDisable) _enable(); 00262 } 00263 00264 /* SOFTWARE INTERRUPTS ********************************************************/ 00265 00266 /* 00267 * @implemented 00268 */ 00269 VOID 00270 FASTCALL 00271 HalRequestSoftwareInterrupt(IN KIRQL Irql) 00272 { 00273 /* Force a software interrupt */ 00274 WRITE_REGISTER_ULONG(VIC_SOFT_INT, 1 << Irql); 00275 } 00276 00277 /* 00278 * @implemented 00279 */ 00280 VOID 00281 FASTCALL 00282 HalClearSoftwareInterrupt(IN KIRQL Irql) 00283 { 00284 /* Clear software interrupt */ 00285 WRITE_REGISTER_ULONG(VIC_SOFT_INT_CLEAR, 1 << Irql); 00286 } 00287 00288 /* SYSTEM INTERRUPTS **********************************************************/ 00289 00290 /* 00291 * @implemented 00292 */ 00293 BOOLEAN 00294 NTAPI 00295 HalEnableSystemInterrupt(IN ULONG Vector, 00296 IN KIRQL Irql, 00297 IN KINTERRUPT_MODE InterruptMode) 00298 { 00299 UNIMPLEMENTED; 00300 while (TRUE); 00301 return FALSE; 00302 } 00303 00304 /* 00305 * @implemented 00306 */ 00307 VOID 00308 NTAPI 00309 HalDisableSystemInterrupt(IN ULONG Vector, 00310 IN KIRQL Irql) 00311 { 00312 UNIMPLEMENTED; 00313 while (TRUE); 00314 } 00315 00316 /* 00317 * @implemented 00318 */ 00319 BOOLEAN 00320 NTAPI 00321 HalBeginSystemInterrupt(IN KIRQL Irql, 00322 IN ULONG Vector, 00323 OUT PKIRQL OldIrql) 00324 { 00325 UNIMPLEMENTED; 00326 while (TRUE); 00327 return FALSE; 00328 } 00329 00330 /* 00331 * @implemented 00332 */ 00333 VOID 00334 NTAPI 00335 HalEndSystemInterrupt(IN KIRQL OldIrql, 00336 IN PKTRAP_FRAME TrapFrame) 00337 { 00338 UNIMPLEMENTED; 00339 while (TRUE); 00340 } 00341 00342 /* EOF */ Generated on Sat May 26 2012 04:27:16 for ReactOS by
1.7.6.1
|