@@ -14,8 +14,8 @@ extern "C" {
1414pub 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 ) ]
9697pub 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}
0 commit comments