root/tools/testing/selftests/powerpc/pmu/ebb/busy_loop.S
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright 2014, Michael Ellerman, IBM Corp.
 */

#include <ppc-asm.h>

        .text

FUNC_START(core_busy_loop)
        stdu    %r1, -168(%r1)
        std     r14, 160(%r1)
        std     r15, 152(%r1)
        std     r16, 144(%r1)
        std     r17, 136(%r1)
        std     r18, 128(%r1)
        std     r19, 120(%r1)
        std     r20, 112(%r1)
        std     r21, 104(%r1)
        std     r22, 96(%r1)
        std     r23, 88(%r1)
        std     r24, 80(%r1)
        std     r25, 72(%r1)
        std     r26, 64(%r1)
        std     r27, 56(%r1)
        std     r28, 48(%r1)
        std     r29, 40(%r1)
        std     r30, 32(%r1)
        std     r31, 24(%r1)

        li       r3, 0x3030
        std      r3, -96(%r1)
        li       r4, 0x4040
        std      r4, -104(%r1)
        li       r5, 0x5050
        std      r5, -112(%r1)
        li       r6, 0x6060
        std      r6, -120(%r1)
        li       r7, 0x7070
        std      r7, -128(%r1)
        li       r8, 0x0808
        std      r8, -136(%r1)
        li       r9, 0x0909
        std      r9, -144(%r1)
        li      r10, 0x1010
        std     r10, -152(%r1)
        li      r11, 0x1111
        std     r11, -160(%r1)
        li      r14, 0x1414
        std     r14, -168(%r1)
        li      r15, 0x1515
        std     r15, -176(%r1)
        li      r16, 0x1616
        std     r16, -184(%r1)
        li      r17, 0x1717
        std     r17, -192(%r1)
        li      r18, 0x1818
        std     r18, -200(%r1)
        li      r19, 0x1919
        std     r19, -208(%r1)
        li      r20, 0x2020
        std     r20, -216(%r1)
        li      r21, 0x2121
        std     r21, -224(%r1)
        li      r22, 0x2222
        std     r22, -232(%r1)
        li      r23, 0x2323
        std     r23, -240(%r1)
        li      r24, 0x2424
        std     r24, -248(%r1)
        li      r25, 0x2525
        std     r25, -256(%r1)
        li      r26, 0x2626
        std     r26, -264(%r1)
        li      r27, 0x2727
        std     r27, -272(%r1)
        li      r28, 0x2828
        std     r28, -280(%r1)
        li      r29, 0x2929
        std     r29, -288(%r1)
        li      r30, 0x3030
        li      r31, 0x3131

        li      r3, 0
