429b6939f06b130e9cbccd62314f1582263c7179
[fw/openocd] / contrib / loaders / erase_check / armv7m_erase_check.s
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2
3 /***************************************************************************
4  *   Copyright (C) 2010 by Spencer Oliver                                  *
5  *   spen@spen-soft.co.uk                                                  *
6  ***************************************************************************/
7
8 /*
9         parameters:
10         r0 - pointer to struct { uint32_t size_in_result_out, uint32_t addr }
11         r1 - value to check
12 */
13
14         .text
15         .syntax unified
16         .cpu cortex-m0
17         .thumb
18         .thumb_func
19
20         .align  2
21
22 BLOCK_SIZE_RESULT       = 0
23 BLOCK_ADDRESS           = 4
24 SIZEOF_STRUCT_BLOCK     = 8
25
26 start:
27 block_loop:
28         ldr     r2, [r0, #BLOCK_SIZE_RESULT]    /* get size */
29         tst     r2, r2
30         beq     done
31
32         ldr     r3, [r0, #BLOCK_ADDRESS]        /* get address */
33
34 word_loop:
35         ldr     r4, [r3]        /* read word */
36         adds    r3, #4
37
38         cmp     r4, r1
39         bne     not_erased
40
41         subs    r2, #1
42         bne     word_loop
43
44         movs    r4, #1          /* block is erased */
45 save_result:
46         str     r4, [r0, #BLOCK_SIZE_RESULT]
47         adds    r0, #SIZEOF_STRUCT_BLOCK
48         b       block_loop
49
50 not_erased:
51         movs    r4, #0
52         b       save_result
53
54 /* Avoid padding at .text segment end. Otherwise exit point check fails. */
55         .skip   ( . - start + 2) & 2, 0
56
57 done:
58         bkpt    #0
59
60         .end