Module Name:    src
Committed By:   ryo
Date:           Thu Dec  2 04:29:49 UTC 2021

Modified Files:
        src/sys/compat/linux/arch/aarch64: syscalls.master
        src/sys/compat/linux/arch/alpha: syscalls.master
        src/sys/compat/linux/arch/amd64: syscalls.master
        src/sys/compat/linux/arch/arm: syscalls.master
        src/sys/compat/linux/arch/i386: syscalls.master
        src/sys/compat/linux/arch/m68k: syscalls.master
        src/sys/compat/linux/arch/mips: syscalls.master
        src/sys/compat/linux/arch/powerpc: syscalls.master
        src/sys/compat/linux/common: linux_limit.h linux_misc.c
        src/sys/compat/linux32/arch/aarch64: syscalls.master
        src/sys/compat/linux32/arch/amd64: syscalls.master
        src/sys/compat/linux32/common: linux32_resource.c

Log Message:
add prlimit64(2) syscall to COMPAT_LINUX and COMPAT_LINUX32


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/compat/linux/arch/aarch64/syscalls.master
cvs rdiff -u -r1.101 -r1.102 src/sys/compat/linux/arch/alpha/syscalls.master
cvs rdiff -u -r1.66 -r1.67 src/sys/compat/linux/arch/amd64/syscalls.master
cvs rdiff -u -r1.74 -r1.75 src/sys/compat/linux/arch/arm/syscalls.master
cvs rdiff -u -r1.128 -r1.129 src/sys/compat/linux/arch/i386/syscalls.master
cvs rdiff -u -r1.100 -r1.101 src/sys/compat/linux/arch/m68k/syscalls.master
cvs rdiff -u -r1.73 -r1.74 src/sys/compat/linux/arch/mips/syscalls.master
cvs rdiff -u -r1.79 -r1.80 src/sys/compat/linux/arch/powerpc/syscalls.master
cvs rdiff -u -r1.7 -r1.8 src/sys/compat/linux/common/linux_limit.h
cvs rdiff -u -r1.255 -r1.256 src/sys/compat/linux/common/linux_misc.c
cvs rdiff -u -r1.2 -r1.3 src/sys/compat/linux32/arch/aarch64/syscalls.master
cvs rdiff -u -r1.76 -r1.77 src/sys/compat/linux32/arch/amd64/syscalls.master
cvs rdiff -u -r1.12 -r1.13 src/sys/compat/linux32/common/linux32_resource.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/compat/linux/arch/aarch64/syscalls.master
diff -u src/sys/compat/linux/arch/aarch64/syscalls.master:1.3 src/sys/compat/linux/arch/aarch64/syscalls.master:1.4
--- src/sys/compat/linux/arch/aarch64/syscalls.master:1.3	Thu Nov 25 02:29:33 2021
+++ src/sys/compat/linux/arch/aarch64/syscalls.master	Thu Dec  2 04:29:47 2021
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.3 2021/11/25 02:29:33 ryo Exp $
+	$NetBSD: syscalls.master,v 1.4 2021/12/02 04:29:47 ryo Exp $
 
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 
@@ -490,7 +490,8 @@
 259	UNIMPL
 260	STD		{ int|linux_sys||wait4(int pid, int *status, \
 			    int options, struct rusage50 *rusage); }
-261	UNIMPL		prlimit64
+261	STD		{ int|linux_sys||prlimit64(pid_t pid, int which, \
+			    struct rlimit *new_rlp, struct rlimit *old_rlp); }
 262	UNIMPL		fanotify_init
 263	UNIMPL		fanotify_mark
 264	UNIMPL		name_to_handle_at

Index: src/sys/compat/linux/arch/alpha/syscalls.master
diff -u src/sys/compat/linux/arch/alpha/syscalls.master:1.101 src/sys/compat/linux/arch/alpha/syscalls.master:1.102
--- src/sys/compat/linux/arch/alpha/syscalls.master:1.101	Mon Sep 20 02:20:02 2021
+++ src/sys/compat/linux/arch/alpha/syscalls.master	Thu Dec  2 04:29:47 2021
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.101 2021/09/20 02:20:02 thorpej Exp $
+	$NetBSD: syscalls.master,v 1.102 2021/12/02 04:29:47 ryo Exp $
 ;
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 
@@ -794,7 +794,8 @@
 493	UNIMPL		perf_counter_open
 494	UNIMPL		fanotify_init
 495	UNIMPL		fanotify_mark
