1 ;------------------------------------------------------------------------------
3 ; Copyright (c) 2009-2013, ARM Ltd. All rights reserved.
4 ; SPDX-License-Identifier: BSD-2-Clause-Patent
6 ;------------------------------------------------------------------------------
9 EXPORT InternalLongJump
10 AREA BaseLib_LowLevel, CODE, READONLY
13 REG_PAIR (x19, x20, #0); \
14 REG_PAIR (x21, x22, #16); \
15 REG_PAIR (x23, x24, #32); \
16 REG_PAIR (x25, x26, #48); \
17 REG_PAIR (x27, x28, #64); \
18 REG_PAIR (x29, x30, #80);/*FP, LR*/ \
19 REG_ONE (x16, #96) /*IP0*/
22 REG_PAIR ( d8, d9, #112); \
23 REG_PAIR (d10, d11, #128); \
24 REG_PAIR (d12, d13, #144); \
25 REG_PAIR (d14, d15, #160);
28 ; Saves the current CPU context that can be restored with a call to LongJump() and returns 0.#
30 ; Saves the current CPU context in the buffer specified by JumpBuffer and returns 0. The initial
31 ; call to SetJump() must always return 0. Subsequent calls to LongJump() cause a non-zero
32 ; value to be returned by SetJump().
34 ; If JumpBuffer is NULL, then ASSERT().
35 ; For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().
37 ; @param JumpBuffer A pointer to CPU context buffer.
44 ; IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer // X0
48 mov x16, sp // use IP0 so save SP
49 #define REG_PAIR(REG1, REG2, OFFS) stp REG1, REG2, [x0, OFFS]
50 #define REG_ONE(REG1, OFFS) str REG1, [x0, OFFS]
59 ; Restores the CPU context that was saved with SetJump().#
61 ; Restores the CPU context from the buffer specified by JumpBuffer.
62 ; This function never returns to the caller.
63 ; Instead is resumes execution based on the state of JumpBuffer.
65 ; @param JumpBuffer A pointer to CPU context buffer.
66 ; @param Value The value to return when the SetJump() context is restored.
72 ; IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer, // X0
73 ; IN UINTN Value // X1
77 #define REG_PAIR(REG1, REG2, OFFS) ldp REG1, REG2, [x0, OFFS]
78 #define REG_ONE(REG1, OFFS) ldr REG1, [x0, OFFS]
89 // use br not ret, as ret is guaranteed to mispredict
92 ASM_FUNCTION_REMOVE_IF_UNREFERENCED