bus_space_asm_armv7.S revision 1.1
1/* $OpenBSD: bus_space_asm_armv7.S,v 1.1 2013/05/09 20:41:47 patrick Exp $ */ 2/* $NetBSD: bus_space_asm_armv7.S,v 1.3 2003/03/27 19:46:14 mycroft Exp $ */ 3 4/* 5 * Copyright (c) 1997 Causality Limited. 6 * Copyright (c) 1997 Mark Brinicombe. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by Mark Brinicombe 20 * for the NetBSD Project. 21 * 4. The name of the company nor the name of the author may be used to 22 * endorse or promote products derived from this software without specific 23 * prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 26 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 27 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 28 * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 29 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 30 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 * SUCH DAMAGE. 36 */ 37 38#include <arm/asm.h> 39#include <arm/cpuconf.h> 40 41#define DSB .long 0xf57ff040 42#define ISB .long 0xf57ff060 43#define WFI .long 0xe320f003 44 45/* 46 * Generic bus_space functions. 47 */ 48 49/* 50 * read single 51 */ 52 53ENTRY(armv7_bs_r_1) 54 DSB 55 ldrb r0, [r1, r2] 56 mov pc, lr 57 58#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6 + ARM_ARCH_7) > 0 59ENTRY(armv7_bs_r_2) 60 DSB 61 ldrh r0, [r1, r2] 62 mov pc, lr 63#endif 64 65ENTRY(armv7_bs_r_4) 66 DSB 67 ldr r0, [r1, r2] 68 mov pc, lr 69 70/* 71 * write single 72 */ 73 74ENTRY(armv7_bs_w_1) 75 strb r3, [r1, r2] 76 DSB 77 mov pc, lr 78 79ENTRY(armv7_bs_w_2) 80 strh r3, [r1, r2] 81 DSB 82 mov pc, lr 83 84ENTRY(armv7_bs_w_4) 85 str r3, [r1, r2] 86 DSB 87 mov pc, lr 88 89/* 90 * read multiple 91 */ 92 93ENTRY(armv7_bs_rm_1) 94 add r0, r1, r2 95 mov r1, r3 96 ldr r2, [sp, #0] 97 teq r2, #0 98 moveq pc, lr 99 1001: ldrb r3, [r0] 101 strb r3, [r1], #1 102 subs r2, r2, #1 103 bne 1b 104 DSB 105 106 mov pc, lr 107 108ENTRY(armv7_bs_rm_2) 109 add r0, r1, r2 110 mov r1, r3 111 ldr r2, [sp, #0] 112 teq r2, #0 113 moveq pc, lr 114 1151: ldrh r3, [r0] 116 strh r3, [r1], #2 117 subs r2, r2, #1 118 bne 1b 119 DSB 120 121 mov pc, lr 122 123ENTRY(armv7_bs_rm_4) 124 add r0, r1, r2 125 mov r1, r3 126 ldr r2, [sp, #0] 127 teq r2, #0 128 moveq pc, lr 129 1301: ldr r3, [r0] 131 str r3, [r1], #4 132 subs r2, r2, #1 133 bne 1b 134 DSB 135 136 mov pc, lr 137 138/* 139 * write multiple 140 */ 141 142ENTRY(armv7_bs_wm_1) 143 add r0, r1, r2 144 mov r1, r3 145 ldr r2, [sp, #0] 146 teq r2, #0 147 moveq pc, lr 148 1491: ldrb r3, [r1], #1 150 strb r3, [r0] 151 subs r2, r2, #1 152 bne 1b 153 DSB 154 155 mov pc, lr 156 157ENTRY(armv7_bs_wm_2) 158 add r0, r1, r2 159 mov r1, r3 160 ldr r2, [sp, #0] 161 teq r2, #0 162 moveq pc, lr 163 1641: ldrh r3, [r1], #2 165 strh r3, [r0] 166 subs r2, r2, #1 167 bne 1b 168 DSB 169 170 mov pc, lr 171 172ENTRY(armv7_bs_wm_4) 173 add r0, r1, r2 174 mov r1, r3 175 ldr r2, [sp, #0] 176 teq r2, #0 177 moveq pc, lr 178 1791: ldr r3, [r1], #4 180 str r3, [r0] 181 subs r2, r2, #1 182 bne 1b 183 DSB 184 185 mov pc, lr 186 187/* 188 * read region 189 */ 190 191ENTRY(armv7_bs_rr_1) 192 add r0, r1, r2 193 mov r1, r3 194 ldr r2, [sp, #0] 195 teq r2, #0 196 moveq pc, lr 197 1981: ldrb r3, [r0], #1 199 strb r3, [r1], #1 200 subs r2, r2, #1 201 bne 1b 202 DSB 203 204 mov pc, lr 205 206ENTRY(armv7_bs_rr_2) 207 add r0, r1, r2 208 mov r1, r3 209 ldr r2, [sp, #0] 210 teq r2, #0 211 moveq pc, lr 212 2131: ldrh r3, [r0], #2 214 strh r3, [r1], #2 215 subs r2, r2, #1 216 bne 1b 217 DSB 218 219 mov pc, lr 220 221ENTRY(armv7_bs_rr_4) 222 add r0, r1, r2 223 mov r1, r3 224 ldr r2, [sp, #0] 225 teq r2, #0 226 moveq pc, lr 227 2281: ldr r3, [r0], #4 229 str r3, [r1], #4 230 subs r2, r2, #1 231 bne 1b 232 233 mov pc, lr 234 235/* 236 * write region. 237 */ 238 239ENTRY(armv7_bs_wr_1) 240 add r0, r1, r2 241 mov r1, r3 242 ldr r2, [sp, #0] 243 teq r2, #0 244 moveq pc, lr 245 2461: ldrb r3, [r1], #1 247 strb r3, [r0], #1 248 subs r2, r2, #1 249 bne 1b 250 DSB 251 252 mov pc, lr 253 254ENTRY(armv7_bs_wr_2) 255 add r0, r1, r2 256 mov r1, r3 257 ldr r2, [sp, #0] 258 teq r2, #0 259 moveq pc, lr 260 2611: ldrh r3, [r1], #2 262 strh r3, [r0], #2 263 subs r2, r2, #1 264 bne 1b 265 DSB 266 267 mov pc, lr 268 269ENTRY(armv7_bs_wr_4) 270 add r0, r1, r2 271 mov r1, r3 272 ldr r2, [sp, #0] 273 teq r2, #0 274 moveq pc, lr 275 2761: ldr r3, [r1], #4 277 str r3, [r0], #4 278 subs r2, r2, #1 279 bne 1b 280 DSB 281 282 mov pc, lr 283 284/* 285 * set region 286 */ 287 288ENTRY(armv7_bs_sr_1) 289 add r0, r1, r2 290 mov r1, r3 291 ldr r2, [sp, #0] 292 teq r2, #0 293 moveq pc, lr 294 2951: strb r1, [r0], #1 296 subs r2, r2, #1 297 bne 1b 298 DSB 299 300 mov pc, lr 301 302ENTRY(armv7_bs_sr_2) 303 add r0, r1, r2 304 mov r1, r3 305 ldr r2, [sp, #0] 306 teq r2, #0 307 moveq pc, lr 308 3091: strh r1, [r0], #2 310 subs r2, r2, #1 311 bne 1b 312 DSB 313 314 mov pc, lr 315 316ENTRY(armv7_bs_sr_4) 317 add r0, r1, r2 318 mov r1, r3 319 ldr r2, [sp, #0] 320 teq r2, #0 321 moveq pc, lr 322 3231: str r1, [r0], #4 324 subs r2, r2, #1 325 bne 1b 326 DSB 327 328 mov pc, lr 329 330/* 331 * copy region 332 */ 333 334ENTRY(armv7_bs_c_2) 335 add r0, r1, r2 336 ldr r2, [sp, #0] 337 add r1, r2, r3 338 ldr r2, [sp, #4] 339 teq r2, #0 340 moveq pc, lr 341 342 cmp r0, r1 343 blt 2f 344 3451: ldrh r3, [r0], #2 346 strh r3, [r1], #2 347 subs r2, r2, #1 348 bne 1b 349 DSB 350 351 mov pc, lr 352 3532: add r0, r0, r2, lsl #1 354 add r1, r1, r2, lsl #1 355 sub r0, r0, #2 356 sub r1, r1, #2 357 3583: ldrh r3, [r0], #-2 359 strh r3, [r1], #-2 360 subs r2, r2, #1 361 bne 3b 362 DSB 363 364 mov pc, lr 365