1 /*	$NetBSD: linux_machdep.h,v 1.3 2021/11/30 01:52:06 ryo Exp $	*/
2 
3 /*-
4  * Copyright (c) 2021 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #ifndef _AARCH64_LINUX_MACHDEP_H
30 #define _AARCH64_LINUX_MACHDEP_H
31 
32 #include <aarch64/reg.h>
33 #include <compat/linux/common/linux_types.h>
34 #include <compat/linux/common/linux_signal.h>
35 #include <compat/linux/common/linux_siginfo.h>
36 
37 /* from $LINUXSRC/arch/arm64/include/uapi/asm/sigcontext.h */
38 struct linux_aarch64_ctx {
39 	uint32_t magic;
40 	uint32_t size;
41 };
42 
43 #define FPSIMD_MAGIC	0x46508001
44 struct fpsimd_context {
45 	struct linux_aarch64_ctx head;
46 	uint32_t fpsr;
47 	uint32_t fpcr;
48 	union fpelem vregs[32];
49 };
50 
51 /* from $LINUXSRC/arch/arm64/include/uapi/asm/sigcontext.h */
52 struct linux_sigcontext {
53 	uint64_t fault_address;
54 	uint64_t regs[31];
55 	uint64_t sp;
56 	uint64_t pc;
57 	uint64_t pstate;
58 	uint8_t __reserved[4096] __attribute__((__aligned__(16)));
59 };
60 
61 /* from $LINUXSRC/arch/arm64/include/uapi/asm/ucontext.h */
62 struct linux_ucontext {
63 	unsigned long luc_flags;
64 	struct linux_ucontext *luc_link;
65 	linux_stack_t luc_stack;
66 	linux_sigset_t luc_sigmask;
67 	uint8_t __reserved[1024 / 8 - sizeof(linux_sigset_t)];
68 	struct linux_sigcontext luc_mcontext;
69 };
70 
71 /* from $LINUXSRC/arch/arm64/kernel/signal.c */
72 struct linux_rt_sigframe {
73 	struct linux_siginfo info;
74 	struct linux_ucontext uc;
75 };
76 
77 /*
78  * Not required for COMPAT_LINUX,
79  * but required for COMPAT_LINUX32.
80  */
81 struct linux_sys_open_args {
82 	syscallarg(const char *) path;
83 	syscallarg(int) flags;
84 	syscallarg(linux_umode_t) mode;
85 };
86 int linux_sys_open(struct lwp *, const struct linux_sys_open_args *, register_t *);
87 
88 struct linux_sys_eventfd_args {
89 	syscallarg(unsigned int) initval;
90 };
91 int linux_sys_eventfd(struct lwp *, const struct linux_sys_eventfd_args *, register_t *);
92 
93 struct linux_sys_llseek_args {
94 	syscallarg(int) fd;
95 	syscallarg(u_int32_t) ohigh;
96 	syscallarg(u_int32_t) olow;
97 	syscallarg(void *) res;
98 	syscallarg(int) whence;
99 };
100 int linux_sys_llseek(struct lwp *, const struct linux_sys_llseek_args *, register_t *);
101 
102 struct linux_sys_unlink_args {
103 	syscallarg(const char *) path;
104 };
105 int linux_sys_unlink(struct lwp *, const struct linux_sys_unlink_args *, register_t *);
106 
107 struct linux_sys_mknod_args {
108 	syscallarg(const char *) path;
109 	syscallarg(linux_umode_t) mode;
110 	syscallarg(unsigned) dev;
111 };
112 int linux_sys_mknod(struct lwp *, const struct linux_sys_mknod_args *, register_t *);
113 
114 struct linux_sys_alarm_args {
115 	syscallarg(unsigned int) secs;
116 };
117 int linux_sys_alarm(struct lwp *, const struct linux_sys_alarm_args *, register_t *);
118 
119 int linux_sys_pause(struct lwp *, const void *, register_t *);
120 
121 #ifdef _KERNEL
122 __BEGIN_DECLS
123 void linux_syscall_intern(struct proc *);
124 __END_DECLS
125 #endif /* !_KERNEL */
126 
127 #if BYTE_ORDER != BIG_ENDIAN
128 #define LINUX_UNAME_ARCH	"aarch64"
129 #else
130 #define LINUX_UNAME_ARCH	"aarch64_be"
131 #endif
132 #define LINUX_LARGEFILE64
133 
134 #endif /* !_AARCH64_LINUX_MACHDEP_H */
135