From b8781a7771d57fc5dc3e6c78ee0bf83f8b559575 Mon Sep 17 00:00:00 2001 From: jljusten Date: Fri, 22 Oct 2010 01:08:16 +0000 Subject: [PATCH] DuetPkg: Use UefiCpuPkg/CpuDxe instead of DuetPkg/CpuDxe UefiCpuPkg/CpuDxe provides all the critical features needed for DUET. Therefore, to reduce code duplication, DUET can use the generic UEFI CPU DXE driver. The one notable lost feature is that DUET's CPU DXE would call legacy video INT 10 to make sure the exception information could be displayed on the screen. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10974 6f19259b-4bc3-4df7-8a09-765794883524 --- DuetPkg/CpuDxe/Cpu.c | 1225 -------------------------- DuetPkg/CpuDxe/Cpu.inf | 58 -- DuetPkg/CpuDxe/CpuDxe.h | 149 ---- DuetPkg/CpuDxe/Ia32/CpuInterrupt.S | 961 -------------------- DuetPkg/CpuDxe/Ia32/CpuInterrupt.asm | 835 ------------------ DuetPkg/CpuDxe/X64/CpuInterrupt.S | 1096 ----------------------- DuetPkg/CpuDxe/X64/CpuInterrupt.asm | 938 -------------------- DuetPkg/DuetPkg.fdf | 2 +- DuetPkg/DuetPkgIa32.dsc | 3 +- DuetPkg/DuetPkgX64.dsc | 3 +- 10 files changed, 5 insertions(+), 5265 deletions(-) delete mode 100644 DuetPkg/CpuDxe/Cpu.c delete mode 100644 DuetPkg/CpuDxe/Cpu.inf delete mode 100644 DuetPkg/CpuDxe/CpuDxe.h delete mode 100644 DuetPkg/CpuDxe/Ia32/CpuInterrupt.S delete mode 100644 DuetPkg/CpuDxe/Ia32/CpuInterrupt.asm delete mode 100644 DuetPkg/CpuDxe/X64/CpuInterrupt.S delete mode 100644 DuetPkg/CpuDxe/X64/CpuInterrupt.asm 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 -- 2.39.2