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
| ; 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
|
|