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