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;* | base | limit | dealloc | fiber data| * 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 make_fcontext 62 IMPORT _exit 63 64make_fcontext proc 65 ; save stack top address to x3 66 mov x3, x0 67 68 ; shift address in x0 (allocated stack) to lower 16 byte boundary 69 and x0, x0, ~0xF 70 71 ; reserve space for context-data on context-stack 72 sub x0, x0, #0xd0 73 74 ; save top address of context_stack as 'base' 75 str x3, [x0, #0xa0] 76 ; save bottom address of context-stack as 'limit' and 'dealloction stack' 77 sub x3, x3, x1 78 stp x3, x3, [x0, #0xa8] 79 ; save 0 as 'fiber data' 80 str xzr, [x0, #0xb8] 81 82 ; third arg of make_fcontext() == address of context-function 83 ; store address as x19 for trampoline 84 str x2, [x0, #0x40] 85 ; store trampoline address as pc 86 adr x2, trampoline 87 str x2, [x0, #0xc0] 88 89 ; save address of finish as return-address for context-function 90 ; will be entered after context-function returns (LR register) 91 adr x1, finish 92 str x1, [x0, #0x98] 93 94 ret x30 ; return pointer to context-data (x0) 95 96trampoline 97 stp fp, lr, [sp, #-0x10]! 98 mov fp, sp 99 blr x19 100 101finish 102 ; exit code is zero 103 mov x0, #0 104 ; exit application 105 bl _exit 106 ENDP 107 END 108