Example #1
0
/**
  Raise the task priority level to the new level.
  High level is implemented by disabling processor interrupts.

  @param  NewTpl  New task priority level

  @return The previous task priority level

**/
EFI_TPL
EFIAPI
CoreRaiseTpl (
  IN EFI_TPL      NewTpl
  )
{
  EFI_TPL     OldTpl;

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

  //
  // If raising to high level, disable interrupts
  //
  if (NewTpl >= TPL_HIGH_LEVEL  &&  OldTpl < TPL_HIGH_LEVEL) {
    CoreSetInterruptState (FALSE);
  }

  //
  // Set the new value
  //
  gEfiCurrentTpl = NewTpl;

  return OldTpl;
}
Example #2
0
/**
  Raise the task priority level to the new level.
  High level is implemented by disabling processor interrupts.

  @param  NewTpl  New task priority level

  @return The previous task priority level

**/
EFI_TPL
EFIAPI
CoreRaiseTpl (
    IN EFI_TPL      NewTpl
)
{
    EFI_TPL     OldTpl;

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

    //
    // If raising to high level, disable interrupts
    //
    if (NewTpl >= TPL_HIGH_LEVEL  &&  OldTpl < TPL_HIGH_LEVEL) {
        CoreSetInterruptState (FALSE);
    }

    //
    // Set the new value
    //
    gEfiCurrentTpl = NewTpl;

    return OldTpl;
}
Example #3
0
File: Tpl.c Project: lersek/edk2
/**
  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);
  }

}
Example #4
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);
    }

}
Example #5
0
File: tpl.c Project: Kohrara/edk
EFI_BOOTSERVICE
EFI_TPL
EFIAPI
CoreRaiseTpl (
  IN EFI_TPL      NewTpl
  )
/*++

Routine Description:

  Raise the task priority level to the new level.
  High level is implemented by disabling processor interrupts.

Arguments:

  NewTpl  - New task priority level
    
Returns:

  The previous task priority level

--*/
{
  EFI_TPL     OldTpl;

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

  //
  // If raising to high level, disable interrupts
  //
  if (NewTpl >= EFI_TPL_HIGH_LEVEL  &&  OldTpl < EFI_TPL_HIGH_LEVEL) {
    CoreSetInterruptState (FALSE);
  }

  //
  // Set the new value
  //
  gEfiCurrentTpl = NewTpl;

  return OldTpl;
}
Example #6
0
File: tpl.c Project: Kohrara/edk
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);
  }

}