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