1/* $NetBSD: netbsd32_compat_90.c,v 1.2 2023/07/29 13:57:28 pgoyette Exp $ */ 2 3/*- 4 * Copyright (c) 2019 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software developed for The NetBSD Foundation 8 * by Christos Zoulas. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32#include <sys/cdefs.h> 33__KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_90.c,v 1.2 2023/07/29 13:57:28 pgoyette Exp $"); 34 35#include <sys/param.h> 36#include <sys/kmem.h> 37#include <sys/module.h> 38#include <sys/filedesc.h> 39#include <sys/statvfs.h> 40#include <sys/vfs_syscalls.h> 41#include <sys/syscallvar.h> 42 43#include <compat/netbsd32/netbsd32.h> 44#include <compat/netbsd32/netbsd32_syscall.h> 45#include <compat/netbsd32/netbsd32_syscallargs.h> 46#include <compat/netbsd32/netbsd32_conv.h> 47 48static int 49netbsd32_copyout_statvfs90(const void *kp, void *up, size_t len) 50{ 51 struct netbsd32_statvfs90 *sbuf_32; 52 int error; 53 54 sbuf_32 = kmem_alloc(sizeof(*sbuf_32), KM_SLEEP); 55 netbsd32_from_statvfs90(kp, sbuf_32); 56 error = copyout(sbuf_32, up, sizeof(*sbuf_32)); 57 kmem_free(sbuf_32, sizeof(*sbuf_32)); 58 59 return error; 60} 61 62int 63compat_90_netbsd32_getvfsstat(struct lwp *l, 64 const struct compat_90_netbsd32_getvfsstat_args *uap, register_t *retval) 65{ 66 /* { 67 syscallarg(netbsd32_statvfs90p_t) buf; 68 syscallarg(netbsd32_size_t) bufsize; 69 syscallarg(int) flags; 70 } */ 71 72 return do_sys_getvfsstat(l, SCARG_P32(uap, buf), SCARG(uap, bufsize), 73 SCARG(uap, flags), netbsd32_copyout_statvfs90, 74 sizeof(struct netbsd32_statvfs90), retval); 75} 76 77int 78compat_90_netbsd32_statvfs1(struct lwp *l, 79 const struct compat_90_netbsd32_statvfs1_args *uap, register_t *retval) 80{ 81 /* { 82 syscallarg(const netbsd32_charp) path; 83 syscallarg(netbsd32_statvfs90p_t) buf; 84 syscallarg(int) flags; 85 } */ 86 struct statvfs *sb; 87 int error; 88 89 sb = STATVFSBUF_GET(); 90 error = do_sys_pstatvfs(l, SCARG_P32(uap, path), SCARG(uap, flags), sb); 91 if (error == 0) 92 error = netbsd32_copyout_statvfs90(sb, SCARG_P32(uap, buf), 93 sizeof(struct netbsd32_statvfs90)); 94 STATVFSBUF_PUT(sb); 95 return error; 96} 97 98int 99compat_90_netbsd32_fstatvfs1(struct lwp *l, 100 const struct compat_90_netbsd32_fstatvfs1_args *uap, register_t *retval) 101{ 102 /* { 103 syscallarg(int) fd; 104 syscallarg(netbsd32_statvfs90p_t) buf; 105 syscallarg(int) flags; 106 } */ 107 struct statvfs *sb; 108 int error; 109 110 sb = STATVFSBUF_GET(); 111 error = do_sys_fstatvfs(l, SCARG(uap, fd), SCARG(uap, flags), sb); 112 if (error == 0) 113 error = netbsd32_copyout_statvfs90(sb, SCARG_P32(uap, buf), 0); 114 STATVFSBUF_PUT(sb); 115 return error; 116} 117 118 119int 120compat_90_netbsd32_fhstatvfs1(struct lwp *l, 121 const struct compat_90_netbsd32_fhstatvfs1_args *uap, register_t *retval) 122{ 123 /* { 124 syscallarg(const netbsd32_pointer_t) fhp; 125 syscallarg(netbsd32_size_t) fh_size; 126 syscallarg(netbsd32_statvfs90p_t) buf; 127 syscallarg(int) flags; 128 } */ 129 struct statvfs *sb; 130 int error; 131 132 sb = STATVFSBUF_GET(); 133 error = do_fhstatvfs(l, SCARG_P32(uap, fhp), SCARG(uap, fh_size), sb, 134 SCARG(uap, flags)); 135 136 if (error == 0) 137 error = netbsd32_copyout_statvfs90(sb, SCARG_P32(uap, buf), 0); 138 STATVFSBUF_PUT(sb); 139 140 return error; 141} 142 143static struct syscall_package compat_netbsd32_90_syscalls[] = { 144 { NETBSD32_SYS_compat_90_netbsd32_getvfsstat, 0, 145 (sy_call_t *)compat_90_netbsd32_getvfsstat }, 146 { NETBSD32_SYS_compat_90_netbsd32_statvfs1, 0, 147 (sy_call_t *)compat_90_netbsd32_statvfs1 }, 148 { NETBSD32_SYS_compat_90_netbsd32_fstatvfs1, 0, 149 (sy_call_t *)compat_90_netbsd32_fstatvfs1 }, 150 { NETBSD32_SYS_compat_90_netbsd32_fhstatvfs1, 0, 151 (sy_call_t *)compat_90_netbsd32_fhstatvfs1 }, 152 { 0, 0, NULL } 153}; 154 155MODULE(MODULE_CLASS_EXEC, compat_netbsd32_90, "compat_netbsd32_100,compat_90"); 156 157 158static int 159compat_netbsd32_90_modcmd(modcmd_t cmd, void *arg) 160{ 161 162 switch (cmd) { 163 case MODULE_CMD_INIT: 164 return syscall_establish(&emul_netbsd32, 165 compat_netbsd32_90_syscalls); 166 167 case MODULE_CMD_FINI: 168 return syscall_disestablish(&emul_netbsd32, 169 compat_netbsd32_90_syscalls); 170 171 default: 172 return ENOTTY; 173 } 174} 175