AsmFuncs.S revision 4fd606d1f5abe38e1f42c38de1d2e895166bd0f4
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#------------------------------------------------------------------------------
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# This program and the accompanying materials
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# are licensed and made available under the terms and conditions of the BSD License
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# which accompanies this distribution. The full text of the license may be found at
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# http://opensource.org/licenses/bsd-license.php.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# Module Name:
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# AsmFuncs.S
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# Abstract:
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# Debug interrupt handle functions.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#------------------------------------------------------------------------------
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#include "DebugException.h"
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_GLOBAL ASM_PFX(InterruptProcess)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_GLOBAL ASM_PFX(Exception0Handle)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_GLOBAL ASM_PFX(ExceptionStubHeaderSize)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_GLOBAL ASM_PFX(TimerInterruptHandle)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_GLOBAL ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock.data
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(ExceptionStubHeaderSize): .word ASM_PFX(Exception1Handle) - ASM_PFX(Exception0Handle)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock.text
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception0Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $0, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception1Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $1, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception2Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $2, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception3Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $3, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception4Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $4, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception5Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $5, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception6Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $6, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception7Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $7, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception8Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $8, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception9Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $9, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception10Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $10, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception11Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $11, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception12Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $12, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception13Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $13, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception14Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $14, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception15Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $15, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception16Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $16, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception17Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $17, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception18Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $18, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(Exception19Handle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $19, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(TimerInterruptHandle):
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cli
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock mov $32, %rcx
9af3851a3a831b4de34b42482c22351e14f33f16eschrock jmp ASM_PFX(CommonEntry)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
9af3851a3a831b4de34b42482c22351e14f33f16eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockASM_PFX(CommonEntry):
9af3851a3a831b4de34b42482c22351e14f33f16eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#---------------------------------------;
9af3851a3a831b4de34b42482c22351e14f33f16eschrock# CommonInterruptEntry ;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#---------------------------------------;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# The follow algorithm is used for the common interrupt routine.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# +---------------------+ <-- 16-byte aligned ensured by processor
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# + Old SS +
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# +---------------------+
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# + Old RSP +
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# +---------------------+
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# + RFlags +
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# +---------------------+
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# + CS +
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# +---------------------+
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# + RIP +
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# +---------------------+
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# + Error Code +
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# +---------------------+
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# + RCX / Vector Number +
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# +---------------------+
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# + RBP +
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# +---------------------+ <-- RBP, 16-byte aligned
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# We need to determine if any extra data was pushed by the exception
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cmpq $DEBUG_EXCEPT_DOUBLE_FAULT, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock je NoExtrPush
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cmpq $DEBUG_EXCEPT_INVALID_TSS, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock je NoExtrPush
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cmpq $DEBUG_EXCEPT_SEG_NOT_PRESENT, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock je NoExtrPush
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cmpq $DEBUG_EXCEPT_STACK_FAULT, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock je NoExtrPush
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cmpq $DEBUG_EXCEPT_GP_FAULT, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock je NoExtrPush
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cmpq $DEBUG_EXCEPT_PAGE_FAULT, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock je NoExtrPush
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cmpq $DEBUG_EXCEPT_ALIGNMENT_CHECK, %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock je NoExtrPush
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq (%rsp)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq $0, 8(%rsp)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockNoExtrPush:
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock #
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock # All interrupt handlers are invoked through interrupt gates, so
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock # IF flag automatically cleared at the entry point
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rbp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rsp, %rbp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock #
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock # Since here the stack pointer is 16-byte aligned, so
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock # EFI_FX_SAVE_STATE_X64 of EFI_SYSTEM_CONTEXT_x64
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock # is 16-byte aligned
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock #
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 R8, R9, R10, R11, R12, R13, R14, R15;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %r15
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %r14
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %r13
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %r12
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %r11
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %r10
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %r9
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %r8
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %cr8, %r8
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %r8
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rbx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq 8(%rbp) # original rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rdx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq 48(%rbp) # original rsp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq (%rbp) # original rbp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rsi
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rdi
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 Cr0, Cr1, Cr2, Cr3, Cr4;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %cr4, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock orq $0x208, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rax, %cr4
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %cr3, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %cr2, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock xorq %rax, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %cr0, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 Gs, Fs, Es, Ds, Cs, Ss; insure high 16 bits of each is zero
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock xorq %rax, %rax # set rax to 0
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movzwq 56(%rbp), %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# movq %ss, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movzwq 32(%rbp), %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# movq %cs, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %ds, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %es, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %fs, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %gs, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 Rip;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq 24(%rbp)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 Gdtr[2], Idtr[2];
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock subq $16, %rsp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock sidt (%rsp)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock subq $16, %rsp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock sgdt (%rsp)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 Ldtr, Tr;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock xorq %rax, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock strw %ax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock sldtw %ax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 RFlags;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq 40(%rbp)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %dr7, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## clear Dr7 while executing debugger itself
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock xorq %rax, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#debug movq %rax, %dr7
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %dr6, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## insure all status bits in dr6 are clear...
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock xorq %rax, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rax, %dr6
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %dr3, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %dr2, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %dr1, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %dr0, %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock pushq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## FX_SAVE_STATE_X64 FxSaveState;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock subq $512, %rsp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rsp, %rdi
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock .byte 0x0f, 0xae, 0b00000111
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## Clear Direction Flag
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock cld
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## Prepare parameter and call
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock# movq 8(%rbp), %rcx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rsp, %rdx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rcx, %r15 # save vector in r15
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock #
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock # Per X64 calling convention, allocate maximum parameter stack space
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock # and make sure RSP is 16-byte aligned
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock #
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock subq $(4 * 8), %rsp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock call ASM_PFX(InterruptProcess)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock addq $(4 * 8), %rsp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## FX_SAVE_STATE_X64 FxSaveState;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rsp, %rsi
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock .byte 0x0f, 0xae, 0b00001110
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock addq $512, %rsp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rax, %dr0
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rax, %dr1
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rax, %dr2
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rax, %dr3
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## skip restore of dr6. We cleared dr6 during the context save.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock addq $8, %rsp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rax, %dr7
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 RFlags;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq 40(%rbp)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 Ldtr, Tr;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 Gdtr[2], Idtr[2];
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## Best not let anyone mess with these particular registers...
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock addq $48, %rsp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 Rip;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq 24(%rbp)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 Gs, Fs, Es, Ds, Cs, Ss;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock # mov gs, rax ; not for gs
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock # mov fs, rax ; not for fs
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock # (X64 will not use fs and gs, so we do not restore it)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movw %rax, %es
9af3851a3a831b4de34b42482c22351e14f33f16eschrock popq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movw %rax, %ds
9af3851a3a831b4de34b42482c22351e14f33f16eschrock popq 32(%rbp)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq 56(%rbp)
9af3851a3a831b4de34b42482c22351e14f33f16eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 Cr0, Cr1, Cr2, Cr3, Cr4, Cr8;
9af3851a3a831b4de34b42482c22351e14f33f16eschrock popq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rax, %cr0
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock addq $8, %rsp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rax, %cr2
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rax, %cr3
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rax, %cr4
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock## UINT64 R8, R9, R10, R11, R12, R13, R14, R15;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rdi
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rsi
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock addq $8, %rsp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock addq $8, %rsp
9af3851a3a831b4de34b42482c22351e14f33f16eschrock popq %rdx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rcx
9af3851a3a831b4de34b42482c22351e14f33f16eschrock popq %rbx
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rax
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %r8
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %r8, %cr8
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %r8
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %r9
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %r10
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %r11
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %r12
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %r13
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %r14
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %r15
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock movq %rbp, %rsp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock popq %rbp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock addq $16, %rsp
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock iretq
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock