Update to support a single stack. GCC update will follow.
authorAJFISH <AJFISH@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 8 Jan 2010 21:07:58 +0000 (21:07 +0000)
committerAJFISH <AJFISH@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 8 Jan 2010 21:07:58 +0000 (21:07 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9695 6f19259b-4bc3-4df7-8a09-765794883524

BeagleBoardPkg/InterruptDxe/HardwareInterrupt.c
BeagleBoardPkg/Sec/Arm/ModuleEntryPoint.asm
BeagleBoardPkg/Sec/Cache.c
BeagleBoardPkg/TimerDxe/Timer.c

index 97361ffbc1d0c0ec4a0249d9f7145f5bfb0389e8..3e69515dfe5fd20ca8e1c5513de21825387336d8 100644 (file)
@@ -93,7 +93,6 @@ RegisterInterruptSource (
   }\r
 \r
   gRegisteredInterruptHandlers[Source] = Handler;\r
-\r
   return This->EnableInterruptSource(This, Source);\r
 }\r
 \r
index fb30e4dd59f38a3132c72100c84d279f9adb86c7..411e3c13ce1a432e02850f1b6e551fd9faa67908 100755 (executable)
@@ -53,33 +53,9 @@ stack_pointer_setup
   LoadConstantToReg (FixedPcdGet32(PcdPrePiStackSize) ,r3)    /* stack size arg3  */\r
   add     r4, r2, r3\r
 \r
-  //Enter IRQ mode and set up IRQ stack pointer\r
-  mov     r0,#0x12|0x80|0x40\r
-  msr     CPSR_c,r0\r
-  mov     r13,r4\r
-\r
-  //Enter Abort mode and set up Abort stack pointer\r
-  mov     r0,#0x17|0x80|0x40\r
-  msr     CPSR_c,r0\r
-  sub     r4, r4, #0x400\r
-  mov     r13,r4\r
-\r
-  //Enter Undefined mode and set up Undefined stack pointer\r
-  mov     r0,#0x1b|0x80|0x40\r
-  msr     CPSR_c,r0\r
-  sub     r4, r4, #0x400\r
-  mov     r13,r4\r
-\r
   //Enter SVC mode and set up SVC stack pointer\r
   mov     r0,#0x13|0x80|0x40\r
   msr     CPSR_c,r0\r
-  sub     r4, r4, #0x400\r
-  mov     r13,r4\r
-\r
-  //Enter System mode and set up System stack pointer\r
-  mov     r0,#0x1f|0x80|0x40\r
-  msr     CPSR_c,r0\r
-  sub     r4, r4, #0x400\r
   mov     r13,r4\r
 \r
   // Call C entry point\r
index 12bf9908122062b48d402ce827bbc38585c9de39..facc5deae40d6c07e7385305abd9e6ddbecea551 100755 (executable)
@@ -82,7 +82,7 @@ InitCache (
   MemoryTable[4].Length       = 0;\r
   MemoryTable[4].Attributes   = (ARM_MEMORY_REGION_ATTRIBUTES)0;\r
   \r
-  ArmConfigureMmu(MemoryTable, &TranslationTableBase, &TranslationTableSize);\r
+  ArmConfigureMmu (MemoryTable, &TranslationTableBase, &TranslationTableSize);\r
   \r
   BuildMemoryAllocationHob((EFI_PHYSICAL_ADDRESS)(UINTN)TranslationTableBase, TranslationTableSize, EfiBootServicesData);\r
 }\r
index 32ba09c1eb3c15c7abada76716357e47aea7ffa1..f43b24bd37b82ef073d24b0214e35725c71bf413 100644 (file)
@@ -53,6 +53,17 @@ volatile UINT32 TIER;
 // Cached interrupt vector
 volatile UINTN  gVector;
 
