|
1 |
| -/* |
| 1 | +/* |
2 | 2 | cont.S - continuations support for Xtensa call0 ABI
|
3 | 3 | Copyright (c) 2014 Ivan Grokhotkov. All rights reserved.
|
4 | 4 | This file is part of the esp8266 core for Arduino environment.
|
5 |
| - |
| 5 | + |
6 | 6 | This library is free software; you can redistribute it and/or
|
7 | 7 | modify it under the terms of the GNU Lesser General Public
|
8 | 8 | License as published by the Free Software Foundation; either
|
|
18 | 18 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
19 | 19 | */
|
20 | 20 |
|
21 |
| - .text |
22 |
| - .align 4 |
23 |
| - .literal_position |
24 |
| - .global cont_yield |
25 |
| - .type cont_yield, @function |
| 21 | + .text |
| 22 | + .align 4 |
| 23 | + .literal_position |
| 24 | + .global cont_yield |
| 25 | + .type cont_yield, @function |
26 | 26 | cont_yield:
|
27 |
| - /* a1: sp */ |
28 |
| - /* a2: void* cont_ctx */ |
29 |
| - /* adjust stack and save registers */ |
30 |
| - addi a1, a1, -24 |
31 |
| - s32i a12, a1, 0 |
32 |
| - s32i a13, a1, 4 |
33 |
| - s32i a14, a1, 8 |
34 |
| - s32i a15, a1, 12 |
35 |
| - s32i a0, a1, 16 |
36 |
| - s32i a2, a1, 20 |
| 27 | + /* a1: sp */ |
| 28 | + /* a2: void* cont_ctx */ |
| 29 | + /* adjust stack and save registers */ |
| 30 | + addi a1, a1, -24 |
| 31 | + s32i a12, a1, 0 |
| 32 | + s32i a13, a1, 4 |
| 33 | + s32i a14, a1, 8 |
| 34 | + s32i a15, a1, 12 |
| 35 | + s32i a0, a1, 16 |
| 36 | + s32i a2, a1, 20 |
37 | 37 |
|
38 |
| - /* &cont_continue -> cont_ctx.pc_yield */ |
39 |
| - movi a3, cont_continue |
40 |
| - s32i a3, a2, 8 |
41 |
| - /* sp -> cont_ctx.sp_yield */ |
42 |
| - s32i a1, a2, 12 |
| 38 | + /* &cont_continue -> cont_ctx.pc_yield */ |
| 39 | + movi a3, cont_continue |
| 40 | + s32i a3, a2, 8 |
| 41 | + /* sp -> cont_ctx.sp_yield */ |
| 42 | + s32i a1, a2, 12 |
43 | 43 |
|
44 |
| - /* a0 <- cont_ctx.pc_ret */ |
45 |
| - l32i a0, a2, 0 |
46 |
| - /* sp <- cont_ctx.sp_ret */ |
47 |
| - l32i a1, a2, 4 |
48 |
| - jx a0 |
| 44 | + /* a0 <- cont_ctx.pc_ret */ |
| 45 | + l32i a0, a2, 0 |
| 46 | + /* sp <- cont_ctx.sp_ret */ |
| 47 | + l32i a1, a2, 4 |
| 48 | + jx a0 |
49 | 49 |
|
50 | 50 | cont_continue:
|
51 |
| - l32i a12, a1, 0 |
52 |
| - l32i a13, a1, 4 |
53 |
| - l32i a14, a1, 8 |
54 |
| - l32i a15, a1, 12 |
55 |
| - l32i a0, a1, 16 |
56 |
| - l32i a2, a1, 20 |
57 |
| - addi a1, a1, 24 |
58 |
| - ret |
59 |
| - .size cont_yield, . - cont_yield |
| 51 | + l32i a12, a1, 0 |
| 52 | + l32i a13, a1, 4 |
| 53 | + l32i a14, a1, 8 |
| 54 | + l32i a15, a1, 12 |
| 55 | + l32i a0, a1, 16 |
| 56 | + l32i a2, a1, 20 |
| 57 | + addi a1, a1, 24 |
| 58 | + ret |
| 59 | + .size cont_yield, . - cont_yield |
60 | 60 |
|
61 | 61 | ////////////////////////////////////////////////////
|
62 | 62 |
|
63 |
| - .text |
64 |
| - .align 4 |
65 |
| - .literal_position |
66 |
| - .global cont_run |
67 |
| - .type cont_run, @function |
| 63 | + .text |
| 64 | + .align 4 |
| 65 | + .literal_position |
| 66 | + .global cont_run |
| 67 | + .type cont_run, @function |
68 | 68 | cont_run:
|
69 |
| - /* a1: sp */ |
70 |
| - /* a2: void* cont_ctx */ |
71 |
| - /* a3: void (*pfn) */ |
| 69 | + /* a1: sp */ |
| 70 | + /* a2: void* cont_ctx */ |
| 71 | + /* a3: void (*pfn) */ |
72 | 72 |
|
73 |
| - /* adjust stack and save registers */ |
74 |
| - addi a1, a1, -20 |
75 |
| - s32i a12, a1, 0 |
76 |
| - s32i a13, a1, 4 |
77 |
| - s32i a14, a1, 8 |
78 |
| - s32i a15, a1, 12 |
79 |
| - s32i a0, a1, 16 |
| 73 | + /* adjust stack and save registers */ |
| 74 | + addi a1, a1, -20 |
| 75 | + s32i a12, a1, 0 |
| 76 | + s32i a13, a1, 4 |
| 77 | + s32i a14, a1, 8 |
| 78 | + s32i a15, a1, 12 |
| 79 | + s32i a0, a1, 16 |
80 | 80 |
|
81 |
| - /* cont_ret -> a4 -> cont_ctx.pc_ret*/ |
82 |
| - movi a4, cont_ret |
83 |
| - s32i a4, a2, 0 |
84 |
| - /* sp -> cont_ctx.sp_ret */ |
85 |
| - s32i a1, a2, 4 |
| 81 | + /* cont_ret -> a4 -> cont_ctx.pc_ret*/ |
| 82 | + movi a4, cont_ret |
| 83 | + s32i a4, a2, 0 |
| 84 | + /* sp -> cont_ctx.sp_ret */ |
| 85 | + s32i a1, a2, 4 |
86 | 86 |
|
87 |
| - /* if cont_ctx.pc_yield != 0, goto cont_resume */ |
88 |
| - l32i a4, a2, 8 |
89 |
| - bnez a4, cont_resume |
90 |
| - /* else */ |
91 |
| - /* set new stack*/ |
92 |
| - l32i a1, a2, 16; |
93 |
| - /* goto pfn */ |
94 |
| - movi a0, cont_norm |
95 |
| - jx a3 |
| 87 | + /* if cont_ctx.pc_yield != 0, goto cont_resume */ |
| 88 | + l32i a4, a2, 8 |
| 89 | + bnez a4, cont_resume |
| 90 | + /* else */ |
| 91 | + /* set new stack*/ |
| 92 | + l32i a1, a2, 16; |
| 93 | + /* goto pfn */ |
| 94 | + movi a0, cont_norm |
| 95 | + jx a3 |
96 | 96 |
|
97 | 97 | cont_resume:
|
98 |
| - /* a1 <- cont_ctx.sp_yield */ |
99 |
| - l32i a1, a2, 12 |
100 |
| - /* reset yield flag, 0 -> cont_ctx.pc_yield */ |
101 |
| - movi a3, 0 |
102 |
| - s32i a3, a2, 8 |
103 |
| - /* jump to saved cont_ctx.pc_yield */ |
104 |
| - movi a0, cont_ret |
105 |
| - jx a4 |
| 98 | + /* a1 <- cont_ctx.sp_yield */ |
| 99 | + l32i a1, a2, 12 |
| 100 | + /* reset yield flag, 0 -> cont_ctx.pc_yield */ |
| 101 | + movi a3, 0 |
| 102 | + s32i a3, a2, 8 |
| 103 | + /* jump to saved cont_ctx.pc_yield */ |
| 104 | + movi a0, cont_ret |
| 105 | + jx a4 |
106 | 106 |
|
107 | 107 | cont_norm:
|
108 |
| - /* calculate pointer to cont_ctx.struct_start from sp */ |
109 |
| - l32i a2, a1, 4 |
110 |
| - /* sp <- cont_ctx.sp_ret */ |
111 |
| - l32i a1, a2, 4 |
| 108 | + /* calculate pointer to cont_ctx.struct_start from sp */ |
| 109 | + l32i a2, a1, 4 |
| 110 | + /* sp <- cont_ctx.sp_ret */ |
| 111 | + l32i a1, a2, 4 |
| 112 | + /* 0 -> cont_ctx.pc_ret */ |
| 113 | + movi a4, 0 |
| 114 | + s32i a4, a2, 0 |
112 | 115 |
|
113 | 116 | cont_ret:
|
114 |
| - /* restore registers */ |
115 |
| - l32i a12, a1, 0 |
116 |
| - l32i a13, a1, 4 |
117 |
| - l32i a14, a1, 8 |
118 |
| - l32i a15, a1, 12 |
119 |
| - l32i a0, a1, 16 |
120 |
| - /* adjust stack and return */ |
121 |
| - addi a1, a1, 20 |
122 |
| - ret |
123 |
| - .size cont_run, . - cont_run |
| 117 | + /* restore registers */ |
| 118 | + l32i a12, a1, 0 |
| 119 | + l32i a13, a1, 4 |
| 120 | + l32i a14, a1, 8 |
| 121 | + l32i a15, a1, 12 |
| 122 | + l32i a0, a1, 16 |
| 123 | + /* adjust stack and return */ |
| 124 | + addi a1, a1, 20 |
| 125 | + ret |
| 126 | + .size cont_run, . - cont_run |
0 commit comments