146 lines
3.8 KiB
NASM
146 lines
3.8 KiB
NASM
|
;++
|
||
|
;
|
||
|
; Copyright (c) Microsoft Corporation
|
||
|
;
|
||
|
; Module Name:
|
||
|
;
|
||
|
; blidt.asm
|
||
|
;
|
||
|
; Abstract:
|
||
|
;
|
||
|
; This module implements IDT functions for the boot loader.
|
||
|
;
|
||
|
; Environment:
|
||
|
;
|
||
|
; Boot loader.
|
||
|
;
|
||
|
;--
|
||
|
|
||
|
include bl.inc
|
||
|
|
||
|
.code
|
||
|
|
||
|
extrn ?BlTrapFatal@@YAX_KPEAU_BL_TRAP_CONTEXT@@@Z:near
|
||
|
|
||
|
;++
|
||
|
;
|
||
|
; VOID
|
||
|
; BlTrapEnter(
|
||
|
; VOID
|
||
|
; )
|
||
|
;
|
||
|
; Routine Description:
|
||
|
;
|
||
|
; Entry point for incoming exceptions.
|
||
|
;
|
||
|
;--
|
||
|
|
||
|
align 16
|
||
|
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
;;;
|
||
|
;;; The IDT_ENTER building macros insure that each IDT target has
|
||
|
;;; an offset of form BlTrapEnter + 0x10 * interrupt_number.
|
||
|
;;;
|
||
|
|
||
|
IDT_ENTER_NOERR MACRO num:req
|
||
|
push 77h ; No error
|
||
|
call @f
|
||
|
align 8
|
||
|
ENDM
|
||
|
|
||
|
IDT_ENTER_ERR MACRO num:req
|
||
|
call @f
|
||
|
align 8
|
||
|
ENDM
|
||
|
|
||
|
align 16
|
||
|
?BlTrapEnter@@YAXXZ proc
|
||
|
IDT_ENTER_NOERR 000h ; #DE Divide-by-Zero
|
||
|
IDT_ENTER_NOERR 001h ; #DB Debug Exception
|
||
|
IDT_ENTER_NOERR 002h ; NMI Non-Maskable-Interrupt
|
||
|
IDT_ENTER_NOERR 003h ; #BP Breakpoint
|
||
|
IDT_ENTER_NOERR 004h ; #OF OVerflow
|
||
|
IDT_ENTER_NOERR 005h ; #BR Bound-Range
|
||
|
IDT_ENTER_NOERR 006h ; #UD Invalid Opcode
|
||
|
IDT_ENTER_NOERR 007h ; #NM Device Not Available
|
||
|
IDT_ENTER_ERR 008h ; #DF Double Fault
|
||
|
IDT_ENTER_NOERR 009h ; Unused (was x87 segment except)
|
||
|
IDT_ENTER_ERR 00ah ; #TS Invalid TSS
|
||
|
IDT_ENTER_ERR 00bh ; #NP Sgement Not Present
|
||
|
IDT_ENTER_ERR 00ch ; #SS Stack Exception
|
||
|
IDT_ENTER_ERR 00dh ; #GP General Protection
|
||
|
IDT_ENTER_ERR 00eh ; #PF Page Fault
|
||
|
IDT_ENTER_NOERR 00fh ; Reserved
|
||
|
IDT_ENTER_NOERR 010h ; #MF x87 Math Error
|
||
|
IDT_ENTER_ERR 011h ; #AC Alignment Check
|
||
|
IDT_ENTER_NOERR 012h ; #MC Machine Check
|
||
|
IDT_ENTER_NOERR 013h ; #XF SIMD Exception
|
||
|
|
||
|
inum = 014h ; 014h to 020h
|
||
|
WHILE inum LE 020h
|
||
|
IDT_ENTER_NOERR inum
|
||
|
inum = inum + 1
|
||
|
ENDM
|
||
|
@@:
|
||
|
push rax
|
||
|
push rbx
|
||
|
push rcx
|
||
|
push rdx
|
||
|
push rsi
|
||
|
push rdi
|
||
|
push rbp
|
||
|
push r8
|
||
|
push r9
|
||
|
push r10
|
||
|
push r11
|
||
|
push r12
|
||
|
push r13
|
||
|
push r14
|
||
|
push r15
|
||
|
mov rax, rsp
|
||
|
add rax, 88
|
||
|
push rax
|
||
|
mov rax, cr2
|
||
|
push rax
|
||
|
|
||
|
mov rdx, rsp
|
||
|
mov rcx, [rdx].BL_TRAP_CONTEXT.TrapNum
|
||
|
mov rax, ?BlTrapEnter@@YAXXZ
|
||
|
sub rcx, rax
|
||
|
shr rcx, 3
|
||
|
mov [rdx].BL_TRAP_CONTEXT.TrapNum, rcx
|
||
|
push rdx
|
||
|
push rcx
|
||
|
call ?BlTrapFatal@@YAX_KPEAU_BL_TRAP_CONTEXT@@@Z
|
||
|
@@:
|
||
|
jmp @b
|
||
|
|
||
|
?BlTrapEnter@@YAXXZ endp
|
||
|
|
||
|
;++
|
||
|
;
|
||
|
; VOID
|
||
|
; BlTrapSetIdtr(
|
||
|
; PIDTR Idtr
|
||
|
; )
|
||
|
;
|
||
|
; Routine Description:
|
||
|
;
|
||
|
; This function sets the IDTR register.
|
||
|
;
|
||
|
; Arguments:
|
||
|
;
|
||
|
; Idtr - Supplies the data to write to the IDTR register.
|
||
|
;
|
||
|
;--
|
||
|
|
||
|
?BlTrapSetIdtr@@YAXPEAU_IDTR@@@Z proc
|
||
|
|
||
|
lidt fword ptr [rcx]
|
||
|
ret
|
||
|
|
||
|
?BlTrapSetIdtr@@YAXPEAU_IDTR@@@Z endp
|
||
|
|
||
|
end
|