ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

pic.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.