+
+/**\r
+  C Interrupt Handler calledin the interrupt context when Source interrupt is active.\r
+\r
+  @param Source         Source of the interrupt. Hardware routing off a specific platform defines\r
+                        what source means.\r
+  @param SystemContext  Pointer to system register context. Mostly used by debuggers and will\r
+                        update the system context after the return from the interrupt if \r
+                        modified. Don't change these values unless you know what you are doing\r
+\r
+**/
 VOID
 EFIAPI
 TimerInterruptHandler (
@@ -60,6 +71,15 @@ TimerInterruptHandler (
   IN  EFI_SYSTEM_CONTEXT          SystemContext       
   )
 {
+  EFI_TPL OriginalTPL;\r
+\r
+  //\r
+  // DXE core uses this callback for the EFI timer tick. The DXE core uses locks \r
+  // that raise to TPL_HIGH and then restore back to current level. Thus we need\r
+  // to make sure TPL level is set to TPL_HIGH while we are handling the timer tick. \r
+  //\r
+  OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL);\r
+
   if (mTimerPeriodicCallback) {
     mTimerPeriodicCallback(SystemContext);
   }
@@ -73,8 +93,39 @@ TimerInterruptHandler (
 
   // Poll interrupt status bits to ensure clearing
   while ((MmioRead32(TISR) & TISR_ALL_INTERRUPT_MASK) != TISR_NO_INTERRUPTS_PENDING);
+
+  gBS->RestoreTPL (OriginalTPL);
 }
 
+/**\r
+  This function registers the handler NotifyFunction so it is called every time \r
+  the timer interrupt fires.  It also passes the amount of time since the last \r
+  handler call to the NotifyFunction.  If NotifyFunction is NULL, then the \r
+  handler is unregistered.  If the handler is registered, then EFI_SUCCESS is \r
+  returned.  If the CPU does not support registering a timer interrupt handler, \r
+  then EFI_UNSUPPORTED is returned.  If an attempt is made to register a handler \r
+  when a handler is already registered, then EFI_ALREADY_STARTED is returned.  \r
+  If an attempt is made to unregister a handler when a handler is not registered, \r
+  then EFI_INVALID_PARAMETER is returned.  If an error occurs attempting to \r
+  register the NotifyFunction with the timer interrupt, then EFI_DEVICE_ERROR \r
+  is returned.\r
+\r
+  @param  This             The EFI_TIMER_ARCH_PROTOCOL instance.\r
+  @param  NotifyFunction   The function to call when a timer interrupt fires. This\r
+                           function executes at TPL_HIGH_LEVEL. The DXE Core will\r
+                           register a handler for the timer interrupt, so it can know\r
+                           how much time has passed. This information is used to\r
+                           signal timer based events. NULL will unregister the handler.\r
+\r
+  @retval EFI_SUCCESS           The timer handler was registered.\r
+  @retval EFI_UNSUPPORTED       The platform does not support timer interrupts.\r
+  @retval EFI_ALREADY_STARTED   NotifyFunction is not NULL, and a handler is already\r
+                                registered.\r
+  @retval EFI_INVALID_PARAMETER NotifyFunction is NULL, and a handler was not\r
+                                previously registered.\r
+  @retval EFI_DEVICE_ERROR      The timer handler could not be registered.\r
+\r
+**/\r
 EFI_STATUS
 EFIAPI
 TimerDriverRegisterHandler (
@@ -95,6 +146,32 @@ TimerDriverRegisterHandler (
   return EFI_SUCCESS;
 }
 
+/**\r
+  This function adjusts the period of timer interrupts to the value specified \r
+  by TimerPeriod.  If the timer period is updated, then the selected timer \r
+  period is stored in EFI_TIMER.TimerPeriod, and EFI_SUCCESS is returned.  If \r
+  the timer hardware is not programmable, then EFI_UNSUPPORTED is returned.  \r
+  If an error occurs while attempting to update the timer period, then the \r
+  timer hardware will be put back in its state prior to this call, and \r
+  EFI_DEVICE_ERROR is returned.  If TimerPeriod is 0, then the timer interrupt \r
+  is disabled.  This is not the same as disabling the CPU's interrupts.  \r
+  Instead, it must either turn off the timer hardware, or it must adjust the \r
+  interrupt controller so that a CPU interrupt is not generated when the timer \r
+  interrupt fires. \r
+\r
+  @param  This             The EFI_TIMER_ARCH_PROTOCOL instance.\r
+  @param  TimerPeriod      The rate to program the timer interrupt in 100 nS units. If\r
+                           the timer hardware is not programmable, then EFI_UNSUPPORTED is\r
+                           returned. If the timer is programmable, then the timer period\r
+                           will be rounded up to the nearest timer period that is supported\r
+                           by the timer hardware. If TimerPeriod is set to 0, then the\r
+                           timer interrupts will be disabled.\r
+\r
+  @retval EFI_SUCCESS           The timer period was changed.\r
+  @retval EFI_UNSUPPORTED       The platform cannot change the period of the timer interrupt.\r
+  @retval EFI_DEVICE_ERROR      The timer period could not be changed due to a device error.\r
+\r
+**/
 EFI_STATUS
 EFIAPI
 TimerDriverSetTimerPeriod (
@@ -136,6 +213,21 @@ TimerDriverSetTimerPeriod (
   return Status;
 }
 
+
+/**\r
+  This function retrieves the period of timer interrupts in 100 ns units, \r
+  returns that value in TimerPeriod, and returns EFI_SUCCESS.  If TimerPeriod \r
+  is NULL, then EFI_INVALID_PARAMETER is returned.  If a TimerPeriod of 0 is \r
+  returned, then the timer is currently disabled.\r
+\r
+  @param  This             The EFI_TIMER_ARCH_PROTOCOL instance.\r
+  @param  TimerPeriod      A pointer to the timer period to retrieve in 100 ns units. If\r
+                           0 is returned, then the timer is currently disabled.\r
+\r
+  @retval EFI_SUCCESS           The timer period was returned in TimerPeriod.\r
+  @retval EFI_INVALID_PARAMETER TimerPeriod is NULL.\r
+\r
+**/
 EFI_STATUS
 EFIAPI
 TimerDriverGetTimerPeriod (
@@ -151,6 +243,21 @@ TimerDriverGetTimerPeriod (
   return EFI_SUCCESS;
 }
 
+/**\r
+  This function generates a soft timer interrupt. If the platform does not support soft \r
+  timer interrupts, then EFI_UNSUPPORTED is returned. Otherwise, EFI_SUCCESS is returned. \r
+  If a handler has been registered through the EFI_TIMER_ARCH_PROTOCOL.RegisterHandler() \r
+  service, then a soft timer interrupt will be generated. If the timer interrupt is \r
+  enabled when this service is called, then the registered handler will be invoked. The \r
+  registered handler should not be able to distinguish a hardware-generated timer \r
+  interrupt from a software-generated timer interrupt.\r
+\r
+  @param  This             The EFI_TIMER_ARCH_PROTOCOL instance.\r
+\r
+  @retval EFI_SUCCESS           The soft timer interrupt was generated.\r
+  @retval EFI_UNSUPPORTED       The platform does not support the generation of soft timer interrupts.\r
+\r
+**/
 EFI_STATUS
 EFIAPI
 TimerDriverGenerateSoftInterrupt (
@@ -160,6 +267,7 @@ TimerDriverGenerateSoftInterrupt (
   return EFI_UNSUPPORTED;
 }
 
+
 EFI_STATUS
 EFIAPI
 TimerDriverRegisterPeriodicCallback (
@@ -180,6 +288,41 @@ TimerDriverRegisterPeriodicCallback (
   return EFI_SUCCESS;
 }
 
+
+/**\r
+  Interface stucture for the Timer Architectural Protocol.\r
+\r
+  @par Protocol Description:\r
+  This protocol provides the services to initialize a periodic timer \r
+  interrupt, and to register a handler that is called each time the timer\r
+  interrupt fires.  It may also provide a service to adjust the rate of the\r
+  periodic timer interrupt.  When a timer interrupt occurs, the handler is \r
+  passed the amount of time that has passed since the previous timer \r
+  interrupt.\r
+\r
+  @param RegisterHandler\r
+  Registers a handler that will be called each time the \r
+  timer interrupt fires.  TimerPeriod defines the minimum \r
+  time between timer interrupts, so TimerPeriod will also \r
+  be the minimum time between calls to the registered \r
+  handler.\r
+\r
+  @param SetTimerPeriod\r
+  Sets the period of the timer interrupt in 100 nS units.  \r
+  This function is optional, and may return EFI_UNSUPPORTED.  \r
+  If this function is supported, then the timer period will \r
+  be rounded up to the nearest supported timer period.\r
+\r
+  @param GetTimerPeriod\r
+  Retrieves the period of the timer interrupt in 100 nS units.\r
+\r
+  @param GenerateSoftInterrupt\r
+  Generates a soft timer interrupt that simulates the firing of \r
+  the timer interrupt. This service can be used to invoke the \r
+  registered handler if the timer interrupt has been masked for \r
+  a period of time.\r
+\r
+**/
 EFI_TIMER_ARCH_PROTOCOL   gTimer = {
   TimerDriverRegisterHandler,
   TimerDriverSetTimerPeriod,
@@ -191,6 +334,20 @@ TIMER_DEBUG_SUPPORT_PROTOCOL  gTimerDebugSupport = {
   TimerDriverRegisterPeriodicCallback
 };
 
+
+/**\r
+  Initialize the state information for the Timer Architectural Protocol and\r
+  the Timer Debug support protocol that allows the debugger to break into a\r
+  running program.\r
+\r
+  @param  ImageHandle   of the loaded driver\r
+  @param  SystemTable   Pointer to the System Table\r
+\r
+  @retval EFI_SUCCESS           Protocol registered\r
+  @retval EFI_OUT_OF_RESOURCES  Cannot allocate protocol data structure\r
+  @retval EFI_DEVICE_ERROR      Hardware problems\r
+\r
+**/
 EFI_STATUS
 EFIAPI
 TimerInitialize (