| /* |
| * Copyright (c) 2022, Arm Limited. All rights reserved. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| * |
| */ |
| |
| #include "test_interrupt.h" |
| |
| #if defined(TEST_NS_FPU) || defined(TEST_S_FPU) |
| __attribute__((naked)) void TFM_FPU_S_TEST_Handler(void) |
| { |
| __asm volatile( |
| "mov r0, #0x000000E0 \n" |
| "vmov s0, r0 \n" |
| "mov r0, #0x000000E1 \n" |
| "vmov s1, r0 \n" |
| "mov r0, #0x000000E2 \n" |
| "vmov s2, r0 \n" |
| "mov r0, #0x000000E3 \n" |
| "vmov s3, r0 \n" |
| "mov r0, #0x000000E4 \n" |
| "vmov s4, r0 \n" |
| "mov r0, #0x000000E5 \n" |
| "vmov s5, r0 \n" |
| "mov r0, #0x000000E6 \n" |
| "vmov s6, r0 \n" |
| "mov r0, #0x000000E7 \n" |
| "vmov s7, r0 \n" |
| "mov r0, #0x000000E8 \n" |
| "vmov s8, r0 \n" |
| "mov r0, #0x000000E9 \n" |
| "vmov s9, r0 \n" |
| "mov r0, #0x000000EA \n" |
| "vmov s10, r0 \n" |
| "mov r0, #0x000000EB \n" |
| "vmov s11, r0 \n" |
| "mov r0, #0x000000EC \n" |
| "vmov s12, r0 \n" |
| "mov r0, #0x000000ED \n" |
| "vmov s13, r0 \n" |
| "mov r0, #0x000000EE \n" |
| "vmov s14, r0 \n" |
| "mov r0, #0x000000EF \n" |
| "vmov s15, r0 \n" |
| "mov r0, #0x000000F0 \n" |
| "vmov s16, r0 \n" |
| "mov r0, #0x000000F1 \n" |
| "vmov s17, r0 \n" |
| "mov r0, #0x000000F2 \n" |
| "vmov s18, r0 \n" |
| "mov r0, #0x000000F3 \n" |
| "vmov s19, r0 \n" |
| "mov r0, #0x000000F4 \n" |
| "vmov s20, r0 \n" |
| "mov r0, #0x000000F5 \n" |
| "vmov s21, r0 \n" |
| "mov r0, #0x000000F6 \n" |
| "vmov s22, r0 \n" |
| "mov r0, #0x000000F7 \n" |
| "vmov s23, r0 \n" |
| "mov r0, #0x000000F8 \n" |
| "vmov s24, r0 \n" |
| "mov r0, #0x000000F9 \n" |
| "vmov s25, r0 \n" |
| "mov r0, #0x000000FA \n" |
| "vmov s26, r0 \n" |
| "mov r0, #0x000000FB \n" |
| "vmov s27, r0 \n" |
| "mov r0, #0x000000FC \n" |
| "vmov s28, r0 \n" |
| "mov r0, #0x000000FD \n" |
| "vmov s29, r0 \n" |
| "mov r0, #0x000000FE \n" |
| "vmov s30, r0 \n" |
| "mov r0, #0x000000FF \n" |
| "vmov s31, r0 \n" |
| "bx lr \n" |
| ); |
| } |
| #endif |
| |
| #ifdef TEST_NS_FPU |
| __attribute__((used)) static uint32_t is_non_zero(uint32_t *p, uint32_t n) |
| { |
| |
| while(n && p[n - 1] == 0) { |
| n--; |
| } |
| return n; |
| } |
| |
| __attribute__((naked)) void TFM_FPU_NS_TEST_Handler(void) |
| { |
| __asm volatile( |
| /* |
| * If LR.BIT[6] equals 1, the interrupt is triggerred by secure thread. |
| */ |
| "ands r0, lr, #0x40 \n" |
| "cmp r0, 0x40 \n" |
| "bne change_regs \n" |
| "push {r7, lr} \n" |
| "vpush {s0-s15} \n" |
| "vpush {s16-s31} \n" |
| "mov r0, sp \n" |
| "mov r1, #32 \n" |
| "bl is_non_zero \n" |
| "vpop {s16-s31} \n" |
| "vpop {s0-s15} \n" |
| "pop {r7, lr} \n" |
| "cmp r0, #0 \n" |
| "bne panic \n" |
| "change_regs: \n" |
| "mov r0, #0x000000E0 \n" |
| "vmov s0, r0 \n" |
| "mov r0, #0x000000E1 \n" |
| "vmov s1, r0 \n" |
| "mov r0, #0x000000E2 \n" |
| "vmov s2, r0 \n" |
| "mov r0, #0x000000E3 \n" |
| "vmov s3, r0 \n" |
| "mov r0, #0x000000E4 \n" |
| "vmov s4, r0 \n" |
| "mov r0, #0x000000E5 \n" |
| "vmov s5, r0 \n" |
| "mov r0, #0x000000E6 \n" |
| "vmov s6, r0 \n" |
| "mov r0, #0x000000E7 \n" |
| "vmov s7, r0 \n" |
| "mov r0, #0x000000E8 \n" |
| "vmov s8, r0 \n" |
| "mov r0, #0x000000E9 \n" |
| "vmov s9, r0 \n" |
| "mov r0, #0x000000EA \n" |
| "vmov s10, r0 \n" |
| "mov r0, #0x000000EB \n" |
| "vmov s11, r0 \n" |
| "mov r0, #0x000000EC \n" |
| "vmov s12, r0 \n" |
| "mov r0, #0x000000ED \n" |
| "vmov s13, r0 \n" |
| "mov r0, #0x000000EE \n" |
| "vmov s14, r0 \n" |
| "mov r0, #0x000000EF \n" |
| "vmov s15, r0 \n" |
| "mov r0, #0x000000F0 \n" |
| "vmov s16, r0 \n" |
| "mov r0, #0x000000F1 \n" |
| "vmov s17, r0 \n" |
| "mov r0, #0x000000F2 \n" |
| "vmov s18, r0 \n" |
| "mov r0, #0x000000F3 \n" |
| "vmov s19, r0 \n" |
| "mov r0, #0x000000F4 \n" |
| "vmov s20, r0 \n" |
| "mov r0, #0x000000F5 \n" |
| "vmov s21, r0 \n" |
| "mov r0, #0x000000F6 \n" |
| "vmov s22, r0 \n" |
| "mov r0, #0x000000F7 \n" |
| "vmov s23, r0 \n" |
| "mov r0, #0x000000F8 \n" |
| "vmov s24, r0 \n" |
| "mov r0, #0x000000F9 \n" |
| "vmov s25, r0 \n" |
| "mov r0, #0x000000FA \n" |
| "vmov s26, r0 \n" |
| "mov r0, #0x000000FB \n" |
| "vmov s27, r0 \n" |
| "mov r0, #0x000000FC \n" |
| "vmov s28, r0 \n" |
| "mov r0, #0x000000FD \n" |
| "vmov s29, r0 \n" |
| "mov r0, #0x000000FE \n" |
| "vmov s30, r0 \n" |
| "mov r0, #0x000000FF \n" |
| "vmov s31, r0 \n" |
| "bx lr \n" |
| "panic: \n" |
| "b . \n" |
| ); |
| } |
| #endif |