118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff#------------------------------------------------------------------------------ 218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# 34123bd7bf7c70998353b187b593dc992e0dcb146Jeff Fan# Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR> 418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# This program and the accompanying materials 518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# are licensed and made available under the terms and conditions of the BSD License 618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# which accompanies this distribution. The full text of the license may be found at 718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# http://opensource.org/licenses/bsd-license.php. 818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# 918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 1018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 1118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# 1218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# Module Name: 1318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# 1418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# AsmFuncs.S 1518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# 1618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# Abstract: 1718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# 1818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# Debug interrupt handle functions. 1918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# 2018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff#------------------------------------------------------------------------------ 2118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 2218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff#include "DebugException.h" 2318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 2418b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_GLOBAL ASM_PFX(InterruptProcess) 2518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 2618b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_GLOBAL ASM_PFX(Exception0Handle) 2718b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_GLOBAL ASM_PFX(ExceptionStubHeaderSize) 2818b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_GLOBAL ASM_PFX(TimerInterruptHandle) 2918b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_GLOBAL ASM_PFX(CommonEntry) 3018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 318cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff Fan.macro AGENT_HANDLER_SIGNATURE 328cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff Fan .byte 0x41, 0x47, 0x54, 0x48 # AGENT_HANDLER_SIGNATURE SIGNATURE_32('A','G','T','H') 338cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff Fan.endm 348cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff Fan 35af0202a4ca3ca50c4c0166531980ce9b3884d6c6Tian, Hot.data 3618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 3719ee4a904982cfacdcb8c578c5d421162fa9488dAnderw FishASM_PFX(ExceptionStubHeaderSize): .long ASM_PFX(Exception1Handle) - ASM_PFX(Exception0Handle) 3818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 3918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 4018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff.text 4118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 428cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 4318b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception0Handle): 4418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 4518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 4618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $0, %rcx 4718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 488cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 4918b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception1Handle): 5018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 5118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 5218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $1, %rcx 5318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 548cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 5518b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception2Handle): 5618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 5718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 5818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $2, %rcx 5918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 608cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 6118b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception3Handle): 6218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 6318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 6418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $3, %rcx 6518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 668cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 6718b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception4Handle): 6818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 6918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 7018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $4, %rcx 7118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 728cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 7318b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception5Handle): 7418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 7518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 7618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $5, %rcx 7718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 788cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 7918b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception6Handle): 8018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 8118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 8218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $6, %rcx 8318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 848cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 8518b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception7Handle): 8618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 8718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 8818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $7, %rcx 8918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 908cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 9118b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception8Handle): 9218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 9318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 9418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $8, %rcx 9518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 968cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 9718b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception9Handle): 9818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 9918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 10018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $9, %rcx 10118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 1028cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 10318b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception10Handle): 10418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 10518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 10618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $10, %rcx 10718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 1088cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 10918b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception11Handle): 11018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 11118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 11218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $11, %rcx 11318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 1148cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 11518b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception12Handle): 11618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 11718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 11818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $12, %rcx 11918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 1208cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 12118b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception13Handle): 12218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 12318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 12418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $13, %rcx 12518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 1268cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 12718b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception14Handle): 12818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 12918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 13018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $14, %rcx 13118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 1328cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 13318b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception15Handle): 13418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 13518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 13618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $15, %rcx 13718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 1388cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 13918b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception16Handle): 14018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 14118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 14218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $16, %rcx 14318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 1448cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 14518b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception17Handle): 14618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 14718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 14818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $17, %rcx 14918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 1508cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 15118b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception18Handle): 15218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 15318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 15418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $18, %rcx 15518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 1568cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 15718b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(Exception19Handle): 15818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 15918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 16018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $19, %rcx 16118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 1628cc26df4a60ec3a3b7f9d58ccefc12a1a5b6e199Jeff FanAGENT_HANDLER_SIGNATURE 16318b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(TimerInterruptHandle): 16418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cli 16518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rcx 16618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff mov $32, %rcx 16718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff jmp ASM_PFX(CommonEntry) 16818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 16918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 17018b144ea424e476f14839e9d9d3b81fb4820a613vanjeffASM_PFX(CommonEntry): 17118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 17218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff#---------------------------------------; 17318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# CommonInterruptEntry ; 17418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff#---------------------------------------; 17518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# The follow algorithm is used for the common interrupt routine. 17618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 17718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# 17818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# +---------------------+ <-- 16-byte aligned ensured by processor 17918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# + Old SS + 18018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# +---------------------+ 18118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# + Old RSP + 18218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# +---------------------+ 18318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# + RFlags + 18418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# +---------------------+ 18518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# + CS + 18618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# +---------------------+ 18718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# + RIP + 18818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# +---------------------+ 18918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# + Error Code + 19018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# +---------------------+ 19118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# + RCX / Vector Number + 19218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# +---------------------+ 19318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# + RBP + 19418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# +---------------------+ <-- RBP, 16-byte aligned 19518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# 19618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 19718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# We need to determine if any extra data was pushed by the exception 19818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cmpq $DEBUG_EXCEPT_DOUBLE_FAULT, %rcx 19918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff je NoExtrPush 20018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cmpq $DEBUG_EXCEPT_INVALID_TSS, %rcx 20118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff je NoExtrPush 20218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cmpq $DEBUG_EXCEPT_SEG_NOT_PRESENT, %rcx 20318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff je NoExtrPush 20418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cmpq $DEBUG_EXCEPT_STACK_FAULT, %rcx 20518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff je NoExtrPush 20618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cmpq $DEBUG_EXCEPT_GP_FAULT, %rcx 20718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff je NoExtrPush 20818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cmpq $DEBUG_EXCEPT_PAGE_FAULT, %rcx 20918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff je NoExtrPush 21018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cmpq $DEBUG_EXCEPT_ALIGNMENT_CHECK, %rcx 21118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff je NoExtrPush 21218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 21318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq (%rsp) 21418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq $0, 8(%rsp) 21518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 21618b144ea424e476f14839e9d9d3b81fb4820a613vanjeffNoExtrPush: 21718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff # 21818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff # All interrupt handlers are invoked through interrupt gates, so 21918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff # IF flag automatically cleared at the entry point 22018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rbp 22118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rsp, %rbp 22218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 22318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff # 22418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff # Since here the stack pointer is 16-byte aligned, so 22518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff # EFI_FX_SAVE_STATE_X64 of EFI_SYSTEM_CONTEXT_x64 22618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff # is 16-byte aligned 22718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff # 22818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 22918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 R8, R9, R10, R11, R12, R13, R14, R15; 23018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %r15 23118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %r14 23218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %r13 23318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %r12 23418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %r11 23518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %r10 23618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %r9 23718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %r8 23818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 23918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %cr8, %r8 24018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %r8 24118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 24218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax; 24318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 24418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rbx 24518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq 8(%rbp) # original rcx 24618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rdx 24718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq 48(%rbp) # original rsp 24818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq (%rbp) # original rbp 24918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rsi 25018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rdi 25118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 25218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 Cr0, Cr1, Cr2, Cr3, Cr4; 25318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %cr4, %rax 25418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff orq $0x208, %rax 25518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rax, %cr4 25618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 25718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %cr3, %rax 25818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 25918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %cr2, %rax 26018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 26118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff xorq %rax, %rax 26218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 26318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %cr0, %rax 26418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 26518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 26618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 Gs, Fs, Es, Ds, Cs, Ss; insure high 16 bits of each is zero 26718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff xorq %rax, %rax # set rax to 0 26818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movzwq 56(%rbp), %rax 26918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# movq %ss, %rax 27018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 27118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movzwq 32(%rbp), %rax 27218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# movq %cs, %rax 27318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 2744123bd7bf7c70998353b187b593dc992e0dcb146Jeff Fan mov %ds, %rax 27518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 2764123bd7bf7c70998353b187b593dc992e0dcb146Jeff Fan mov %es, %rax 27718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 2784123bd7bf7c70998353b187b593dc992e0dcb146Jeff Fan mov %fs, %rax 27918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 2804123bd7bf7c70998353b187b593dc992e0dcb146Jeff Fan mov %gs, %rax 28118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 28218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 28318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 Rip; 28418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq 24(%rbp) 28518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 28618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 Gdtr[2], Idtr[2]; 28718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff subq $16, %rsp 28818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff sidt (%rsp) 28918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff subq $16, %rsp 29018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff sgdt (%rsp) 29118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 29218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 Ldtr, Tr; 29318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff xorq %rax, %rax 29418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff strw %ax 29518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 29618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff sldtw %ax 29718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 29818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 29918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 RFlags; 30018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq 40(%rbp) 30118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 30218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7; 30318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %dr7, %rax 30418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 30518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## clear Dr7 while executing debugger itself 30618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff xorq %rax, %rax 307b422b62c01a490e7892864c04280d430a2566e3fvanjeff movq %rax, %dr7 30818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 30918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %dr6, %rax 31018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 31118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## insure all status bits in dr6 are clear... 31218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff xorq %rax, %rax 31318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rax, %dr6 31418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 31518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %dr3, %rax 31618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 31718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %dr2, %rax 31818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 31918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %dr1, %rax 32018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 32118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %dr0, %rax 32218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff pushq %rax 32318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 32418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## FX_SAVE_STATE_X64 FxSaveState; 32518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff subq $512, %rsp 32618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rsp, %rdi 32718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff .byte 0x0f, 0xae, 0b00000111 32818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 32993c0bdec2807cd968a89a0ac01a379a90fa50f93vanjeff## save the exception data; 33093c0bdec2807cd968a89a0ac01a379a90fa50f93vanjeff pushq 16(%rbp) 33193c0bdec2807cd968a89a0ac01a379a90fa50f93vanjeff 33218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## Clear Direction Flag 33318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff cld 33418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 33518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## Prepare parameter and call 33618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff# movq 8(%rbp), %rcx 33718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rsp, %rdx 33818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rcx, %r15 # save vector in r15 33918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff # 34018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff # Per X64 calling convention, allocate maximum parameter stack space 34118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff # and make sure RSP is 16-byte aligned 34218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff # 34393c0bdec2807cd968a89a0ac01a379a90fa50f93vanjeff subq $(32 + 8), %rsp 34418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff call ASM_PFX(InterruptProcess) 34593c0bdec2807cd968a89a0ac01a379a90fa50f93vanjeff addq $(32 + 8), %rsp 34693c0bdec2807cd968a89a0ac01a379a90fa50f93vanjeff 34793c0bdec2807cd968a89a0ac01a379a90fa50f93vanjeff## skip the exception data; 34893c0bdec2807cd968a89a0ac01a379a90fa50f93vanjeff addq $8, %rsp 34918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 35018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## FX_SAVE_STATE_X64 FxSaveState; 35118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 35218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rsp, %rsi 35318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff .byte 0x0f, 0xae, 0b00001110 35418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff addq $512, %rsp 35518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 35618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7; 35718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rax 35818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rax, %dr0 35918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rax 36018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rax, %dr1 36118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rax 36218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rax, %dr2 36318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rax 36418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rax, %dr3 36518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## skip restore of dr6. We cleared dr6 during the context save. 36618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff addq $8, %rsp 36718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rax 36818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rax, %dr7 36918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 37018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 RFlags; 37118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq 40(%rbp) 37218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 37318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 Ldtr, Tr; 37418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 Gdtr[2], Idtr[2]; 37518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## Best not let anyone mess with these particular registers... 37618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff addq $48, %rsp 37718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 37818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 Rip; 37918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq 24(%rbp) 38018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 38118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 Gs, Fs, Es, Ds, Cs, Ss; 38218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rax 38318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff # mov gs, rax ; not for gs 38418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rax 38518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff # mov fs, rax ; not for fs 38618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff # (X64 will not use fs and gs, so we do not restore it) 38718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rax 3884123bd7bf7c70998353b187b593dc992e0dcb146Jeff Fan mov %rax, %es 38918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rax 3904123bd7bf7c70998353b187b593dc992e0dcb146Jeff Fan mov %rax, %ds 39118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq 32(%rbp) 39218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq 56(%rbp) 39318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 39418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 Cr0, Cr1, Cr2, Cr3, Cr4, Cr8; 39518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rax 39618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rax, %cr0 39718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff addq $8, %rsp 39818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rax 39918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rax, %cr2 40018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rax 40118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rax, %cr3 40218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rax 40318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rax, %cr4 40418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 40518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax; 40618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff## UINT64 R8, R9, R10, R11, R12, R13, R14, R15; 40718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rdi 40818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rsi 40918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff addq $8, %rsp 41018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff addq $8, %rsp 41118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rdx 41218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rcx 41318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rbx 41418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rax 41518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 41618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %r8 41718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %r8, %cr8 41818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 41918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %r8 42018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %r9 42118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %r10 42218b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %r11 42318b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %r12 42418b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %r13 42518b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %r14 42618b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %r15 42718b144ea424e476f14839e9d9d3b81fb4820a613vanjeff 42818b144ea424e476f14839e9d9d3b81fb4820a613vanjeff movq %rbp, %rsp 42918b144ea424e476f14839e9d9d3b81fb4820a613vanjeff popq %rbp 43018b144ea424e476f14839e9d9d3b81fb4820a613vanjeff addq $16, %rsp 43118b144ea424e476f14839e9d9d3b81fb4820a613vanjeff iretq 432