diff --git a/DuetPkg/CpuDxe/Cpu.c b/DuetPkg/CpuDxe/Cpu.c deleted file mode 100644 index 8f44b97dde..0000000000 --- a/DuetPkg/CpuDxe/Cpu.c +++ /dev/null @@ -1,1225 +0,0 @@ -/*++ - -Copyright (c) 2006, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -Module Name: - Cpu.c - -Abstract: - ---*/ - -#include "CpuDxe.h" - -// -// Global Variables -// - -BOOLEAN mInterruptState = FALSE; -extern UINT32 mExceptionCodeSize; -UINTN mTimerVector = 0; -volatile EFI_CPU_INTERRUPT_HANDLER mTimerHandler = NULL; -EFI_LEGACY_8259_PROTOCOL *gLegacy8259 = NULL; -THUNK_CONTEXT mThunkContext; -#define EFI_CPU_EFLAGS_IF 0x200 - -VOID -InitializeBiosIntCaller ( - VOID - ); - -BOOLEAN -EFIAPI -LegacyBiosInt86 ( - IN UINT8 BiosInt, - IN EFI_IA32_REGISTER_SET *Regs - ); - -// -// The Cpu Architectural Protocol that this Driver produces -// -EFI_HANDLE mHandle = NULL; -EFI_CPU_ARCH_PROTOCOL mCpu = { - CpuFlushCpuDataCache, - CpuEnableInterrupt, - CpuDisableInterrupt, - CpuGetInterruptState, - CpuInit, - CpuRegisterInterruptHandler, - CpuGetTimerValue, - CpuSetMemoryAttributes, - 1, // NumberOfTimers - 4, // DmaBufferAlignment -}; - -EFI_STATUS -EFIAPI -CpuFlushCpuDataCache ( - IN EFI_CPU_ARCH_PROTOCOL *This, - IN EFI_PHYSICAL_ADDRESS Start, - IN UINT64 Length, - IN EFI_CPU_FLUSH_TYPE FlushType - ) -/*++ - -Routine Description: - Flush CPU data cache. If the instruction cache is fully coherent - with all DMA operations then function can just return EFI_SUCCESS. - -Arguments: - This - Protocol instance structure - Start - Physical address to start flushing from. - Length - Number of bytes to flush. Round up to chipset - granularity. - FlushType - Specifies the type of flush operation to perform. - -Returns: - - EFI_SUCCESS - If cache was flushed - EFI_UNSUPPORTED - If flush type is not supported. - EFI_DEVICE_ERROR - If requested range could not be flushed. - ---*/ -{ - if (FlushType == EfiCpuFlushTypeWriteBackInvalidate) { - AsmWbinvd (); - return EFI_SUCCESS; - } else if (FlushType == EfiCpuFlushTypeInvalidate) { - AsmInvd (); - return EFI_SUCCESS; - } else { - return EFI_UNSUPPORTED; - } -} - - -EFI_STATUS -EFIAPI -CpuEnableInterrupt ( - IN EFI_CPU_ARCH_PROTOCOL *This - ) -/*++ - -Routine Description: - Enables CPU interrupts. - -Arguments: - This - Protocol instance structure - -Returns: - EFI_SUCCESS - If interrupts were enabled in the CPU - EFI_DEVICE_ERROR - If interrupts could not be enabled on the CPU. - ---*/ -{ - EnableInterrupts (); - - mInterruptState = TRUE; - return EFI_SUCCESS; -} - - -EFI_STATUS -EFIAPI -CpuDisableInterrupt ( - IN EFI_CPU_ARCH_PROTOCOL *This - ) -/*++ - -Routine Description: - Disables CPU interrupts. - -Arguments: - This - Protocol instance structure - -Returns: - EFI_SUCCESS - If interrupts were disabled in the CPU. - EFI_DEVICE_ERROR - If interrupts could not be disabled on the CPU. - ---*/ -{ - DisableInterrupts (); - - mInterruptState = FALSE; - return EFI_SUCCESS; -} - - -EFI_STATUS -EFIAPI -CpuGetInterruptState ( - IN EFI_CPU_ARCH_PROTOCOL *This, - OUT BOOLEAN *State - ) -/*++ - -Routine Description: - Return the state of interrupts. - -Arguments: - This - Protocol instance structure - State - Pointer to the CPU's current interrupt state - -Returns: - EFI_SUCCESS - If interrupts were disabled in the CPU. - EFI_INVALID_PARAMETER - State is NULL. - ---*/ -{ - if (State == NULL) { - return EFI_INVALID_PARAMETER; - } - - *State = mInterruptState; - return EFI_SUCCESS; -} - - -EFI_STATUS -EFIAPI -CpuInit ( - IN EFI_CPU_ARCH_PROTOCOL *This, - IN EFI_CPU_INIT_TYPE InitType - ) - -/*++ - -Routine Description: - Generates an INIT to the CPU - -Arguments: - This - Protocol instance structure - InitType - Type of CPU INIT to perform - -Returns: - EFI_SUCCESS - If CPU INIT occurred. This value should never be - seen. - EFI_DEVICE_ERROR - If CPU INIT failed. - EFI_NOT_SUPPORTED - Requested type of CPU INIT not supported. - ---*/ -{ - return EFI_UNSUPPORTED; -} - - -EFI_STATUS -EFIAPI -CpuRegisterInterruptHandler ( - IN EFI_CPU_ARCH_PROTOCOL *This, - IN EFI_EXCEPTION_TYPE InterruptType, - IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler - ) -/*++ - -Routine Description: - Registers a function to be called from the CPU interrupt handler. - -Arguments: - This - Protocol instance structure - InterruptType - Defines which interrupt to hook. IA-32 valid range - is 0x00 through 0xFF - InterruptHandler - A pointer to a function of type - EFI_CPU_INTERRUPT_HANDLER that is called when a - processor interrupt occurs. A null pointer - is an error condition. - -Returns: - EFI_SUCCESS - If handler installed or uninstalled. - EFI_ALREADY_STARTED - InterruptHandler is not NULL, and a handler for - InterruptType was previously installed - EFI_INVALID_PARAMETER - InterruptHandler is NULL, and a handler for - InterruptType was not previously installed. - EFI_UNSUPPORTED - The interrupt specified by InterruptType is not - supported. - ---*/ -{ - if ((InterruptType < 0) || (InterruptType >= INTERRUPT_VECTOR_NUMBER)) { - return EFI_UNSUPPORTED; - } - if ((UINTN)(UINT32)InterruptType != mTimerVector) { - return EFI_UNSUPPORTED; - } - if ((mTimerHandler == NULL) && (InterruptHandler == NULL)) { - return EFI_INVALID_PARAMETER; - } else if ((mTimerHandler != NULL) && (InterruptHandler != NULL)) { - return EFI_ALREADY_STARTED; - } - mTimerHandler = InterruptHandler; - return EFI_SUCCESS; -} - -EFI_STATUS -EFIAPI -CpuGetTimerValue ( - IN EFI_CPU_ARCH_PROTOCOL *This, - IN UINT32 TimerIndex, - OUT UINT64 *TimerValue, - OUT UINT64 *TimerPeriod OPTIONAL - ) -/*++ - -Routine Description: - Returns a timer value from one of the CPU's internal timers. There is no - inherent time interval between ticks but is a function of the CPU - frequency. - -Arguments: - This - Protocol instance structure - TimerIndex - Specifies which CPU timer ie requested - TimerValue - Pointer to the returned timer value - TimerPeriod - - -Returns: - EFI_SUCCESS - If the CPU timer count was returned. - EFI_UNSUPPORTED - If the CPU does not have any readable timers - EFI_DEVICE_ERROR - If an error occurred reading the timer. - EFI_INVALID_PARAMETER - TimerIndex is not valid - ---*/ -{ - if (TimerValue == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (TimerIndex == 0) { - *TimerValue = AsmReadTsc (); - if (TimerPeriod != NULL) { - // - // BugBug: Hard coded. Don't know how to do this generically - // - *TimerPeriod = 1000000000; - } - return EFI_SUCCESS; - } - return EFI_INVALID_PARAMETER; -} - -EFI_STATUS -EFIAPI -CpuSetMemoryAttributes ( - IN EFI_CPU_ARCH_PROTOCOL *This, - IN EFI_PHYSICAL_ADDRESS BaseAddress, - IN UINT64 Length, - IN UINT64 Attributes - ) -/*++ - -Routine Description: - Set memory cacheability attributes for given range of memeory - -Arguments: - This - Protocol instance structure - BaseAddress - Specifies the start address of the memory range - Length - Specifies the length of the memory range - Attributes - The memory cacheability for the memory range - -Returns: - EFI_SUCCESS - If the cacheability of that memory range is set successfully - EFI_UNSUPPORTED - If the desired operation cannot be done - EFI_INVALID_PARAMETER - The input parameter is not correct, such as Length = 0 - ---*/ -{ - return EFI_UNSUPPORTED; -} - -#if CPU_EXCEPTION_DEBUG_OUTPUT -VOID -DumpExceptionDataDebugOut ( - IN EFI_EXCEPTION_TYPE InterruptType, - IN EFI_SYSTEM_CONTEXT SystemContext - ) -{ - UINT32 ErrorCodeFlag; - - ErrorCodeFlag = 0x00027d00; - -#ifdef MDE_CPU_IA32 - DEBUG (( - EFI_D_ERROR, - "!!!! IA32 Exception Type - %08x !!!!\n", - InterruptType - )); - DEBUG (( - EFI_D_ERROR, - "EIP - %08x, CS - %08x, EFLAGS - %08x\n", - SystemContext.SystemContextIa32->Eip, - SystemContext.SystemContextIa32->Cs, - SystemContext.SystemContextIa32->Eflags - )); - if (ErrorCodeFlag & (1 << InterruptType)) { - DEBUG (( - EFI_D_ERROR, - "ExceptionData - %08x\n", - SystemContext.SystemContextIa32->ExceptionData - )); - } - DEBUG (( - EFI_D_ERROR, - "EAX - %08x, ECX - %08x, EDX - %08x, EBX - %08x\n", - SystemContext.SystemContextIa32->Eax, - SystemContext.SystemContextIa32->Ecx, - SystemContext.SystemContextIa32->Edx, - SystemContext.SystemContextIa32->Ebx - )); - DEBUG (( - EFI_D_ERROR, - "ESP - %08x, EBP - %08x, ESI - %08x, EDI - %08x\n", - SystemContext.SystemContextIa32->Esp, - SystemContext.SystemContextIa32->Ebp, - SystemContext.SystemContextIa32->Esi, - SystemContext.SystemContextIa32->Edi - )); - DEBUG (( - EFI_D_ERROR, - "DS - %08x, ES - %08x, FS - %08x, GS - %08x, SS - %08x\n", - SystemContext.SystemContextIa32->Ds, - SystemContext.SystemContextIa32->Es, - SystemContext.SystemContextIa32->Fs, - SystemContext.SystemContextIa32->Gs, - SystemContext.SystemContextIa32->Ss - )); - DEBUG (( - EFI_D_ERROR, - "GDTR - %08x %08x, IDTR - %08x %08x\n", - SystemContext.SystemContextIa32->Gdtr[0], - SystemContext.SystemContextIa32->Gdtr[1], - SystemContext.SystemContextIa32->Idtr[0], - SystemContext.SystemContextIa32->Idtr[1] - )); - DEBUG (( - EFI_D_ERROR, - "LDTR - %08x, TR - %08x\n", - SystemContext.SystemContextIa32->Ldtr, - SystemContext.SystemContextIa32->Tr - )); - DEBUG (( - EFI_D_ERROR, - "CR0 - %08x, CR2 - %08x, CR3 - %08x, CR4 - %08x\n", - SystemContext.SystemContextIa32->Cr0, - SystemContext.SystemContextIa32->Cr2, - SystemContext.SystemContextIa32->Cr3, - SystemContext.SystemContextIa32->Cr4 - )); - DEBUG (( - EFI_D_ERROR, - "DR0 - %08x, DR1 - %08x, DR2 - %08x, DR3 - %08x\n", - SystemContext.SystemContextIa32->Dr0, - SystemContext.SystemContextIa32->Dr1, - SystemContext.SystemContextIa32->Dr2, - SystemContext.SystemContextIa32->Dr3 - )); - DEBUG (( - EFI_D_ERROR, - "DR6 - %08x, DR7 - %08x\n", - SystemContext.SystemContextIa32->Dr6, - SystemContext.SystemContextIa32->Dr7 - )); -#else - DEBUG (( - EFI_D_ERROR, - "!!!! X64 Exception Type - %016lx !!!!\n", - (UINT64)InterruptType - )); - DEBUG (( - EFI_D_ERROR, - "RIP - %016lx, CS - %016lx, RFLAGS - %016lx\n", - SystemContext.SystemContextX64->Rip, - SystemContext.SystemContextX64->Cs, - SystemContext.SystemContextX64->Rflags - )); - if (ErrorCodeFlag & (1 << InterruptType)) { - DEBUG (( - EFI_D_ERROR, - "ExceptionData - %016lx\n", - SystemContext.SystemContextX64->ExceptionData - )); - } - DEBUG (( - EFI_D_ERROR, - "RAX - %016lx, RCX - %016lx, RDX - %016lx\n", - SystemContext.SystemContextX64->Rax, - SystemContext.SystemContextX64->Rcx, - SystemContext.SystemContextX64->Rdx - )); - DEBUG (( - EFI_D_ERROR, - "RBX - %016lx, RSP - %016lx, RBP - %016lx\n", - SystemContext.SystemContextX64->Rbx, - SystemContext.SystemContextX64->Rsp, - SystemContext.SystemContextX64->Rbp - )); - DEBUG (( - EFI_D_ERROR, - "RSI - %016lx, RDI - %016lx\n", - SystemContext.SystemContextX64->Rsi, - SystemContext.SystemContextX64->Rdi - )); - DEBUG (( - EFI_D_ERROR, - "R8 - %016lx, R9 - %016lx, R10 - %016lx\n", - SystemContext.SystemContextX64->R8, - SystemContext.SystemContextX64->R9, - SystemContext.SystemContextX64->R10 - )); - DEBUG (( - EFI_D_ERROR, - "R11 - %016lx, R12 - %016lx, R13 - %016lx\n", - SystemContext.SystemContextX64->R11, - SystemContext.SystemContextX64->R12, - SystemContext.SystemContextX64->R13 - )); - DEBUG (( - EFI_D_ERROR, - "R14 - %016lx, R15 - %016lx\n", - SystemContext.SystemContextX64->R14, - SystemContext.SystemContextX64->R15 - )); - DEBUG (( - EFI_D_ERROR, - "DS - %016lx, ES - %016lx, FS - %016lx\n", - SystemContext.SystemContextX64->Ds, - SystemContext.SystemContextX64->Es, - SystemContext.SystemContextX64->Fs - )); - DEBUG (( - EFI_D_ERROR, - "GS - %016lx, SS - %016lx\n", - SystemContext.SystemContextX64->Gs, - SystemContext.SystemContextX64->Ss - )); - DEBUG (( - EFI_D_ERROR, - "GDTR - %016lx %016lx, LDTR - %016lx\n", - SystemContext.SystemContextX64->Gdtr[0], - SystemContext.SystemContextX64->Gdtr[1], - SystemContext.SystemContextX64->Ldtr - )); - DEBUG (( - EFI_D_ERROR, - "IDTR - %016lx %016lx, TR - %016lx\n", - SystemContext.SystemContextX64->Idtr[0], - SystemContext.SystemContextX64->Idtr[1], - SystemContext.SystemContextX64->Tr - )); - DEBUG (( - EFI_D_ERROR, - "CR0 - %016lx, CR2 - %016lx, CR3 - %016lx\n", - SystemContext.SystemContextX64->Cr0, - SystemContext.SystemContextX64->Cr2, - SystemContext.SystemContextX64->Cr3 - )); - DEBUG (( - EFI_D_ERROR, - "CR4 - %016lx, CR8 - %016lx\n", - SystemContext.SystemContextX64->Cr4, - SystemContext.SystemContextX64->Cr8 - )); - DEBUG (( - EFI_D_ERROR, - "DR0 - %016lx, DR1 - %016lx, DR2 - %016lx\n", - SystemContext.SystemContextX64->Dr0, - SystemContext.SystemContextX64->Dr1, - SystemContext.SystemContextX64->Dr2 - )); - DEBUG (( - EFI_D_ERROR, - "DR3 - %016lx, DR6 - %016lx, DR7 - %016lx\n", - SystemContext.SystemContextX64->Dr3, - SystemContext.SystemContextX64->Dr6, - SystemContext.SystemContextX64->Dr7 - )); -#endif - return ; -} -#endif - - -VOID -DumpExceptionDataVgaOut ( - IN EFI_EXCEPTION_TYPE InterruptType, - IN EFI_SYSTEM_CONTEXT SystemContext - ) -{ - UINTN COLUMN_MAX; - UINTN ROW_MAX; - UINT32 ErrorCodeFlag; - CHAR16 *VideoBufferBase; - CHAR16 *VideoBuffer; - UINTN Index; - - COLUMN_MAX = 80; - ROW_MAX = 25; - ErrorCodeFlag = 0x00027d00; - VideoBufferBase = (CHAR16 *) (UINTN) 0xb8000; - VideoBuffer = (CHAR16 *) (UINTN) 0xb8000; - -#ifdef MDE_CPU_IA32 - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "!!!! IA32 Exception Type - %08x !!!!", - InterruptType - ); - VideoBuffer += COLUMN_MAX; - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "EIP - %08x, CS - %08x, EFLAGS - %08x", - SystemContext.SystemContextIa32->Eip, - SystemContext.SystemContextIa32->Cs, - SystemContext.SystemContextIa32->Eflags - ); - VideoBuffer += COLUMN_MAX; - if (ErrorCodeFlag & (1 << InterruptType)) { - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "ExceptionData - %08x", - SystemContext.SystemContextIa32->ExceptionData - ); - VideoBuffer += COLUMN_MAX; - } - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "EAX - %08x, ECX - %08x, EDX - %08x, EBX - %08x", - SystemContext.SystemContextIa32->Eax, - SystemContext.SystemContextIa32->Ecx, - SystemContext.SystemContextIa32->Edx, - SystemContext.SystemContextIa32->Ebx - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "ESP - %08x, EBP - %08x, ESI - %08x, EDI - %08x", - SystemContext.SystemContextIa32->Esp, - SystemContext.SystemContextIa32->Ebp, - SystemContext.SystemContextIa32->Esi, - SystemContext.SystemContextIa32->Edi - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "DS - %08x, ES - %08x, FS - %08x, GS - %08x, SS - %08x", - SystemContext.SystemContextIa32->Ds, - SystemContext.SystemContextIa32->Es, - SystemContext.SystemContextIa32->Fs, - SystemContext.SystemContextIa32->Gs, - SystemContext.SystemContextIa32->Ss - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "GDTR - %08x %08x, IDTR - %08x %08x", - SystemContext.SystemContextIa32->Gdtr[0], - SystemContext.SystemContextIa32->Gdtr[1], - SystemContext.SystemContextIa32->Idtr[0], - SystemContext.SystemContextIa32->Idtr[1] - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "LDTR - %08x, TR - %08x", - SystemContext.SystemContextIa32->Ldtr, - SystemContext.SystemContextIa32->Tr - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "CR0 - %08x, CR2 - %08x, CR3 - %08x, CR4 - %08x", - SystemContext.SystemContextIa32->Cr0, - SystemContext.SystemContextIa32->Cr2, - SystemContext.SystemContextIa32->Cr3, - SystemContext.SystemContextIa32->Cr4 - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "DR0 - %08x, DR1 - %08x, DR2 - %08x, DR3 - %08x", - SystemContext.SystemContextIa32->Dr0, - SystemContext.SystemContextIa32->Dr1, - SystemContext.SystemContextIa32->Dr2, - SystemContext.SystemContextIa32->Dr3 - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "DR6 - %08x, DR7 - %08x", - SystemContext.SystemContextIa32->Dr6, - SystemContext.SystemContextIa32->Dr7 - ); - VideoBuffer += COLUMN_MAX; -#else - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "!!!! X64 Exception Type - %016lx !!!!", - (UINT64)InterruptType - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "RIP - %016lx, CS - %016lx, RFLAGS - %016lx", - SystemContext.SystemContextX64->Rip, - SystemContext.SystemContextX64->Cs, - SystemContext.SystemContextX64->Rflags - ); - VideoBuffer += COLUMN_MAX; - - if (ErrorCodeFlag & (1 << InterruptType)) { - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "ExceptionData - %016lx", - SystemContext.SystemContextX64->ExceptionData - ); - VideoBuffer += COLUMN_MAX; - } - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "RAX - %016lx, RCX - %016lx, RDX - %016lx", - SystemContext.SystemContextX64->Rax, - SystemContext.SystemContextX64->Rcx, - SystemContext.SystemContextX64->Rdx - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "RBX - %016lx, RSP - %016lx, RBP - %016lx", - SystemContext.SystemContextX64->Rbx, - SystemContext.SystemContextX64->Rsp, - SystemContext.SystemContextX64->Rbp - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "RSI - %016lx, RDI - %016lx", - SystemContext.SystemContextX64->Rsi, - SystemContext.SystemContextX64->Rdi - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "R8 - %016lx, R9 - %016lx, R10 - %016lx", - SystemContext.SystemContextX64->R8, - SystemContext.SystemContextX64->R9, - SystemContext.SystemContextX64->R10 - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "R11 - %016lx, R12 - %016lx, R13 - %016lx", - SystemContext.SystemContextX64->R11, - SystemContext.SystemContextX64->R12, - SystemContext.SystemContextX64->R13 - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "R14 - %016lx, R15 - %016lx", - SystemContext.SystemContextX64->R14, - SystemContext.SystemContextX64->R15 - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "DS - %016lx, ES - %016lx, FS - %016lx", - SystemContext.SystemContextX64->Ds, - SystemContext.SystemContextX64->Es, - SystemContext.SystemContextX64->Fs - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "GS - %016lx, SS - %016lx", - SystemContext.SystemContextX64->Gs, - SystemContext.SystemContextX64->Ss - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "GDTR - %016lx %016lx, LDTR - %016lx", - SystemContext.SystemContextX64->Gdtr[0], - SystemContext.SystemContextX64->Gdtr[1], - SystemContext.SystemContextX64->Ldtr - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "IDTR - %016lx %016lx, TR - %016lx", - SystemContext.SystemContextX64->Idtr[0], - SystemContext.SystemContextX64->Idtr[1], - SystemContext.SystemContextX64->Tr - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "CR0 - %016lx, CR2 - %016lx, CR3 - %016lx", - SystemContext.SystemContextX64->Cr0, - SystemContext.SystemContextX64->Cr2, - SystemContext.SystemContextX64->Cr3 - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "CR4 - %016lx, CR8 - %016lx", - SystemContext.SystemContextX64->Cr4, - SystemContext.SystemContextX64->Cr8 - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "DR0 - %016lx, DR1 - %016lx, DR2 - %016lx", - SystemContext.SystemContextX64->Dr0, - SystemContext.SystemContextX64->Dr1, - SystemContext.SystemContextX64->Dr2 - ); - VideoBuffer += COLUMN_MAX; - - UnicodeSPrintAsciiFormat ( - VideoBuffer, - COLUMN_MAX * sizeof (CHAR16), - "DR3 - %016lx, DR6 - %016lx, DR7 - %016lx", - SystemContext.SystemContextX64->Dr3, - SystemContext.SystemContextX64->Dr6, - SystemContext.SystemContextX64->Dr7 - ); - VideoBuffer += COLUMN_MAX; -#endif - - for (Index = 0; Index < COLUMN_MAX * ROW_MAX; Index ++) { - if (Index > (UINTN)(VideoBuffer - VideoBufferBase)) { - VideoBufferBase[Index] = 0x0c20; - } else { - VideoBufferBase[Index] |= 0x0c00; - } - } - - return ; -} - -#if CPU_EXCEPTION_VGA_SWITCH -UINT16 -SwitchVideoMode ( - UINT16 NewVideoMode - ) -/*++ -Description - Switch Video Mode from current mode to new mode, and return the old mode. - Use Thuink - -Arguments - NewVideoMode - new video mode want to set - -Return - UINT16 - (UINT16) -1 indicates failure - Other value indicates the old mode, which can be used for restore later - ---*/ -{ - EFI_STATUS Status; - EFI_LEGACY_BIOS_THUNK_PROTOCOL *LegacyBios; - EFI_IA32_REGISTER_SET Regs; - UINT16 OriginalVideoMode = (UINT16) -1; - - - // - // VESA SuperVGA BIOS - GET CURRENT VIDEO MODE - // AX = 4F03h - // Return:AL = 4Fh if function supported - // AH = status 00h successful - // BX = video mode (see #0082,#0083) - // - gBS->SetMem (&Regs, sizeof (Regs), 0); - Regs.X.AX = 0x4F03; - LegacyBiosInt86 (0x10, &Regs); - if (Regs.X.AX == 0x004F) { - OriginalVideoMode = Regs.X.BX; - } else { - // - // VIDEO - GET CURRENT VIDEO MODE - // AH = 0Fh - // Return:AH = number of character columns - // AL = display mode (see #0009 at AH=00h) - // BH = active page (see AH=05h) - // - gBS->SetMem (&Regs, sizeof (Regs), 0); - Regs.H.AH = 0x0F; - LegacyBiosInt86 (0x10, &Regs); - OriginalVideoMode = Regs.H.AL; - } - - // - // Set new video mode - // - if (NewVideoMode < 0x100) { - // - // Set the 80x25 Text VGA Mode: Assume successful always - // - // VIDEO - SET VIDEO MODE - // AH = 00h - // AL = desired video mode (see #0009) - // Return:AL = video mode flag (Phoenix, AMI BIOS) - // 20h mode > 7 - // 30h modes 0-5 and 7 - // 3Fh mode 6 - // AL = CRT controller mode byte (Phoenix 386 BIOS v1.10) - // - gBS->SetMem (&Regs, sizeof (Regs), 0); - Regs.H.AH = 0x00; - Regs.H.AL = (UINT8) NewVideoMode; - LegacyBiosInt86 (0x10, &Regs); - - // - // VIDEO - TEXT-MODE CHARGEN - LOAD ROM 8x16 CHARACTER SET (VGA) - // AX = 1114h - // BL = block to load - // Return:Nothing - // - gBS->SetMem (&Regs, sizeof (Regs), 0); - Regs.H.AH = 0x11; - Regs.H.AL = 0x14; - Regs.H.BL = 0; - LegacyBiosInt86 (0x10, &Regs); - } else { - // - // VESA SuperVGA BIOS - SET SuperVGA VIDEO MODE - // AX = 4F02h - // BX = mode (see #0082,#0083) - // bit 15 set means don't clear video memory - // bit 14 set means enable linear framebuffer mode (VBE v2.0+) - // Return:AL = 4Fh if function supported - // AH = status - // 00h successful - // 01h failed - // - gBS->SetMem (&Regs, sizeof (Regs), 0); - Regs.X.AX = 0x4F02; - Regs.X.BX = NewVideoMode; - LegacyBiosInt86 (0x10, &Regs); - if (Regs.X.AX != 0x004F) { - DEBUG ((EFI_D_ERROR, "SORRY: Cannot set to video mode: 0x%04X!\n", NewVideoMode)); - return (UINT16) -1; - } - } - - return OriginalVideoMode; -} -#endif - -VOID -ExceptionHandler ( - IN EFI_EXCEPTION_TYPE InterruptType, - IN EFI_SYSTEM_CONTEXT SystemContext - ) -{ -#if CPU_EXCEPTION_VGA_SWITCH - UINT16 VideoMode; -#endif - -#if CPU_EXCEPTION_DEBUG_OUTPUT - DumpExceptionDataDebugOut (InterruptType, SystemContext); -#endif - -#if CPU_EXCEPTION_VGA_SWITCH - // - // Switch to text mode for RED-SCREEN output - // - VideoMode = SwitchVideoMode (0x83); - if (VideoMode == (UINT16) -1) { - DEBUG ((EFI_D_ERROR, "Video Mode Unknown!\n")); - } -#endif - - DumpExceptionDataVgaOut (InterruptType, SystemContext); - - // - // Use this macro to hang so that the compiler does not optimize out - // the following RET instructions. This allows us to return if we - // have a debugger attached. - // - CpuDeadLoop (); - -#if CPU_EXCEPTION_VGA_SWITCH - // - // Switch back to the old video mode - // - if (VideoMode != (UINT16)-1) { - SwitchVideoMode (VideoMode); - } -#endif - - return ; -} - -VOID -TimerHandler ( - IN EFI_EXCEPTION_TYPE InterruptType, - IN EFI_SYSTEM_CONTEXT SystemContext - ) -{ - if (mTimerHandler != NULL) { - mTimerHandler (InterruptType, SystemContext); - } -} - -EFI_STATUS -EFIAPI -InitializeCpu ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -/*++ - -Routine Description: - Initialize the state information for the CPU Architectural Protocol - -Arguments: - ImageHandle of the loaded driver - Pointer to the System Table - -Returns: - EFI_SUCCESS - thread can be successfully created - EFI_OUT_OF_RESOURCES - cannot allocate protocol data structure - EFI_DEVICE_ERROR - cannot create the thread - ---*/ -{ - EFI_STATUS Status; - EFI_8259_IRQ Irq; - UINT32 InterruptVector; - - // - // Find the Legacy8259 protocol. - // - Status = gBS->LocateProtocol (&gEfiLegacy8259ProtocolGuid, NULL, (VOID **) &gLegacy8259); - ASSERT_EFI_ERROR (Status); - - // - // Get the interrupt vector number corresponding to IRQ0 from the 8259 driver - // - Status = gLegacy8259->GetVector (gLegacy8259, Efi8259Irq0, (UINT8 *) &mTimerVector); - ASSERT_EFI_ERROR (Status); - - // - // Reload GDT, IDT - // - InitDescriptor (); - - // - // Install Exception Handler (0x00 ~ 0x1F) - // - for (InterruptVector = 0; InterruptVector < 0x20; InterruptVector++) { - InstallInterruptHandler ( - InterruptVector, - (VOID (*)(VOID))(UINTN)((UINTN)SystemExceptionHandler + mExceptionCodeSize * InterruptVector) - ); - } - - // - // Install Timer Handler - // - InstallInterruptHandler (mTimerVector, SystemTimerHandler); - - // - // BUGBUG: We add all other interrupt vector - // - for (Irq = Efi8259Irq1; Irq <= Efi8259Irq15; Irq++) { - InterruptVector = 0; - Status = gLegacy8259->GetVector (gLegacy8259, Irq, (UINT8 *) &InterruptVector); - ASSERT_EFI_ERROR (Status); - InstallInterruptHandler (InterruptVector, SystemTimerHandler); - } - - InitializeBiosIntCaller(); - - // - // Install CPU Architectural Protocol and the thunk protocol - // - mHandle = NULL; - Status = gBS->InstallMultipleProtocolInterfaces ( - &mHandle, - &gEfiCpuArchProtocolGuid, - &mCpu, - NULL - ); - ASSERT_EFI_ERROR (Status); - - return EFI_SUCCESS; -} - -VOID -InitializeBiosIntCaller ( - VOID - ) -{ - EFI_STATUS Status; - UINT32 RealModeBufferSize; - UINT32 ExtraStackSize; - EFI_PHYSICAL_ADDRESS LegacyRegionBase; - - // - // Get LegacyRegion - // - AsmGetThunk16Properties (&RealModeBufferSize, &ExtraStackSize); - - LegacyRegionBase = 0x100000; - Status = gBS->AllocatePages ( - AllocateMaxAddress, - EfiACPIMemoryNVS, - EFI_SIZE_TO_PAGES(RealModeBufferSize + ExtraStackSize + 200), - &LegacyRegionBase - ); - ASSERT_EFI_ERROR (Status); - - mThunkContext.RealModeBuffer = (VOID*)(UINTN)LegacyRegionBase; - mThunkContext.RealModeBufferSize = EFI_PAGES_TO_SIZE (RealModeBufferSize); - mThunkContext.ThunkAttributes = 3; - AsmPrepareThunk16(&mThunkContext); - -} - -BOOLEAN -EFIAPI -LegacyBiosInt86 ( - IN UINT8 BiosInt, - IN EFI_IA32_REGISTER_SET *Regs - ) -{ - UINTN Status; - UINTN Eflags; - IA32_REGISTER_SET ThunkRegSet; - BOOLEAN Ret; - UINT16 *Stack16; - - Regs->X.Flags.Reserved1 = 1; - Regs->X.Flags.Reserved2 = 0; - Regs->X.Flags.Reserved3 = 0; - Regs->X.Flags.Reserved4 = 0; - Regs->X.Flags.IOPL = 3; - Regs->X.Flags.NT = 0; - Regs->X.Flags.IF = 1; - Regs->X.Flags.TF = 0; - Regs->X.Flags.CF = 0; - - ZeroMem (&ThunkRegSet, sizeof (ThunkRegSet)); - ThunkRegSet.E.EDI = Regs->E.EDI; - ThunkRegSet.E.ESI = Regs->E.ESI; - ThunkRegSet.E.EBP = Regs->E.EBP; - ThunkRegSet.E.EBX = Regs->E.EBX; - ThunkRegSet.E.EDX = Regs->E.EDX; - ThunkRegSet.E.ECX = Regs->E.ECX; - ThunkRegSet.E.EAX = Regs->E.EAX; - ThunkRegSet.E.DS = Regs->E.DS; - ThunkRegSet.E.ES = Regs->E.ES; - - CopyMem (&(ThunkRegSet.E.EFLAGS), &(Regs->E.EFlags), sizeof (UINT32)); - - // - // The call to Legacy16 is a critical section to EFI - // - Eflags = AsmReadEflags (); - if ((Eflags | EFI_CPU_EFLAGS_IF) != 0) { - DisableInterrupts (); - } - - // - // Set Legacy16 state. 0x08, 0x70 is legacy 8259 vector bases. - // - Status = gLegacy8259->SetMode (gLegacy8259, Efi8259LegacyMode, NULL, NULL); - ASSERT_EFI_ERROR (Status); - - Stack16 = (UINT16 *)((UINT8 *) mThunkContext.RealModeBuffer + mThunkContext.RealModeBufferSize - sizeof (UINT16)); - Stack16 -= sizeof (ThunkRegSet.E.EFLAGS) / sizeof (UINT16); - CopyMem (Stack16, &ThunkRegSet.E.EFLAGS, sizeof (ThunkRegSet.E.EFLAGS)); - - ThunkRegSet.E.SS = (UINT16) (((UINTN) Stack16 >> 16) << 12); - ThunkRegSet.E.ESP = (UINT16) (UINTN) Stack16; - ThunkRegSet.E.Eip = (UINT16)((UINT32 *)NULL)[BiosInt]; - ThunkRegSet.E.CS = (UINT16)(((UINT32 *)NULL)[BiosInt] >> 16); - mThunkContext.RealModeState = &ThunkRegSet; - AsmThunk16 (&mThunkContext); - - // - // Restore protected mode interrupt state - // - Status = gLegacy8259->SetMode (gLegacy8259, Efi8259ProtectedMode, NULL, NULL); - ASSERT_EFI_ERROR (Status); - - // - // End critical section - // - if ((Eflags | EFI_CPU_EFLAGS_IF) != 0) { - EnableInterrupts (); - } - - Regs->E.EDI = ThunkRegSet.E.EDI; - Regs->E.ESI = ThunkRegSet.E.ESI; - Regs->E.EBP = ThunkRegSet.E.EBP; - Regs->E.EBX = ThunkRegSet.E.EBX; - Regs->E.EDX = ThunkRegSet.E.EDX; - Regs->E.ECX = ThunkRegSet.E.ECX; - Regs->E.EAX = ThunkRegSet.E.EAX; - Regs->E.SS = ThunkRegSet.E.SS; - Regs->E.CS = ThunkRegSet.E.CS; - Regs->E.DS = ThunkRegSet.E.DS; - Regs->E.ES = ThunkRegSet.E.ES; - - CopyMem (&(Regs->E.EFlags), &(ThunkRegSet.E.EFLAGS), sizeof (UINT32)); - - Ret = (BOOLEAN) (Regs->E.EFlags.CF == 1); - - return Ret; -} diff --git a/DuetPkg/CpuDxe/Cpu.inf b/DuetPkg/CpuDxe/Cpu.inf deleted file mode 100644 index e2724a1fd2..0000000000 --- a/DuetPkg/CpuDxe/Cpu.inf +++ /dev/null @@ -1,58 +0,0 @@ -## @file -# -# Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
-# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -# Module Name: -# Cpu.inf -# -# Abstract: -# -## - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = Cpu - FILE_GUID = 10527025-78B2-4d3e-A9DF-41E75C220F5A - MODULE_TYPE = DXE_DRIVER - VERSION_STRING = 1.0 - - ENTRY_POINT = InitializeCpu - -[Packages] - DuetPkg/DuetPkg.dec - MdePkg/MdePkg.dec - IntelFrameworkPkg/IntelFrameworkPkg.dec - -[LibraryClasses] - UefiDriverEntryPoint - PrintLib - UefiBootServicesTableLib - BaseMemoryLib - -[Sources.IA32] - Ia32/CpuInterrupt.asm |INTEL - Ia32/CpuInterrupt.asm |MSFT - Ia32/CpuInterrupt.S |GCC - -[Sources.X64] - X64/CpuInterrupt.asm | INTEL - X64/CpuInterrupt.asm | MSFT - X64/CpuInterrupt.S |GCC - -[Sources] - Cpu.c - CpuDxe.h - -[Protocols] - gEfiCpuArchProtocolGuid - gEfiLegacy8259ProtocolGuid - -[Depex] - gEfiLegacy8259ProtocolGuid diff --git a/DuetPkg/CpuDxe/CpuDxe.h b/DuetPkg/CpuDxe/CpuDxe.h deleted file mode 100644 index 46eff18d74..0000000000 --- a/DuetPkg/CpuDxe/CpuDxe.h +++ /dev/null @@ -1,149 +0,0 @@ -/*++ - -Copyright (c) 2006, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -Module Name: - CpuDxe.h - -Abstract: - ---*/ -#ifndef _CPU_DXE_H -#define _CPU_DXE_H - -#include - -#include -#include - -#include - - -#include -#include -#include -#include -#include - -#define CPU_EXCEPTION_DEBUG_OUTPUT 1 -#define CPU_EXCEPTION_VGA_SWITCH 0 - -#define INTERRUPT_VECTOR_NUMBER 0x100 - -// -// Print primitives -// -//#define LEFT_JUSTIFY 0x01 -#define PREFIX_SIGN 0x02 -#define PREFIX_BLANK 0x04 -//#define COMMA_TYPE 0x08 -#define LONG_TYPE 0x10 -//#define PREFIX_ZERO 0x20 -#define OUTPUT_UNICODE 0x40 -//#define RADIX_HEX 0x80 -#define FORMAT_UNICODE 0x100 -#define PAD_TO_WIDTH 0x200 -#define ARGUMENT_UNICODE 0x400 -#define PRECISION 0x800 -#define ARGUMENT_REVERSED 0x1000 - -// -// Function declarations -// -EFI_STATUS -EFIAPI -InitializeCpu ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ); - -EFI_STATUS -EFIAPI -CpuFlushCpuDataCache ( - IN EFI_CPU_ARCH_PROTOCOL *This, - IN EFI_PHYSICAL_ADDRESS Start, - IN UINT64 Length, - IN EFI_CPU_FLUSH_TYPE FlushType - ); - -EFI_STATUS -EFIAPI -CpuEnableInterrupt ( - IN EFI_CPU_ARCH_PROTOCOL *This - ); - -EFI_STATUS -EFIAPI -CpuDisableInterrupt ( - IN EFI_CPU_ARCH_PROTOCOL *This - ); - -EFI_STATUS -EFIAPI -CpuGetInterruptState ( - IN EFI_CPU_ARCH_PROTOCOL *This, - OUT BOOLEAN *State - ); - -EFI_STATUS -EFIAPI -CpuInit ( - IN EFI_CPU_ARCH_PROTOCOL *This, - IN EFI_CPU_INIT_TYPE InitType - ); - -EFI_STATUS -EFIAPI -CpuRegisterInterruptHandler ( - IN EFI_CPU_ARCH_PROTOCOL *This, - IN EFI_EXCEPTION_TYPE InterruptType, - IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler - ); - -EFI_STATUS -EFIAPI -CpuGetTimerValue ( - IN EFI_CPU_ARCH_PROTOCOL *This, - IN UINT32 TimerIndex, - OUT UINT64 *TimerValue, - OUT UINT64 *TimerPeriod OPTIONAL - ); - -EFI_STATUS -EFIAPI -CpuSetMemoryAttributes( - IN EFI_CPU_ARCH_PROTOCOL *This, - IN EFI_PHYSICAL_ADDRESS BaseAddress, - IN UINT64 Length, - IN UINT64 Attributes - ); - -VOID -InstallInterruptHandler ( - UINTN Vector, - VOID (*Handler)(VOID) - ); - -VOID -SystemExceptionHandler ( - VOID - ); - -VOID -SystemTimerHandler ( - VOID - ); - -VOID -InitDescriptor ( - VOID - ); - -#endif diff --git a/DuetPkg/CpuDxe/Ia32/CpuInterrupt.S b/DuetPkg/CpuDxe/Ia32/CpuInterrupt.S deleted file mode 100644 index 945dcf6665..0000000000 --- a/DuetPkg/CpuDxe/Ia32/CpuInterrupt.S +++ /dev/null @@ -1,961 +0,0 @@ -#------------------------------------------------------------------------------ -#* -#* Copyright (c) 2006, Intel Corporation. All rights reserved.
-#* This program and the accompanying materials -#* are licensed and made available under the terms and conditions of the BSD License -#* which accompanies this distribution. The full text of the license may be found at -#* http://opensource.org/licenses/bsd-license.php -#* -#* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -#* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -#* -#* CpuInterrupt.S -#* -#* Abstract: -#* -#------------------------------------------------------------------------------ - -#PUBLIC SystemTimerHandler -#PUBLIC SystemExceptionHandler -#EXTERNDEF mExceptionCodeSize:DWORD - -#EXTERN TimerHandler: NEAR -#EXTERN ExceptionHandler: NEAR -#EXTERN mTimerVector: DWORD - - .data - ASM_GLOBAL ASM_PFX(mExceptionCodeSize) -ASM_PFX(mExceptionCodeSize): .long 9 - - .text - ASM_GLOBAL ASM_PFX(InitDescriptor) - -ASM_PFX(InitDescriptor): - movl $GDT_BASE,%eax # EAX=PHYSICAL address of gdt - movl %eax, gdtr + 2 # Put address of gdt into the gdtr - lgdt gdtr - movl $IDT_BASE,%eax # EAX=PHYSICAL address of idt - movl %eax, idtr + 2 # Put address of idt into the idtr - lidt idtr - ret - -# VOID -# InstallInterruptHandler ( -# UINTN Vector, -# VOID (*Handler)(VOID) -# ) - ASM_GLOBAL ASM_PFX(InstallInterruptHandler) -ASM_PFX(InstallInterruptHandler): -# Vector:DWORD @ 4(%esp) -# Handler:DWORD @ 8(%esp) - - push %edi - pushf # save eflags - cli # turn off interrupts - subl $6,%esp # open some space on the stack - movl %esp,%edi - sidt (%edi) # get fword address of IDT - movl 2(%edi), %edi # move offset of IDT into EDI - addl $6,%esp # correct stack - movl 12(%esp),%eax # Get vector number - shl $3,%eax # multiply by 8 to get offset - addl %eax,%edi # add to IDT base to get entry - movl 16(%esp),%eax # load new address into IDT entry - movw %ax,(%edi) # write bits 15..0 of offset - shrl $16,%eax # use ax to copy 31..16 to descriptors - movw %ax,6(%edi) # write bits 31..16 of offset - popf # restore flags (possible enabling interrupts) - pop %edi - ret - - .macro JmpCommonIdtEntry - # jmp commonIdtEntry - this must be hand coded to keep the assembler from - # using a 8 bit reletive jump when the entries are - # within 255 bytes of the common entry. This must - # be done to maintain the consistency of the size - # of entry points... - .byte 0xe9 # jmp 16 bit reletive - .long commonIdtEntry - . - 4 # offset to jump to - .endm - - .p2align 1 - ASM_GLOBAL ASM_PFX(SystemExceptionHandler) -ASM_PFX(SystemExceptionHandler): -INT0: - pushl $0x0 # push error code place holder on the stack - pushl $0x0 - JmpCommonIdtEntry -# db 0e9h # jmp 16 bit reletive -# dd commonIdtEntry - $ - 4 # offset to jump to - -INT1: - pushl $0x0 # push error code place holder on the stack - pushl $0x1 - JmpCommonIdtEntry - -INT2: - pushl $0x0 # push error code place holder on the stack - pushl $0x2 - JmpCommonIdtEntry - -INT3: - pushl $0x0 # push error code place holder on the stack - pushl $0x3 - JmpCommonIdtEntry - -INT4: - pushl $0x0 # push error code place holder on the stack - pushl $0x4 - JmpCommonIdtEntry - -INT5: - pushl $0x0 # push error code place holder on the stack - pushl $0x5 - JmpCommonIdtEntry - -INT6: - pushl $0x0 # push error code place holder on the stack - pushl $0x6 - JmpCommonIdtEntry - -INT7: - pushl $0x0 # push error code place holder on the stack - pushl $0x7 - JmpCommonIdtEntry - -INT8: -# Double fault causes an error code to be pushed so no phony push necessary - nop - nop - pushl $0x8 - JmpCommonIdtEntry - -INT9: - pushl $0x0 # push error code place holder on the stack - pushl $0x9 - JmpCommonIdtEntry - -INT10: -# Invalid TSS causes an error code to be pushed so no phony push necessary - nop - nop - pushl $10 - JmpCommonIdtEntry - -INT11: -# Segment Not Present causes an error code to be pushed so no phony push necessary - nop - nop - pushl $11 - JmpCommonIdtEntry - -INT12: -# Stack fault causes an error code to be pushed so no phony push necessary - nop - nop - pushl $12 - JmpCommonIdtEntry - -INT13: -# GP fault causes an error code to be pushed so no phony push necessary - nop - nop - pushl $13 - JmpCommonIdtEntry - -INT14: -# Page fault causes an error code to be pushed so no phony push necessary - nop - nop - pushl $14 - JmpCommonIdtEntry - -INT15: - pushl $0x0 # push error code place holder on the stack - pushl $15 - JmpCommonIdtEntry - -INT16: - pushl $0x0 # push error code place holder on the stack - pushl $16 - JmpCommonIdtEntry - -INT17: -# Alignment check causes an error code to be pushed so no phony push necessary - nop - nop - pushl $17 - JmpCommonIdtEntry - -INT18: - pushl $0x0 # push error code place holder on the stack - pushl $18 - JmpCommonIdtEntry - -INT19: - pushl $0x0 # push error code place holder on the stack - pushl $19 - JmpCommonIdtEntry - -INTUnknown: - # The following segment repeats (32 - 20) times: - # No. 1 - pushl $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 2 - pushl $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 3 - pushl $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 4 - pushl $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 5 - pushl $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 6 - pushl $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 7 - pushl $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 8 - pushl $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 9 - pushl $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 10 - pushl $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 11 - pushl $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 12 - pushl $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - - - ASM_GLOBAL ASM_PFX(SystemTimerHandler) -ASM_PFX(SystemTimerHandler): - pushl $0 - pushl $ASM_PFX(mTimerVector) - JmpCommonIdtEntry - -commonIdtEntry: -# +---------------------+ -# + EFlags + -# +---------------------+ -# + CS + -# +---------------------+ -# + EIP + -# +---------------------+ -# + Error Code + -# +---------------------+ -# + Vector Number + -# +---------------------+ -# + EBP + -# +---------------------+ <-- EBP - - cli - push %ebp - movl %esp,%ebp - - # - # Align stack to make sure that EFI_FX_SAVE_STATE_IA32 of EFI_SYSTEM_CONTEXT_IA32 - # is 16-byte aligned - # - andl $0xfffffff0,%esp - subl $12,%esp - -## UINT32 Edi, Esi, Ebp, Esp, Ebx, Edx, Ecx, Eax# - push %eax - push %ecx - push %edx - push %ebx - leal 6*4(%ebp),%ecx - push %ecx # ESP - push (%ebp) # EBP - push %esi - push %edi - -## UINT32 Gs, Fs, Es, Ds, Cs, Ss# - movw %ss,%ax - push %eax - movzx 4*4(%ebp),%eax - push %eax - movw %ds,%ax - push %eax - movw %es,%ax - push %eax - movw %fs,%ax - push %eax - movw %gs,%ax - push %eax - -## UINT32 Eip# - pushl 3*4(%ebp) - -## UINT32 Gdtr[2], Idtr[2]# - subl $8,%esp - sidt (%esp) - subl $8,%esp - sgdt (%esp) - -## UINT32 Ldtr, Tr# - xorl %eax, %eax - str %ax - push %eax - sldt %eax - push %eax - -## UINT32 EFlags# - pushl 5*4(%ebp) - -## UINT32 Cr0, Cr1, Cr2, Cr3, Cr4# - mov %cr4,%eax - orl $0x208,%eax - mov %eax,%cr4 - push %eax - mov %cr3,%eax - push %eax - mov %cr2,%eax - push %eax - xor %eax, %eax - push %eax - mov %cr0,%eax - push %eax - -## UINT32 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7# - mov %dr7,%eax - push %eax -## clear Dr7 while executing debugger itself - xor %eax, %eax - mov %eax,%dr7 - - mov %dr6,%eax - push %eax -## insure all status bits in dr6 are clear... - xor %eax, %eax - mov %eax,%dr6 - - mov %dr3,%eax - push %eax - mov %dr2,%eax - push %eax - mov %dr1,%eax - push %eax - mov %dr0,%eax - push %eax - -## FX_SAVE_STATE_IA32 FxSaveState; - sub $512,%esp - mov %esp,%edi - fxsave (%edi) - -## UINT32 ExceptionData; - pushl 2*4(%ebp) - -## Prepare parameter and call - mov %esp,%edx - push %edx - mov 1*4(%ebp),%eax - push %eax - cmpl $32,%eax - jb CallException - call ASM_PFX(TimerHandler) - jmp ExceptionDone -CallException: - call ASM_PFX(ExceptionHandler) -ExceptionDone: - addl $8,%esp - - cli -## UINT32 ExceptionData; - addl $4,%esp - -## FX_SAVE_STATE_IA32 FxSaveState; - mov %esp,%esi - fxrstor (%esi) - addl $512,%esp - -#; UINT32 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7; - pop %eax - mov %eax,%dr0 - pop %eax - mov %eax,%dr1 - pop %eax - mov %eax,%dr2 - pop %eax - mov %eax,%dr3 -## skip restore of dr6. We cleared dr6 during the context save. - addl $4,%esp - pop %eax - mov %eax,%dr7 - -## UINT32 Cr0, Cr1, Cr2, Cr3, Cr4; - pop %eax - mov %eax,%cr0 - addl $4,%esp # not for Cr1 - pop %eax - mov %eax,%cr2 - pop %eax - mov %eax,%cr3 - pop %eax - mov %eax,%cr4 - -## UINT32 EFlags; - popl 5*4(%ebp) - -## UINT32 Ldtr, Tr; -## UINT32 Gdtr[2], Idtr[2]; -## Best not let anyone mess with these particular registers... - addl $24,%esp - -## UINT32 Eip; - popl 3*4(%ebp) - -## UINT32 Gs, Fs, Es, Ds, Cs, Ss; -## NOTE - modified segment registers could hang the debugger... We -## could attempt to insulate ourselves against this possibility, -## but that poses risks as well. -## - pop %gs - pop %fs - pop %es - pop %ds - popl 4*4(%ebp) - pop %ss - -## UINT32 Edi, Esi, Ebp, Esp, Ebx, Edx, Ecx, Eax; - pop %edi - pop %esi - addl $4,%esp # not for ebp - addl $4,%esp # not for esp - pop %ebx - pop %edx - pop %ecx - pop %eax - - mov %ebp,%esp - pop %ebp - addl $8,%esp - iret - - -#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -# data -#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - .data - .p2align 2 - -gdtr: .short GDT_END - GDT_BASE - 1 # GDT limit - .long 0 # (GDT base gets set above) -#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -# global descriptor table (GDT) -#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - .p2align 2 - -GDT_BASE: -# null descriptor -NULL_SEL = .-GDT_BASE - .short 0 # limit 15:0 - .short 0 # base 15:0 - .byte 0 # base 23:16 - .byte 0 # type - .byte 0 # limit 19:16, flags - .byte 0 # base 31:24 - -# linear data segment descriptor -LINEAR_SEL = .-GDT_BASE - .short 0x0FFFF # limit 0xFFFFF - .short 0 # base 0 - .byte 0 - .byte 0x092 # present, ring 0, data, expand-up, writable - .byte 0x0CF # page-granular, 32-bit - .byte 0 - -# linear code segment descriptor -LINEAR_CODE_SEL = .-GDT_BASE - .short 0x0FFFF # limit 0xFFFFF - .short 0 # base 0 - .byte 0 - .byte 0x09A # present, ring 0, data, expand-up, writable - .byte 0x0CF # page-granular, 32-bit - .byte 0 - -# system data segment descriptor -SYS_DATA_SEL = .-GDT_BASE - .short 0x0FFFF # limit 0xFFFFF - .short 0 # base 0 - .byte 0 - .byte 0x092 # present, ring 0, data, expand-up, writable - .byte 0x0CF # page-granular, 32-bit - .byte 0 - -# system code segment descriptor -SYS_CODE_SEL = .-GDT_BASE - .short 0x0FFFF # limit 0xFFFFF - .short 0 # base 0 - .byte 0 - .byte 0x09A # present, ring 0, data, expand-up, writable - .byte 0x0CF # page-granular, 32-bit - .byte 0 - -# spare segment descriptor -SPARE3_SEL = .-GDT_BASE - .short 0 # limit 0xFFFFF - .short 0 # base 0 - .byte 0 - .byte 0 # present, ring 0, data, expand-up, writable - .byte 0 # page-granular, 32-bit - .byte 0 - -# spare segment descriptor -SPARE4_SEL = .-GDT_BASE - .short 0 # limit 0xFFFFF - .short 0 # base 0 - .byte 0 - .byte 0 # present, ring 0, data, expand-up, writable - .byte 0 # page-granular, 32-bit - .byte 0 - -# spare segment descriptor -SPARE5_SEL = .-GDT_BASE - .short 0 # limit 0xFFFFF - .short 0 # base 0 - .byte 0 - .byte 0 # present, ring 0, data, expand-up, writable - .byte 0 # page-granular, 32-bit - .byte 0 - -GDT_END: - - .p2align 2 - - - -idtr: .short IDT_END - IDT_BASE - 1 # IDT limit - .long 0 # (IDT base gets set above) -#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -# interrupt descriptor table (IDT) -# -# Note: The hardware IRQ's specified in this table are the normal PC/AT IRQ -# mappings. This implementation only uses the system timer and all other -# IRQs will remain masked. The descriptors for vectors 33+ are provided -# for convenience. -#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -#idt_tag .byte "IDT",0 - .p2align 2 - -IDT_BASE: -# divide by zero (INT 0) -DIV_ZERO_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# debug exception (INT 1) -DEBUG_EXCEPT_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# NMI (INT 2) -NMI_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# soft breakpoint (INT 3) -BREAKPOINT_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# overflow (INT 4) -OVERFLOW_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# bounds check (INT 5) -BOUNDS_CHECK_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# invalid opcode (INT 6) -INVALID_OPCODE_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# device not available (INT 7) -DEV_NOT_AVAIL_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# double fault (INT 8) -DOUBLE_FAULT_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# Coprocessor segment overrun - reserved (INT 9) -RSVD_INTR_SEL1 = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# invalid TSS (INT 0ah) -INVALID_TSS_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# segment not present (INT 0bh) -SEG_NOT_PRESENT_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# stack fault (INT 0ch) -STACK_FAULT_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# general protection (INT 0dh) -GP_FAULT_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# page fault (INT 0eh) -PAGE_FAULT_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# Intel reserved - do not use (INT 0fh) -RSVD_INTR_SEL2 = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# floating point error (INT 0x10) -FLT_POINT_ERR_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# alignment check (INT 0x11) -ALIGNMENT_CHECK_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# machine check (INT 0x12) -MACHINE_CHECK_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# SIMD floating-point exception (INT 0x13) -SIMD_EXCEPTION_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - - # The following segment repeats (32 - 20) times: - # No. 1 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - # No. 2 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - # No. 3 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - # No. 4 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - # No. 5 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - # No. 6 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - # No. 7 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - # No. 8 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - # No. 9 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - # No. 10 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - # No. 11 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - # No. 12 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - - -# 72 unspecified descriptors - .fill 72 * 8, 1, 0 - -# IRQ 0 (System timer) - (INT 0x68) -IRQ0_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# IRQ 1 (8042 Keyboard controller) - (INT 0x69) -IRQ1_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# Reserved - IRQ 2 redirect (IRQ 2) - DO NOT USE!!! - (INT 6ah) -IRQ2_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# IRQ 3 (COM 2) - (INT 6bh) -IRQ3_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# IRQ 4 (COM 1) - (INT 6ch) -IRQ4_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# IRQ 5 (LPT 2) - (INT 6dh) -IRQ5_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# IRQ 6 (Floppy controller) - (INT 6eh) -IRQ6_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# IRQ 7 (LPT 1) - (INT 6fh) -IRQ7_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# IRQ 8 (RTC Alarm) - (INT 0x70) -IRQ8_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# IRQ 9 - (INT 0x71) -IRQ9_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# IRQ 10 - (INT 0x72) -IRQ10_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# IRQ 11 - (INT 0x73) -IRQ11_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# IRQ 12 (PS/2 mouse) - (INT 0x74) -IRQ12_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# IRQ 13 (Floating point error) - (INT 0x75) -IRQ13_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# IRQ 14 (Secondary IDE) - (INT 0x76) -IRQ14_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - -# IRQ 15 (Primary IDE) - (INT 0x77) -IRQ15_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - - .fill 1 * 8, 1, 0 - -IDT_END: - diff --git a/DuetPkg/CpuDxe/Ia32/CpuInterrupt.asm b/DuetPkg/CpuDxe/Ia32/CpuInterrupt.asm deleted file mode 100644 index d52022336f..0000000000 --- a/DuetPkg/CpuDxe/Ia32/CpuInterrupt.asm +++ /dev/null @@ -1,835 +0,0 @@ - TITLE CpuInterrupt.asm: -;------------------------------------------------------------------------------ -;* -;* Copyright (c) 2006, Intel Corporation. All rights reserved.
-;* This program and the accompanying materials -;* are licensed and made available under the terms and conditions of the BSD License -;* which accompanies this distribution. The full text of the license may be found at -;* http://opensource.org/licenses/bsd-license.php -;* -;* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -;* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -;* -;* CpuInterrupt.asm -;* -;* Abstract: -;* -;------------------------------------------------------------------------------ - -.686p -.model flat, C - -PUBLIC SystemTimerHandler -PUBLIC SystemExceptionHandler -EXTERNDEF mExceptionCodeSize:DWORD - -.code -.stack -.MMX -.XMM - -EXTERN TimerHandler: NEAR -EXTERN ExceptionHandler: NEAR -EXTERN mTimerVector: DWORD - -mExceptionCodeSize DD 9 - -InitDescriptor PROC C - lea eax, [GDT_BASE] ; EAX=PHYSICAL address of gdt - mov dword ptr [gdtr + 2],eax ; Put address of gdt into the gdtr - lgdt fword ptr [gdtr] - lea eax, [IDT_BASE] ; EAX=PHYSICAL address of idt - mov dword ptr [idtr + 2],eax ; Put address of idt into the idtr - lidt fword ptr [idtr] - ret -InitDescriptor ENDP - -; VOID -; InstallInterruptHandler ( -; UINTN Vector, -; VOID (*Handler)(VOID) -; ) -InstallInterruptHandler PROC C \ - Vector:DWORD, \ - Handler:DWORD - - push edi - pushfd ; save eflags - cli ; turn off interrupts - sub esp, 6 ; open some space on the stack - mov edi, esp - sidt es:[edi] ; get fword address of IDT - mov edi, es:[edi+2] ; move offset of IDT into EDI - add esp, 6 ; correct stack - mov eax, Vector ; Get vector number - shl eax, 3 ; multiply by 8 to get offset - add edi, eax ; add to IDT base to get entry - mov eax, Handler ; load new address into IDT entry - mov word ptr es:[edi], ax ; write bits 15..0 of offset - shr eax, 16 ; use ax to copy 31..16 to descriptors - mov word ptr es:[edi+6], ax ; write bits 31..16 of offset - popfd ; restore flags (possible enabling interrupts) - pop edi - ret - -InstallInterruptHandler ENDP - -JmpCommonIdtEntry macro - ; jmp commonIdtEntry - this must be hand coded to keep the assembler from - ; using a 8 bit reletive jump when the entries are - ; within 255 bytes of the common entry. This must - ; be done to maintain the consistency of the size - ; of entry points... - db 0e9h ; jmp 16 bit reletive - dd commonIdtEntry - $ - 4 ; offset to jump to -endm - - align 02h -SystemExceptionHandler PROC -INT0: - push 0h ; push error code place holder on the stack - push 0h - JmpCommonIdtEntry -; db 0e9h ; jmp 16 bit reletive -; dd commonIdtEntry - $ - 4 ; offset to jump to - -INT1: - push 0h ; push error code place holder on the stack - push 1h - JmpCommonIdtEntry - -INT2: - push 0h ; push error code place holder on the stack - push 2h - JmpCommonIdtEntry - -INT3: - push 0h ; push error code place holder on the stack - push 3h - JmpCommonIdtEntry - -INT4: - push 0h ; push error code place holder on the stack - push 4h - JmpCommonIdtEntry - -INT5: - push 0h ; push error code place holder on the stack - push 5h - JmpCommonIdtEntry - -INT6: - push 0h ; push error code place holder on the stack - push 6h - JmpCommonIdtEntry - -INT7: - push 0h ; push error code place holder on the stack - push 7h - JmpCommonIdtEntry - -INT8: -; Double fault causes an error code to be pushed so no phony push necessary - nop - nop - push 8h - JmpCommonIdtEntry - -INT9: - push 0h ; push error code place holder on the stack - push 9h - JmpCommonIdtEntry - -INT10: -; Invalid TSS causes an error code to be pushed so no phony push necessary - nop - nop - push 10 - JmpCommonIdtEntry - -INT11: -; Segment Not Present causes an error code to be pushed so no phony push necessary - nop - nop - push 11 - JmpCommonIdtEntry - -INT12: -; Stack fault causes an error code to be pushed so no phony push necessary - nop - nop - push 12 - JmpCommonIdtEntry - -INT13: -; GP fault causes an error code to be pushed so no phony push necessary - nop - nop - push 13 - JmpCommonIdtEntry - -INT14: -; Page fault causes an error code to be pushed so no phony push necessary - nop - nop - push 14 - JmpCommonIdtEntry - -INT15: - push 0h ; push error code place holder on the stack - push 15 - JmpCommonIdtEntry - -INT16: - push 0h ; push error code place holder on the stack - push 16 - JmpCommonIdtEntry - -INT17: -; Alignment check causes an error code to be pushed so no phony push necessary - nop - nop - push 17 - JmpCommonIdtEntry - -INT18: - push 0h ; push error code place holder on the stack - push 18 - JmpCommonIdtEntry - -INT19: - push 0h ; push error code place holder on the stack - push 19 - JmpCommonIdtEntry - -INTUnknown: -REPEAT (32 - 20) - push 0h ; push error code place holder on the stack -; push xxh ; push vector number - db 06ah - db ( $ - INTUnknown - 3 ) / 9 + 20 ; vector number - JmpCommonIdtEntry -ENDM -SystemExceptionHandler ENDP - -SystemTimerHandler PROC - push 0 - push mTimerVector - JmpCommonIdtEntry -SystemTimerHandler ENDP - -commonIdtEntry: -; +---------------------+ -; + EFlags + -; +---------------------+ -; + CS + -; +---------------------+ -; + EIP + -; +---------------------+ -; + Error Code + -; +---------------------+ -; + Vector Number + -; +---------------------+ -; + EBP + -; +---------------------+ <-- EBP - - cli - push ebp - mov ebp, esp - - ; - ; Align stack to make sure that EFI_FX_SAVE_STATE_IA32 of EFI_SYSTEM_CONTEXT_IA32 - ; is 16-byte aligned - ; - and esp, 0fffffff0h - sub esp, 12 - -;; UINT32 Edi, Esi, Ebp, Esp, Ebx, Edx, Ecx, Eax; - push eax - push ecx - push edx - push ebx - lea ecx, [ebp + 6 * 4] - push ecx ; ESP - push dword ptr [ebp] ; EBP - push esi - push edi - -;; UINT32 Gs, Fs, Es, Ds, Cs, Ss; - mov eax, ss - push eax - movzx eax, word ptr [ebp + 4 * 4] - push eax - mov eax, ds - push eax - mov eax, es - push eax - mov eax, fs - push eax - mov eax, gs - push eax - -;; UINT32 Eip; - push dword ptr [ebp + 3 * 4] - -;; UINT32 Gdtr[2], Idtr[2]; - sub esp, 8 - sidt fword ptr [esp] - sub esp, 8 - sgdt fword ptr [esp] - -;; UINT32 Ldtr, Tr; - xor eax, eax - str ax - push eax - sldt ax - push eax - -;; UINT32 EFlags; - push dword ptr [ebp + 5 * 4] - -;; UINT32 Cr0, Cr1, Cr2, Cr3, Cr4; - mov eax, cr4 - or eax, 208h - mov cr4, eax - push eax - mov eax, cr3 - push eax - mov eax, cr2 - push eax - xor eax, eax - push eax - mov eax, cr0 - push eax - -;; UINT32 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7; - mov eax, dr7 - push eax -;; clear Dr7 while executing debugger itself - xor eax, eax - mov dr7, eax - - mov eax, dr6 - push eax -;; insure all status bits in dr6 are clear... - xor eax, eax - mov dr6, eax - - mov eax, dr3 - push eax - mov eax, dr2 - push eax - mov eax, dr1 - push eax - mov eax, dr0 - push eax - -;; FX_SAVE_STATE_IA32 FxSaveState; - sub esp, 512 - mov edi, esp - db 0fh, 0aeh, 00000111y ;fxsave [edi] - -;; UINT32 ExceptionData; - push dword ptr [ebp + 2 * 4] - -;; Prepare parameter and call - mov edx, esp - push edx - mov eax, dword ptr [ebp + 1 * 4] - push eax - cmp eax, 32 - jb CallException - call TimerHandler - jmp ExceptionDone -CallException: - call ExceptionHandler -ExceptionDone: - add esp, 8 - - cli -;; UINT32 ExceptionData; - add esp, 4 - -;; FX_SAVE_STATE_IA32 FxSaveState; - mov esi, esp - db 0fh, 0aeh, 00001110y ; fxrstor [esi] - add esp, 512 - -;; UINT32 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7; - pop eax - mov dr0, eax - pop eax - mov dr1, eax - pop eax - mov dr2, eax - pop eax - mov dr3, eax -;; skip restore of dr6. We cleared dr6 during the context save. - add esp, 4 - pop eax - mov dr7, eax - -;; UINT32 Cr0, Cr1, Cr2, Cr3, Cr4; - pop eax - mov cr0, eax - add esp, 4 ; not for Cr1 - pop eax - mov cr2, eax - pop eax - mov cr3, eax - pop eax - mov cr4, eax - -;; UINT32 EFlags; - pop dword ptr [ebp + 5 * 4] - -;; UINT32 Ldtr, Tr; -;; UINT32 Gdtr[2], Idtr[2]; -;; Best not let anyone mess with these particular registers... - add esp, 24 - -;; UINT32 Eip; - pop dword ptr [ebp + 3 * 4] - -;; UINT32 Gs, Fs, Es, Ds, Cs, Ss; -;; NOTE - modified segment registers could hang the debugger... We -;; could attempt to insulate ourselves against this possibility, -;; but that poses risks as well. -;; - pop gs - pop fs - pop es - pop ds - pop dword ptr [ebp + 4 * 4] - pop ss - -;; UINT32 Edi, Esi, Ebp, Esp, Ebx, Edx, Ecx, Eax; - pop edi - pop esi - add esp, 4 ; not for ebp - add esp, 4 ; not for esp - pop ebx - pop edx - pop ecx - pop eax - - mov esp, ebp - pop ebp - add esp, 8 - iretd - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; data -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - align 02h - -gdtr dw GDT_END - GDT_BASE - 1 ; GDT limit - dd 0 ; (GDT base gets set above) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; global descriptor table (GDT) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - align 02h - -public GDT_BASE -GDT_BASE: -; null descriptor -NULL_SEL equ $-GDT_BASE - dw 0 ; limit 15:0 - dw 0 ; base 15:0 - db 0 ; base 23:16 - db 0 ; type - db 0 ; limit 19:16, flags - db 0 ; base 31:24 - -; linear data segment descriptor -LINEAR_SEL equ $-GDT_BASE - dw 0FFFFh ; limit 0xFFFFF - dw 0 ; base 0 - db 0 - db 092h ; present, ring 0, data, expand-up, writable - db 0CFh ; page-granular, 32-bit - db 0 - -; linear code segment descriptor -LINEAR_CODE_SEL equ $-GDT_BASE - dw 0FFFFh ; limit 0xFFFFF - dw 0 ; base 0 - db 0 - db 09Ah ; present, ring 0, data, expand-up, writable - db 0CFh ; page-granular, 32-bit - db 0 - -; system data segment descriptor -SYS_DATA_SEL equ $-GDT_BASE - dw 0FFFFh ; limit 0xFFFFF - dw 0 ; base 0 - db 0 - db 092h ; present, ring 0, data, expand-up, writable - db 0CFh ; page-granular, 32-bit - db 0 - -; system code segment descriptor -SYS_CODE_SEL equ $-GDT_BASE - dw 0FFFFh ; limit 0xFFFFF - dw 0 ; base 0 - db 0 - db 09Ah ; present, ring 0, data, expand-up, writable - db 0CFh ; page-granular, 32-bit - db 0 - -; spare segment descriptor -SPARE3_SEL equ $-GDT_BASE - dw 0 ; limit 0xFFFFF - dw 0 ; base 0 - db 0 - db 0 ; present, ring 0, data, expand-up, writable - db 0 ; page-granular, 32-bit - db 0 - -; spare segment descriptor -SPARE4_SEL equ $-GDT_BASE - dw 0 ; limit 0xFFFFF - dw 0 ; base 0 - db 0 - db 0 ; present, ring 0, data, expand-up, writable - db 0 ; page-granular, 32-bit - db 0 - -; spare segment descriptor -SPARE5_SEL equ $-GDT_BASE - dw 0 ; limit 0xFFFFF - dw 0 ; base 0 - db 0 - db 0 ; present, ring 0, data, expand-up, writable - db 0 ; page-granular, 32-bit - db 0 - -GDT_END: - - align 02h - - - -idtr dw IDT_END - IDT_BASE - 1 ; IDT limit - dd 0 ; (IDT base gets set above) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; interrupt descriptor table (IDT) -; -; Note: The hardware IRQ's specified in this table are the normal PC/AT IRQ -; mappings. This implementation only uses the system timer and all other -; IRQs will remain masked. The descriptors for vectors 33+ are provided -; for convenience. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;idt_tag db "IDT",0 - align 02h - -public IDT_BASE -IDT_BASE: -; divide by zero (INT 0) -DIV_ZERO_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; debug exception (INT 1) -DEBUG_EXCEPT_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; NMI (INT 2) -NMI_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; soft breakpoint (INT 3) -BREAKPOINT_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; overflow (INT 4) -OVERFLOW_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; bounds check (INT 5) -BOUNDS_CHECK_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; invalid opcode (INT 6) -INVALID_OPCODE_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; device not available (INT 7) -DEV_NOT_AVAIL_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; double fault (INT 8) -DOUBLE_FAULT_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; Coprocessor segment overrun - reserved (INT 9) -RSVD_INTR_SEL1 equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; invalid TSS (INT 0ah) -INVALID_TSS_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; segment not present (INT 0bh) -SEG_NOT_PRESENT_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; stack fault (INT 0ch) -STACK_FAULT_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; general protection (INT 0dh) -GP_FAULT_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; page fault (INT 0eh) -PAGE_FAULT_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; Intel reserved - do not use (INT 0fh) -RSVD_INTR_SEL2 equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; floating point error (INT 10h) -FLT_POINT_ERR_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; alignment check (INT 11h) -ALIGNMENT_CHECK_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; machine check (INT 12h) -MACHINE_CHECK_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; SIMD floating-point exception (INT 13h) -SIMD_EXCEPTION_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -REPEAT (32 - 20) - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 -ENDM - -; 72 unspecified descriptors - db (72 * 8) dup(0) - -; IRQ 0 (System timer) - (INT 68h) -IRQ0_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; IRQ 1 (8042 Keyboard controller) - (INT 69h) -IRQ1_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; Reserved - IRQ 2 redirect (IRQ 2) - DO NOT USE!!! - (INT 6ah) -IRQ2_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; IRQ 3 (COM 2) - (INT 6bh) -IRQ3_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; IRQ 4 (COM 1) - (INT 6ch) -IRQ4_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; IRQ 5 (LPT 2) - (INT 6dh) -IRQ5_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; IRQ 6 (Floppy controller) - (INT 6eh) -IRQ6_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; IRQ 7 (LPT 1) - (INT 6fh) -IRQ7_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; IRQ 8 (RTC Alarm) - (INT 70h) -IRQ8_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; IRQ 9 - (INT 71h) -IRQ9_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; IRQ 10 - (INT 72h) -IRQ10_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; IRQ 11 - (INT 73h) -IRQ11_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; IRQ 12 (PS/2 mouse) - (INT 74h) -IRQ12_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; IRQ 13 (Floating point error) - (INT 75h) -IRQ13_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; IRQ 14 (Secondary IDE) - (INT 76h) -IRQ14_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - -; IRQ 15 (Primary IDE) - (INT 77h) -IRQ15_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - - db (1 * 8) dup(0) - -IDT_END: - -END diff --git a/DuetPkg/CpuDxe/X64/CpuInterrupt.S b/DuetPkg/CpuDxe/X64/CpuInterrupt.S deleted file mode 100644 index 7b83d08166..0000000000 --- a/DuetPkg/CpuDxe/X64/CpuInterrupt.S +++ /dev/null @@ -1,1096 +0,0 @@ -#------------------------------------------------------------------------------ -#* -#* Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
-#* This program and the accompanying materials -#* are licensed and made available under the terms and conditions of the BSD License -#* which accompanies this distribution. The full text of the license may be found at -#* http://opensource.org/licenses/bsd-license.php -#* -#* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -#* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -#* -#* CpuInterrupt.S -#* -#* Abstract: -#* -#------------------------------------------------------------------------------ - -#PUBLIC SystemTimerHandler -#PUBLIC SystemExceptionHandler -#EXTERNDEF mExceptionCodeSize:DWORD - -#EXTERN TimerHandler: NEAR -#EXTERN ExceptionHandler: NEAR -#EXTERN mTimerVector: DWORD - - .data - ASM_GLOBAL ASM_PFX(mExceptionCodeSize) -ASM_PFX(mExceptionCodeSize): .long 9 - - .text - ASM_GLOBAL ASM_PFX(InitDescriptor) - -ASM_PFX(InitDescriptor): - movq $GDT_BASE,%rax # EAX=PHYSICAL address of gdt - movq %rax, gdtr + 2 # Put address of gdt into the gdtr - lgdt gdtr - movq $0x18, %rax - movq %rax, %gs - movq %rax, %fs - movq $IDT_BASE,%rax # EAX=PHYSICAL address of idt - movq %rax, idtr + 2 # Put address of idt into the idtr - lidt idtr - ret - -# VOID -# InstallInterruptHandler ( -# UINTN Vector, -# VOID (*Handler)(VOID) -# ) - ASM_GLOBAL ASM_PFX(InstallInterruptHandler) -ASM_PFX(InstallInterruptHandler): -# Vector:DWORD @ 4(%esp) -# Handler:DWORD @ 8(%esp) - push %rbx - pushfq # save eflags - cli # turn off interrupts - subq $0x10, %rsp # open some space on the stack - movq %rsp, %rbx - - sidt (%rbx) # get fword address of IDT - movq 2(%rbx), %rbx # move offset of IDT into RBX - addq $0x10, %rsp # correct stack - movq %rcx, %rax # Get vector number - shlq $4, %rax # multiply by 16 to get offset - addq %rax, %rbx # add to IDT base to get entry - movq %rdx, %rax # load new address into IDT entry - movw %ax, (%rbx) # write bits 15..0 of offset - shrq $16, %rax # use ax to copy 31..16 to descriptors - movw %ax, 6(%rbx) # write bits 31..16 of offset - shrq $16, %rax # use eax to copy 63..32 to descriptors - movl %eax, 8(%rbx) # write bits 63..32 of offset - popfq # restore flags (possible enabling interrupts) - pop %rbx - ret - - .macro JmpCommonIdtEntry - # jmp commonIdtEntry - this must be hand coded to keep the assembler from - # using a 8 bit reletive jump when the entries are - # within 255 bytes of the common entry. This must - # be done to maintain the consistency of the size - # of entry points... - .byte 0xe9 # jmp 16 bit reletive - .long commonIdtEntry - . - 4 # offset to jump to - .endm - - .p2align 1 - ASM_GLOBAL ASM_PFX(SystemExceptionHandler) -ASM_PFX(SystemExceptionHandler): -INT0: - push $0x0 # push error code place holder on the stack - push $0x0 - JmpCommonIdtEntry -# db 0e9h # jmp 16 bit reletive -# dd commonIdtEntry - $ - 4 # offset to jump to - -INT1: - push $0x0 # push error code place holder on the stack - push $0x1 - JmpCommonIdtEntry - -INT2: - push $0x0 # push error code place holder on the stack - push $0x2 - JmpCommonIdtEntry - -INT3: - push $0x0 # push error code place holder on the stack - push $0x3 - JmpCommonIdtEntry - -INT4: - push $0x0 # push error code place holder on the stack - push $0x4 - JmpCommonIdtEntry - -INT5: - push $0x0 # push error code place holder on the stack - push $0x5 - JmpCommonIdtEntry - -INT6: - push $0x0 # push error code place holder on the stack - push $0x6 - JmpCommonIdtEntry - -INT7: - push $0x0 # push error code place holder on the stack - push $0x7 - JmpCommonIdtEntry - -INT8: -# Double fault causes an error code to be pushed so no phony push necessary - nop - nop - push $0x8 - JmpCommonIdtEntry - -INT9: - push $0x0 # push error code place holder on the stack - push $0x9 - JmpCommonIdtEntry - -INT10: -# Invalid TSS causes an error code to be pushed so no phony push necessary - nop - nop - push $10 - JmpCommonIdtEntry - -INT11: -# Segment Not Present causes an error code to be pushed so no phony push necessary - nop - nop - push $11 - JmpCommonIdtEntry - -INT12: -# Stack fault causes an error code to be pushed so no phony push necessary - nop - nop - push $12 - JmpCommonIdtEntry - -INT13: -# GP fault causes an error code to be pushed so no phony push necessary - nop - nop - push $13 - JmpCommonIdtEntry - -INT14: -# Page fault causes an error code to be pushed so no phony push necessary - nop - nop - push $14 - JmpCommonIdtEntry - -INT15: - push $0x0 # push error code place holder on the stack - push $15 - JmpCommonIdtEntry - -INT16: - push $0x0 # push error code place holder on the stack - push $16 - JmpCommonIdtEntry - -INT17: -# Alignment check causes an error code to be pushed so no phony push necessary - nop - nop - push $17 - JmpCommonIdtEntry - -INT18: - push $0x0 # push error code place holder on the stack - push $18 - JmpCommonIdtEntry - -INT19: - push $0x0 # push error code place holder on the stack - push $19 - JmpCommonIdtEntry - -INTUnknown: - # The following segment repeats (32 - 20) times: - # macro .rept isn't used here because Apple GAS compiler doesn't support it. - # No. 1 - push $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 2 - push $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 3 - push $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 4 - push $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 5 - push $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 6 - push $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 7 - push $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 8 - push $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 9 - push $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 10 - push $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 11 - push $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - # No. 12 - push $0x0 # push error code place holder on the stack -# push xxh # push vector number - .byte 0x6a - .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number - JmpCommonIdtEntry - - - ASM_GLOBAL ASM_PFX(SystemTimerHandler) -ASM_PFX(SystemTimerHandler): - push $0 - push $ASM_PFX(mTimerVector) - JmpCommonIdtEntry - -commonIdtEntry: -# +---------------------+ -# + EFlags + -# +---------------------+ -# + CS + -# +---------------------+ -# + EIP + -# +---------------------+ -# + Error Code + -# +---------------------+ -# + Vector Number + -# +---------------------+ -# + EBP + -# +---------------------+ <-- EBP - - cli - push %rbp - movq %rsp,%rbp - - # - # Since here the stack pointer is 16-byte aligned, so - # EFI_FX_SAVE_STATE_X64 of EFI_SYSTEM_CONTEXT_x64 - # is 16-byte aligned - # - -## UINT64 Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax# -## UINT64 R8, R9, R10, R11, R12, R13, R14, R15# - push %r15 - push %r14 - push %r13 - push %r12 - push %r11 - push %r10 - push %r9 - push %r8 - push %rax - push %rcx - push %rdx - push %rbx - push 6*8(%rbp) - push (%rbp) - push %rsi - push %rdi - -## UINT64 Gs, Fs, Es, Ds, Cs, Ss# insure high 16 bits of each is zero - movzx 7*8(%rbp), %rax - push %rax # for ss - movzx 4*8(%rbp), %rax - push %rax # for cs - movq %ds, %rax - push %rax - movq %es, %rax - push %rax - movq %fs, %rax - push %rax - movq %gs, %rax - push %rax - -## UINT64 Rip# - push 3*8(%rbp) - -## UINT64 Gdtr[2], Idtr[2]# - subq $16, %rsp - sidt (%rsp) - subq $16, %rsp - sgdt (%rsp) - -## UINT64 Ldtr, Tr# - xorq %rax, %rax - str %ax - push %rax - sldt %ax - push %rax - -## UINT64 RFlags# - push 5*8(%rbp) - -## UINT64 Cr0, Cr1, Cr2, Cr3, Cr4, Cr8# - movq %cr8, %rax - push %rax - movq %cr4, %rax - orq $0x208, %rax - movq %rax, %cr4 - push %rax - movq %cr3, %rax - push %rax - movq %cr2, %rax - push %rax - xorq %rax, %rax - push %rax - movq %cr0, %rax - push %rax - -## UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7# - movq %dr7, %rax - push %rax - -## clear Dr7 while executing debugger itself - xorq %rax, %rax - movq %rax, %dr7 - - movq %dr6, %rax - push %rax - -## insure all status bits in dr6 are clear... - xorq %rax, %rax - movq %rax, %dr6 - - movq %dr3, %rax - push %rax - movq %dr2, %rax - push %rax - movq %dr1, %rax - push %rax - movq %dr0, %rax - push %rax - - -## FX_SAVE_STATE_X64 FxSaveState# - subq $512, %rsp - movq %rsp, %rdi - fxsave (%rdi) - -## UINT64 ExceptionData# - push 2*8 (%rbp) - -## call into exception handler -## Prepare parameter and call - movq 1*8(%rbp), %rcx - movq %rsp, %rdx - # - # Per X64 calling convention, allocate maximum parameter stack space - # and make sure RSP is 16-byte aligned - # - subq $(4*8+8), %rsp - cmpq $32, %rcx - jb CallException - call ASM_PFX(TimerHandler) - jmp ExceptionDone -CallException: - call ASM_PFX(ExceptionHandler) -ExceptionDone: - addq $(4*8+8), %rsp - - cli -## UINT64 ExceptionData# - addq $8, %rsp - -## FX_SAVE_STATE_X64 FxSaveState# - movq %rsp, %rsi - fxrstor (%esi) - addq $512, %rsp - - -## UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7# - pop %rax - movq %rax, %dr0 - pop %rax - movq %rax, %dr1 - pop %rax - movq %rax, %dr2 - pop %rax - movq %rax, %dr3 -## skip restore of dr6. We cleared dr6 during the context save. - addq $8, %rsp - pop %rax - movq %rax, %dr7 - -## UINT64 Cr0, Cr1, Cr2, Cr3, Cr4, Cr8# - pop %rax - movq %rax, %cr0 - addq $8, %rsp # not for Cr1 - pop %rax - movq %rax, %cr2 - pop %rax - movq %rax, %cr3 - pop %rax - movq %rax, %cr4 - pop %rax - mov %rax, %cr8 - -## UINT64 RFlags# - pop 5*8(%rbp) - -## UINT64 Ldtr, Tr# -## UINT64 Gdtr[2], Idtr[2]# -## Best not let anyone mess with these particular registers... - addq $48, %rsp - -## UINT64 Rip# - pop 3*8(%rbp) - -## UINT64 Gs, Fs, Es, Ds, Cs, Ss# - pop %rax - # mov gs, rax # not for gs - pop %rax - # mov fs, rax # not for fs - # (X64 will not use fs and gs, so we do not restore it) - pop %rax - movq %rax, %es - pop %rax - movq %rax, %ds - pop 4*8(%rbp) # for cs - pop 7*8(%rbp) # for ss - -## UINT64 Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax# -## UINT64 R8, R9, R10, R11, R12, R13, R14, R15# - pop %rdi - pop %rsi - addq $8, %rsp # not for rbp - pop 6*8(%rbp) # for rsp - pop %rbx - pop %rdx - pop %rcx - pop %rax - pop %r8 - pop %r9 - pop %r10 - pop %r11 - pop %r12 - pop %r13 - pop %r14 - pop %r15 - - movq %rbp, %rsp - pop %rbp - addq $16, %rsp - iretq - - -############################################################################## -# data -############################################################################## - - .data - -gdtr: .short GDT_END - GDT_BASE - 1 # GDT limit - .quad 0 # (GDT base gets set above) -############################################################################## -# global descriptor table (GDT) -############################################################################## - - .p2align 4 # make GDT 16-byte align - -GDT_BASE: -# null descriptor -NULL_SEL = .-GDT_BASE # Selector [0x0] - .short 0 # limit 15:0 - .short 0 # base 15:0 - .byte 0 # base 23:16 - .byte 0 # type - .byte 0 # limit 19:16, flags - .byte 0 # base 31:24 - -# linear data segment descriptor -LINEAR_SEL = .-GDT_BASE # Selector [0x8] - .short 0x0FFFF # limit 0xFFFFF - .short 0 # base 0 - .byte 0 - .byte 0x092 # present, ring 0, data, expand-up, writable - .byte 0x0CF # page-granular, 32-bit - .byte 0 - -# linear code segment descriptor -LINEAR_CODE_SEL = .-GDT_BASE # Selector [0x10] - .short 0x0FFFF # limit 0xFFFFF - .short 0 # base 0 - .byte 0 - .byte 0x09A # present, ring 0, code, expand-up, writable - .byte 0x0CF # page-granular, 32-bit - .byte 0 - -# system data segment descriptor -SYS_DATA_SEL = .-GDT_BASE # Selector [0x18] - .short 0x0FFFF # limit 0xFFFFF - .short 0 # base 0 - .byte 0 - .byte 0x092 # present, ring 0, data, expand-up, writable - .byte 0x0CF # page-granular, 32-bit - .byte 0 - -# system code segment descriptor -SYS_CODE_SEL = .-GDT_BASE # Selector [0x20] - .short 0x0FFFF # limit 0xFFFFF - .short 0 # base 0 - .byte 0 - .byte 0x09A # present, ring 0, code, expand-up, writable - .byte 0x0CF # page-granular, 32-bit - .byte 0 - -# spare segment descriptor -SPARE3_SEL = .-GDT_BASE # Selector [0x28] - .short 0 - .short 0 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - -# system data segment descriptor -SYS_DATA64_SEL = .-GDT_BASE # Selector [0x30] - .short 0x0FFFF # limit 0xFFFFF - .short 0 # base 0 - .byte 0 - .byte 0x092 # present, ring 0, data, expand-up, writable - .byte 0x0CF # page-granular, 32-bit - .byte 0 - -# system code segment descriptor -SYS_CODE64_SEL = .-GDT_BASE # Selector [0x38] - .short 0x0FFFF # limit 0xFFFFF - .short 0 # base 0 - .byte 0 - .byte 0x09A # present, ring 0, code, expand-up, writable - .byte 0x0AF # page-granular, 64-bit - .byte 0 - -# spare segment descriptor -SPARE4_SEL = .-GDT_BASE # Selector [0x40] - .short 0 - .short 0 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - -GDT_END: - -idtr: .short IDT_END - IDT_BASE - 1 # IDT limit - .quad 0 # (IDT base gets set above) -############################################################################## -# interrupt descriptor table (IDT) -# -# Note: The hardware IRQ's specified in this table are the normal PC/AT IRQ -# mappings. This implementation only uses the system timer and all other -# IRQs will remain masked. The descriptors for vectors 33+ are provided -# for convenience. -############################################################################## - - .p2align 3 # make IDT 8-byte align - -IDT_BASE: -# divide by zero (INT 0) -DIV_ZERO_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# debug exception (INT 1) -DEBUG_EXCEPT_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# NMI (INT 2) -NMI_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# soft breakpoint (INT 3) -BREAKPOINT_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# overflow (INT 4) -OVERFLOW_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# bounds check (INT 5) -BOUNDS_CHECK_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# invalid opcode (INT 6) -INVALID_OPCODE_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# device not available (INT 7) -DEV_NOT_AVAIL_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# double fault (INT 8) -DOUBLE_FAULT_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# Coprocessor segment overrun - reserved (INT 9) -RSVD_INTR_SEL1 = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# invalid TSS (INT 0ah) -INVALID_TSS_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# segment not present (INT 0bh) -SEG_NOT_PRESENT_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# stack fault (INT 0ch) -STACK_FAULT_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# general protection (INT 0dh) -GP_FAULT_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# page fault (INT 0eh) -PAGE_FAULT_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# Intel reserved - do not use (INT 0fh) -RSVD_INTR_SEL2 = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# floating point error (INT 0x10) -FLT_POINT_ERR_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# alignment check (INT 0x11) -ALIGNMENT_CHECK_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# machine check (INT 0x12) -MACHINE_CHECK_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# SIMD floating-point exception (INT 0x13) -SIMD_EXCEPTION_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - - # The following segment repeats (32 - 20) times: - # macro .rept isn't used here because Apple GAS compiler doesn't support it. - # No. 1 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - # No. 2 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - # No. 3 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - # No. 4 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - # No. 5 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - # No. 6 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - # No. 7 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - # No. 8 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - # No. 9 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - # No. 10 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - # No. 11 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - # No. 12 - .short 0 # offset 15:0 - .short SYS_CODE_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - - -# 72 unspecified descriptors - .fill 72 * 16, 1, 0 - -# IRQ 0 (System timer) - (INT 0x68) -IRQ0_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # 0 for reserved - -# IRQ 1 (8042 Keyboard controller) - (INT 0x69) -IRQ1_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# Reserved - IRQ 2 redirect (IRQ 2) - DO NOT USE!!! - (INT 6ah) -IRQ2_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# IRQ 3 (COM 2) - (INT 6bh) -IRQ3_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# IRQ 4 (COM 1) - (INT 6ch) -IRQ4_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# IRQ 5 (LPT 2) - (INT 6dh) -IRQ5_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# IRQ 6 (Floppy controller) - (INT 6eh) -IRQ6_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# IRQ 7 (LPT 1) - (INT 6fh) -IRQ7_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# IRQ 8 (RTC Alarm) - (INT 0x70) -IRQ8_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# IRQ 9 - (INT 0x71) -IRQ9_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# IRQ 10 - (INT 0x72) -IRQ10_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# IRQ 11 - (INT 0x73) -IRQ11_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# IRQ 12 (PS/2 mouse) - (INT 0x74) -IRQ12_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# IRQ 13 (Floating point error) - (INT 0x75) -IRQ13_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# IRQ 14 (Secondary IDE) - (INT 0x76) -IRQ14_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - -# IRQ 15 (Primary IDE) - (INT 0x77) -IRQ15_SEL = .-IDT_BASE - .short 0 # offset 15:0 - .short SYS_CODE64_SEL # selector 15:0 - .byte 0 # 0 for interrupt gate - .byte 0x0e | 0x80 # (10001110)type = 386 interrupt gate, present - .short 0 # offset 31:16 - .long 0 # offset 63:32 - .long 0 # for reserved - - .fill 16, 1, 0 - -IDT_END: - diff --git a/DuetPkg/CpuDxe/X64/CpuInterrupt.asm b/DuetPkg/CpuDxe/X64/CpuInterrupt.asm deleted file mode 100644 index 412c5ea1dc..0000000000 --- a/DuetPkg/CpuDxe/X64/CpuInterrupt.asm +++ /dev/null @@ -1,938 +0,0 @@ - TITLE CpuInterrupt.asm: -;------------------------------------------------------------------------------ -;* -;* Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
-;* This program and the accompanying materials -;* are licensed and made available under the terms and conditions of the BSD License -;* which accompanies this distribution. The full text of the license may be found at -;* http://opensource.org/licenses/bsd-license.php -;* -;* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -;* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -;* -;* CpuInterrupt.asm -;* -;* Abstract: -;* -;------------------------------------------------------------------------------ - -EXTERNDEF mExceptionCodeSize:DWORD - -.code - -EXTERN TimerHandler: FAR -EXTERN ExceptionHandler: NEAR -EXTERN mTimerVector: QWORD - -mExceptionCodeSize DD 9 - -InitDescriptor PROC - lea rax, [GDT_BASE] ; RAX=PHYSICAL address of gdt - mov qword ptr [gdtr + 2], rax ; Put address of gdt into the gdtr - lgdt fword ptr [gdtr] - mov rax, 18h - mov gs, rax - mov fs, rax - lea rax, [IDT_BASE] ; RAX=PHYSICAL address of idt - mov qword ptr [idtr + 2], rax ; Put address of idt into the idtr - lidt fword ptr [idtr] - ret -InitDescriptor ENDP - -; VOID -; InstallInterruptHandler ( -; UINTN Vector, // rcx -; void (*Handler)(void) // rdx -; ) -InstallInterruptHandler PROC - push rbx - pushfq ; save eflags - cli ; turn off interrupts - sub rsp, 10h ; open some space on the stack - mov rbx, rsp - sidt [rbx] ; get fword address of IDT - mov rbx, [rbx+2] ; move offset of IDT into RBX - add rsp, 10h ; correct stack - mov rax, rcx ; Get vector number - shl rax, 4 ; multiply by 16 to get offset - add rbx, rax ; add to IDT base to get entry - mov rax, rdx ; load new address into IDT entry - mov word ptr [rbx], ax ; write bits 15..0 of offset - shr rax, 16 ; use ax to copy 31..16 to descriptors - mov word ptr [rbx+6], ax ; write bits 31..16 of offset - shr rax, 16 ; use eax to copy 63..32 to descriptors - mov dword ptr [rbx+8], eax ; write bits 63..32 of offset - popfq ; restore flags (possible enabling interrupts) - pop rbx - ret - -InstallInterruptHandler ENDP - -JmpCommonIdtEntry macro - ; jmp commonIdtEntry - this must be hand coded to keep the assembler from - ; using a 8 bit reletive jump when the entries are - ; within 255 bytes of the common entry. This must - ; be done to maintain the consistency of the size - ; of entry points... - db 0e9h ; jmp 16 bit reletive - dd commonIdtEntry - $ - 4 ; offset to jump to -endm - - align 02h -SystemExceptionHandler PROC -INT0: - push 0h ; push error code place holder on the stack - push 0h - JmpCommonIdtEntry -; db 0e9h ; jmp 16 bit reletive -; dd commonIdtEntry - $ - 4 ; offset to jump to - -INT1: - push 0h ; push error code place holder on the stack - push 1h - JmpCommonIdtEntry - -INT2: - push 0h ; push error code place holder on the stack - push 2h - JmpCommonIdtEntry - -INT3: - push 0h ; push error code place holder on the stack - push 3h - JmpCommonIdtEntry - -INT4: - push 0h ; push error code place holder on the stack - push 4h - JmpCommonIdtEntry - -INT5: - push 0h ; push error code place holder on the stack - push 5h - JmpCommonIdtEntry - -INT6: - push 0h ; push error code place holder on the stack - push 6h - JmpCommonIdtEntry - -INT7: - push 0h ; push error code place holder on the stack - push 7h - JmpCommonIdtEntry - -INT8: -; Double fault causes an error code to be pushed so no phony push necessary - nop - nop - push 8h - JmpCommonIdtEntry - -INT9: - push 0h ; push error code place holder on the stack - push 9h - JmpCommonIdtEntry - -INT10: -; Invalid TSS causes an error code to be pushed so no phony push necessary - nop - nop - push 10 - JmpCommonIdtEntry - -INT11: -; Segment Not Present causes an error code to be pushed so no phony push necessary - nop - nop - push 11 - JmpCommonIdtEntry - -INT12: -; Stack fault causes an error code to be pushed so no phony push necessary - nop - nop - push 12 - JmpCommonIdtEntry - -INT13: -; GP fault causes an error code to be pushed so no phony push necessary - nop - nop - push 13 - JmpCommonIdtEntry - -INT14: -; Page fault causes an error code to be pushed so no phony push necessary - nop - nop - push 14 - JmpCommonIdtEntry - -INT15: - push 0h ; push error code place holder on the stack - push 15 - JmpCommonIdtEntry - -INT16: - push 0h ; push error code place holder on the stack - push 16 - JmpCommonIdtEntry - -INT17: -; Alignment check causes an error code to be pushed so no phony push necessary - nop - nop - push 17 - JmpCommonIdtEntry - -INT18: - push 0h ; push error code place holder on the stack - push 18 - JmpCommonIdtEntry - -INT19: - push 0h ; push error code place holder on the stack - push 19 - JmpCommonIdtEntry - -INTUnknown: -REPEAT (32 - 20) - push 0h ; push error code place holder on the stack -; push xxh ; push vector number - db 06ah - db ( $ - INTUnknown - 3 ) / 9 + 20 ; vector number - JmpCommonIdtEntry -ENDM -SystemExceptionHandler ENDP - -SystemTimerHandler PROC - push 0 - push mTimerVector - JmpCommonIdtEntry -SystemTimerHandler ENDP - -commonIdtEntry: -; +---------------------+ <-- 16-byte aligned ensured by processor -; + Old SS + -; +---------------------+ -; + Old RSP + -; +---------------------+ -; + RFlags + -; +---------------------+ -; + CS + -; +---------------------+ -; + RIP + -; +---------------------+ -; + Error Code + -; +---------------------+ -; + Vector Number + -; +---------------------+ -; + RBP + -; +---------------------+ <-- RBP, 16-byte aligned - - cli - push rbp - mov rbp, rsp - - ; - ; Since here the stack pointer is 16-byte aligned, so - ; EFI_FX_SAVE_STATE_X64 of EFI_SYSTEM_CONTEXT_x64 - ; is 16-byte aligned - ; - -;; UINT64 Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax; -;; UINT64 R8, R9, R10, R11, R12, R13, R14, R15; - push r15 - push r14 - push r13 - push r12 - push r11 - push r10 - push r9 - push r8 - push rax - push rcx - push rdx - push rbx - push qword ptr [rbp + 6 * 8] ; RSP - push qword ptr [rbp] ; RBP - push rsi - push rdi - -;; UINT64 Gs, Fs, Es, Ds, Cs, Ss; insure high 16 bits of each is zero - movzx rax, word ptr [rbp + 7 * 8] - push rax ; for ss - movzx rax, word ptr [rbp + 4 * 8] - push rax ; for cs - mov rax, ds - push rax - mov rax, es - push rax - mov rax, fs - push rax - mov rax, gs - push rax - -;; UINT64 Rip; - push qword ptr [rbp + 3 * 8] - -;; UINT64 Gdtr[2], Idtr[2]; - sub rsp, 16 - sidt fword ptr [rsp] - sub rsp, 16 - sgdt fword ptr [rsp] - -;; UINT64 Ldtr, Tr; - xor rax, rax - str ax - push rax - sldt ax - push rax - -;; UINT64 RFlags; - push qword ptr [rbp + 5 * 8] - -;; UINT64 Cr0, Cr1, Cr2, Cr3, Cr4, Cr8; - mov rax, cr8 - push rax - mov rax, cr4 - or rax, 208h - mov cr4, rax - push rax - mov rax, cr3 - push rax - mov rax, cr2 - push rax - xor rax, rax - push rax - mov rax, cr0 - push rax - -;; UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7; - mov rax, dr7 - push rax -;; clear Dr7 while executing debugger itself - xor rax, rax - mov dr7, rax - - mov rax, dr6 - push rax -;; insure all status bits in dr6 are clear... - xor rax, rax - mov dr6, rax - - mov rax, dr3 - push rax - mov rax, dr2 - push rax - mov rax, dr1 - push rax - mov rax, dr0 - push rax - -;; FX_SAVE_STATE_X64 FxSaveState; - - sub rsp, 512 - mov rdi, rsp - db 0fh, 0aeh, 00000111y ;fxsave [rdi] - -;; UINT32 ExceptionData; - push qword ptr [rbp + 2 * 8] - -;; call into exception handler -;; Prepare parameter and call - mov rcx, qword ptr [rbp + 1 * 8] - mov rdx, rsp - ; - ; Per X64 calling convention, allocate maximum parameter stack space - ; and make sure RSP is 16-byte aligned - ; - sub rsp, 4 * 8 + 8 - cmp rcx, 32 - jb CallException - call TimerHandler - jmp ExceptionDone -CallException: - call ExceptionHandler -ExceptionDone: - add rsp, 4 * 8 + 8 - - cli -;; UINT64 ExceptionData; - add rsp, 8 - -;; FX_SAVE_STATE_X64 FxSaveState; - - mov rsi, rsp - db 0fh, 0aeh, 00001110y ; fxrstor [rsi] - add rsp, 512 - -;; UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7; - pop rax - mov dr0, rax - pop rax - mov dr1, rax - pop rax - mov dr2, rax - pop rax - mov dr3, rax -;; skip restore of dr6. We cleared dr6 during the context save. - add rsp, 8 - pop rax - mov dr7, rax - -;; UINT64 Cr0, Cr1, Cr2, Cr3, Cr4, Cr8; - pop rax - mov cr0, rax - add rsp, 8 ; not for Cr1 - pop rax - mov cr2, rax - pop rax - mov cr3, rax - pop rax - mov cr4, rax - pop rax - mov cr8, rax - -;; UINT64 RFlags; - pop qword ptr [rbp + 5 * 8] - -;; UINT64 Ldtr, Tr; -;; UINT64 Gdtr[2], Idtr[2]; -;; Best not let anyone mess with these particular registers... - add rsp, 48 - -;; UINT64 Rip; - pop qword ptr [rbp + 3 * 8] - -;; UINT64 Gs, Fs, Es, Ds, Cs, Ss; - pop rax - ; mov gs, rax ; not for gs - pop rax - ; mov fs, rax ; not for fs - ; (X64 will not use fs and gs, so we do not restore it) - pop rax - mov es, rax - pop rax - mov ds, rax - pop qword ptr [rbp + 4 * 8] ; for cs - pop qword ptr [rbp + 7 * 8] ; for ss - -;; UINT64 Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax; -;; UINT64 R8, R9, R10, R11, R12, R13, R14, R15; - pop rdi - pop rsi - add rsp, 8 ; not for rbp - pop qword ptr [rbp + 6 * 8] ; for rsp - pop rbx - pop rdx - pop rcx - pop rax - pop r8 - pop r9 - pop r10 - pop r11 - pop r12 - pop r13 - pop r14 - pop r15 - - mov rsp, rbp - pop rbp - add rsp, 16 - iretq - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; data -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - -gdtr dw GDT_END - GDT_BASE - 1 ; GDT limit - dq 0 ; (GDT base gets set above) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; global descriptor table (GDT) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - align 010h ; make GDT 16-byte align - -public GDT_BASE -GDT_BASE: -; null descriptor -NULL_SEL equ $-GDT_BASE ; Selector [0x0] - dw 0 ; limit 15:0 - dw 0 ; base 15:0 - db 0 ; base 23:16 - db 0 ; type - db 0 ; limit 19:16, flags - db 0 ; base 31:24 - -; linear data segment descriptor -LINEAR_SEL equ $-GDT_BASE ; Selector [0x8] - dw 0FFFFh ; limit 0xFFFFF - dw 0 ; base 0 - db 0 - db 092h ; present, ring 0, data, expand-up, writable - db 0CFh ; page-granular, 32-bit - db 0 - -; linear code segment descriptor -LINEAR_CODE_SEL equ $-GDT_BASE ; Selector [0x10] - dw 0FFFFh ; limit 0xFFFFF - dw 0 ; base 0 - db 0 - db 09Ah ; present, ring 0, code, expand-up, writable - db 0CFh ; page-granular, 32-bit - db 0 - -; system data segment descriptor -SYS_DATA_SEL equ $-GDT_BASE ; Selector [0x18] - dw 0FFFFh ; limit 0xFFFFF - dw 0 ; base 0 - db 0 - db 092h ; present, ring 0, data, expand-up, writable - db 0CFh ; page-granular, 32-bit - db 0 - -; system code segment descriptor -SYS_CODE_SEL equ $-GDT_BASE ; Selector [0x20] - dw 0FFFFh ; limit 0xFFFFF - dw 0 ; base 0 - db 0 - db 09Ah ; present, ring 0, code, expand-up, writable - db 0CFh ; page-granular, 32-bit - db 0 - -; spare segment descriptor -SPARE3_SEL equ $-GDT_BASE ; Selector [0x28] - dw 0 - dw 0 - db 0 - db 0 - db 0 - db 0 - -; system data segment descriptor -SYS_DATA64_SEL equ $-GDT_BASE ; Selector [0x30] - dw 0FFFFh ; limit 0xFFFFF - dw 0 ; base 0 - db 0 - db 092h ; present, ring 0, data, expand-up, writable - db 0CFh ; page-granular, 32-bit - db 0 - -; system code segment descriptor -SYS_CODE64_SEL equ $-GDT_BASE ; Selector [0x38] - dw 0FFFFh ; limit 0xFFFFF - dw 0 ; base 0 - db 0 - db 09Ah ; present, ring 0, code, expand-up, writable - db 0AFh ; page-granular, 64-bit - db 0 - -; spare segment descriptor -SPARE4_SEL equ $-GDT_BASE ; Selector [0x40] - dw 0 - dw 0 - db 0 - db 0 - db 0 - db 0 - -GDT_END: - -idtr dw IDT_END - IDT_BASE - 1 ; IDT limit - dq 0 ; (IDT base gets set above) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; interrupt descriptor table (IDT) -; -; Note: The hardware IRQ's specified in this table are the normal PC/AT IRQ -; mappings. This implementation only uses the system timer and all other -; IRQs will remain masked. The descriptors for vectors 33+ are provided -; for convenience. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - align 08h ; make IDT 8-byte align - -public IDT_BASE -IDT_BASE: -; divide by zero (INT 0) -DIV_ZERO_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; debug exception (INT 1) -DEBUG_EXCEPT_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; NMI (INT 2) -NMI_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; soft breakpoint (INT 3) -BREAKPOINT_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; overflow (INT 4) -OVERFLOW_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; bounds check (INT 5) -BOUNDS_CHECK_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; invalid opcode (INT 6) -INVALID_OPCODE_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; device not available (INT 7) -DEV_NOT_AVAIL_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; double fault (INT 8) -DOUBLE_FAULT_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; Coprocessor segment overrun - reserved (INT 9) -RSVD_INTR_SEL1 equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; invalid TSS (INT 0ah) -INVALID_TSS_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; segment not present (INT 0bh) -SEG_NOT_PRESENT_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; stack fault (INT 0ch) -STACK_FAULT_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; general protection (INT 0dh) -GP_FAULT_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; page fault (INT 0eh) -PAGE_FAULT_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; Intel reserved - do not use (INT 0fh) -RSVD_INTR_SEL2 equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; floating point error (INT 10h) -FLT_POINT_ERR_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; alignment check (INT 11h) -ALIGNMENT_CHECK_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; machine check (INT 12h) -MACHINE_CHECK_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; SIMD floating-point exception (INT 13h) -SIMD_EXCEPTION_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -REPEAT (32 - 20) - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved -ENDM - -; 72 unspecified descriptors - db (72 * 16) dup(0) - -; IRQ 0 (System timer) - (INT 68h) -IRQ0_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; IRQ 1 (8042 Keyboard controller) - (INT 69h) -IRQ1_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; Reserved - IRQ 2 redirect (IRQ 2) - DO NOT USE!!! - (INT 6ah) -IRQ2_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; IRQ 3 (COM 2) - (INT 6bh) -IRQ3_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; IRQ 4 (COM 1) - (INT 6ch) -IRQ4_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; IRQ 5 (LPT 2) - (INT 6dh) -IRQ5_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; IRQ 6 (Floppy controller) - (INT 6eh) -IRQ6_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; IRQ 7 (LPT 1) - (INT 6fh) -IRQ7_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; IRQ 8 (RTC Alarm) - (INT 70h) -IRQ8_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; IRQ 9 - (INT 71h) -IRQ9_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; IRQ 10 - (INT 72h) -IRQ10_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; IRQ 11 - (INT 73h) -IRQ11_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; IRQ 12 (PS/2 mouse) - (INT 74h) -IRQ12_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; IRQ 13 (Floating point error) - (INT 75h) -IRQ13_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; IRQ 14 (Secondary IDE) - (INT 76h) -IRQ14_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - -; IRQ 15 (Primary IDE) - (INT 77h) -IRQ15_SEL equ $-IDT_BASE - dw 0 ; offset 15:0 - dw SYS_CODE64_SEL ; selector 15:0 - db 0 ; 0 for interrupt gate - db 0eh OR 80h ; (10001110)type = 386 interrupt gate, present - dw 0 ; offset 31:16 - dd 0 ; offset 63:32 - dd 0 ; 0 for reserved - - db (1 * 16) dup(0) - -IDT_END: - - -END diff --git a/DuetPkg/DuetPkg.fdf b/DuetPkg/DuetPkg.fdf index 73f9c839bb..ca7d2be203 100644 --- a/DuetPkg/DuetPkg.fdf +++ b/DuetPkg/DuetPkg.fdf @@ -70,7 +70,7 @@ INF IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf INF MdeModulePkg/Universal/EbcDxe/EbcDxe.inf INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf INF UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf -INF DuetPkg/CpuDxe/Cpu.inf +INF UefiCpuPkg/CpuDxe/CpuDxe.inf INF PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf INF DuetPkg/AcpiResetDxe/Reset.inf diff --git a/DuetPkg/DuetPkgIa32.dsc b/DuetPkg/DuetPkgIa32.dsc index fa411b5b9d..ec0bee8214 100644 --- a/DuetPkg/DuetPkgIa32.dsc +++ b/DuetPkg/DuetPkgIa32.dsc @@ -99,6 +99,7 @@ HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf SerialPortLib|PcAtChipsetPkg/Library/SerialIoLib/SerialIoLib.inf + MtrrLib|UefiCpuPkg/Library/MtrrLib/MtrrLib.inf # # To save size, use NULL library for DebugLib and ReportStatusCodeLib. @@ -205,7 +206,7 @@ } MdeModulePkg/Universal/EbcDxe/EbcDxe.inf UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf - DuetPkg/CpuDxe/Cpu.inf + UefiCpuPkg/CpuDxe/CpuDxe.inf PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf DuetPkg/AcpiResetDxe/Reset.inf DuetPkg/LegacyMetronome/Metronome.inf diff --git a/DuetPkg/DuetPkgX64.dsc b/DuetPkg/DuetPkgX64.dsc index 0079782532..96c10536ca 100644 --- a/DuetPkg/DuetPkgX64.dsc +++ b/DuetPkg/DuetPkgX64.dsc @@ -99,6 +99,7 @@ HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf SerialPortLib|PcAtChipsetPkg/Library/SerialIoLib/SerialIoLib.inf + MtrrLib|UefiCpuPkg/Library/MtrrLib/MtrrLib.inf # # To save size, use NULL library for DebugLib and ReportStatusCodeLib. @@ -205,7 +206,7 @@ } MdeModulePkg/Universal/EbcDxe/EbcDxe.inf UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf - DuetPkg/CpuDxe/Cpu.inf + UefiCpuPkg/CpuDxe/CpuDxe.inf PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf DuetPkg/AcpiResetDxe/Reset.inf DuetPkg/LegacyMetronome/Metronome.inf