亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? irql.c

?? 這是一個(gè)開放源代碼的與WINNT/WIN2K/WIN2003兼容的操作系統(tǒng)
?? C
字號(hào):
/* $Id$
 *
 * COPYRIGHT:       See COPYING in the top level directory
 * PROJECT:         ReactOS kernel
 * FILE:            ntoskrnl/hal/x86/irql.c
 * PURPOSE:         Implements IRQLs
 * PROGRAMMER:      David Welch (welch@cwcom.net)
 */

/* INCLUDES *****************************************************************/

#include <hal.h>
#define NDEBUG
#include <debug.h>

/* GLOBALS ******************************************************************/

/*
 * FIXME: Use EISA_CONTROL STRUCTURE INSTEAD OF HARD-CODED OFFSETS 
*/

typedef union
{
   USHORT both;
   struct
   {
      UCHAR master;
      UCHAR slave;
   };
}
PIC_MASK;
   
/* 
 * PURPOSE: - Mask for HalEnableSystemInterrupt and HalDisableSystemInterrupt
 *          - At startup enable timer and cascade 
 */
#if defined(__GNUC__)
static PIC_MASK pic_mask = {.both = 0xFFFA};
#else
static PIC_MASK pic_mask = { 0xFFFA };
#endif


/*
 * PURPOSE: Mask for disabling of acknowledged interrupts 
 */
#if defined(__GNUC__)
static PIC_MASK pic_mask_intr = {.both = 0x0000};
#else
static PIC_MASK pic_mask_intr = { 0 };
#endif

static ULONG HalpPendingInterruptCount[NR_IRQS];

#define DIRQL_TO_IRQ(x)  (PROFILE_LEVEL - x)
#define IRQ_TO_DIRQL(x)  (PROFILE_LEVEL - x)

#ifdef _MSC_VER

#define KiInterruptDispatch2(x, y)

#else

VOID STDCALL
KiInterruptDispatch2 (ULONG Irq, KIRQL old_level);

#endif

/* FUNCTIONS ****************************************************************/

#undef KeGetCurrentIrql
KIRQL STDCALL KeGetCurrentIrql (VOID)
/*
 * PURPOSE: Returns the current irq level
 * RETURNS: The current irq level
 */
{
  return(KeGetPcr()->Irql);
}

VOID NTAPI HalpInitPICs(VOID)
{
  memset(HalpPendingInterruptCount, 0, sizeof(HalpPendingInterruptCount));

  /* Initialization sequence */
  WRITE_PORT_UCHAR((PUCHAR)0x20, 0x11);
  WRITE_PORT_UCHAR((PUCHAR)0xa0, 0x11);
  /* Start of hardware irqs (0x24) */
  WRITE_PORT_UCHAR((PUCHAR)0x21, IRQ_BASE);
  WRITE_PORT_UCHAR((PUCHAR)0xa1, IRQ_BASE + 8);
  /* 8259-1 is master */
  WRITE_PORT_UCHAR((PUCHAR)0x21, 0x4);
  /* 8259-2 is slave */
  WRITE_PORT_UCHAR((PUCHAR)0xa1, 0x2);
  /* 8086 mode */
  WRITE_PORT_UCHAR((PUCHAR)0x21, 0x1);
  WRITE_PORT_UCHAR((PUCHAR)0xa1, 0x1);   
  /* Enable interrupts */
  WRITE_PORT_UCHAR((PUCHAR)0x21, 0xFF);
  WRITE_PORT_UCHAR((PUCHAR)0xa1, 0xFF);
  
  /* We can now enable interrupts */
  _enable();
}

VOID HalpEndSystemInterrupt(KIRQL Irql)
/*
 * FUNCTION: Enable all irqs with higher priority.
 */
{
  const USHORT mask[] = 
  {
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
     0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0xc000, 0xe000, 0xf000,
     0xf800, 0xfc00, 0xfe00, 0xff00, 0xff80, 0xffc0, 0xffe0, 0xfff0,
     0xfff8, 0xfffc, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
  };     

  /* Interrupts should be disable while enabling irqs of both pics */
  _disable();

  pic_mask_intr.both &= mask[Irql];
  WRITE_PORT_UCHAR((PUCHAR)0x21, (UCHAR)(pic_mask.master|pic_mask_intr.master));
  WRITE_PORT_UCHAR((PUCHAR)0xa1, (UCHAR)(pic_mask.slave|pic_mask_intr.slave));

  /* restore ints */
  _enable();
}

VOID
HalpHardwareInt30(VOID)
{
    __asm__ __volatile__ ("int $0x30");
}

