| // SPDX-License-Identifier: GPL-2.0-only |
| // Copyright (C) 2021 ARM Limited. |
| |
| #include "sme-inst.h" |
| |
| .arch_extension sve |
| |
| #define MAGIC 42 |
| |
| #define MAXVL 2048 |
| #define MAXVL_B (MAXVL / 8) |
| |
| .pushsection .text |
| .data |
| .align 4 |
| scratch: |
| .space MAXVL_B |
| .popsection |
| |
| .globl fork_test |
| fork_test: |
| smstart_za |
| |
| // For simplicity just set one word in one vector, other tests |
| // cover general data corruption issues. |
| ldr x0, =scratch |
| mov x1, #MAGIC |
| str x1, [x0] |
| mov w12, wzr |
| _ldr_za 12, 0 // ZA.H[W12] loaded from [X0] |
| |
| // Tail call into the C portion that does the fork & verify |
| b fork_test_c |
| |
| .globl verify_fork |
| verify_fork: |
| // SVCR should have ZA=1, SM=0 |
| mrs x0, S3_3_C4_C2_2 |
| and x1, x0, #3 |
| cmp x1, #2 |
| beq 1f |
| mov x0, xzr |
| b 100f |
| 1: |
| |
| // ZA should still have the value we loaded |
| ldr x0, =scratch |
| mov w12, wzr |
| _str_za 12, 0 // ZA.H[W12] stored to [X0] |
| ldr x1, [x0] |
| cmp x1, #MAGIC |
| beq 2f |
| mov x0, xzr |
| b 100f |
| |
| 2: |
| // All tests passed |
| mov x0, #1 |
| 100: |
| ret |
| |