blob: bbfe1df434b097c7790bc2dafc954efc159895e4 [file] [log] [blame]
Jeenu Viswambharan2de81532018-02-16 11:54:24 +00001/*
2 * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Antonio Nino Diaz5eb88372018-11-08 10:20:19 +00007#ifndef SETJMP_H
8#define SETJMP_H
Jeenu Viswambharan2de81532018-02-16 11:54:24 +00009
10#define JMP_CTX_X19 0x0
11#define JMP_CTX_X21 0x10
12#define JMP_CTX_X23 0x20
13#define JMP_CTX_X25 0x30
14#define JMP_CTX_X27 0x40
15#define JMP_CTX_X29 0x50
16#define JMP_CTX_SP 0x60
17#define JMP_CTX_END 0x70
18
19#define JMP_SIZE (JMP_CTX_END >> 3)
20
21#ifndef __ASSEMBLY__
22
23#include <stdint.h>
24
25/* Jump buffer hosting x18 - x30 and sp_el0 registers */
26struct jmpbuf {
27 uint64_t buf[JMP_SIZE];
28} __aligned(16);
29
30
31/*
32 * Set a jump point, and populate the jump buffer with context information so
33 * that longjmp() can jump later. The caller must adhere to the following
34 * conditions:
35 *
36 * - After calling this function, the stack must not be shrunk. The contents of
37 * the stack must not be changed either.
38 *
39 * - If the caller were to 'return', the buffer must be considered invalid, and
40 * must not be used with longjmp().
41 *
42 * The caller will observe this function returning at two distinct
43 * circumstances, each with different return values:
44 *
45 * - Zero, when the buffer is setup;
46 *
47 * - Non-zero, when a call to longjmp() is made (presumably by one of the
48 * callee functions) with the same jump buffer.
49 */
50int setjmp(struct jmpbuf *buf);
51
52/*
53 * Reset execution to a jump point, and restore context information according to
54 * the jump buffer populated by setjmp().
55 */
56void longjmp(struct jmpbuf *buf);
57
58#endif /* __ASSEMBLY__ */
Antonio Nino Diaz5eb88372018-11-08 10:20:19 +000059#endif /* SETJMP_H */