VOID
HalpHardwareInt31(VOID)
{
    __asm__ __volatile__ ("int $0x31");
}

VOID
HalpHardwareInt32(VOID)
{
    __asm__ __volatile__ ("int $0x32");
}

VOID
HalpHardwareInt33(VOID)
{
    __asm__ __volatile__ ("int $0x33");
}

VOID
HalpHardwareInt34(VOID)
{
    __asm__ __volatile__ ("int $0x34");
}

VOID
HalpHardwareInt35(VOID)
{
    __asm__ __volatile__ ("int $0x35");
}

VOID
HalpHardwareInt36(VOID)
{
    __asm__ __volatile__ ("int $0x36");
}

VOID
HalpHardwareInt37(VOID)
{
    __asm__ __volatile__ ("int $0x37");
}

VOID
HalpHardwareInt38(VOID)
{
    __asm__ __volatile__ ("int $0x38");
}

VOID
HalpHardwareInt39(VOID)
{
    __asm__ __volatile__ ("int $0x39");
}

VOID
HalpHardwareInt3A(VOID)
{
    __asm__ __volatile__ ("int $0x3A");
}

VOID
HalpHardwareInt3B(VOID)
{
    __asm__ __volatile__ ("int $0x3B");
}

VOID
HalpHardwareInt3C(VOID)
{
    __asm__ __volatile__ ("int $0x3C");
}

VOID
HalpHardwareInt3D(VOID)
{
    __asm__ __volatile__ ("int $0x3D");
}

VOID
HalpHardwareInt3E(VOID)
{
    __asm__ __volatile__ ("int $0x3E");
    while (TRUE);
}

VOID
HalpHardwareInt3F(VOID)
{
    __asm__ __volatile__ ("int $0x3F");
}


typedef VOID (*PHARDWARE_INT)(VOID);

PHARDWARE_INT HalpHardwareInt[NR_IRQS] =
{
    HalpHardwareInt30,
    HalpHardwareInt31,
    HalpHardwareInt32,
    HalpHardwareInt33,
    HalpHardwareInt34,
    HalpHardwareInt35,
    HalpHardwareInt36,
    HalpHardwareInt37,
    HalpHardwareInt38,
    HalpHardwareInt39,
    HalpHardwareInt3A,
    HalpHardwareInt3B,
    HalpHardwareInt3C,
    HalpHardwareInt3D,
    HalpHardwareInt3E,
    HalpHardwareInt3F
};

VOID
HalpExecuteIrqs(KIRQL NewIrql)
{
  ULONG IrqLimit, i;
  IrqLimit = min(PROFILE_LEVEL - NewIrql, NR_IRQS);

  /*
   * For each irq if there have been any deferred interrupts then now
   * dispatch them.
   */
  for (i = 0; i < IrqLimit; i++)
    {
      if (HalpPendingInterruptCount[i] > 0)
	{
	   KeGetPcr()->Irql = (KIRQL)IRQ_TO_DIRQL(i);

           while (HalpPendingInterruptCount[i] > 0)
	     {
	       /*
	        * For each deferred interrupt execute all the handlers at DIRQL.
	        */
	       HalpPendingInterruptCount[i]--;
           HalpHardwareInt[i]();
	     }
	   //KeGetPcr()->Irql--;
	   //HalpEndSystemInterrupt(KeGetPcr()->Irql);
	}
    }

}

VOID
HalpLowerIrql(KIRQL NewIrql)
{
  if (NewIrql >= PROFILE_LEVEL)
    {
      KeGetPcr()->Irql = NewIrql;
      return;
    }
  HalpExecuteIrqs(NewIrql);
  if (NewIrql >= DISPATCH_LEVEL)
    {
      KeGetPcr()->Irql = NewIrql;
      return;
    }
  KeGetPcr()->Irql = DISPATCH_LEVEL;
  if (((PKIPCR)KeGetPcr())->HalReserved[HAL_DPC_REQUEST])
    {
      ((PKIPCR)KeGetPcr())->HalReserved[HAL_DPC_REQUEST] = FALSE;
      KiDispatchInterrupt();
    }
  KeGetPcr()->Irql = APC_LEVEL;
  if (NewIrql == APC_LEVEL)
    {
      return;
    }
  if (KeGetCurrentThread() != NULL && 
      KeGetCurrentThread()->ApcState.KernelApcPending)
    {
      KiDeliverApc(KernelMode, NULL, NULL);
    }
  KeGetPcr()->Irql = PASSIVE_LEVEL;
}

