netbsd32_compat_12.c revision 1.34 1 /* $NetBSD: netbsd32_compat_12.c,v 1.34 2019/01/27 02:08:40 pgoyette Exp $ */
2
3 /*
4 * Copyright (c) 1998, 2001 Matthew R. Green
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 AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29 #include <sys/cdefs.h>
30 __KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_12.c,v 1.34 2019/01/27 02:08:40 pgoyette Exp $");
31
32 #if defined(_KERNEL_OPT)
33 #include "opt_compat_netbsd.h"
34 #endif
35
36 #include <sys/param.h>
37 #include <sys/systm.h>
38 #include <sys/module.h>
39 #include <sys/filedesc.h>
40 #include <sys/mount.h>
41 #include <sys/mman.h>
42 #include <sys/namei.h>
43 #include <sys/proc.h>
44 #include <sys/stat.h>
45 #include <sys/swap.h>
46 #include <sys/vfs_syscalls.h>
47
48 #include <sys/syscallargs.h>
49 #include <sys/syscallvar.h>
50
51 #include <compat/sys/stat.h>
52
53 #include <compat/netbsd32/netbsd32.h>
54 #include <compat/netbsd32/netbsd32_syscall.h>
55 #include <compat/netbsd32/netbsd32_syscallargs.h>
56
57 static void netbsd32_stat12_to_netbsd32(struct stat12 *,
58 struct netbsd32_stat12 *);
59
60 /* for use with {,fl}stat() */
61 static void
62 netbsd32_stat12_to_netbsd32(struct stat12 *sp12, struct netbsd32_stat12 *sp32)
63 {
64
65 sp32->st_dev = sp12->st_dev;
66 sp32->st_ino = sp12->st_ino;
67 sp32->st_mode = sp12->st_mode;
68 sp32->st_nlink = sp12->st_nlink;
69 sp32->st_uid = sp12->st_uid;
70 sp32->st_gid = sp12->st_gid;
71 sp32->st_rdev = sp12->st_rdev;
72 if (sp12->st_size < (quad_t)1 << 32)
73 sp32->st_size = sp12->st_size;
74 else
75 sp32->st_size = -2;
76 sp32->st_atimespec.tv_sec = sp12->st_atimespec.tv_sec;
77 sp32->st_atimespec.tv_nsec = sp12->st_atimespec.tv_nsec;
78 sp32->st_mtimespec.tv_sec = sp12->st_mtimespec.tv_sec;
79 sp32->st_mtimespec.tv_nsec = sp12->st_mtimespec.tv_nsec;
80 sp32->st_ctimespec.tv_sec = sp12->st_ctimespec.tv_sec;
81 sp32->st_ctimespec.tv_nsec = sp12->st_ctimespec.tv_nsec;
82 sp32->st_blocks = sp12->st_blocks;
83 sp32->st_blksize = sp12->st_blksize;
84 sp32->st_flags = sp12->st_flags;
85 sp32->st_gen = sp12->st_gen;
86 }
87
88 int
89 compat_12_netbsd32_reboot(struct lwp *l, const struct compat_12_netbsd32_reboot_args *uap, register_t *retval)
90 {
91 /* {
92 syscallarg(int) opt;
93 } */
94 struct compat_12_sys_reboot_args ua;
95
96 NETBSD32TO64_UAP(opt);
97 return (compat_12_sys_reboot(l, &ua, retval));
98 }
99
100 int
101 compat_12_netbsd32_msync(struct lwp *l, const struct compat_12_netbsd32_msync_args *uap, register_t *retval)
102 {
103 /* {
104 syscallarg(netbsd32_voidp) addr;
105 syscallarg(netbsd32_size_t) len;
106 } */
107 struct sys___msync13_args ua;
108
109 NETBSD32TOP_UAP(addr, void *);
110 NETBSD32TOX_UAP(len, size_t);
111 SCARG(&ua, flags) = MS_SYNC | MS_INVALIDATE;
112 return (sys___msync13(l, &ua, retval));
113 }
114
115 int
116 compat_12_netbsd32_oswapon(struct lwp *l, const struct compat_12_netbsd32_oswapon_args *uap, register_t *retval)
117 {
118 /* {
119 syscallarg(const netbsd32_charp) name;
120 } */
121 struct sys_swapctl_args ua;
122
123 SCARG(&ua, cmd) = SWAP_ON;
124 SCARG(&ua, arg) = SCARG_P32(uap, name);
125 SCARG(&ua, misc) = 0; /* priority */
126 return (sys_swapctl(l, &ua, retval));
127 }
128
129 int
130 compat_12_netbsd32_stat12(struct lwp *l, const struct compat_12_netbsd32_stat12_args *uap, register_t *retval)
131 {
132 /* {
133 syscallarg(const netbsd32_charp) path;
134 syscallarg(netbsd32_stat12p_t) ub;
135 } */
136 struct netbsd32_stat12 sb32;
137 struct stat12 sb12;
138 struct stat sb;
139 int error;
140
141 error = do_sys_stat(SCARG_P32(uap, path), FOLLOW, &sb);
142 if (error)
143 return (error);
144
145 compat_12_stat_conv(&sb, &sb12);
146 netbsd32_stat12_to_netbsd32(&sb12, &sb32);
147
148 return (copyout(&sb32, SCARG_P32(uap, ub), sizeof sb32));
149 }
150
151 int
152 compat_12_netbsd32_fstat12(struct lwp *l, const struct compat_12_netbsd32_fstat12_args *uap, register_t *retval)
153 {
154 /* {
155 syscallarg(int) fd;
156 syscallarg(netbsd32_stat12p_t) sb;
157 } */
158 struct netbsd32_stat12 sb32;
159 struct stat12 sb12;
160 struct stat sb;
161 int error;
162
163 error = do_sys_fstat(SCARG(uap, fd), &sb);
164 if (error)
165 return (error);
166
167 compat_12_stat_conv(&sb, &sb12);
168 netbsd32_stat12_to_netbsd32(&sb12, &sb32);
169
170 return (copyout(&sb32, SCARG_P32(uap, sb), sizeof sb32));
171 }
172
173 int
174 compat_12_netbsd32_lstat12(struct lwp *l, const struct compat_12_netbsd32_lstat12_args *uap, register_t *retval)
175 {
176 /* {
177 syscallarg(const netbsd32_charp) path;
178 syscallarg(netbsd32_stat12p_t) ub;
179 } */
180 struct netbsd32_stat12 sb32;
181 struct stat12 sb12;
182 struct stat sb;
183 int error;
184
185 error = do_sys_stat(SCARG_P32(uap, path), NOFOLLOW, &sb);
186 if (error)
187 return (error);
188
189 compat_12_stat_conv(&sb, &sb12);
190 netbsd32_stat12_to_netbsd32(&sb12, &sb32);
191
192 return (copyout(&sb32, SCARG_P32(uap, ub), sizeof sb32));
193 }
194
195 int
196 compat_12_netbsd32_getdirentries(struct lwp *l, const struct compat_12_netbsd32_getdirentries_args *uap, register_t *retval)
197 {
198 /* {
199 syscallarg(int) fd;
200 syscallarg(netbsd32_charp) buf;
201 syscallarg(u_int) count;
202 syscallarg(netbsd32_longp) basep;
203 } */
204 struct compat_12_sys_getdirentries_args ua;
205
206 NETBSD32TO64_UAP(fd);
207 NETBSD32TOP_UAP(buf, char);
208 NETBSD32TO64_UAP(count);
209 NETBSD32TOP_UAP(basep, long);
210
211 return (compat_12_sys_getdirentries(l, &ua, retval));
212 }
213
214 static struct syscall_package compat_netbsd32_12_syscalls[] = {
215 { NETBSD32_SYS_compat_12_netbsd32_reboot, 0,
216 (sy_call_t *)compat_12_netbsd32_reboot },
217 { NETBSD32_SYS_compat_12_netbsd32_msync, 0,
218 (sy_call_t *)compat_12_netbsd32_msync },
219 { NETBSD32_SYS_compat_12_netbsd32_oswapon, 0,
220 (sy_call_t *)compat_12_netbsd32_oswapon },
221 { NETBSD32_SYS_compat_12_netbsd32_stat12, 0,
222 (sy_call_t *)compat_12_netbsd32_stat12 },
223 { NETBSD32_SYS_compat_12_netbsd32_fstat12, 0,
224 (sy_call_t *)compat_12_netbsd32_fstat12 },
225 { NETBSD32_SYS_compat_12_netbsd32_lstat12, 0,
226 (sy_call_t *)compat_12_netbsd32_lstat12 },
227 { NETBSD32_SYS_compat_12_netbsd32_getdirentries, 0,
228 (sy_call_t *)compat_12_netbsd32_getdirentries },
229 { 0, 0, NULL }
230 };
231
232 MODULE(MODULE_CLASS_EXEC, compat_netbsd32_12, "compat_netbsd32_13,compat_12");
233
234 static int
235 compat_netbsd32_12_modcmd(modcmd_t cmd, void *arg)
236 {
237
238 switch (cmd) {
239 case MODULE_CMD_INIT:
240 return syscall_establish(&emul_netbsd32,
241 compat_netbsd32_12_syscalls);
242
243 case MODULE_CMD_FINI:
244 return syscall_disestablish(&emul_netbsd32,
245 compat_netbsd32_12_syscalls);
246
247 default:
248 return ENOTTY;
249 }
250 }
251