Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
1.8 KiB

  1. // TITLE("Manipulate Interrupt Request Level")
  2. //++
  3. //
  4. // Copyright (c) 1990 Microsoft Corporation
  5. // Copyright (c) 1992 Microsoft Corporation
  6. //
  7. // Module Name:
  8. //
  9. // irql.s
  10. //
  11. // Abstract:
  12. //
  13. // This module implements the code necessary to lower and raise the current
  14. // Interrupt Request Level (IRQL).
  15. //
  16. //
  17. // Author:
  18. //
  19. // David N. Cutler (davec) 12-Aug-1990
  20. // Joe Notarangelo 06-Apr-1992
  21. //
  22. // Environment:
  23. //
  24. // Kernel mode only.
  25. //
  26. // Revision History:
  27. //
  28. //--
  29. #include "ksalpha.h"
  30. //++
  31. //
  32. // VOID
  33. // KeLowerIrql (
  34. // KIRQL NewIrql
  35. // )
  36. //
  37. // Routine Description:
  38. //
  39. // This function lowers the current IRQL to the specified value.
  40. //
  41. // Arguments:
  42. //
  43. // NewIrql (a0) - Supplies the new IRQL value.
  44. //
  45. // Return Value:
  46. //
  47. // None.
  48. //
  49. //--
  50. LEAF_ENTRY(KeLowerIrql)
  51. SWAP_IRQL // a0 = new, on return v0 = old irql
  52. ret zero, (ra) // return
  53. .end KeLowerIrql
  54. //++
  55. //
  56. // VOID
  57. // KeRaiseIrql (
  58. // KIRQL NewIrql,
  59. // PKIRQL OldIrql
  60. // )
  61. //
  62. // Routine Description:
  63. //
  64. // This function raises the current IRQL to the specified value and returns
  65. // the old IRQL value.
  66. //
  67. // Arguments:
  68. //
  69. // NewIrql (a0) - Supplies the new IRQL value.
  70. //
  71. // OldIrql (a1) - Supplies a pointer to a variable that recieves the old
  72. // IRQL value.
  73. //
  74. // Return Value:
  75. //
  76. // None.
  77. //
  78. //--
  79. LEAF_ENTRY(KeRaiseIrql)
  80. bis a1, zero, t0 // save pointer to old irql
  81. SWAP_IRQL // a0 = new, on return v0 = old irql
  82. ldq_u t1, 0(t0) // get quadword around old irql
  83. bic t0, 0x3, t3 // get containing longword address
  84. insbl v0, t0, t2 // put destination byte into position
  85. mskbl t1, t0, t1 // clear destination byte
  86. bis t1, t2, t1 // merge destination byte
  87. extll t1, t3, t1 // get appropriate longword
  88. stl t1, 0(t3) // store byte
  89. ret zero, (ra) // return
  90. .end KeRaiseIrql
  91.