/**********************************************************************
 * NAME							EXPORTED
 *	KfLowerIrql
 *
 * DESCRIPTION
 *	Restores the irq level on the current processor
 *
 * ARGUMENTS
 *	NewIrql = Irql to lower to
 *
 * RETURN VALUE
 *	None
 *
 * NOTES
 *	Uses fastcall convention
 */
VOID FASTCALL
KfLowerIrql (KIRQL	NewIrql)
{
  DPRINT("KfLowerIrql(NewIrql %d)\n", NewIrql);
  
  if (NewIrql > KeGetPcr()->Irql)
    {
      DbgPrint ("(%s:%d) NewIrql %x CurrentIrql %x\n",
		__FILE__, __LINE__, NewIrql, KeGetPcr()->Irql);
      KEBUGCHECK(0);
      for(;;);
    }
  
  HalpLowerIrql(NewIrql);
}

/**********************************************************************
 * NAME							EXPORTED
 *	KfRaiseIrql
 *
 * DESCRIPTION
 *	Raises the hardware priority (irql)
 *
 * ARGUMENTS
 *	NewIrql = Irql to raise to
 *
 * RETURN VALUE
 *	previous irq level
 *
 * NOTES
 *	Uses fastcall convention
 */

KIRQL FASTCALL
KfRaiseIrql (KIRQL	NewIrql)
{
  KIRQL OldIrql;
  
  DPRINT("KfRaiseIrql(NewIrql %d)\n", NewIrql);
  
  if (NewIrql < KeGetPcr()->Irql)
    {
      DbgPrint ("%s:%d CurrentIrql %x NewIrql %x\n",
		__FILE__,__LINE__,KeGetPcr()->Irql,NewIrql);
      KEBUGCHECK (0);
      for(;;);
    }
  
  OldIrql = KeGetPcr()->Irql;
  KeGetPcr()->Irql = NewIrql;
  return OldIrql;
}

/**********************************************************************
 * NAME							EXPORTED
 *	KeRaiseIrqlToDpcLevel
 *
 * DESCRIPTION
 *	Raises the hardware priority (irql) to DISPATCH level
 *
 * ARGUMENTS
 *	None
 *
 * RETURN VALUE
 *	Previous irq level
 *
 * NOTES
 *	Calls KfRaiseIrql
 */

KIRQL STDCALL
KeRaiseIrqlToDpcLevel (VOID)
{
  return KfRaiseIrql (DISPATCH_LEVEL);
}


/**********************************************************************
 * NAME							EXPORTED
 *	KeRaiseIrqlToSynchLevel
 *
 * DESCRIPTION
 *	Raises the hardware priority (irql) to CLOCK2 level
 *
 * ARGUMENTS
 *	None
 *
 * RETURN VALUE
 *	Previous irq level
 *
 * NOTES
 *	Calls KfRaiseIrql
 */

KIRQL STDCALL
KeRaiseIrqlToSynchLevel (VOID)
{
  return KfRaiseIrql (DISPATCH_LEVEL);
}


BOOLEAN STDCALL 
HalBeginSystemInterrupt (KIRQL Irql,
			 ULONG Vector,
			 PKIRQL OldIrql)
{
  ULONG irq;
  if (Vector < IRQ_BASE || Vector >= IRQ_BASE + NR_IRQS)
    {
      return(FALSE);
    }
  irq = Vector - IRQ_BASE;
  pic_mask_intr.both |= ((1 << irq) & 0xfffe);	// do not disable the timer interrupt

  if (irq < 8)
  {
     WRITE_PORT_UCHAR((PUCHAR)0x21, (UCHAR)(pic_mask.master|pic_mask_intr.master));
     WRITE_PORT_UCHAR((PUCHAR)0x20, 0x20);
  }
  else
  {
     WRITE_PORT_UCHAR((PUCHAR)0xa1, (UCHAR)(pic_mask.slave|pic_mask_intr.slave));
     /* Send EOI to the PICs */
     WRITE_PORT_UCHAR((PUCHAR)0x20,0x20);
     WRITE_PORT_UCHAR((PUCHAR)0xa0,0x20);
  }
#if 0
  if (KeGetPcr()->Irql >= Irql)
    {
      HalpPendingInterruptCount[irq]++;
      return(FALSE);
    }
#endif
  *OldIrql = KeGetPcr()->Irql;
  KeGetPcr()->Irql = Irql;

  return(TRUE);
}


VOID STDCALL HalEndSystemInterrupt (KIRQL Irql, ULONG Unknown2)
/*
 * FUNCTION: Finish a system interrupt and restore the specified irq level.
 */
{
  HalpLowerIrql(Irql);
  HalpEndSystemInterrupt(Irql);
}
  
