Files
swift-mirror/stdlib/public/RuntimeModule/get-cpu-context-i686.asm
Alastair Houghton e0845e1483 [Backtracing] Made on-crash backtraces work for 64-bit.
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
2026-02-03 18:23:29 +00:00

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