1;/* 2; Copyright Oliver Kowalke 2009. 3; Distributed under the Boost Software License, Version 1.0. 4; (See accompanying file LICENSE_1_0.txt or copy at 5; http://www.boost.org/LICENSE_1_0.txt) 6;*/ 7 8; ******************************************************* 9; * * 10; * ------------------------------------------------- * 11; * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | * 12; * ------------------------------------------------- * 13; * | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| * 14; * ------------------------------------------------- * 15; * |deall|limit| base|hiddn| v1 | v2 | v3 | v4 | * 16; * ------------------------------------------------- * 17; * ------------------------------------------------- * 18; * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | * 19; * ------------------------------------------------- * 20; * | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| * 21; * ------------------------------------------------- * 22; * | v5 | v6 | v7 | v8 | lr | pc | FCTX| DATA| * 23; * ------------------------------------------------- * 24; * * 25; ******************************************************* 26 27 28 AREA |.text|, CODE 29 ALIGN 4 30 EXPORT make_fcontext 31 IMPORT _exit 32 33make_fcontext PROC 34 ; first arg of make_fcontext() == top of context-stack 35 ; save top of context-stack (base) A4 36 mov a4, a1 37 38 ; shift address in A1 to lower 16 byte boundary 39 bic a1, a1, #0x0f 40 41 ; reserve space for context-data on context-stack 42 sub a1, a1, #0x48 43 44 ; save top address of context_stack as 'base' 45 str a4, [a1, #0x8] 46 ; second arg of make_fcontext() == size of context-stack 47 ; compute bottom address of context-stack (limit) 48 sub a4, a4, a2 49 ; save bottom address of context-stack as 'limit' 50 str a4, [a1, #0x4] 51 ; save bottom address of context-stack as 'dealloction stack' 52 str a4, [a1, #0x0] 53 54 ; third arg of make_fcontext() == address of context-function 55 str a3, [a1, #0x34] 56 57 ; compute address of returned transfer_t 58 add a2, a1, #0x38 59 mov a3, a2 60 str a3, [a1, #0xc] 61 62 ; compute abs address of label finish 63 adr a2, finish 64 ; save address of finish as return-address for context-function 65 ; will be entered after context-function returns 66 str a2, [a1, #0x30] 67 68 bx lr ; return pointer to context-data 69 70finish 71 ; exit code is zero 72 mov a1, #0 73 ; exit application 74 bl _exit 75 76 ENDP 77 END 78