Skip to content

Commit f9e7966

Browse files
committed
Add SIMD vector register support
1 parent e6aa9b5 commit f9e7966

File tree

2 files changed

+79
-29
lines changed

2 files changed

+79
-29
lines changed

unwind/src/glue/aarch64.rs

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ extern "C" {
1414
pub unsafe extern fn unwind_trampoline(_payload: *mut UnwindPayload) {
1515
asm!("
1616
mov x1, sp
17-
sub sp, sp, 0x70
18-
.cfi_adjust_cfa_offset 0x70
17+
sub sp, sp, 0xB0
18+
.cfi_adjust_cfa_offset 0xB0
1919
str lr, [sp, #0x60]
2020
.cfi_rel_offset lr, 0x60
2121
stp x19, x20, [sp, #0x00]
@@ -24,12 +24,16 @@ pub unsafe extern fn unwind_trampoline(_payload: *mut UnwindPayload) {
2424
stp x25, x26, [sp, #0x30]
2525
stp x27, x28, [sp, #0x40]
2626
stp x29, lr, [sp, #0x50]
27+
stp d8, d9, [sp, #0x70]
28+
stp d10, d11, [sp, #0x80]
29+
stp d12, d13, [sp, #0x90]
30+
stp d14, d15, [sp, #0xA0]
2731
mov x2, sp
2832
bl unwind_recorder
2933
ldr lr, [sp, #0x60]
3034
.cfi_restore lr
31-
add sp, sp, 0x70
32-
.cfi_adjust_cfa_offset -0x70
35+
add sp, sp, 0xB0
36+
.cfi_adjust_cfa_offset -0xB0
3337
ret
3438
");
3539
::std::hint::unreachable_unchecked();
@@ -56,23 +60,22 @@ unsafe extern fn unwind_lander(_regs: *const LandingRegisters) {
5660
ldp x30, x1, [x0, #0x0F0]
5761
mov sp, x1
5862
59-
ldp d0, d1, [x0, #0x110]
60-
ldp d2, d3, [x0, #0x120]
61-
ldp d4, d5, [x0, #0x130]
62-
ldp d6, d7, [x0, #0x140]
63-
ldp d8, d9, [x0, #0x150]
64-
ldp d10, d11, [x0, #0x160]
65-
ldp d12, d13, [x0, #0x170]
66-
ldp d14, d15, [x0, #0x180]
67-
ldp d16, d17, [x0, #0x190]
68-
ldp d18, d19, [x0, #0x1A0]
69-
ldp d20, d21, [x0, #0x1B0]
70-
ldp d22, d23, [x0, #0x1C0]
71-
ldp d24, d25, [x0, #0x1D0]
72-
ldp d26, d27, [x0, #0x1E0]
73-
ldp d28, d29, [x0, #0x1F0]
74-
ldr d30, [x0, #0x200]
75-
ldr d31, [x0, #0x208]
63+
ldp d0, d1, [x0, #0x100]
64+
ldp d2, d3, [x0, #0x110]
65+
ldp d4, d5, [x0, #0x120]
66+
ldp d6, d7, [x0, #0x130]
67+
ldp d8, d9, [x0, #0x140]
68+
ldp d10, d11, [x0, #0x150]
69+
ldp d12, d13, [x0, #0x160]
70+
ldp d14, d15, [x0, #0x170]
71+
ldp d16, d17, [x0, #0x180]
72+
ldp d18, d19, [x0, #0x190]
73+
ldp d20, d21, [x0, #0x1A0]
74+
ldp d22, d23, [x0, #0x1B0]
75+
ldp d24, d25, [x0, #0x1C0]
76+
ldp d26, d27, [x0, #0x1D0]
77+
ldp d28, d29, [x0, #0x1E0]
78+
ldp d30, d31, [x0, #0x1F0]
7679
7780
ldp x0, x1, [x0, #0x000]
7881
ret x30 // HYPERSPACE JUMP :D
@@ -86,16 +89,15 @@ struct LandingRegisters {
8689
fp: u64, // x29, Frame Pointer
8790
lr: u64, // x30, Link Register
8891
sp: u64, // x31, Stack Pointer
89-
90-
pad: u64,
9192
vector_half: [u64; 32], // d0-d31
9293
}
9394

9495
// TODO: Doc hidden
9596
#[repr(C)]
9697
pub struct SavedRegs {
9798
r: [u64; 11], // x19-x29
98-
lr: u64
99+
lr: u64,
100+
vector_half: [u64; 8], // d8-d15
99101
}
100102

101103
// TODO: doc hidden
@@ -108,6 +110,9 @@ pub unsafe extern "C" fn unwind_recorder(payload: *mut UnwindPayload, stack: u64
108110
for (regnum, v) in saved_regs.r.iter().enumerate() {
109111
registers[DwarfRegisterAArch64::X19 as u8 + regnum as u8] = Some(*v);
110112
}
113+
for (regnum, v) in saved_regs.vector_half.iter().enumerate() {
114+
registers[DwarfRegisterAArch64::V8 as u8 + regnum as u8] = Some(*v);
115+
}
111116
registers[DwarfRegisterAArch64::SP] = Some(stack);
112117
registers[DwarfRegisterAArch64::IP] = Some(saved_regs.lr);
113118

@@ -126,11 +131,14 @@ pub unsafe fn land(regs: &Registers) {
126131
fp: regs[DwarfRegisterAArch64::X29].unwrap_or(0),
127132
lr: regs[DwarfRegisterAArch64::IP].unwrap_or(0),
128133
sp: regs[DwarfRegisterAArch64::SP].unwrap_or(0),
129-
pad: 0,
130134
vector_half: [0; 32]
131135
};
132136
for (i, v) in lr.r.iter_mut().enumerate() {
133137
*v = regs[i as u8].unwrap_or(0);
134138
}
139+
140+
for (i, v) in lr.vector_half.iter_mut().enumerate() {
141+
*v = regs[DwarfRegisterAArch64::V0 as u8 + i as u8].unwrap_or(0);
142+
}
135143
unwind_lander(&lr);
136144
}

unwind/src/registers.rs

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
use std::fmt::{Debug, Formatter, Result as FmtResult};
22
use std::ops::{Index, IndexMut};
33

4-
#[derive(Default, Clone, PartialEq, Eq)]
4+
#[derive(Clone)]
55
pub struct Registers {
6-
registers: [Option<u64>; 32],
6+
registers: [Option<u64>; 96],
7+
}
8+
9+
impl Default for Registers {
10+
fn default() -> Registers {
11+
Registers {
12+
registers: [Some(0); 96]
13+
}
14+
}
715
}
816

917
impl Debug for Registers {
1018
fn fmt(&self, fmt: &mut Formatter) -> FmtResult {
11-
for reg in &self.registers {
19+
for reg in &self.registers[..] {
1220
match *reg {
1321
None => write!(fmt, " XXX")?,
1422
Some(x) => write!(fmt, " 0x{:x}", x)?,
@@ -115,8 +123,42 @@ pub enum DwarfRegisterAArch64 {
115123
IP = 30, // Link register, x30, IP is restored in it?
116124
SP = 31,
117125

118-
// ELR_mode
126+
127+
// TODO: ELR_mode
128+
119129
// Vector regs
130+
V0 = 64,
131+
V1 = 65,
132+
V2 = 66,
133+
V3 = 67,
134+
V4 = 68,
135+
V5 = 69,
136+
V6 = 70,
137+
V7 = 71,
138+
V8 = 72,
139+
V9 = 73,
140+
V10 = 74,
141+
V11 = 75,
142+
V12 = 76,
143+
V13 = 77,
144+
V14 = 78,
145+
V15 = 79,
146+
V16 = 80,
147+
V17 = 81,
148+
V18 = 82,
149+
V19 = 83,
150+
V20 = 84,
151+
V21 = 85,
152+
V22 = 86,
153+
V23 = 87,
154+
V24 = 88,
155+
V25 = 89,
156+
V26 = 90,
157+
V27 = 91,
158+
V28 = 92,
159+
V29 = 93,
160+
V30 = 94,
161+
V31 = 95,
120162
}
121163

122164
#[cfg(target_arch = "x86_64")]

0 commit comments

Comments
 (0)