1/* 2 * Copyright (c) 2023-2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "runtime/fibers/arch/asm_macros.h" 17#include "runtime/fibers/arch/arm/context_layout.h" 18 19#define GPR_O(reg) FCTX_GPR_OFFSET_BYTES_ ## reg 20#define FP_O(reg) FCTX_FP_OFFSET_BYTES_ ## reg 21#include "runtime/fibers/arch/arm/helpers.S" 22 23/** 24 * arguments: 25 * r0: uint8_t* ctx_memory_from 26 * r1: uint8_t* ctx_memory_to 27 */ 28FUNCTION_START(SwitchContext) 29 /*** save current context ***/ 30 STORE_CONTEXT tmp_regid=3 31 /*** restore next context ***/ 32 /* restore GPR */ 33 // gpr (incl. fp): assuming that R4..R15 reside in a contiguous block 34 add r3, r1, # GPR_O(R4) 35 ldm r3, {r4-r12} 36 ldr sp, [r1, # GPR_O(SP)] 37 ldr lr, [r1, # GPR_O(LR)] 38 // arg register 39 ldr r0, [r1, # GPR_O(R0)] 40 41#ifndef PANDA_TARGET_ARM32_ABI_SOFT 42 /* restore FP */ 43 // regs: assuming that D8..D15 reside in a contiguous block 44 add r3, r1, # FP_O(D8) 45 vldm r3, {d8-d15} 46 // control/status 47 ldr r3, [r1, # FP_O(FPSCR)] // Get saved FPSCR value 48 fmxr fpscr, r3 // and restore it 49#endif 50 51 /* branch to the restored PC */ 52 ldr r3, [r1, # GPR_O(PC)] 53 bx r3 54FUNCTION_END(SwitchContext) 55 56#undef GPR_O 57#undef FP_O 58 59// we don't need executable stack. 60.section .note.GNU-stack,"",%progbits