edk2.patch-idtgdt revision ad27e1d5e48ca41245120c331cc88b50464813ce
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing ChinaIndex: UefiCpuPkg/CpuDxe/CpuDxe.inf
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China===================================================================
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China--- UefiCpuPkg/CpuDxe/CpuDxe.inf (revision 9332)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+++ UefiCpuPkg/CpuDxe/CpuDxe.inf (working copy)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China@@ -62,6 +62,9 @@
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China gEfiCpuArchProtocolGuid
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ gEfiEventVirtualAddressChangeGuid # ALWAYS_CONSUMED Create Event: EVENT_GROUP_GUID
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing ChinaIndex: UefiCpuPkg/CpuDxe/CpuGdt.c
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China===================================================================
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China--- UefiCpuPkg/CpuDxe/CpuGdt.c (revision 9332)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+++ UefiCpuPkg/CpuDxe/CpuGdt.c (working copy)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China@@ -67,6 +67,9 @@
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China #error CPU type not supported for CPU GDT initialization!
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China // Global descriptor table (GDT) Template
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China@@ -161,6 +164,20 @@
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+LoadGdt(VOID* Gdt, UINT32 GdtSize)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ IA32_DESCRIPTOR gdtPtr;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ // Write GDT register
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ gdtPtr.Base = (UINT32)(UINTN)Gdt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ gdtPtr.Limit = GdtSize - 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ AsmWriteGdtr (&gdtPtr);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China Initialize Global Descriptor Table
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China@@ -169,27 +186,27 @@
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China InitGlobalDescriptorTable (
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- GDT_ENTRIES *gdt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- IA32_DESCRIPTOR gdtPtr;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China // Allocate Runtime Data for the GDT
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- gdt = AllocateRuntimePool (sizeof (GdtTemplate) + 8);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- ASSERT (gdt != NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- gdt = ALIGN_POINTER (gdt, 8);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ GdtSize = sizeof (GdtTemplate);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ Gdt = AllocateRuntimePool (GdtSize + 8);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ ASSERT (Gdt != NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ Gdt = ALIGN_POINTER (Gdt, 8);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ Gdt = (VOID*)(UINTN)HandyCpuPage;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China // Initialize all GDT entries
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- CopyMem (gdt, &GdtTemplate, sizeof (GdtTemplate));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ CopyMem (Gdt, &GdtTemplate, GdtSize);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China // Write GDT register
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- gdtPtr.Base = (UINT32)(UINTN)(VOID*) gdt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- gdtPtr.Limit = sizeof (GdtTemplate) - 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- AsmWriteGdtr (&gdtPtr);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ LoadGdt(Gdt, GdtSize);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China // Update selector (segment) registers base on new GDT
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China@@ -197,4 +214,3 @@
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China SetCodeSelector ((UINT16)CPU_CODE_SEL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China SetDataSelectors ((UINT16)CPU_DATA_SEL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing ChinaIndex: UefiCpuPkg/CpuDxe/CpuDxe.c
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China===================================================================
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China--- UefiCpuPkg/CpuDxe/CpuDxe.c (revision 9332)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+++ UefiCpuPkg/CpuDxe/CpuDxe.c (working copy)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China@@ -14,11 +14,14 @@
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China #include "CpuDxe.h"
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+EFI_EVENT mEfiVirtualNotifyEvent;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+EFI_PHYSICAL_ADDRESS HandyCpuPage;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+IA32_IDT_GATE_DESCRIPTOR* Idt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China // Global Variables
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China-IA32_IDT_GATE_DESCRIPTOR gIdtTable[INTERRUPT_VECTOR_NUMBER] = { 0 };
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China EFI_CPU_INTERRUPT_HANDLER ExternalVectorTable[0x100];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China BOOLEAN InterruptState = FALSE;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China EFI_HANDLE mCpuHandle = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China@@ -1004,8 +1007,6 @@
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China EFI_STATUS Status;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- VOID *IdtPtrAlignmentBuffer;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- IA32_DESCRIPTOR *IdtPtr;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China UINTN CurrentHandler;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China@@ -1015,27 +1016,33 @@
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China // Initialize IDT
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China CurrentHandler = (UINTN)AsmIdtVector00;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ // Allocate Runtime Data for the IDT
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ IdtSize = INTERRUPT_VECTOR_NUMBER*sizeof(IA32_IDT_GATE_DESCRIPTOR);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ Idt = AllocateRuntimePool (IdtSize + 16);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ ASSERT (Idt != NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ Idt = ALIGN_POINTER (Idt, 16);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ Idt = (VOID*)(UINTN)HandyCpuPage + 0x500;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (Index = 0; Index < INTERRUPT_VECTOR_NUMBER; Index ++, CurrentHandler += 0x08) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- gIdtTable[Index].Bits.OffsetLow = (UINT16)CurrentHandler;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- gIdtTable[Index].Bits.Selector = AsmReadCs();
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- gIdtTable[Index].Bits.Reserved_0 = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- gIdtTable[Index].Bits.GateType = IA32_IDT_GATE_TYPE_INTERRUPT_32;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- gIdtTable[Index].Bits.OffsetHigh = (UINT16)(CurrentHandler >> 16);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ Idt[Index].Bits.OffsetLow = (UINT16)CurrentHandler;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ Idt[Index].Bits.Selector = AsmReadCs();
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ Idt[Index].Bits.Reserved_0 = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ Idt[Index].Bits.GateType = IA32_IDT_GATE_TYPE_INTERRUPT_32;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ Idt[Index].Bits.OffsetHigh = (UINT16)(CurrentHandler >> 16);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China #if defined (MDE_CPU_X64)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- gIdtTable[Index].Bits.OffsetUpper = (UINT32)(CurrentHandler >> 32);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- gIdtTable[Index].Bits.Reserved_1 = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ Idt[Index].Bits.OffsetUpper = (UINT32)(CurrentHandler >> 32);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ Idt[Index].Bits.Reserved_1 = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- // Load IDT Pointer
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- IdtPtrAlignmentBuffer = AllocatePool (sizeof (*IdtPtr) + 16);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- IdtPtr = ALIGN_POINTER (IdtPtrAlignmentBuffer, 16);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- IdtPtr->Base = (UINT32)(((UINTN)(VOID*) gIdtTable) & (BASE_4GB-1));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- IdtPtr->Limit = sizeof (gIdtTable) - 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- AsmWriteIdtr (IdtPtr);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China- FreePool (IdtPtrAlignmentBuffer);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ LoadIdt(Idt, IdtSize);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China // Initialize Exception Handlers
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China@@ -1052,7 +1059,50 @@
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+LoadIdt(VOID* Idt, UINT32 IdtSize)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ IA32_DESCRIPTOR IdtPtr;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ IdtPtr.Base = (UINT32)(((UINTN) Idt) & (BASE_4GB-1));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ IdtPtr.Limit = IdtSize - 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ AsmWriteIdtr (&IdtPtr);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ IN UINT32 Value
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ __asm__ __volatile__ ("outl %0,%w1" : : "a" (Value), "d" ((UINT16)Port));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+CpuLibVirtualNotifyEvent (
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ IN EFI_EVENT Event,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ IN VOID *Context
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ EFI_RUNTIME_SERVICES * rs = (EFI_RUNTIME_SERVICES *)Context;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ rs->ConvertPointer (0, (VOID **) &Gdt);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ rs->ConvertPointer (0, (VOID **) &Idt);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ DisableInterrupts();
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ LoadIdt(Idt, IdtSize);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ LoadGdt(Gdt, GdtSize);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ //IoWrite32(0xef11, 1);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+extern EFI_GUID gEfiEventVirtualAddressChangeGuid;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China Initialize the state information for the CPU Architectural Protocol.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China@@ -1073,6 +1123,17 @@
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China EFI_STATUS Status;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ // Allocate handy page
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ HandyCpuPage = 0xffffffff;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ Status = gBS->AllocatePages (
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ AllocateMaxAddress,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ EfiReservedMemoryType,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ &HandyCpuPage );
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ ASSERT_EFI_ERROR (Status);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ ASSERT (HandyCpuPage != 0xffffffff);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China // Make sure interrupts are disabled
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China@@ -1103,6 +1164,18 @@
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China RefreshGcdMemoryAttributes ();
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ // Register virtual address change notifier
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ gBS->CreateEventEx (
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ EVT_NOTIFY_SIGNAL,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ CpuLibVirtualNotifyEvent,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ SystemTable->RuntimeServices,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ &gEfiEventVirtualAddressChangeGuid,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+ &mEfiVirtualNotifyEvent
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing ChinaIndex: UefiCpuPkg/CpuDxe/CpuDxe.h
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China===================================================================
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China--- UefiCpuPkg/CpuDxe/CpuDxe.h (revision 9332)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+++ UefiCpuPkg/CpuDxe/CpuDxe.h (working copy)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China@@ -136,5 +136,17 @@
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+LoadGdt(VOID* Gdt, UINT32 GdtSize);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+LoadIdt(VOID* Idt, UINT32 IdtSize);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+extern EFI_PHYSICAL_ADDRESS HandyCpuPage;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+extern VOID* Gdt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+extern UINT32 GdtSize;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+extern IA32_IDT_GATE_DESCRIPTOR* Idt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China+extern UINT32 IdtSize;