1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
; $Id: dbgstackdumpself-amd64-x86.asm $
;; @file
; IPRT - RTDbgStackDumpSelf assembly wrapper calling rtDbgStackDumpSelfWorker.
;
;
; Copyright (C) 2006-2019 Oracle Corporation
;
; This file is part of VirtualBox Open Source Edition (OSE), as
; available from http://www.virtualbox.org. This file is free software;
; you can redistribute it and/or modify it under the terms of the GNU
; General Public License (GPL) as published by the Free Software
; Foundation, in version 2 as it comes in the "COPYING" file of the
; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
;
; The contents of this file may alternatively be used under the terms
; of the Common Development and Distribution License Version 1.0
; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
; VirtualBox OSE distribution, in which case the provisions of the
; CDDL are applicable instead of those of the GPL.
;
; You may elect to license modified versions of this file under the
; terms and conditions of either the GPL or the CDDL or both.
;
;*********************************************************************************************************************************
;* Header Files *
;*********************************************************************************************************************************
%define RT_ASM_WITH_SEH64
%include "iprt/asmdefs.mac"
;*********************************************************************************************************************************
;* Extern Symbols *
;*********************************************************************************************************************************
extern NAME(rtDbgStackDumpSelfWorker)
BEGINCODE
;;
; Collects register state and calls C worker.
;
BEGINPROC_EXPORTED RTDbgStackDumpSelf
push xBP
SEH64_PUSH_xBP
mov xBP, xSP
SEH64_SET_FRAME_xBP 0
;
; Push all GPRS in reserve order...
;
%ifdef RT_ARCH_AMD64
push r15
SEH64_PUSH_GREG r15
push r14
SEH64_PUSH_GREG r14
push r13
SEH64_PUSH_GREG r13
push r12
SEH64_PUSH_GREG r12
push r13
SEH64_PUSH_GREG r13
push r12
SEH64_PUSH_GREG r12
push r11
SEH64_PUSH_GREG r11
push r10
SEH64_PUSH_GREG r10
push r9
SEH64_PUSH_GREG r9
push r8
SEH64_PUSH_GREG r8
%endif
push xDI
SEH64_PUSH_GREG xDI
push xSI
SEH64_PUSH_GREG xSI
%ifdef RT_ARCH_AMD64
mov r10, [xBP] ; Caller RBP.
push r10
lea r10, [xBP + xCB * 2] ; Caller RSP.
push r10
%else
push dword [xBP] ; Caller EBP
push xAX
lea xAX, [xBP + xCB * 2] ; Caller ESP.
xchg xAX, [xSP]
%endif
push xBX
SEH64_PUSH_GREG xBX
push xDX
SEH64_PUSH_GREG xDX
push xCX
SEH64_PUSH_GREG xCX
push xAX
SEH64_PUSH_GREG xAX
;
; ... preceeded by the EIP/RIP.
;
%ifdef RT_ARCH_AMD64
mov r10, [xBP + xCB]
push r10
%else
push dword [xBP + xCB]
%endif
;
; Call the worker function passing the register array as the fourth argument.
;
%ifdef ASM_CALL64_GCC
mov rcx, rsp ; 4th parameter = register array.
sub rsp, 8h ; Align stack.
SEH64_ALLOCATE_STACK 28h
%elifdef ASM_CALL64_MSC
mov r9, rsp ; 4th parameter = register array.
sub rsp, 28h ; Aling stack and allocate spill area.
SEH64_ALLOCATE_STACK 28h
%else
mov eax, esp ; Save register array location
and xSP, ~15 ; Align the stack.
%endif
SEH64_END_PROLOGUE
%ifndef RT_ARCH_AMD64
push eax
push dword [xBP + xCB * 4]
push dword [xBP + xCB * 3]
push dword [xBP + xCB * 2]
%endif
%ifdef ASM_FORMAT_ELF
%ifdef PIC
call NAME(rtDbgStackDumpSelfWorker) wrt ..plt
%else
call NAME(rtDbgStackDumpSelfWorker)
%endif
%else
call NAME(rtDbgStackDumpSelfWorker)
%endif
leave
ret
ENDPROC RTDbgStackDumpSelf
|