BOOLEAN
STDCALL
HalDisableSystemInterrupt(
  ULONG Vector,
  KIRQL Irql)
{
  ULONG irq;
  
  if (Vector < IRQ_BASE || Vector >= IRQ_BASE + NR_IRQS)
    return FALSE;

  irq = Vector - IRQ_BASE;
  pic_mask.both |= (1 << irq);
  if (irq < 8)
     {
      WRITE_PORT_UCHAR((PUCHAR)0x21, (UCHAR)(pic_mask.master|pic_mask_intr.slave));
     }
  else
    {
      WRITE_PORT_UCHAR((PUCHAR)0xa1, (UCHAR)(pic_mask.slave|pic_mask_intr.slave));
    }
  
  return TRUE;
}


BOOLEAN
STDCALL
HalEnableSystemInterrupt(
  ULONG Vector,
  KIRQL Irql,
  KINTERRUPT_MODE InterruptMode)
{
  ULONG irq;

  if (Vector < IRQ_BASE || Vector >= IRQ_BASE + NR_IRQS)
    return FALSE;

  irq = Vector - IRQ_BASE;
  pic_mask.both &= ~(1 << irq);
  if (irq < 8)
    {
      WRITE_PORT_UCHAR((PUCHAR)0x21, (UCHAR)(pic_mask.master|pic_mask_intr.master));
    }
  else
     {
       WRITE_PORT_UCHAR((PUCHAR)0xa1, (UCHAR)(pic_mask.slave|pic_mask_intr.slave));
     }

  return TRUE;
}


VOID FASTCALL
HalRequestSoftwareInterrupt(
  IN KIRQL Request)
{
  switch (Request)
  {
    case APC_LEVEL:
      ((PKIPCR)KeGetPcr())->HalReserved[HAL_APC_REQUEST] = TRUE;
      break;

    case DISPATCH_LEVEL:
      ((PKIPCR)KeGetPcr())->HalReserved[HAL_DPC_REQUEST] = TRUE;
      break;
      
    default:
      KEBUGCHECK(0);
  }
}

VOID FASTCALL
HalClearSoftwareInterrupt(
  IN KIRQL Request)
{
  switch (Request)
  {
    case APC_LEVEL:
      ((PKIPCR)KeGetPcr())->HalReserved[HAL_APC_REQUEST] = FALSE;
      break;

    case DISPATCH_LEVEL:
      ((PKIPCR)KeGetPcr())->HalReserved[HAL_DPC_REQUEST] = FALSE;
      break;
      
    default:
      KEBUGCHECK(0);
  }
}