0:      addi    r3, r3, 1
        cmpwi   r3, 100
        blt     0b

        /* Return 1 (fail) unless we get through all the checks */
        li      r3, 1

        /* Check none of our registers have been corrupted */
        cmpwi   r4,  0x4040
        bne     1f
        cmpwi   r5,  0x5050
        bne     1f
        cmpwi   r6,  0x6060
        bne     1f
        cmpwi   r7,  0x7070
        bne     1f
        cmpwi   r8,  0x0808
        bne     1f
        cmpwi   r9,  0x0909
        bne     1f
        cmpwi   r10, 0x1010
        bne     1f
        cmpwi   r11, 0x1111
        bne     1f
        cmpwi   r14, 0x1414
        bne     1f
        cmpwi   r15, 0x1515
        bne     1f
        cmpwi   r16, 0x1616
        bne     1f
        cmpwi   r17, 0x1717
        bne     1f
        cmpwi   r18, 0x1818
        bne     1f
        cmpwi   r19, 0x1919
        bne     1f
        cmpwi   r20, 0x2020
        bne     1f
        cmpwi   r21, 0x2121
        bne     1f
        cmpwi   r22, 0x2222
        bne     1f
        cmpwi   r23, 0x2323
        bne     1f
        cmpwi   r24, 0x2424
        bne     1f
        cmpwi   r25, 0x2525
        bne     1f
        cmpwi   r26, 0x2626
        bne     1f
        cmpwi   r27, 0x2727
        bne     1f
        cmpwi   r28, 0x2828
        bne     1f
        cmpwi   r29, 0x2929
        bne     1f
        cmpwi   r30, 0x3030
        bne     1f
        cmpwi   r31, 0x3131
        bne     1f

        /* Load junk into all our registers before we reload them from the stack. */
        li      r3,  0xde
        li      r4,  0xad
        li      r5,  0xbe
        li      r6,  0xef
        li      r7,  0xde
        li      r8,  0xad
        li      r9,  0xbe
        li      r10, 0xef
        li      r11, 0xde
        li      r14, 0xad
        li      r15, 0xbe
        li      r16, 0xef
        li      r17, 0xde
        li      r18, 0xad
        li      r19, 0xbe
        li      r20, 0xef
        li      r21, 0xde
        li      r22, 0xad
        li      r23, 0xbe
        li      r24, 0xef
        li      r25, 0xde
        li      r26, 0xad
        li      r27, 0xbe
        li      r28, 0xef
        li      r29, 0xdd

        ld      r3,     -96(%r1)
        cmpwi   r3,  0x3030
        bne     1f
        ld      r4,     -104(%r1)
        cmpwi   r4,  0x4040
        bne     1f
        ld      r5,     -112(%r1)
        cmpwi   r5,  0x5050
        bne     1f
        ld      r6,     -120(%r1)
        cmpwi   r6,  0x6060
        bne     1f
        ld      r7,     -128(%r1)
        cmpwi   r7,  0x7070
        bne     1f
        ld      r8,     -136(%r1)
        cmpwi   r8,  0x0808
        bne     1f
        ld      r9,     -144(%r1)
        cmpwi   r9,  0x0909
        bne     1f
        ld      r10, -152(%r1)
        cmpwi   r10, 0x1010
        bne     1f
        ld      r11, -160(%r1)
        cmpwi   r11, 0x1111
        bne     1f
        ld      r14, -168(%r1)
        cmpwi   r14, 0x1414
        bne     1f
        ld      r15, -176(%r1)
        cmpwi   r15, 0x1515
        bne     1f
        ld      r16, -184(%r1)
        cmpwi   r16, 0x1616
        bne     1f
        ld      r17, -192(%r1)
        cmpwi   r17, 0x1717
        bne     1f
        ld      r18, -200(%r1)
        cmpwi   r18, 0x1818
        bne     1f
        ld      r19, -208(%r1)
        cmpwi   r19, 0x1919
        bne     1f
        ld      r20, -216(%r1)
        cmpwi   r20, 0x2020
        bne     1f
        ld      r21, -224(%r1)
        cmpwi   r21, 0x2121
        bne     1f
        ld      r22, -232(%r1)
        cmpwi   r22, 0x2222
        bne     1f
        ld      r23, -240(%r1)
        cmpwi   r23, 0x2323
        bne     1f
        ld      r24, -248(%r1)
        cmpwi   r24, 0x2424
        bne     1f
        ld      r25, -256(%r1)
        cmpwi   r25, 0x2525
        bne     1f
        ld      r26, -264(%r1)
        cmpwi   r26, 0x2626
        bne     1f
        ld      r27, -272(%r1)
        cmpwi   r27, 0x2727
        bne     1f
        ld      r28, -280(%r1)
        cmpwi   r28, 0x2828
        bne     1f
        ld      r29, -288(%r1)
        cmpwi   r29, 0x2929
        bne     1f

        /* Load 0 (success) to return */
        li      r3, 0

1:      ld      r14, 160(%r1)
        ld      r15, 152(%r1)
        ld      r16, 144(%r1)
        ld      r17, 136(%r1)
        ld      r18, 128(%r1)
        ld      r19, 120(%r1)
        ld      r20, 112(%r1)
        ld      r21, 104(%r1)
        ld      r22, 96(%r1)
        ld      r23, 88(%r1)
        ld      r24, 80(%r1)
        ld      r25, 72(%r1)
        ld      r26, 64(%r1)
        ld      r27, 56(%r1)
        ld      r28, 48(%r1)
        ld      r29, 40(%r1)
        ld      r30, 32(%r1)
        ld      r31, 24(%r1)
        addi    %r1, %r1, 168
        blr