mirror of
https://github.com/apple/swift.git
synced 2026-02-27 18:26:24 +01:00
On-crash backtracing is basically there for 64-bit Windows. It won't work on 32-bit because of a Swift compiler issue, and there is a little more work to do yet, but it is now working! rdar://101623384
92 lines
2.4 KiB
NASM
92 lines
2.4 KiB
NASM
; ===--- get-cpu-context.asm - Low-level functions to capture registers ---=== ;
|
|
;
|
|
; This source file is part of the Swift.org open source project
|
|
;
|
|
; Copyright (c) 2025 Apple Inc. and the Swift project authors
|
|
; Licensed under Apache License v2.0 with Runtime Library Exception
|
|
;
|
|
; See https://swift.org/LICENSE.txt for license information
|
|
; See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
;
|
|
; ===----------------------------------------------------------------------=== ;
|
|
;
|
|
; Saves the necessary registers to an appropriate Context structure.
|
|
;
|
|
; ===----------------------------------------------------------------------=== ;
|
|
|
|
.686P
|
|
.MODEL flat, C
|
|
.CODE
|
|
|
|
;;; On entry, [esp + 4] contains a pointer to i386_gprs
|
|
;;;
|
|
;;; i386_gprs is as follows:
|
|
;;;
|
|
;;; Offset Contents
|
|
;;; ------------------------
|
|
;;; 0 eax
|
|
;;; 4 ecx
|
|
;;; 8 edx
|
|
;;; 12 ebx
|
|
;;; 16 esp
|
|
;;; 20 ebp
|
|
;;; 24 esi
|
|
;;; 28 edi
|
|
;;; 32 eflags
|
|
;;; 36 es
|
|
;;; 38 cs
|
|
;;; 40 ss
|
|
;;; 42 ds
|
|
;;; 44 fs
|
|
;;; 46 gs
|
|
;;; 48 eip
|
|
;;; 52 validity flags
|
|
;;;
|
|
_swift_get_cpu_context PROC PUBLIC
|
|
push eax ; Stash eax
|
|
mov eax, dword ptr [esp + 8] ; Get the i386_gprs pointer
|
|
|
|
;; General purpose registers
|
|
mov dword ptr [eax + 4], ecx
|
|
mov dword ptr [eax + 8], edx
|
|
mov dword ptr [eax + 12], ebx
|
|
lea edx, [esp + 8]
|
|
mov dword ptr [eax + 16], edx ; esp
|
|
mov dword ptr [eax + 20], ebp
|
|
mov dword ptr [eax + 24], esi
|
|
mov dword ptr [eax + 28], edi
|
|
|
|
;; Now store the original eax
|
|
pop edx
|
|
mov dword ptr [eax], edx
|
|
|
|
;; eflags
|
|
pushfd
|
|
pop edx
|
|
mov dword ptr [eax + 32], edx
|
|
|
|
;; Segment registers
|
|
mov dx, es
|
|
mov word ptr [eax + 36], dx
|
|
mov dx, cs
|
|
mov word ptr [eax + 38], dx
|
|
mov dx, ss
|
|
mov word ptr [eax + 40], dx
|
|
mov dx, ds
|
|
mov word ptr [eax + 42], dx
|
|
mov dx, fs
|
|
mov word ptr [eax + 44], dx
|
|
mov dx, gs
|
|
mov word ptr [eax + 46], dx
|
|
|
|
;; eip (from our return address)
|
|
mov edx, [esp]
|
|
mov dword ptr [eax + 48], edx
|
|
|
|
;; Validity flags (16 valid values)
|
|
mov dword ptr [eax + 52], 0000FFFFh
|
|
ret
|
|
_swift_get_cpu_context ENDP
|
|
|
|
END
|