-496	UNIMPL		prlimit64
+496	STD		{ int|linux_sys||prlimit64(pid_t pid, int which, \
+			    struct rlimit *new_rlp, struct rlimit *old_rlp); }
 497	UNIMPL		name_to_handle_at
 498	UNIMPL		open_by_handle_at
 499	UNIMPL		clock_adjtime

Index: src/sys/compat/linux/arch/amd64/syscalls.master
diff -u src/sys/compat/linux/arch/amd64/syscalls.master:1.66 src/sys/compat/linux/arch/amd64/syscalls.master:1.67
--- src/sys/compat/linux/arch/amd64/syscalls.master:1.66	Mon Sep 20 02:20:02 2021
+++ src/sys/compat/linux/arch/amd64/syscalls.master	Thu Dec  2 04:29:48 2021
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.66 2021/09/20 02:20:02 thorpej Exp $
+	$NetBSD: syscalls.master,v 1.67 2021/12/02 04:29:48 ryo Exp $
 
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 
@@ -552,7 +552,8 @@
 			    unsigned int flags, struct timespec *timeout); }
 300	UNIMPL		fanotify_init
 301	UNIMPL		fanotify_mark
-302	UNIMPL		prlimit64
+302	STD		{ int|linux_sys||prlimit64(pid_t pid, int which, \
+			    struct rlimit *new_rlp, struct rlimit *old_rlp); }
 303	UNIMPL		name_to_handle_at
 304	UNIMPL		open_by_handle_at
 305	UNIMPL		clock_adjtime

