Exemple #1
0
/**
  Lowers the task priority to the previous value.   If the new
  priority unmasks events at a higher priority, they are dispatched.

  @param  NewTpl  New, lower, task priority

**/
VOID
EFIAPI
CoreRestoreTpl (
  IN EFI_TPL NewTpl
  )
{
  EFI_TPL     OldTpl;
  EFI_TPL     PendingTpl;

  OldTpl = gEfiCurrentTpl;
  if (NewTpl > OldTpl) {
    DEBUG ((EFI_D_ERROR, "FATAL ERROR - RestoreTpl with NewTpl(0x%x) > OldTpl(0x%x)\n", NewTpl, OldTpl));
    ASSERT (FALSE);
  }
  ASSERT (VALID_TPL (NewTpl));

  //
  // If lowering below HIGH_LEVEL, make sure
  // interrupts are enabled
  //

  if (OldTpl >= TPL_HIGH_LEVEL  &&  NewTpl < TPL_HIGH_LEVEL) {
    gEfiCurrentTpl = TPL_HIGH_LEVEL;
  }

  //
  // Dispatch any pending events
  //
  while (gEventPending != 0) {
    PendingTpl = (UINTN) HighBitSet64 (gEventPending);
    if (PendingTpl <= NewTpl) {
      break;
    }

    gEfiCurrentTpl = PendingTpl;
    if (gEfiCurrentTpl < TPL_HIGH_LEVEL) {
      CoreSetInterruptState (TRUE);
    }
    CoreDispatchEventNotifies (gEfiCurrentTpl);
  }

  //
  // Set the new value
  //

  gEfiCurrentTpl = NewTpl;

  //
  // If lowering below HIGH_LEVEL, make sure
  // interrupts are enabled
  //
  if (gEfiCurrentTpl < TPL_HIGH_LEVEL) {
    CoreSetInterruptState (TRUE);
  }

}
Exemple #2
0
/**
  Lowers the task priority to the previous value.   If the new
  priority unmasks events at a higher priority, they are dispatched.

  @param  NewTpl  New, lower, task priority

**/
VOID
EFIAPI
CoreRestoreTpl (
    IN EFI_TPL NewTpl
)
{
    EFI_TPL     OldTpl;

    OldTpl = gEfiCurrentTpl;
    ASSERT (NewTpl <= OldTpl);
    ASSERT (VALID_TPL (NewTpl));

    //
    // If lowering below HIGH_LEVEL, make sure
    // interrupts are enabled
    //

    if (OldTpl >= TPL_HIGH_LEVEL  &&  NewTpl < TPL_HIGH_LEVEL) {
        gEfiCurrentTpl = TPL_HIGH_LEVEL;
    }

    //
    // Dispatch any pending events
    //
    while (((-2 << NewTpl) & gEventPending) != 0) {
        gEfiCurrentTpl = HighBitSet64 (gEventPending);
        if (gEfiCurrentTpl < TPL_HIGH_LEVEL) {
            CoreSetInterruptState (TRUE);
        }
        CoreDispatchEventNotifies (gEfiCurrentTpl);
    }

    //
    // Set the new value
    //

    gEfiCurrentTpl = NewTpl;

    //
    // If lowering below HIGH_LEVEL, make sure
    // interrupts are enabled
    //
    if (gEfiCurrentTpl < TPL_HIGH_LEVEL) {
        CoreSetInterruptState (TRUE);
    }

}
Exemple #3
0
EFI_BOOTSERVICE
VOID
EFIAPI
CoreRestoreTpl (
  IN EFI_TPL NewTpl
  )
/*++

Routine Description:

  Lowers the task priority to the previous value.   If the new 
  priority unmasks events at a higher priority, they are dispatched.

Arguments:

  NewTpl  - New, lower, task priority
    
Returns:

  None

--*/
{
  EFI_TPL     OldTpl;

  OldTpl = gEfiCurrentTpl;
  ASSERT (NewTpl <= OldTpl);
  ASSERT (VALID_TPL (NewTpl));

  //
  // If lowering below HIGH_LEVEL, make sure
  // interrupts are enabled
  //

  if (OldTpl >= EFI_TPL_HIGH_LEVEL  &&  NewTpl < EFI_TPL_HIGH_LEVEL) {
    gEfiCurrentTpl = EFI_TPL_HIGH_LEVEL;  
  }

  //
  // Dispatch any pending events
  //

  while ((-2 << NewTpl) & gEventPending) {
    gEfiCurrentTpl = CoreHighestSetBit (gEventPending);
    if (gEfiCurrentTpl < EFI_TPL_HIGH_LEVEL) {
      CoreSetInterruptState (TRUE);
    }
    CoreDispatchEventNotifies (gEfiCurrentTpl);
  }

  //
  // Set the new value
  //

  gEfiCurrentTpl = NewTpl;

  //
  // If lowering below HIGH_LEVEL, make sure
  // interrupts are enabled
  //
  if (gEfiCurrentTpl < EFI_TPL_HIGH_LEVEL) {
    CoreSetInterruptState (TRUE);
  }

}