1; Copyright Edward Nevill + Oliver Kowalke 2015 2; Distributed under the Boost Software License, Version 1.0. 3; (See accompanying file LICENSE_1_0.txt or copy at 4; http://www.boost.org/LICENSE_1_0.txt) 5 6;******************************************************* 7;* * 8;* ------------------------------------------------- * 9;* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | * 10;* ------------------------------------------------- * 11;* | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| * 12;* ------------------------------------------------- * 13;* | d8 | d9 | d10 | d11 | * 14;* ------------------------------------------------- * 15;* ------------------------------------------------- * 16;* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | * 17;* ------------------------------------------------- * 18;* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| * 19;* ------------------------------------------------- * 20;* | d12 | d13 | d14 | d15 | * 21;* ------------------------------------------------- * 22;* ------------------------------------------------- * 23;* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | * 24;* ------------------------------------------------- * 25;* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| * 26;* ------------------------------------------------- * 27;* | x19 | x20 | x21 | x22 | * 28;* ------------------------------------------------- * 29;* ------------------------------------------------- * 30;* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | * 31;* ------------------------------------------------- * 32;* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| * 33;* ------------------------------------------------- * 34;* | x23 | x24 | x25 | x26 | * 35;* ------------------------------------------------- * 36;* ------------------------------------------------- * 37;* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | * 38;* ------------------------------------------------- * 39;* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| * 40;* ------------------------------------------------- * 41;* | x27 | x28 | FP | LR | * 42;* ------------------------------------------------- * 43;* ------------------------------------------------- * 44;* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | * 45;* ------------------------------------------------- * 46;* | 0xa0| 0xa4| 0xa8| 0xac| 0xb0| 0xb4| 0xb8| 0xbc| * 47;* ------------------------------------------------- * 48;* | fiber data| base | limit | dealloc | * 49;* ------------------------------------------------- * 50;* ------------------------------------------------- * 51;* | 48 | 49 | 50 | 51 | | | * 52;* ------------------------------------------------- * 53;* | 0xc0| 0xc4| 0xc8| 0xcc| | | * 54;* ------------------------------------------------- * 55;* | PC | align | | | * 56;* ------------------------------------------------- * 57;* * 58;******************************************************* 59 60 AREA |.text|, CODE, READONLY, ALIGN=4, CODEALIGN 61 EXPORT jump_fcontext 62 63jump_fcontext proc 64 ; prepare stack for GP + FPU 65 sub sp, sp, #0xd0 66 67 ; save d8 - d15 68 stp d8, d9, [sp, #0x00] 69 stp d10, d11, [sp, #0x10] 70 stp d12, d13, [sp, #0x20] 71 stp d14, d15, [sp, #0x30] 72 73 ; save x19-x30 74 stp x19, x20, [sp, #0x40] 75 stp x21, x22, [sp, #0x50] 76 stp x23, x24, [sp, #0x60] 77 stp x25, x26, [sp, #0x70] 78 stp x27, x28, [sp, #0x80] 79 stp x29, x30, [sp, #0x90] 80 81 ; save LR as PC 82 str x30, [sp, #0xc0] 83 84 ; save current stack base and limit 85 ldp x5, x6, [x18, #0x08] ; TeStackBase and TeStackLimit at ksarm64.h 86 stp x5, x6, [sp, #0xa0] 87 ; save current fiber data and deallocation stack 88 ldr x5, [x18, #0x1478] ; TeDeallocationStack at ksarm64.h 89 ldr x6, [x18, #0x20] ; TeFiberData at ksarm64.h 90 stp x5, x6, [sp, #0xb0] 91 92 ; store RSP (pointing to context-data) in X0 93 mov x4, sp 94 95 ; restore RSP (pointing to context-data) from X1 96 mov sp, x0 97 98 ; restore stack base and limit 99 ldp x5, x6, [sp, #0xa0] 100 stp x5, x6, [x18, #0x08] ; TeStackBase and TeStackLimit at ksarm64.h 101 ; restore fiber data and deallocation stack 102 ldp x5, x6, [sp, #0xb0] 103 str x5, [x18, #0x1478] ; TeDeallocationStack at ksarm64.h 104 str x6, [x18, #0x20] ; TeFiberData at ksarm64.h 105 106 ; load d8 - d15 107 ldp d8, d9, [sp, #0x00] 108 ldp d10, d11, [sp, #0x10] 109 ldp d12, d13, [sp, #0x20] 110 ldp d14, d15, [sp, #0x30] 111 112 ; load x19-x30 113 ldp x19, x20, [sp, #0x40] 114 ldp x21, x22, [sp, #0x50] 115 ldp x23, x24, [sp, #0x60] 116 ldp x25, x26, [sp, #0x70] 117 ldp x27, x28, [sp, #0x80] 118 ldp x29, x30, [sp, #0x90] 119 120 ; return transfer_t from jump 121 ; pass transfer_t as first arg in context function 122 ; X0 == FCTX, X1 == DATA 123 mov x0, x4 124 125 ; load pc 126 ldr x4, [sp, #0xc0] 127 128 ; restore stack from GP + FPU 129 add sp, sp, #0xd0 130 131 ret x4 132 ENDP 133 END