Index: src/sys/compat/linux/arch/arm/syscalls.master
diff -u src/sys/compat/linux/arch/arm/syscalls.master:1.74 src/sys/compat/linux/arch/arm/syscalls.master:1.75
--- src/sys/compat/linux/arch/arm/syscalls.master:1.74	Wed Nov 24 18:52:13 2021
+++ src/sys/compat/linux/arch/arm/syscalls.master	Thu Dec  2 04:29:48 2021
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.74 2021/11/24 18:52:13 ryo Exp $
+	$NetBSD: syscalls.master,v 1.75 2021/12/02 04:29:48 ryo Exp $
 
 ; Derived from sys/compat/linux/arch/*/syscalls.master
 ; and from Linux 2.4.12 arch/arm/kernel/calls.S
@@ -595,7 +595,8 @@
 			    int *anamelen, int flags); }
 367	UNIMPL		fanotify_init
 368	UNIMPL		fanotify_mark
-369	UNIMPL		prlimit64
+369	STD		{ int|linux_sys||prlimit64(pid_t pid, int which, \
+			    struct rlimit *new_rlp, struct rlimit *old_rlp); }
 370	UNIMPL		name_to_handle_at
 371	UNIMPL		open_by_handle_at
 372	UNIMPL		clock_adjtime

Index: src/sys/compat/linux/arch/i386/syscalls.master
diff -u src/sys/compat/linux/arch/i386/syscalls.master:1.128 src/sys/compat/linux/arch/i386/syscalls.master:1.129
--- src/sys/compat/linux/arch/i386/syscalls.master:1.128	Mon Sep 20 02:20:02 2021
+++ src/sys/compat/linux/arch/i386/syscalls.master	Thu Dec  2 04:29:48 2021
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.128 2021/09/20 02:20:02 thorpej Exp $
+	$NetBSD: syscalls.master,v 1.129 2021/12/02 04:29:48 ryo Exp $
 
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 
@@ -557,7 +557,8 @@
 337	UNIMPL		recvmmsg
 338	UNIMPL		fanotify_init
 339	UNIMPL		fanotify_mark
-340	UNIMPL		prlimit64
+340	STD		{ int|linux_sys||prlimit64(pid_t pid, int which, \
+			    struct rlimit *new_rlp, struct rlimit *old_rlp); }
 341	UNIMPL		name_to_handle_at
 342	UNIMPL		open_by_handle_at
 343	UNIMPL		clock_adjtime

Index: src/sys/compat/linux/arch/m68k/syscalls.master
diff -u src/sys/compat/linux/arch/m68k/syscalls.master:1.100 src/sys/compat/linux/arch/m68k/syscalls.master:1.101
--- src/sys/compat/linux/arch/m68k/syscalls.master:1.100	Wed Nov 24 18:52:13 2021
+++ src/sys/compat/linux/arch/m68k/syscalls.master	Thu Dec  2 04:29:48 2021
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.100 2021/11/24 18:52:13 ryo Exp $
+	$NetBSD: syscalls.master,v 1.101 2021/12/02 04:29:48 ryo Exp $
 
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 
@@ -578,7 +578,8 @@
 336	UNIMPL		atomic_barrier
 337	UNIMPL		fanotify_init
 338	UNIMPL		fanotify_mark
-339	UNIMPL		prlimit64
+339	STD		{ int|linux_sys||prlimit64(pid_t pid, int which, \
+			    struct rlimit *new_rlp, struct rlimit *old_rlp); }
 340	UNIMPL		name_to_handle_at
 341	UNIMPL		open_by_handle_at
 342	UNIMPL		clock_adjtime

Index: src/sys/compat/linux/arch/mips/syscalls.master
diff -u src/sys/compat/linux/arch/mips/syscalls.master:1.73 src/sys/compat/linux/arch/mips/syscalls.master:1.74
--- src/sys/compat/linux/arch/mips/syscalls.master:1.73	Wed Nov 24 18:52:13 2021
+++ src/sys/compat/linux/arch/mips/syscalls.master	Thu Dec  2 04:29:48 2021
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.73 2021/11/24 18:52:13 ryo Exp $  
+	$NetBSD: syscalls.master,v 1.74 2021/12/02 04:29:48 ryo Exp $  
 
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 
@@ -570,7 +570,8 @@
 336	UNIMPL		getdents64
 337	UNIMPL		fanotify_init
 338	UNIMPL		fanotify_mark
-339	UNIMPL		prlimit64
+339	STD		{ int|linux_sys||prlimit64(pid_t pid, int which, \
+			    struct rlimit *new_rlp, struct rlimit *old_rlp); }
 340	UNIMPL		name_to_handle_at
 341	UNIMPL		open_by_handle_at
 342	UNIMPL		clock_adjtime

Index: src/sys/compat/linux/arch/powerpc/syscalls.master
diff -u src/sys/compat/linux/arch/powerpc/syscalls.master:1.79 src/sys/compat/linux/arch/powerpc/syscalls.master:1.80
--- src/sys/compat/linux/arch/powerpc/syscalls.master:1.79	Wed Nov 24 18:52:13 2021
+++ src/sys/compat/linux/arch/powerpc/syscalls.master	Thu Dec  2 04:29:48 2021
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.79 2021/11/24 18:52:13 ryo Exp $  
+	$NetBSD: syscalls.master,v 1.80 2021/12/02 04:29:48 ryo Exp $  
 
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 
@@ -562,7 +562,8 @@
 322	UNIMPL		rt_tgsigqueueinfo
 323	UNIMPL		fanotify_init
 324	UNIMPL		fanotify_mark
-325	UNIMPL		prlimit64
+325	STD		{ int|linux_sys||prlimit64(pid_t pid, int which, \
+			    struct rlimit *new_rlp, struct rlimit *old_rlp); }
 326	UNIMPL		socket
 327	UNIMPL		bind
 328	UNIMPL		connect

Index: src/sys/compat/linux/common/linux_limit.h
diff -u src/sys/compat/linux/common/linux_limit.h:1.7 src/sys/compat/linux/common/linux_limit.h:1.8
--- src/sys/compat/linux/common/linux_limit.h:1.7	Sat Feb 28 13:08:00 2015
+++ src/sys/compat/linux/common/linux_limit.h	Thu Dec  2 04:29:48 2021
@@ -1,4 +1,4 @@
-/* 	$NetBSD: linux_limit.h,v 1.7 2015/02/28 13:08:00 njoly Exp $ */
+/* 	$NetBSD: linux_limit.h,v 1.8 2021/12/02 04:29:48 ryo Exp $ */
 
 /*-
  * Copyright (c) 1995, 1998, 1999 The NetBSD Foundation, Inc.
@@ -35,20 +35,27 @@
 
 static int linux_to_bsd_limit(int);
 
-#ifdef LINUX_LARGEFILE64
-#define bsd_to_linux_rlimit1(l, b, f) \
+#define bsd_to_linux_rlimit64_1(l, b, f) \
     (l)->f = ((b)->f == RLIM_INFINITY || \
 	     ((b)->f & 0x8000000000000000UL) != 0) ? \
     LINUX_RLIM_INFINITY : (b)->f
-#else
-#define bsd_to_linux_rlimit1(l, b, f) \
+#define bsd_to_linux_rlimit32_1(l, b, f) \
     (l)->f = ((b)->f == RLIM_INFINITY || \
 	     ((b)->f & 0xffffffff00000000ULL) != 0) ? \
     LINUX_RLIM_INFINITY : (int32_t)(b)->f
+
+#define bsd_to_linux_rlimit64(l, b) \
+    bsd_to_linux_rlimit64_1(l, b, rlim_cur); \
+    bsd_to_linux_rlimit64_1(l, b, rlim_max)
+#define bsd_to_linux_rlimit32(l, b) \
+    bsd_to_linux_rlimit32_1(l, b, rlim_cur); \
+    bsd_to_linux_rlimit32_1(l, b, rlim_max)
+
+#ifdef LINUX_LARGEFILE64
+#define bsd_to_linux_rlimit(l, b)	bsd_to_linux_rlimit64(l, b)
+#else
+#define bsd_to_linux_rlimit(l, b)	bsd_to_linux_rlimit32(l, b)
 #endif
-#define bsd_to_linux_rlimit(l, b) \
-    bsd_to_linux_rlimit1(l, b, rlim_cur); \
-    bsd_to_linux_rlimit1(l, b, rlim_max)
 
 #define linux_to_bsd_rlimit1(b, l, f) \
     (b)->f = (l)->f == LINUX_RLIM_INFINITY ? RLIM_INFINITY : (l)->f

Index: src/sys/compat/linux/common/linux_misc.c
diff -u src/sys/compat/linux/common/linux_misc.c:1.255 src/sys/compat/linux/common/linux_misc.c:1.256
--- src/sys/compat/linux/common/linux_misc.c:1.255	Thu Nov 25 03:08:04 2021
+++ src/sys/compat/linux/common/linux_misc.c	Thu Dec  2 04:29:48 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_misc.c,v 1.255 2021/11/25 03:08:04 ryo Exp $	*/
+/*	$NetBSD: linux_misc.c,v 1.256 2021/12/02 04:29:48 ryo Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1998, 1999, 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.255 2021/11/25 03:08:04 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.256 2021/12/02 04:29:48 ryo Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1452,6 +1452,48 @@ linux_sys_ugetrlimit(struct lwp *l, cons
 }
 # endif
 
+int
+linux_sys_prlimit64(struct lwp *l, const struct linux_sys_prlimit64_args *uap, register_t *retval)
+{
+	/* {
+		syscallarg(pid_t) pid;
+		syscallarg(int) witch;
+		syscallarg(struct rlimit *) new_rlp;
+		syscallarg(struct rlimit *) old_rlp;
+	}; */
+	struct rlimit rl, nrl, orl;
+	struct rlimit *p;
+	int which;
+	int error;
+
+	/* XXX: Cannot operate any process other than its own */
+	if (SCARG(uap, pid) != 0)
+		return EPERM;
+
+	which = linux_to_bsd_limit(SCARG(uap, which));
+	if (which < 0)
+		return -which;
+
+	p = SCARG(uap, old_rlp);
+	if (p != NULL) {
+		memset(&orl, 0, sizeof(orl));
+		bsd_to_linux_rlimit64(&orl, &l->l_proc->p_rlimit[which]);
+		if ((error = copyout(&orl, p, sizeof(orl))) != 0)
+			return error;
+	}
+
+	p = SCARG(uap, new_rlp);
+	if (p != NULL) {
+		if ((error = copyin(p, &nrl, sizeof(nrl))) != 0)
+			return error;
+
+		linux_to_bsd_rlimit(&rl, &nrl);
+		return dosetrlimit(l, l->l_proc, which, &rl);
+	}
+
+	return 0;
+}
+
 /*
  * This gets called for unsupported syscalls. The difference to sys_nosys()
  * is that process does not get SIGSYS, the call just returns with ENOSYS.

Index: src/sys/compat/linux32/arch/aarch64/syscalls.master
diff -u src/sys/compat/linux32/arch/aarch64/syscalls.master:1.2 src/sys/compat/linux32/arch/aarch64/syscalls.master:1.3
--- src/sys/compat/linux32/arch/aarch64/syscalls.master:1.2	Sat Nov 27 21:15:07 2021
+++ src/sys/compat/linux32/arch/aarch64/syscalls.master	Thu Dec  2 04:29:48 2021
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.2 2021/11/27 21:15:07 ryo Exp $
+	$NetBSD: syscalls.master,v 1.3 2021/12/02 04:29:48 ryo Exp $
 
 ; NetBSD aarch64 COMPAT_LINUX32 system call name/number "master" file.
 ;
@@ -642,7 +642,8 @@
 366	UNIMPL	accept4
 367	UNIMPL	fanotify_init
 368	UNIMPL	fanotify_mark
-369	UNIMPL	prlimit64
+369	STD	{ int|linux32_sys||prlimit64(pid_t pid, int which, \
+		    netbsd32_rlimitp_t new_rlp, netbsd32_rlimitp_t old_rlp); }
 370	UNIMPL	name_to_handle_at
 371	UNIMPL	open_by_handle_at
 372	UNIMPL	clock_adjtime

Index: src/sys/compat/linux32/arch/amd64/syscalls.master
diff -u src/sys/compat/linux32/arch/amd64/syscalls.master:1.76 src/sys/compat/linux32/arch/amd64/syscalls.master:1.77
--- src/sys/compat/linux32/arch/amd64/syscalls.master:1.76	Sat Nov 27 21:15:07 2021
+++ src/sys/compat/linux32/arch/amd64/syscalls.master	Thu Dec  2 04:29:48 2021
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.76 2021/11/27 21:15:07 ryo Exp $
+	$NetBSD: syscalls.master,v 1.77 2021/12/02 04:29:48 ryo Exp $
 
 ; NetBSD i386 COMPAT_LINUX32 system call name/number "master" file.
 ; (See syscalls.conf to see what it is processed into.)
@@ -583,7 +583,8 @@
 337	UNIMPL	recvmmsg
 338	UNIMPL	fanotify_init
 339	UNIMPL	fanotify_mark
-340	UNIMPL	prlimit64
+340	STD	{ int|linux32_sys||prlimit64(pid_t pid, int which, \
+		    netbsd32_rlimitp_t new_rlp, netbsd32_rlimitp_t old_rlp); }
 341	UNIMPL	name_to_handle_at
 342	UNIMPL	open_by_handle_at
 343	UNIMPL	clock_adjtime

Index: src/sys/compat/linux32/common/linux32_resource.c
diff -u src/sys/compat/linux32/common/linux32_resource.c:1.12 src/sys/compat/linux32/common/linux32_resource.c:1.13
--- src/sys/compat/linux32/common/linux32_resource.c:1.12	Tue Sep  7 11:43:04 2021
+++ src/sys/compat/linux32/common/linux32_resource.c	Thu Dec  2 04:29:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux32_resource.c,v 1.12 2021/09/07 11:43:04 riastradh Exp $ */
+/*	$NetBSD: linux32_resource.c,v 1.13 2021/12/02 04:29:49 ryo Exp $ */
 
 /*-
  * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -33,7 +33,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: linux32_resource.c,v 1.12 2021/09/07 11:43:04 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_resource.c,v 1.13 2021/12/02 04:29:49 ryo Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -124,6 +124,48 @@ linux32_sys_ugetrlimit(struct lwp *l, co
 }
 
 int
+linux32_sys_prlimit64(struct lwp *l, const struct linux32_sys_prlimit64_args *uap, register_t *retval)
+{
+	/* {
+		syscallarg(pid_t) pid;
+		syscallarg(int) which;
+		syscallarg(netbsd32_rlimitp_t) new_rlp;
+		syscallarg(netbsd32_rlimitp_t) old_rlp;
+	}; */
+	struct rlimit rl, nrl, orl;
+	struct rlimit *p;
+	int which;
+	int error;
+
+	/* XXX: Cannot operate any process other than its own */
+	if (SCARG(uap, pid) != 0)
+		return EPERM;
+
+	which = linux_to_bsd_limit(SCARG(uap, which));
+	if (which < 0)
+		return -which;
+
+	p = SCARG_P32(uap, old_rlp);
+	if (p != NULL) {
+		memset(&orl, 0, sizeof(orl));
+		bsd_to_linux_rlimit64(&orl, &l->l_proc->p_rlimit[which]);
+		if ((error = copyout(&orl, p, sizeof(orl))) != 0)
+			return error;
+	}
+
+	p = SCARG_P32(uap, new_rlp);
+	if (p != NULL) {
+		if ((error = copyin(p, &nrl, sizeof(nrl))) != 0)
+			return error;
+
+		linux_to_bsd_rlimit(&rl, &nrl);
+		return dosetrlimit(l, l->l_proc, which, &rl);
+	}
+
+	return 0;
+}
+
+int
 linux32_sys_getpriority(struct lwp *l, const struct linux32_sys_getpriority_args *uap, register_t *retval)
 {
 	/* {

Reply via email to