mirror of https://github.com/acidanthera/audk.git
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
This commit is contained in:
parent
0587c9825c
commit
b8781a7771
1225
DuetPkg/CpuDxe/Cpu.c
1225
DuetPkg/CpuDxe/Cpu.c
File diff suppressed because it is too large
Load Diff
|
@ -1,58 +0,0 @@
|
||||||
## @file
|
|
||||||
#
|
|
||||||
# Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
|
||||||
# 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
|
|
|
@ -1,149 +0,0 @@
|
||||||
/*++
|
|
||||||
|
|
||||||
Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
|
|
||||||
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 <FrameworkDxe.h>
|
|
||||||
|
|
||||||
#include <Protocol/Cpu.h>
|
|
||||||
#include <Protocol/Legacy8259.h>
|
|
||||||
|
|
||||||
#include <Protocol/LegacyBios.h>
|
|
||||||
|
|
||||||
|
|
||||||
#include <Library/BaseLib.h>
|
|
||||||
#include <Library/BaseMemoryLib.h>
|
|
||||||
#include <Library/DebugLib.h>
|
|
||||||
#include <Library/PrintLib.h>
|
|
||||||
#include <Library/UefiBootServicesTableLib.h>
|
|
||||||
|
|
||||||
#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
|
|
|
@ -1,961 +0,0 @@
|
||||||
#------------------------------------------------------------------------------
|
|
||||||
#*
|
|
||||||
#* Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
|
|
||||||
#* 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:
|
|
||||||
|
|
|
@ -1,835 +0,0 @@
|
||||||
TITLE CpuInterrupt.asm:
|
|
||||||
;------------------------------------------------------------------------------
|
|
||||||
;*
|
|
||||||
;* Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
|
|
||||||
;* 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
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,938 +0,0 @@
|
||||||
TITLE CpuInterrupt.asm:
|
|
||||||
;------------------------------------------------------------------------------
|
|
||||||
;*
|
|
||||||
;* Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
|
||||||
;* 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
|
|
|
@ -70,7 +70,7 @@ INF IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
|
||||||
INF MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
|
INF MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
|
||||||
INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
|
INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
|
||||||
INF UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
|
INF UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
|
||||||
INF DuetPkg/CpuDxe/Cpu.inf
|
INF UefiCpuPkg/CpuDxe/CpuDxe.inf
|
||||||
|
|
||||||
INF PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf
|
INF PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf
|
||||||
INF DuetPkg/AcpiResetDxe/Reset.inf
|
INF DuetPkg/AcpiResetDxe/Reset.inf
|
||||||
|
|
|
@ -99,6 +99,7 @@
|
||||||
HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
|
HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
|
||||||
ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
|
ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
|
||||||
SerialPortLib|PcAtChipsetPkg/Library/SerialIoLib/SerialIoLib.inf
|
SerialPortLib|PcAtChipsetPkg/Library/SerialIoLib/SerialIoLib.inf
|
||||||
|
MtrrLib|UefiCpuPkg/Library/MtrrLib/MtrrLib.inf
|
||||||
|
|
||||||
#
|
#
|
||||||
# To save size, use NULL library for DebugLib and ReportStatusCodeLib.
|
# To save size, use NULL library for DebugLib and ReportStatusCodeLib.
|
||||||
|
@ -205,7 +206,7 @@
|
||||||
}
|
}
|
||||||
MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
|
MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
|
||||||
UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
|
UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
|
||||||
DuetPkg/CpuDxe/Cpu.inf
|
UefiCpuPkg/CpuDxe/CpuDxe.inf
|
||||||
PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf
|
PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf
|
||||||
DuetPkg/AcpiResetDxe/Reset.inf
|
DuetPkg/AcpiResetDxe/Reset.inf
|
||||||
DuetPkg/LegacyMetronome/Metronome.inf
|
DuetPkg/LegacyMetronome/Metronome.inf
|
||||||
|
|
|
@ -99,6 +99,7 @@
|
||||||
HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
|
HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
|
||||||
ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
|
ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
|
||||||
SerialPortLib|PcAtChipsetPkg/Library/SerialIoLib/SerialIoLib.inf
|
SerialPortLib|PcAtChipsetPkg/Library/SerialIoLib/SerialIoLib.inf
|
||||||
|
MtrrLib|UefiCpuPkg/Library/MtrrLib/MtrrLib.inf
|
||||||
|
|
||||||
#
|
#
|
||||||
# To save size, use NULL library for DebugLib and ReportStatusCodeLib.
|
# To save size, use NULL library for DebugLib and ReportStatusCodeLib.
|
||||||
|
@ -205,7 +206,7 @@
|
||||||
}
|
}
|
||||||
MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
|
MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
|
||||||
UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
|
UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf
|
||||||
DuetPkg/CpuDxe/Cpu.inf
|
UefiCpuPkg/CpuDxe/CpuDxe.inf
|
||||||
PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf
|
PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf
|
||||||
DuetPkg/AcpiResetDxe/Reset.inf
|
DuetPkg/AcpiResetDxe/Reset.inf
|
||||||
DuetPkg/LegacyMetronome/Metronome.inf
|
DuetPkg/LegacyMetronome/Metronome.inf
|
||||||
|
|
Loading…
Reference in New Issue