crashpad/util/misc/capture_context_win_arm64.asm
Adam Kallai 79b59b0a8f Add support for capture CPU context on Windows on ARM64
Most Crashpad builds use Microsoft's armasm64.exe macro assembler
for .asm source files. When building in Chromium, clang-cl is used
as the assembler instead. Since the two assemblers recognize different
assembly dialects, the same .asm file can't be used for each.
As a workaround, use a prebuilt .obj file when the Microsoft-dialect
assembler isn't available.

The obj file is generated from the capture_context_win_arm64.asm
by armasm64 macro assembler. If this asm file is modified,
the obj file needs to be updated.

Change-Id: Id5a4a949997a27b04815aeb79b2540d30a52d34c
Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/1632749
Reviewed-by: Mark Mentovai <mark@chromium.org>
Commit-Queue: Mark Mentovai <mark@chromium.org>
2019-07-17 18:08:42 +00:00

65 lines
1.9 KiB
NASM

; Copyright 2019 The Crashpad Authors. All rights reserved.
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
; http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
EXPORT |?CaptureContext@crashpad@@YAXPEAU_CONTEXT@@@Z|
AREA |.text|, CODE
|?CaptureContext@crashpad@@YAXPEAU_CONTEXT@@@Z| PROC
; Save general purpose registers in context.regs[i].
; The original x0 can't be recovered.
stp x0, x1, [x0, #0x008]
stp x2, x3, [x0, #0x018]
stp x4, x5, [x0, #0x028]
stp x6, x7, [x0, #0x038]
stp x8, x9, [x0, #0x048]
stp x10, x11, [x0, #0x058]
stp x12, x13, [x0, #0x068]
stp x14, x15, [x0, #0x078]
stp x16, x17, [x0, #0x088]
stp x18, x19, [x0, #0x098]
stp x20, x21, [x0, #0x0a8]
stp x22, x23, [x0, #0x0b8]
stp x24, x25, [x0, #0x0c8]
stp x26, x27, [x0, #0x0d8]
stp x28, x29, [x0, #0x0e8]
; The original LR can't be recovered.
str LR, [x0, #0x0f8]
; Use x1 as a scratch register.
mov x1, SP
str x1, [x0, #0x100] ; context.sp
; The link register holds the return address for this function.
str LR, [x0, #0x108] ; context.pc
; pstate should hold SPSR but NZCV are the only bits we know about.
mrs x1, NZCV
; Enable Control flags, such as CONTEXT_ARM64, CONTEXT_CONTROL,
; CONTEXT_INTEGER
ldr w1, =0x00400003
; Set ControlFlags /0x000/ and pstate /0x004/ at the same time.
str x1, [x0, #0x000]
; Restore x1 from the saved context.
ldr x1, [x0, #0x010]
; TODO(https://crashpad.chromium.org/bug/300): save floating-point registers
ret
ENDP
END