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