_setjmp.S revision 1.5 1 1.5 skrll /* $NetBSD: _setjmp.S,v 1.5 2021/10/07 06:44:18 skrll Exp $ */
2 1.1 matt
3 1.1 matt /*-
4 1.1 matt * Copyright (c) 2014 The NetBSD Foundation, Inc.
5 1.1 matt * All rights reserved.
6 1.1 matt *
7 1.1 matt * This code is derived from software contributed to The NetBSD Foundation
8 1.1 matt * by Matt Thomas of 3am Software Foundry.
9 1.1 matt *
10 1.1 matt * Redistribution and use in source and binary forms, with or without
11 1.1 matt * modification, are permitted provided that the following conditions
12 1.1 matt * are met:
13 1.1 matt * 1. Redistributions of source code must retain the above copyright
14 1.1 matt * notice, this list of conditions and the following disclaimer.
15 1.1 matt * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 matt * notice, this list of conditions and the following disclaimer in the
17 1.1 matt * documentation and/or other materials provided with the distribution.
18 1.1 matt *
19 1.1 matt * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 matt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 matt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 matt * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 matt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 matt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 matt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 matt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 matt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 matt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 matt * POSSIBILITY OF SUCH DAMAGE.
30 1.1 matt */
31 1.1 matt
32 1.1 matt #include <machine/asm.h>
33 1.1 matt #include "assym.h"
34 1.1 matt
35 1.1 matt /*
36 1.1 matt * C library -- _setjmp, _longjmp
37 1.1 matt *
38 1.1 matt * _longjmp(a, v)
39 1.1 matt * will generate a "return v;" from the last call to
40 1.1 matt * _setjmp(a)
41 1.1 matt * by restoring registers from the stack.
42 1.1 matt * The previous signal state is NOT restored.
43 1.1 matt *
44 1.1 matt * Note: x0 is the return value
45 1.1 matt */
46 1.1 matt .section .rodata.cst8,"aM",@progbits,8
47 1.1 matt .align 3
48 1.1 matt .L_MAGIC:
49 1.1 matt .xword _JB_MAGIC_AARCH64__SETJMP
50 1.1 matt
51 1.1 matt ENTRY(_setjmp)
52 1.1 matt adrp x7, .L_MAGIC
53 1.1 matt ldr x7, [x7, #:lo12:.L_MAGIC]
54 1.1 matt
55 1.1 matt mov x3, sp
56 1.1 matt
57 1.1 matt stp x7, x3, [x0, #_JB_MAGIC]
58 1.1 matt
59 1.1 matt stp x19, x20, [x0, #_JB_X19]
60 1.1 matt stp x21, x22, [x0, #_JB_X21]
61 1.1 matt stp x23, x24, [x0, #_JB_X23]
62 1.1 matt stp x25, x26, [x0, #_JB_X25]
63 1.1 matt stp x27, x28, [x0, #_JB_X27]
64 1.1 matt stp x29, x30, [x0, #_JB_X29]
65 1.1 matt
66 1.1 matt stp d8, d9, [x0, #_JB_D8]
67 1.1 matt stp d10, d11, [x0, #_JB_D10]
68 1.1 matt stp d12, d13, [x0, #_JB_D12]
69 1.1 matt stp d14, d15, [x0, #_JB_D14]
70 1.1 matt
71 1.2 ryo mov x0, xzr
72 1.2 ryo ret
73 1.1 matt END(_setjmp)
74 1.1 matt
75 1.1 matt ENTRY(_longjmp)
76 1.1 matt adrp x7, .L_MAGIC
77 1.1 matt ldr x7, [x7, #:lo12:.L_MAGIC]
78 1.1 matt
79 1.1 matt ldp x2, x3, [x0, #_JB_MAGIC]
80 1.1 matt ldp x4, x5, [x0, #_JB_X29]
81 1.1 matt
82 1.1 matt cbz x3, .Lbotch
83 1.1 matt cbz x5, .Lbotch
84 1.1 matt cmp x2, x7
85 1.1 matt b.ne .Lbotch
86 1.1 matt
87 1.1 matt ldp x19, x20, [x0, #_JB_X19]
88 1.1 matt ldp x21, x22, [x0, #_JB_X21]
89 1.1 matt ldp x23, x24, [x0, #_JB_X23]
90 1.1 matt ldp x25, x26, [x0, #_JB_X25]
91 1.1 matt ldp x27, x28, [x0, #_JB_X27]
92 1.1 matt
93 1.1 matt ldp d8, d9, [x0, #_JB_D8]
94 1.1 matt ldp d10, d11, [x0, #_JB_D10]
95 1.1 matt ldp d12, d13, [x0, #_JB_D12]
96 1.1 matt ldp d14, d15, [x0, #_JB_D14]
97 1.1 matt
98 1.1 matt mov sp, x3
99 1.1 matt mov x29, x4
100 1.1 matt mov x30, x5
101 1.1 matt
102 1.5 skrll cmp x1, #0
103 1.5 skrll csinc x0, x1, xzr, ne
104 1.2 ryo ret
105 1.1 matt
106 1.1 matt /* validation failed, die die die. */
107 1.1 matt .Lbotch:
108 1.1 matt bl _C_LABEL(longjmperror)
109 1.1 matt bl _C_LABEL(abort)
110 1.1 matt 1: b 1b /* Cannot get here */
111 1.1 matt END(_longjmp)
112