summaryrefslogtreecommitdiffstats
path: root/src/VBox/Runtime/common/dbg/dbgstackdumpself-amd64-x86.asm
blob: 844613888b5788452b361e7900102ab43cd11fcc (plain)
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