/* EOF */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人动漫精品| 国产精品嫩草99a| 久久综合色播五月| **欧美大码日韩| 午夜精彩视频在线观看不卡| 国产在线播放一区| 99久久国产综合精品色伊| 欧美日韩久久久久久| 精品国一区二区三区| 亚洲色图一区二区三区| 免费国产亚洲视频| av在线播放一区二区三区| 777奇米成人网| 国产女主播视频一区二区| 一区二区三区欧美| 国产精品主播直播| 日本国产一区二区| 26uuu国产在线精品一区二区| 综合分类小说区另类春色亚洲小说欧美| 三级在线观看一区二区| 懂色av中文一区二区三区 | 国产亚洲自拍一区| 亚洲永久精品国产| 国产精品88av| 67194成人在线观看| 国产精品国产三级国产专播品爱网| 天天影视色香欲综合网老头| 成人福利电影精品一区二区在线观看| 6080yy午夜一二三区久久| 日本一区二区电影| 六月丁香婷婷色狠狠久久| 色诱视频网站一区| 久久久久久久电影| 日韩黄色片在线观看| 一本大道久久精品懂色aⅴ| 久久精品夜夜夜夜久久| 视频一区在线播放| 91蝌蚪porny九色| 久久九九影视网| 蜜桃视频在线观看一区| 在线观看视频欧美| 国产精品久线在线观看| 极品少妇xxxx精品少妇| 欧美日本精品一区二区三区| 中文字幕在线一区| 国产伦精一区二区三区| 欧美一级黄色录像| 婷婷综合另类小说色区| 91黄视频在线| 亚洲人成人一区二区在线观看 | 国产蜜臀97一区二区三区| 另类小说欧美激情| 欧美久久久久久久久| 亚洲成人午夜电影| 欧美综合亚洲图片综合区| 亚洲欧美另类小说视频| 成人精品免费看| 国产日韩欧美精品一区| 韩国女主播成人在线| 欧美一级精品大片| 蜜臀av一区二区三区| 7777精品伊人久久久大香线蕉 | 欧美男男青年gay1069videost| 亚洲女爱视频在线| www.av精品| 国产精品久久国产精麻豆99网站| 国产一区二区在线电影| 欧美精品一区二区三区在线播放| 久久国产人妖系列| 精品av久久707| 狠狠色狠狠色综合系列| 精品国产乱码久久久久久夜甘婷婷| 美女任你摸久久| 日韩视频123| 国内成+人亚洲+欧美+综合在线| 日韩欧美国产午夜精品| 六月丁香婷婷久久| 亚洲精品一区二区三区香蕉| 精品在线免费视频| 国产亚洲精品超碰| 成人免费三级在线| 中文字幕一区不卡| 日本韩国欧美一区二区三区| 洋洋av久久久久久久一区| 欧美三级中文字幕| 午夜av电影一区| 日韩欧美国产一区在线观看| 国产自产高清不卡| 国产嫩草影院久久久久| 99精品视频中文字幕| 亚洲精品免费在线播放| 欧美日韩一区二区三区在线| 日本中文字幕不卡| 久久久久久97三级| av成人老司机| 偷拍日韩校园综合在线| 精品久久人人做人人爽| 国产成人精品亚洲午夜麻豆| 国产精品久久久久影院老司| 欧美在线色视频| 捆绑变态av一区二区三区| 久久先锋影音av鲁色资源| av在线不卡电影| 亚洲h在线观看| 精品久久免费看| 99re这里都是精品| 亚洲va国产天堂va久久en| www成人在线观看| 一本大道久久a久久精品综合| 丝袜美腿一区二区三区| 久久精品亚洲精品国产欧美kt∨| 一本在线高清不卡dvd| 日韩国产欧美在线观看| 国产网红主播福利一区二区| 欧美吻胸吃奶大尺度电影| 久久av中文字幕片| 亚洲男人天堂av| 精品国产一区二区在线观看| 99久久精品国产观看| 奇米影视一区二区三区| 国产精品久久午夜夜伦鲁鲁| 欧美嫩在线观看| 国产成人综合亚洲网站| 亚洲高清三级视频| 国产日产精品1区| 欧美另类高清zo欧美| 丁香婷婷深情五月亚洲| 亚洲成人一区在线| 国产精品女人毛片| 9191久久久久久久久久久| 国产.欧美.日韩| 亚洲国产视频在线| 欧美国产丝袜视频| 91麻豆精品国产自产在线| 成人激情电影免费在线观看| 蜜臀99久久精品久久久久久软件 | 欧美天堂一区二区三区| 国产一区二区三区免费看 | 777奇米四色成人影色区| 成人av在线资源网| 精品在线观看视频| 午夜av一区二区三区| 18涩涩午夜精品.www| 精品国产一区a| 欧美视频你懂的| 成人的网站免费观看| 久久不见久久见免费视频7| 伊人一区二区三区| 国产精品美女视频| 精品国产一区二区三区四区四| 欧美色欧美亚洲另类二区| 成+人+亚洲+综合天堂| 国产一区在线精品| 日韩精品一二三| 亚洲精品va在线观看| 中文字幕av不卡| 国产亚洲视频系列| 精品国产免费久久 | 经典三级视频一区| 日韩精品一区第一页| 亚洲一区在线播放| 亚洲视频 欧洲视频| 国产精品美女久久久久久久| 精品国产伦一区二区三区免费| 91精品国产综合久久精品app| 色一区在线观看| 97精品超碰一区二区三区| 国产成人综合自拍| 国产精品2024| 精品一区二区三区久久| 青娱乐精品视频| 人人狠狠综合久久亚洲| 午夜不卡av在线| 日韩精品亚洲一区| 图片区小说区国产精品视频| 五月婷婷综合激情| 天天做天天摸天天爽国产一区 | 欧美一区二区三区思思人| 欧美日韩精品高清| 欧美福利视频导航| 欧美精品1区2区| 日韩视频一区在线观看| 日韩欧美激情四射| 26uuu色噜噜精品一区| 久久视频一区二区| 国产欧美日韩亚州综合 | 色婷婷综合久久久中文一区二区 | 亚洲五月六月丁香激情| 亚洲va韩国va欧美va| 日韩综合在线视频| 秋霞影院一区二区| 国模少妇一区二区三区| 国产成人亚洲综合a∨婷婷| 成人小视频在线观看| www.成人在线| 欧美亚洲一区二区在线观看| 欧美乱妇一区二区三区不卡视频| 欧美一卡二卡三卡| 国产亚洲欧洲一区高清在线观看| 国产精品欧美经典|