Kai Backman | 7943556 | 2009-05-26 11:18:42 -0700 | [diff] [blame] | 1 | // Copyright 2009 The Go Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 5 | #include "arm/asm.h" |
| 6 | |
| 7 | // using frame size $-4 means do not save LR on stack. |
| 8 | TEXT _rt0_arm(SB),7,$-4 |
Russ Cox | 8052786 | 2010-10-17 11:41:23 -0400 | [diff] [blame] | 9 | MOVW $0xcafebabe, R12 |
Kai Backman | 7943556 | 2009-05-26 11:18:42 -0700 | [diff] [blame] | 10 | |
Kai Backman | 1ac2cfc | 2009-06-16 11:25:58 -0700 | [diff] [blame] | 11 | // copy arguments forward on an even stack |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 12 | // use R13 instead of SP to avoid linker rewriting the offsets |
| 13 | MOVW 0(R13), R0 // argc |
| 14 | MOVW $4(R13), R1 // argv |
Russ Cox | d9fd114 | 2011-02-22 17:40:40 -0500 | [diff] [blame] | 15 | SUB $64, R13 // plenty of scratch |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 16 | AND $~7, R13 |
Russ Cox | d9fd114 | 2011-02-22 17:40:40 -0500 | [diff] [blame] | 17 | MOVW R0, 60(R13) // save argc, argv away |
| 18 | MOVW R1, 64(R13) |
Kai Backman | 7943556 | 2009-05-26 11:18:42 -0700 | [diff] [blame] | 19 | |
Kai Backman | 1ac2cfc | 2009-06-16 11:25:58 -0700 | [diff] [blame] | 20 | // set up m and g registers |
| 21 | // g is R10, m is R9 |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 22 | MOVW $runtime·g0(SB), g |
| 23 | MOVW $runtime·m0(SB), m |
Kai Backman | 7943556 | 2009-05-26 11:18:42 -0700 | [diff] [blame] | 24 | |
Kai Backman | 1ac2cfc | 2009-06-16 11:25:58 -0700 | [diff] [blame] | 25 | // save m->g0 = g0 |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 26 | MOVW g, m_g0(m) |
Kai Backman | 7943556 | 2009-05-26 11:18:42 -0700 | [diff] [blame] | 27 | |
Kai Backman | 1ac2cfc | 2009-06-16 11:25:58 -0700 | [diff] [blame] | 28 | // create istack out of the OS stack |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 29 | MOVW $(-8192+104)(R13), R0 |
| 30 | MOVW R0, g_stackguard(g) // (w 104b guard) |
| 31 | MOVW R13, g_stackbase(g) |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 32 | BL runtime·emptyfunc(SB) // fault if stack check is wrong |
Kai Backman | 7943556 | 2009-05-26 11:18:42 -0700 | [diff] [blame] | 33 | |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 34 | BL runtime·check(SB) |
Kai Backman | 7943556 | 2009-05-26 11:18:42 -0700 | [diff] [blame] | 35 | |
Kai Backman | 1ac2cfc | 2009-06-16 11:25:58 -0700 | [diff] [blame] | 36 | // saved argc, argv |
Russ Cox | d9fd114 | 2011-02-22 17:40:40 -0500 | [diff] [blame] | 37 | MOVW 60(R13), R0 |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 38 | MOVW R0, 4(R13) |
Russ Cox | d9fd114 | 2011-02-22 17:40:40 -0500 | [diff] [blame] | 39 | MOVW 64(R13), R1 |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 40 | MOVW R1, 8(R13) |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 41 | BL runtime·args(SB) |
| 42 | BL runtime·osinit(SB) |
| 43 | BL runtime·schedinit(SB) |
Kai Backman | 7943556 | 2009-05-26 11:18:42 -0700 | [diff] [blame] | 44 | |
Kai Backman | 1ac2cfc | 2009-06-16 11:25:58 -0700 | [diff] [blame] | 45 | // create a new goroutine to start program |
Russ Cox | 6808da0 | 2011-10-27 18:04:12 -0700 | [diff] [blame] | 46 | MOVW $runtime·main(SB), R0 |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 47 | MOVW.W R0, -4(R13) |
Kai Backman | 1ac2cfc | 2009-06-16 11:25:58 -0700 | [diff] [blame] | 48 | MOVW $8, R0 |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 49 | MOVW.W R0, -4(R13) |
Kai Backman | 1ac2cfc | 2009-06-16 11:25:58 -0700 | [diff] [blame] | 50 | MOVW $0, R0 |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 51 | MOVW.W R0, -4(R13) // push $0 as guard |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 52 | BL runtime·newproc(SB) |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 53 | MOVW $12(R13), R13 // pop args and LR |
Kai Backman | 7943556 | 2009-05-26 11:18:42 -0700 | [diff] [blame] | 54 | |
Kai Backman | 1ac2cfc | 2009-06-16 11:25:58 -0700 | [diff] [blame] | 55 | // start this M |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 56 | BL runtime·mstart(SB) |
Kai Backman | 7943556 | 2009-05-26 11:18:42 -0700 | [diff] [blame] | 57 | |
Kai Backman | 770b872 | 2009-10-29 21:21:14 -0700 | [diff] [blame] | 58 | MOVW $1234, R0 |
| 59 | MOVW $1000, R1 |
| 60 | MOVW R0, (R1) // fail hard |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 61 | B runtime·_dep_dummy(SB) // Never reached |
Kai Backman | 1ac2cfc | 2009-06-16 11:25:58 -0700 | [diff] [blame] | 62 | |
Kai Backman | d85bb81 | 2009-12-17 16:08:42 -0800 | [diff] [blame] | 63 | // TODO(kaib): remove these once i actually understand how the linker removes symbols |
Kai Backman | 5289195 | 2009-06-10 11:53:07 -0700 | [diff] [blame] | 64 | // pull in dummy dependencies |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 65 | TEXT runtime·_dep_dummy(SB),7,$0 |
Kai Backman | 1ac2cfc | 2009-06-16 11:25:58 -0700 | [diff] [blame] | 66 | BL _div(SB) |
| 67 | BL _divu(SB) |
| 68 | BL _mod(SB) |
| 69 | BL _modu(SB) |
| 70 | BL _modu(SB) |
Kai Backman | d85bb81 | 2009-12-17 16:08:42 -0800 | [diff] [blame] | 71 | BL _sfloat(SB) |
Kai Backman | 5289195 | 2009-06-10 11:53:07 -0700 | [diff] [blame] | 72 | |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 73 | TEXT runtime·breakpoint(SB),7,$0 |
Russ Cox | 8fff916 | 2010-10-25 21:25:13 -0700 | [diff] [blame] | 74 | // no breakpoint yet; let program exit |
Russ Cox | 6c19601 | 2010-04-05 12:51:09 -0700 | [diff] [blame] | 75 | RET |
Kai Backman | 5289195 | 2009-06-10 11:53:07 -0700 | [diff] [blame] | 76 | |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 77 | /* |
| 78 | * go-routine |
| 79 | */ |
Kai Backman | 5289195 | 2009-06-10 11:53:07 -0700 | [diff] [blame] | 80 | |
Russ Cox | f9ca3b5 | 2011-03-07 10:37:42 -0500 | [diff] [blame] | 81 | // void gosave(Gobuf*) |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 82 | // save state in Gobuf; setjmp |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 83 | TEXT runtime·gosave(SB), 7, $-4 |
Ken Thompson | ed575dc | 2010-10-08 16:46:05 -0700 | [diff] [blame] | 84 | MOVW 0(FP), R0 // gobuf |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 85 | MOVW SP, gobuf_sp(R0) |
| 86 | MOVW LR, gobuf_pc(R0) |
| 87 | MOVW g, gobuf_g(R0) |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 88 | RET |
| 89 | |
| 90 | // void gogo(Gobuf*, uintptr) |
| 91 | // restore state from Gobuf; longjmp |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 92 | TEXT runtime·gogo(SB), 7, $-4 |
Ken Thompson | ed575dc | 2010-10-08 16:46:05 -0700 | [diff] [blame] | 93 | MOVW 0(FP), R1 // gobuf |
Kai Backman | 46e392e | 2009-09-18 16:45:41 -0700 | [diff] [blame] | 94 | MOVW 4(FP), R0 // return 2nd arg |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 95 | MOVW gobuf_g(R1), g |
| 96 | MOVW 0(g), R2 // make sure g != nil |
| 97 | MOVW gobuf_sp(R1), SP // restore SP |
| 98 | MOVW gobuf_pc(R1), PC |
| 99 | |
| 100 | // void gogocall(Gobuf*, void (*fn)(void)) |
| 101 | // restore state from Gobuf but then call fn. |
| 102 | // (call fn, returning to state in Gobuf) |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 103 | // using frame size $-4 means do not save LR on stack. |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 104 | TEXT runtime·gogocall(SB), 7, $-4 |
Ken Thompson | ed575dc | 2010-10-08 16:46:05 -0700 | [diff] [blame] | 105 | MOVW 0(FP), R0 // gobuf |
Kai Backman | 46e392e | 2009-09-18 16:45:41 -0700 | [diff] [blame] | 106 | MOVW 4(FP), R1 // fn |
Ken Thompson | ed575dc | 2010-10-08 16:46:05 -0700 | [diff] [blame] | 107 | MOVW 8(FP), R2 // fp offset |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 108 | MOVW gobuf_g(R0), g |
Ken Thompson | ed575dc | 2010-10-08 16:46:05 -0700 | [diff] [blame] | 109 | MOVW 0(g), R3 // make sure g != nil |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 110 | MOVW gobuf_sp(R0), SP // restore SP |
| 111 | MOVW gobuf_pc(R0), LR |
| 112 | MOVW R1, PC |
| 113 | |
Russ Cox | f9ca3b5 | 2011-03-07 10:37:42 -0500 | [diff] [blame] | 114 | // void mcall(void (*fn)(G*)) |
| 115 | // Switch to m->g0's stack, call fn(g). |
Russ Cox | 370276a | 2011-04-27 23:21:12 -0400 | [diff] [blame] | 116 | // Fn must never return. It should gogo(&g->sched) |
Russ Cox | f9ca3b5 | 2011-03-07 10:37:42 -0500 | [diff] [blame] | 117 | // to keep running g. |
| 118 | TEXT runtime·mcall(SB), 7, $-4 |
| 119 | MOVW fn+0(FP), R0 |
| 120 | |
| 121 | // Save caller state in g->gobuf. |
| 122 | MOVW SP, (g_sched+gobuf_sp)(g) |
| 123 | MOVW LR, (g_sched+gobuf_pc)(g) |
| 124 | MOVW g, (g_sched+gobuf_g)(g) |
| 125 | |
| 126 | // Switch to m->g0 & its stack, call fn. |
| 127 | MOVW g, R1 |
| 128 | MOVW m_g0(m), g |
| 129 | CMP g, R1 |
| 130 | BL.EQ runtime·badmcall(SB) |
| 131 | MOVW (g_sched+gobuf_sp)(g), SP |
| 132 | SUB $8, SP |
| 133 | MOVW R1, 4(SP) |
| 134 | BL (R0) |
| 135 | BL runtime·badmcall2(SB) |
| 136 | RET |
| 137 | |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 138 | /* |
| 139 | * support for morestack |
| 140 | */ |
| 141 | |
| 142 | // Called during function prolog when more stack is needed. |
| 143 | // R1 frame size |
| 144 | // R2 arg size |
| 145 | // R3 prolog's LR |
Russ Cox | 6c19601 | 2010-04-05 12:51:09 -0700 | [diff] [blame] | 146 | // NB. we do not save R0 because we've forced 5c to pass all arguments |
Kai Backman | 0af8e10 | 2009-10-23 10:59:31 -0700 | [diff] [blame] | 147 | // on the stack. |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 148 | // using frame size $-4 means do not save LR on stack. |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 149 | TEXT runtime·morestack(SB),7,$-4 |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 150 | // Cannot grow scheduler stack (m->g0). |
| 151 | MOVW m_g0(m), R4 |
| 152 | CMP g, R4 |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 153 | BL.EQ runtime·abort(SB) |
Kai Backman | 5289195 | 2009-06-10 11:53:07 -0700 | [diff] [blame] | 154 | |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 155 | // Save in m. |
Russ Cox | 141a4a1 | 2011-01-14 14:05:20 -0500 | [diff] [blame] | 156 | MOVW R1, m_moreframesize(m) |
| 157 | MOVW R2, m_moreargsize(m) |
Kai Backman | 5289195 | 2009-06-10 11:53:07 -0700 | [diff] [blame] | 158 | |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 159 | // Called from f. |
| 160 | // Set m->morebuf to f's caller. |
Ken Thompson | b33f5d5 | 2010-10-13 13:24:14 -0700 | [diff] [blame] | 161 | MOVW R3, (m_morebuf+gobuf_pc)(m) // f's caller's PC |
| 162 | MOVW SP, (m_morebuf+gobuf_sp)(m) // f's caller's SP |
Russ Cox | 141a4a1 | 2011-01-14 14:05:20 -0500 | [diff] [blame] | 163 | MOVW $4(SP), R3 // f's argument pointer |
| 164 | MOVW R3, m_moreargp(m) |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 165 | MOVW g, (m_morebuf+gobuf_g)(m) |
Kai Backman | 5289195 | 2009-06-10 11:53:07 -0700 | [diff] [blame] | 166 | |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 167 | // Set m->morepc to f's PC. |
| 168 | MOVW LR, m_morepc(m) |
Kai Backman | 5289195 | 2009-06-10 11:53:07 -0700 | [diff] [blame] | 169 | |
Russ Cox | f9ca3b5 | 2011-03-07 10:37:42 -0500 | [diff] [blame] | 170 | // Call newstack on m->g0's stack. |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 171 | MOVW m_g0(m), g |
Russ Cox | f9ca3b5 | 2011-03-07 10:37:42 -0500 | [diff] [blame] | 172 | MOVW (g_sched+gobuf_sp)(g), SP |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 173 | B runtime·newstack(SB) |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 174 | |
Russ Cox | bba278a | 2009-07-08 18:16:09 -0700 | [diff] [blame] | 175 | // Called from reflection library. Mimics morestack, |
| 176 | // reuses stack growth code to create a frame |
| 177 | // with the desired args running the desired function. |
| 178 | // |
| 179 | // func call(fn *byte, arg *byte, argsize uint32). |
| 180 | TEXT reflect·call(SB), 7, $-4 |
| 181 | // Save our caller's state as the PC and SP to |
| 182 | // restore when returning from f. |
| 183 | MOVW LR, (m_morebuf+gobuf_pc)(m) // our caller's PC |
| 184 | MOVW SP, (m_morebuf+gobuf_sp)(m) // our caller's SP |
Kai Backman | 7842b03 | 2009-07-12 22:12:19 -0700 | [diff] [blame] | 185 | MOVW g, (m_morebuf+gobuf_g)(m) |
Russ Cox | bba278a | 2009-07-08 18:16:09 -0700 | [diff] [blame] | 186 | |
| 187 | // Set up morestack arguments to call f on a new stack. |
Russ Cox | 83727cc | 2010-03-29 21:48:22 -0700 | [diff] [blame] | 188 | // We set f's frame size to 1, as a hint to newstack |
| 189 | // that this is a call from reflect·call. |
| 190 | // If it turns out that f needs a larger frame than |
| 191 | // the default stack, f's usual stack growth prolog will |
| 192 | // allocate a new segment (and recopy the arguments). |
Ken Thompson | ed575dc | 2010-10-08 16:46:05 -0700 | [diff] [blame] | 193 | MOVW 4(SP), R0 // fn |
| 194 | MOVW 8(SP), R1 // arg frame |
| 195 | MOVW 12(SP), R2 // arg size |
Russ Cox | bba278a | 2009-07-08 18:16:09 -0700 | [diff] [blame] | 196 | |
Ken Thompson | ed575dc | 2010-10-08 16:46:05 -0700 | [diff] [blame] | 197 | MOVW R0, m_morepc(m) // f's PC |
Russ Cox | 141a4a1 | 2011-01-14 14:05:20 -0500 | [diff] [blame] | 198 | MOVW R1, m_moreargp(m) // f's argument pointer |
| 199 | MOVW R2, m_moreargsize(m) // f's argument size |
Russ Cox | 83727cc | 2010-03-29 21:48:22 -0700 | [diff] [blame] | 200 | MOVW $1, R3 |
Russ Cox | 141a4a1 | 2011-01-14 14:05:20 -0500 | [diff] [blame] | 201 | MOVW R3, m_moreframesize(m) // f's frame size |
Russ Cox | bba278a | 2009-07-08 18:16:09 -0700 | [diff] [blame] | 202 | |
Russ Cox | f9ca3b5 | 2011-03-07 10:37:42 -0500 | [diff] [blame] | 203 | // Call newstack on m->g0's stack. |
Russ Cox | bba278a | 2009-07-08 18:16:09 -0700 | [diff] [blame] | 204 | MOVW m_g0(m), g |
Russ Cox | f9ca3b5 | 2011-03-07 10:37:42 -0500 | [diff] [blame] | 205 | MOVW (g_sched+gobuf_sp)(g), SP |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 206 | B runtime·newstack(SB) |
Russ Cox | bba278a | 2009-07-08 18:16:09 -0700 | [diff] [blame] | 207 | |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 208 | // Return point when leaving stack. |
| 209 | // using frame size $-4 means do not save LR on stack. |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 210 | TEXT runtime·lessstack(SB), 7, $-4 |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 211 | // Save return value in m->cret |
| 212 | MOVW R0, m_cret(m) |
| 213 | |
Russ Cox | f9ca3b5 | 2011-03-07 10:37:42 -0500 | [diff] [blame] | 214 | // Call oldstack on m->g0's stack. |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 215 | MOVW m_g0(m), g |
Russ Cox | f9ca3b5 | 2011-03-07 10:37:42 -0500 | [diff] [blame] | 216 | MOVW (g_sched+gobuf_sp)(g), SP |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 217 | B runtime·oldstack(SB) |
Kai Backman | 1ac2cfc | 2009-06-16 11:25:58 -0700 | [diff] [blame] | 218 | |
Kai Backman | 5289195 | 2009-06-10 11:53:07 -0700 | [diff] [blame] | 219 | // void jmpdefer(fn, sp); |
| 220 | // called from deferreturn. |
Kai Backman | d58b5fc | 2009-10-05 21:52:10 -0700 | [diff] [blame] | 221 | // 1. grab stored LR for caller |
| 222 | // 2. sub 4 bytes to get back to BL deferreturn |
| 223 | // 3. B to fn |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 224 | TEXT runtime·jmpdefer(SB), 7, $0 |
Kai Backman | d58b5fc | 2009-10-05 21:52:10 -0700 | [diff] [blame] | 225 | MOVW 0(SP), LR |
| 226 | MOVW $-4(LR), LR // BL deferreturn |
Russ Cox | 141a4a1 | 2011-01-14 14:05:20 -0500 | [diff] [blame] | 227 | MOVW fn+0(FP), R0 |
| 228 | MOVW argp+4(FP), SP |
| 229 | MOVW $-4(SP), SP // SP is 4 below argp, due to saved LR |
Kai Backman | d58b5fc | 2009-10-05 21:52:10 -0700 | [diff] [blame] | 230 | B (R0) |
Kai Backman | 5289195 | 2009-06-10 11:53:07 -0700 | [diff] [blame] | 231 | |
Russ Cox | f9ca3b5 | 2011-03-07 10:37:42 -0500 | [diff] [blame] | 232 | TEXT runtime·asmcgocall(SB),7,$0 |
| 233 | B runtime·cgounimpl(SB) |
| 234 | |
| 235 | TEXT runtime·cgocallback(SB),7,$0 |
| 236 | B runtime·cgounimpl(SB) |
| 237 | |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 238 | TEXT runtime·memclr(SB),7,$20 |
Kai Backman | 46e392e | 2009-09-18 16:45:41 -0700 | [diff] [blame] | 239 | MOVW 0(FP), R0 |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 240 | MOVW $0, R1 // c = 0 |
| 241 | MOVW R1, -16(SP) |
| 242 | MOVW 4(FP), R1 // n |
| 243 | MOVW R1, -12(SP) |
| 244 | MOVW m, -8(SP) // Save m and g |
| 245 | MOVW g, -4(SP) |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 246 | BL runtime·memset(SB) |
Kai Backman | be639b9 | 2009-06-23 11:54:23 -0700 | [diff] [blame] | 247 | MOVW -8(SP), m // Restore m and g, memset clobbers them |
| 248 | MOVW -4(SP), g |
| 249 | RET |
Kai Backman | 5289195 | 2009-06-10 11:53:07 -0700 | [diff] [blame] | 250 | |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 251 | TEXT runtime·getcallerpc(SB),7,$-4 |
Kai Backman | 33a7bcf | 2009-10-19 21:58:16 -0700 | [diff] [blame] | 252 | MOVW 0(SP), R0 |
| 253 | RET |
Kai Backman | 5289195 | 2009-06-10 11:53:07 -0700 | [diff] [blame] | 254 | |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 255 | TEXT runtime·setcallerpc(SB),7,$-4 |
Kai Backman | 33a7bcf | 2009-10-19 21:58:16 -0700 | [diff] [blame] | 256 | MOVW x+4(FP), R0 |
| 257 | MOVW R0, 0(SP) |
| 258 | RET |
Kai Backman | 5289195 | 2009-06-10 11:53:07 -0700 | [diff] [blame] | 259 | |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 260 | TEXT runtime·getcallersp(SB),7,$-4 |
Russ Cox | 6c19601 | 2010-04-05 12:51:09 -0700 | [diff] [blame] | 261 | MOVW 0(FP), R0 |
| 262 | MOVW $-4(R0), R0 |
| 263 | RET |
| 264 | |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 265 | TEXT runtime·emptyfunc(SB),0,$0 |
Kai Backman | 1ac2cfc | 2009-06-16 11:25:58 -0700 | [diff] [blame] | 266 | RET |
| 267 | |
Russ Cox | 68b4255 | 2010-11-04 14:00:19 -0400 | [diff] [blame] | 268 | TEXT runtime·abort(SB),7,$-4 |
Kai Backman | 1ac2cfc | 2009-06-16 11:25:58 -0700 | [diff] [blame] | 269 | MOVW $0, R0 |
| 270 | MOVW (R0), R1 |
Kai Backman | 5289195 | 2009-06-10 11:53:07 -0700 | [diff] [blame] | 271 | |
Russ Cox | 9ad9742 | 2011-02-25 14:29:55 -0500 | [diff] [blame] | 272 | // bool armcas(int32 *val, int32 old, int32 new) |
| 273 | // Atomically: |
| 274 | // if(*val == old){ |
| 275 | // *val = new; |
| 276 | // return 1; |
| 277 | // }else |
| 278 | // return 0; |
| 279 | // |
| 280 | // To implement runtime·cas in ../$GOOS/arm/sys.s |
| 281 | // using the native instructions, use: |
| 282 | // |
| 283 | // TEXT runtime·cas(SB),7,$0 |
| 284 | // B runtime·armcas(SB) |
| 285 | // |
| 286 | TEXT runtime·armcas(SB),7,$0 |
| 287 | MOVW valptr+0(FP), R1 |
| 288 | MOVW old+4(FP), R2 |
| 289 | MOVW new+8(FP), R3 |
| 290 | casl: |
| 291 | LDREX (R1), R0 |
| 292 | CMP R0, R2 |
| 293 | BNE casfail |
| 294 | STREX R3, (R1), R0 |
| 295 | CMP $0, R0 |
| 296 | BNE casl |
| 297 | MOVW $1, R0 |
| 298 | RET |
| 299 | casfail: |
| 300 | MOVW $0, R0 |
| 301 | RET |