Module Name: src Committed By: christos Date: Sat Sep 28 19:35:56 UTC 2024
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_fcntl.h linux_file.c linux_misc.c linux_sched.h Log Message: Linux GSoC-2024: renameat2, clone3, sync_file_range, syncfs (Shivraj Jamgade) To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/sys/compat/linux/arch/aarch64/syscalls.master cvs rdiff -u -r1.108 -r1.109 src/sys/compat/linux/arch/alpha/syscalls.master cvs rdiff -u -r1.74 -r1.75 src/sys/compat/linux/arch/amd64/syscalls.master cvs rdiff -u -r1.81 -r1.82 src/sys/compat/linux/arch/arm/syscalls.master cvs rdiff -u -r1.136 -r1.137 src/sys/compat/linux/arch/i386/syscalls.master cvs rdiff -u -r1.106 -r1.107 src/sys/compat/linux/arch/m68k/syscalls.master cvs rdiff -u -r1.81 -r1.82 src/sys/compat/linux/arch/mips/syscalls.master cvs rdiff -u -r1.86 -r1.87 src/sys/compat/linux/arch/powerpc/syscalls.master cvs rdiff -u -r1.22 -r1.23 src/sys/compat/linux/common/linux_fcntl.h cvs rdiff -u -r1.124 -r1.125 src/sys/compat/linux/common/linux_file.c cvs rdiff -u -r1.264 -r1.265 src/sys/compat/linux/common/linux_misc.c cvs rdiff -u -r1.10 -r1.11 src/sys/compat/linux/common/linux_sched.h 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.13 src/sys/compat/linux/arch/aarch64/syscalls.master:1.14 --- src/sys/compat/linux/arch/aarch64/syscalls.master:1.13 Sun Jun 30 21:35:52 2024 +++ src/sys/compat/linux/arch/aarch64/syscalls.master Sat Sep 28 15:35:55 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.13 2024/07/01 01:35:52 christos Exp $ + $NetBSD: syscalls.master,v 1.14 2024/09/28 19:35:55 christos Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -203,7 +203,8 @@ 81 NOARGS { int|sys||sync(void); } 82 NOARGS { int|sys||fsync(int fd); } 83 STD { int|linux_sys||fdatasync(int fd); } -84 UNIMPL sync_file_range +84 STD { int|linux_sys||sync_file_range(int fd, \ + off_t offset, off_t nbytes, unsigned int flags); } 85 STD { int|linux_sys||timerfd_create(clockid_t clock_id, \ int flags); } 86 STD { int|linux_sys||timerfd_settime(int fd, int flags, \ @@ -519,7 +520,7 @@ 264 UNIMPL name_to_handle_at 265 UNIMPL open_by_handle_at 266 UNIMPL clock_adjtime -267 UNIMPL syncfs +267 STD { int|linux_sys||syncfs(int fd); } 268 UNIMPL setns 269 STD { int|linux_sys||sendmmsg(int s, \ struct linux_mmsghdr *msgvec, unsigned int vlen, \ @@ -530,7 +531,9 @@ 273 UNIMPL finit_module 274 UNIMPL sched_setattr 275 UNIMPL sched_getattr -276 UNIMPL renameat2 +276 STD { int|linux_sys||renameat2(int fromfd, \ + const char *from, int tofd, const char *to, \ + unsigned int flags); } 277 UNIMPL seccomp 278 NOARGS { ssize_t|sys||getrandom(void *buf, size_t buflen, \ unsigned int flags); } @@ -541,7 +544,9 @@ 282 UNIMPL userfaultfd 283 UNIMPL membarrier 284 UNIMPL mlock2 -285 UNIMPL copy_file_range +285 STD { ssize_t|linux_sys||copy_file_range(int fd_in, \ + off_t * off_in, int fd_out, off_t * off_out, \ + size_t len, unsigned int flags); } 286 UNIMPL preadv2 287 UNIMPL pwritev2 288 UNIMPL pkey_mprotect @@ -693,7 +698,9 @@ 432 UNIMPL fsmount 433 UNIMPL fspick 434 UNIMPL pidfd_open -435 UNIMPL clone3 +435 STD { int|linux_sys||clone3( \ + struct linux_user_clone3_args *cl_args, \ + size_t size); } 436 STD { int|linux_sys||close_range(unsigned int first, \ unsigned int last, unsigned int flags); } 437 UNIMPL openat2 Index: src/sys/compat/linux/arch/alpha/syscalls.master diff -u src/sys/compat/linux/arch/alpha/syscalls.master:1.108 src/sys/compat/linux/arch/alpha/syscalls.master:1.109 --- src/sys/compat/linux/arch/alpha/syscalls.master:1.108 Sun Jun 30 21:35:52 2024 +++ src/sys/compat/linux/arch/alpha/syscalls.master Sat Sep 28 15:35:55 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.108 2024/07/01 01:35:52 christos Exp $ + $NetBSD: syscalls.master,v 1.109 2024/09/28 19:35:55 christos Exp $ ; ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -774,7 +774,8 @@ 467 NOARGS { int|sys||__futex_get_robust_list(lwpid_t lwpid, \ void **headp, size_t *lenp); } 468 UNIMPL splice -469 UNIMPL sync_file_range +469 STD { int|linux_sys||sync_file_range(int fd, \ + off_t offset, off_t nbytes, unsigned int flags); } 470 UNIMPL tee 471 UNIMPL vmsplice 472 UNIMPL move_pages @@ -823,7 +824,7 @@ 497 UNIMPL name_to_handle_at 498 UNIMPL open_by_handle_at 499 UNIMPL clock_adjtime -500 UNIMPL syncfs +500 STD { int|linux_sys||syncfs(int fd); } 501 UNIMPL setns 502 STD { int|linux_sys||accept4(int s, \ struct osockaddr *name, \ @@ -837,7 +838,9 @@ 507 UNIMPL finit_module 508 UNIMPL sched_setattr 509 UNIMPL sched_getattr -510 UNIMPL renameat2 +510 STD { int|linux_sys||renameat2(int fromfd, \ + const char *from, int tofd, const char *to, \ + unsigned int flags); } 511 UNIMPL 512 UNIMPL 513 UNIMPL @@ -846,7 +849,9 @@ 516 UNIMPL 517 UNIMPL 518 UNIMPL -519 UNIMPL +519 STD { ssize_t|linux_sys||copy_file_range(int fd_in, \ + off_t * off_in, int fd_out, off_t * off_out, \ + size_t len, unsigned int flags); } 520 UNIMPL 521 UNIMPL 522 STD { int|linux_sys||statx(int fd, const char *path, \ @@ -874,7 +879,9 @@ 542 UNIMPL 543 UNIMPL 544 UNIMPL -545 UNIMPL +545 STD { int|linux_sys||clone3( \ + struct linux_user_clone3_args *cl_args, \ + size_t size); } 546 STD { int|linux_sys||close_range(unsigned int first, \ unsigned int last, unsigned int flags); } 547 UNIMPL Index: src/sys/compat/linux/arch/amd64/syscalls.master diff -u src/sys/compat/linux/arch/amd64/syscalls.master:1.74 src/sys/compat/linux/arch/amd64/syscalls.master:1.75 --- src/sys/compat/linux/arch/amd64/syscalls.master:1.74 Sun Jun 30 21:35:52 2024 +++ src/sys/compat/linux/arch/amd64/syscalls.master Sat Sep 28 15:35:55 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.74 2024/07/01 01:35:52 christos Exp $ + $NetBSD: syscalls.master,v 1.75 2024/09/28 19:35:55 christos Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -62,6 +62,7 @@ #include <compat/linux/common/linux_siginfo.h> #include <compat/linux/common/linux_mqueue.h> #include <compat/linux/common/linux_machdep.h> +#include <compat/linux/common/linux_sched.h> #include <compat/linux/linux_syscallargs.h> @@ -533,7 +534,8 @@ void **headp, size_t *lenp); } 275 UNIMPL splice 276 UNIMPL tee -277 UNIMPL sync_file_range +277 STD { int|linux_sys||sync_file_range(int fd, \ + off_t offset, off_t nbytes, unsigned int flags); } 278 UNIMPL vmsplice 279 UNIMPL move_pages 280 STD { int|linux_sys||utimensat(int fd, const char *path, \ @@ -580,7 +582,7 @@ 303 UNIMPL name_to_handle_at 304 UNIMPL open_by_handle_at 305 UNIMPL clock_adjtime -306 UNIMPL syncfs +306 STD { int|linux_sys||syncfs(int fd); } 307 STD { int|linux_sys||sendmmsg(int s, \ struct linux_mmsghdr *msgvec, unsigned int vlen, \ unsigned int flags); } @@ -594,7 +596,9 @@ 313 UNIMPL finit_module 314 UNIMPL sched_setattr 315 UNIMPL sched_getattr -316 UNIMPL renameat2 +316 STD { int|linux_sys||renameat2(int fromfd, \ + const char *from, int tofd, const char *to, \ + unsigned int flags); } 317 UNIMPL seccomp 318 NOARGS { ssize_t|sys||getrandom(void *buf, size_t buflen, \ unsigned int flags); } @@ -606,7 +610,9 @@ 323 UNIMPL userfaultfd 324 UNIMPL membarrier 325 UNIMPL mlock2 -326 UNIMPL copy_file_range +326 STD { ssize_t|linux_sys||copy_file_range(int fd_in, \ + off_t * off_in, int fd_out, off_t * off_out, \ + size_t len, unsigned int flags); } 327 UNIMPL preadv2 328 UNIMPL pwritev2 329 UNIMPL pkey_mprotect @@ -717,7 +723,9 @@ 432 UNIMPL fsmount 433 UNIMPL fspick 434 UNIMPL pidfd_open -435 UNIMPL clone3 +435 STD { int|linux_sys||clone3( \ + struct linux_user_clone3_args *cl_args, \ + size_t size); } 436 STD { int|linux_sys||close_range(unsigned int first, \ unsigned int last, unsigned int flags); } 437 UNIMPL openat2 Index: src/sys/compat/linux/arch/arm/syscalls.master diff -u src/sys/compat/linux/arch/arm/syscalls.master:1.81 src/sys/compat/linux/arch/arm/syscalls.master:1.82 --- src/sys/compat/linux/arch/arm/syscalls.master:1.81 Sun Jun 30 21:35:52 2024 +++ src/sys/compat/linux/arch/arm/syscalls.master Sat Sep 28 15:35:55 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.81 2024/07/01 01:35:52 christos Exp $ + $NetBSD: syscalls.master,v 1.82 2024/09/28 19:35:55 christos Exp $ ; Derived from sys/compat/linux/arch/*/syscalls.master ; and from Linux 2.4.12 arch/arm/kernel/calls.S @@ -573,7 +573,8 @@ 339 NOARGS { int|sys||__futex_get_robust_list(lwpid_t lwpid, \ void **headp, size_t *lenp); } 340 UNIMPL splice -341 UNIMPL sync_file_range2 +341 STD { int|linux_sys||sync_file_range(int fd, \ + off_t offset, off_t nbytes, unsigned int flags); } 342 UNIMPL tee 343 UNIMPL vmsplice 344 UNIMPL move_pages @@ -625,7 +626,7 @@ 370 UNIMPL name_to_handle_at 371 UNIMPL open_by_handle_at 372 UNIMPL clock_adjtime -373 UNIMPL syncfs +373 STD { int|linux_sys||syncfs(int fd); } 374 STD { int|linux_sys||sendmmsg(int s, \ struct linux_mmsghdr *msgvec, unsigned int vlen, \ unsigned int flags); } @@ -636,7 +637,9 @@ 379 UNIMPL finit_module 380 UNIMPL sched_setattr 381 UNIMPL sched_getattr -382 UNIMPL renameat2 +382 STD { int|linux_sys||renameat2(int fromfd, \ + const char *from, int tofd, const char *to, \ + unsigned int flags); } 383 UNIMPL seccomp ; XXX FIX-me? ; 384 NOARGS { ssize_t|sys||getrandom(void *buf, size_t buflen, \ @@ -658,7 +661,9 @@ 388 UNIMPL usr32 389 STD { int|linux_sys||set_tls(void *tls); } 390 UNIMPL -391 UNIMPL +391 STD { ssize_t|linux_sys||copy_file_range(int fd_in, \ + off_t * off_in, int fd_out, off_t * off_out, \ + size_t len, unsigned int flags); } 392 UNIMPL 393 UNIMPL 394 UNIMPL @@ -704,7 +709,9 @@ 432 UNIMPL 433 UNIMPL 434 UNIMPL -435 UNIMPL +435 STD { int|linux_sys||clone3( \ + struct linux_user_clone3_args *cl_args, \ + size_t size); } 436 STD { int|linux_sys||close_range(unsigned int first, \ unsigned int last, unsigned int flags); } 437 UNIMPL Index: src/sys/compat/linux/arch/i386/syscalls.master diff -u src/sys/compat/linux/arch/i386/syscalls.master:1.136 src/sys/compat/linux/arch/i386/syscalls.master:1.137 --- src/sys/compat/linux/arch/i386/syscalls.master:1.136 Sun Jun 30 21:35:53 2024 +++ src/sys/compat/linux/arch/i386/syscalls.master Sat Sep 28 15:35:55 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.136 2024/07/01 01:35:53 christos Exp $ + $NetBSD: syscalls.master,v 1.137 2024/09/28 19:35:55 christos Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -540,7 +540,8 @@ 312 NOARGS { int|sys||__futex_get_robust_list(lwpid_t lwpid, \ void **headp, size_t *lenp); } 313 UNIMPL splice -314 UNIMPL sync_file_range +314 STD { int|linux_sys||sync_file_range(int fd, \ + off_t offset, off_t nbytes, unsigned int flags); } 315 UNIMPL tee 316 UNIMPL vmsplice 317 UNIMPL move_pages @@ -586,7 +587,7 @@ 341 UNIMPL name_to_handle_at 342 UNIMPL open_by_handle_at 343 UNIMPL clock_adjtime -344 UNIMPL syncfs +344 STD { int|linux_sys||syncfs(int fd); } 345 UNIMPL sendmmsg 346 UNIMPL setns 347 UNIMPL process_vm_readv @@ -595,7 +596,9 @@ 350 UNIMPL finit_module 351 UNIMPL sched_setattr 352 UNIMPL sched_getattr -353 UNIMPL renameat2 +353 STD { int|linux_sys||renameat2(int fromfd, \ + const char *from, int tofd, const char *to, \ + unsigned int flags); } 354 UNIMPL seccomp 355 NOARGS { ssize_t|sys||getrandom(void *buf, size_t buflen, \ unsigned int flags); } @@ -621,7 +624,9 @@ 374 UNIMPL userfaultfd 375 UNIMPL membarrier 376 UNIMPL mlock2 -377 UNIMPL copy_file_range +377 STD { ssize_t|linux_sys||copy_file_range(int fd_in, \ + off_t * off_in, int fd_out, off_t * off_out, \ + size_t len, unsigned int flags); } 378 UNIMPL preadv2 379 UNIMPL pwritev2 380 UNIMPL pkey_mprotect @@ -681,7 +686,9 @@ 432 UNIMPL fsmount 433 UNIMPL fspick 434 UNIMPL pidfd_open -435 UNIMPL clone3 +435 STD { int|linux_sys||clone3(\ + struct linux_user_clone3_args *cl_args, \ + size_t size); } 436 STD { int|linux_sys||close_range(unsigned int first, \ unsigned int last, unsigned int flags); } 437 UNIMPL openat2 Index: src/sys/compat/linux/arch/m68k/syscalls.master diff -u src/sys/compat/linux/arch/m68k/syscalls.master:1.106 src/sys/compat/linux/arch/m68k/syscalls.master:1.107 --- src/sys/compat/linux/arch/m68k/syscalls.master:1.106 Sun Jun 30 21:35:53 2024 +++ src/sys/compat/linux/arch/m68k/syscalls.master Sat Sep 28 15:35:56 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.106 2024/07/01 01:35:53 christos Exp $ + $NetBSD: syscalls.master,v 1.107 2024/09/28 19:35:56 christos Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -551,7 +551,8 @@ 305 NOARGS { int|sys||__futex_get_robust_list(lwpid_t lwpid, \ void **headp, size_t *lenp); } 306 UNIMPL splice -307 UNIMPL sync_file_range +307 STD { int|linux_sys||sync_file_range(int fd, \ + off_t offset, off_t nbytes, unsigned int flags); } 308 UNIMPL tee 309 UNIMPL vmsplice 310 UNIMPL move_pages @@ -605,7 +606,7 @@ 340 UNIMPL name_to_handle_at 341 UNIMPL open_by_handle_at 342 UNIMPL clock_adjtime -343 UNIMPL syncfs +343 STD { int|linux_sys||syncfs(int fd); } 344 UNIMPL setns 345 UNIMPL process_vm_readv 346 UNIMPL process_vm_writev @@ -613,7 +614,9 @@ 348 UNIMPL finit_module 349 UNIMPL sched_setattr 350 UNIMPL sched_getattr -351 UNIMPL renameat2 +351 STD { int|linux_sys||renameat2(int fromfd, \ + const char *from, int tofd, const char *to, \ + unsigned int flags); } 352 NOARGS { ssize_t|sys||getrandom(void *buf, size_t buflen, \ unsigned int flags); } 353 UNIMPL memfd_create @@ -645,7 +648,9 @@ 373 UNIMPL userfaultfd 374 UNIMPL membarrier 375 UNIMPL mlock2 -376 UNIMPL copy_file_range +376 STD { ssize_t|linux_sys||copy_file_range(int fd_in, \ + off_t * off_in, int fd_out, off_t * off_out, \ + size_t len, unsigned int flags); } 377 UNIMPL preadv2 378 UNIMPL pwritev2 379 STD { int|linux_sys||statx(int fd, const char *path, \ @@ -706,7 +711,9 @@ 432 UNIMPL 433 UNIMPL 434 UNIMPL -435 UNIMPL +435 STD { int|linux_sys||clone3( \ + struct linux_user_clone3_args *cl_args, \ + size_t size); } 436 STD { int|linux_sys||close_range(unsigned int first, \ unsigned int last, unsigned int flags); } 437 UNIMPL Index: src/sys/compat/linux/arch/mips/syscalls.master diff -u src/sys/compat/linux/arch/mips/syscalls.master:1.81 src/sys/compat/linux/arch/mips/syscalls.master:1.82 --- src/sys/compat/linux/arch/mips/syscalls.master:1.81 Sun Jun 30 21:35:53 2024 +++ src/sys/compat/linux/arch/mips/syscalls.master Sat Sep 28 15:35:56 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.81 2024/07/01 01:35:53 christos Exp $ + $NetBSD: syscalls.master,v 1.82 2024/09/28 19:35:56 christos Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -534,7 +534,8 @@ linux_sigset_t *sigset); } 303 UNIMPL unshare 304 UNIMPL splice -305 UNIMPL sync_file_range +305 STD { int|linux_sys||sync_file_range(int fd, \ + off_t offset, off_t nbytes, unsigned int flags); } 306 UNIMPL tee 307 UNIMPL vmsplice 308 UNIMPL move_pages @@ -599,7 +600,7 @@ 340 UNIMPL name_to_handle_at 341 UNIMPL open_by_handle_at 342 UNIMPL clock_adjtime -343 UNIMPL syncfs +343 STD { int|linux_sys||syncfs(int fd); } 344 STD { int|linux_sys||sendmmsg(int s, \ struct linux_mmsghdr *msgvec, unsigned int vlen, \ unsigned int flags); } @@ -610,7 +611,9 @@ 349 UNIMPL finit_module 350 UNIMPL sched_setattr 351 UNIMPL sched_getattr -352 UNIMPL renameat2 +352 STD { int|linux_sys||renameat2(int fromfd, \ + const char *from, int tofd, const char *to, \ + unsigned int flags); } 353 NOARGS { ssize_t|sys||getrandom(void *buf, size_t buflen, \ unsigned int flags); } 354 STD { int|linux_sys||memfd_create(const char *name, \ @@ -620,7 +623,9 @@ 357 UNIMPL userfaultfd 358 UNIMPL membarrier 359 UNIMPL mlock2 -360 UNIMPL copy_file_range +360 STD { ssize_t|linux_sys||copy_file_range(int fd_in, \ + off_t * off_in, int fd_out, off_t * off_out, \ + size_t len, unsigned int flags); } 361 UNIMPL preadv2 362 UNIMPL pwritev2 363 UNIMPL pkey_mprotect @@ -697,7 +702,9 @@ 432 UNIMPL 433 UNIMPL 434 UNIMPL -435 UNIMPL +435 STD { int|linux_sys||clone3( \ + struct linux_user_clone3_args *cl_args, \ + size_t size); } 436 STD { int|linux_sys||close_range(unsigned int first, \ unsigned int last, unsigned int flags); } 437 UNIMPL Index: src/sys/compat/linux/arch/powerpc/syscalls.master diff -u src/sys/compat/linux/arch/powerpc/syscalls.master:1.86 src/sys/compat/linux/arch/powerpc/syscalls.master:1.87 --- src/sys/compat/linux/arch/powerpc/syscalls.master:1.86 Sun Jun 30 21:35:53 2024 +++ src/sys/compat/linux/arch/powerpc/syscalls.master Sat Sep 28 15:35:56 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.86 2024/07/01 01:35:53 christos Exp $ + $NetBSD: syscalls.master,v 1.87 2024/09/28 19:35:56 christos Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -560,7 +560,8 @@ 306 STD { int|linux_sys||timerfd_create(clockid_t clock_id, \ int flags); } 307 STD { int|linux_sys||eventfd(unsigned int initval); } -308 UNIMPL sync_file_range2 +308 STD { int|linux_sys||sync_file_range(int fd, \ + off_t offset, off_t nbytes, unsigned int flags); } 309 STD { int|linux_sys||fallocate(int fd, int mode, \ off_t offset, off_t len); } 310 UNIMPL subpage_prot @@ -614,7 +615,7 @@ 345 UNIMPL name_to_handle_at 346 UNIMPL open_by_handle_at 347 UNIMPL clock_adjtime -348 UNIMPL syncfs +348 STD { int|linux_sys||syncfs(int fd); } 349 STD { int|linux_sys||sendmmsg(int s, \ struct linux_mmsghdr *msgvec, unsigned int vlen, \ unsigned int flags); } @@ -625,7 +626,9 @@ 354 UNIMPL kcmp 355 UNIMPL sched_setattr 356 UNIMPL sched_getattr -357 UNIMPL renameat2 +357 STD { int|linux_sys||renameat2(int fromfd, \ + const char *from, int tofd, const char *to, \ + unsigned int flags); } 358 UNIMPL seccomp 359 NOARGS { ssize_t|sys||getrandom(void *buf, size_t buflen, \ unsigned int flags); } @@ -648,7 +651,9 @@ 376 UNIMPL 377 UNIMPL 378 UNIMPL mlock2 -379 UNIMPL copy_file_range +379 STD { ssize_t|linux_sys||copy_file_range(int fd_in, \ + off_t * off_in, int fd_out, off_t * off_out, \ + size_t len, unsigned int flags); } 380 UNIMPL preadv2 381 UNIMPL pwritev2 382 UNIMPL kexec_file_load @@ -706,7 +711,9 @@ 432 UNIMPL 433 UNIMPL 434 UNIMPL -435 UNIMPL +435 STD { int|linux_sys||clone3( \ + struct linux_user_clone3_args *cl_args, \ + size_t size); } 436 STD { int|linux_sys||close_range(unsigned int first, \ unsigned int last, unsigned int flags); } 437 UNIMPL Index: src/sys/compat/linux/common/linux_fcntl.h diff -u src/sys/compat/linux/common/linux_fcntl.h:1.22 src/sys/compat/linux/common/linux_fcntl.h:1.23 --- src/sys/compat/linux/common/linux_fcntl.h:1.22 Sat Aug 19 13:57:54 2023 +++ src/sys/compat/linux/common/linux_fcntl.h Sat Sep 28 15:35:56 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_fcntl.h,v 1.22 2023/08/19 17:57:54 christos Exp $ */ +/* $NetBSD: linux_fcntl.h,v 1.23 2024/09/28 19:35:56 christos Exp $ */ /*- * Copyright (c) 1995, 1998 The NetBSD Foundation, Inc. @@ -55,6 +55,29 @@ struct stat; #define LINUX_AT_NO_AUTOMOUNT 0x0800 #define LINUX_AT_EMPTY_PATH 0x1000 + +/* + * sync_file_range flags + */ +#define LINUX_SYNC_FILE_RANGE_WAIT_BEFORE 1 +#define LINUX_SYNC_FILE_RANGE_WRITE 2 +#define LINUX_SYNC_FILE_RANGE_WAIT_AFTER 4 +#define LINUX_SYNC_FILE_RANGE_ALL \ + (LINUX_SYNC_FILE_RANGE_WAIT_BEFORE | \ + LINUX_SYNC_FILE_RANGE_WRITE | \ + LINUX_SYNC_FILE_RANGE_WAIT_AFTER) + +/* + * renameat2 flags + */ +#define LINUX_RENAME_NOREPLACE 1 +#define LINUX_RENAME_EXCHANGE 2 +#define LINUX_RENAME_WHITEOUT 4 +#define LINUX_RENAME_ALL \ + (LINUX_RENAME_NOREPLACE | \ + LINUX_RENAME_EXCHANGE | \ + LINUX_RENAME_WHITEOUT) + #ifdef _KERNEL int linux_to_bsd_ioflags(int); int linux_to_bsd_atflags(int); Index: src/sys/compat/linux/common/linux_file.c diff -u src/sys/compat/linux/common/linux_file.c:1.124 src/sys/compat/linux/common/linux_file.c:1.125 --- src/sys/compat/linux/common/linux_file.c:1.124 Sat Jun 29 09:46:10 2024 +++ src/sys/compat/linux/common/linux_file.c Sat Sep 28 15:35:56 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_file.c,v 1.124 2024/06/29 13:46:10 christos Exp $ */ +/* $NetBSD: linux_file.c,v 1.125 2024/09/28 19:35:56 christos Exp $ */ /*- * Copyright (c) 1995, 1998, 2008 The NetBSD Foundation, Inc. @@ -35,8 +35,9 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_file.c,v 1.124 2024/06/29 13:46:10 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_file.c,v 1.125 2024/09/28 19:35:56 christos Exp $"); +#include <sys/types.h> #include <sys/param.h> #include <sys/systm.h> #include <sys/namei.h> @@ -44,6 +45,7 @@ __KERNEL_RCSID(0, "$NetBSD: linux_file.c #include <sys/file.h> #include <sys/fcntl.h> #include <sys/stat.h> +#include <sys/vfs_syscalls.h> #include <sys/filedesc.h> #include <sys/ioctl.h> #include <sys/kernel.h> @@ -54,7 +56,7 @@ __KERNEL_RCSID(0, "$NetBSD: linux_file.c #include <sys/socketvar.h> #include <sys/conf.h> #include <sys/pipe.h> - +#include <sys/fstrans.h> #include <sys/syscallargs.h> #include <sys/vfs_syscalls.h> @@ -68,6 +70,14 @@ __KERNEL_RCSID(0, "$NetBSD: linux_file.c #include <compat/linux/linux_syscallargs.h> +#ifdef DEBUG_LINUX +#define DPRINTF(a, ...) uprintf(a, __VA_ARGS__) +#else +#define DPRINTF(a, ...) +#endif + +#define LINUX_COPY_FILE_RANGE_MAX_CHUNK 8192 + static int bsd_to_linux_ioflags(int); #if !defined(__aarch64__) && !defined(__amd64__) static void bsd_to_linux_stat(struct stat *, struct linux_stat *); @@ -918,6 +928,343 @@ linux_sys_faccessat2(lwp_t *l, const str } +int +linux_sys_sync_file_range(lwp_t *l, + const struct linux_sys_sync_file_range_args *uap, register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(off_t) offset; + syscallarg(off_t) nbytes; + syscallarg(unsigned int) flags; + } */ + + struct sys_fsync_range_args ua; + + if (SCARG(uap, offset) < 0 || SCARG(uap, nbytes) < 0 || + ((SCARG(uap, flags) & ~LINUX_SYNC_FILE_RANGE_ALL) != 0)) + return EINVAL; + + /* Fill ua with uap */ + SCARG(&ua, fd) = SCARG(uap, fd); + SCARG(&ua, flags) = SCARG(uap, flags); + + /* Round down offset to page boundary */ + SCARG(&ua, start) = rounddown(SCARG(uap, offset), PAGE_SIZE); + SCARG(&ua, length) = SCARG(uap, nbytes); + if (SCARG(&ua, length) != 0) { + /* Round up length to nbytes+offset to page boundary */ + SCARG(&ua, length) = roundup(SCARG(uap, nbytes) + + SCARG(uap, offset) - SCARG(&ua, start), PAGE_SIZE); + } + + return sys_fsync_range(l, &ua, retval); +} + +int +linux_sys_syncfs(lwp_t *l, const struct linux_sys_syncfs_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fd; + } */ + + struct mount *mp; + struct vnode *vp; + file_t *fp; + int error, fd; + fd = SCARG(uap, fd); + + /* Get file pointer */ + if ((error = fd_getvnode(fd, &fp)) != 0) + return error; + + /* Get vnode and mount point */ + vp = fp->f_vnode; + mp = vp->v_mount; + + mutex_enter(mp->mnt_updating); + if ((mp->mnt_flag & MNT_RDONLY) == 0) { + int asyncflag = mp->mnt_flag & MNT_ASYNC; + mp->mnt_flag &= ~MNT_ASYNC; + VFS_SYNC(mp, MNT_NOWAIT, l->l_cred); + if (asyncflag) + mp->mnt_flag |= MNT_ASYNC; + } + mutex_exit(mp->mnt_updating); + + /* Cleanup vnode and file pointer */ + vrele(vp); + fd_putfile(fd); + return 0; + +} + +int +linux_sys_renameat2(struct lwp *l, const struct linux_sys_renameat2_args *uap, + register_t *retval) +{ + /* { + syscallarg(int) fromfd; + syscallarg(const char *) from; + syscallarg(int) tofd; + syscallarg(const char *) to; + syscallarg(unsigned int) flags; + } */ + + struct sys_renameat_args ua; + SCARG(&ua, fromfd) = SCARG(uap, fromfd); + SCARG(&ua, from) = SCARG(uap, from); + SCARG(&ua, tofd) = SCARG(uap, tofd); + SCARG(&ua, to) = SCARG(uap, to); + + unsigned int flags = SCARG(uap, flags); + int error; + + if (flags != 0) { + if (flags & ~LINUX_RENAME_ALL) + return EINVAL; + if ((flags & LINUX_RENAME_EXCHANGE) != 0 && + (flags & (LINUX_RENAME_NOREPLACE | LINUX_RENAME_WHITEOUT)) + != 0) + return EINVAL; + /* + * Suppoting renameat2 flags without support from file systems + * becomes a messy affair cause of locks and how VOP_RENAME + * protocol is implemented. So, return EOPNOTSUPP for now. + */ + return EOPNOTSUPP; + } + + error = sys_renameat(l, &ua, retval); + return error; +} + +int linux_sys_copy_file_range(lwp_t *l, + const struct linux_sys_copy_file_range_args *uap, register_t *retval) +{ + /* { + syscallarg(int) fd_in; + syscallarg(unsigned long) off_in; + syscallarg(int) fd_out; + syscallarg(unsigned long) off_out; + syscallarg(size_t) len; + syscallarg(unsigned int) flags; + } */ + + int fd_in, fd_out; + file_t *fp_in, *fp_out; + struct vnode *invp, *outvp; + off_t off_in = 0, off_out = 0; + struct vattr vattr_in, vattr_out; + ssize_t total_copied = 0; + size_t bytes_left, to_copy; + bool have_off_in = false, have_off_out = false; + int error = 0; + size_t len = SCARG(uap, len); + unsigned int flags = SCARG(uap, flags); + // Structures for actual copy + char *buffer = NULL; + struct uio auio; + struct iovec aiov; + + + if (len > SSIZE_MAX) { + DPRINTF("%s: len is greater than SSIZE_MAX\n", + __func__); + return EOVERFLOW; + } + + if(flags != 0) { + DPRINTF("%s: unsupported flags %#x\n", __func__, flags); + return EINVAL; + } + + fd_in = SCARG(uap, fd_in); + fd_out = SCARG(uap, fd_out); + error = fd_getvnode(fd_in, &fp_in); + if (error) { + return error; + } + + error = fd_getvnode(fd_out, &fp_out); + if (error) { + fd_putfile(fd_in); + return error; + } + + invp = fp_in->f_vnode; + outvp = fp_out->f_vnode; + + /* Get attributes of input and output files */ + VOP_GETATTR(invp, &vattr_in, l->l_cred); + VOP_GETATTR(outvp, &vattr_out, l->l_cred); + + /* Check if input and output files are regular files */ + if (vattr_in.va_type == VDIR || vattr_out.va_type == VDIR) { + error = EISDIR; + DPRINTF("%s: Input or output is a directory\n", __func__); + goto out; + } + if ((SCARG(uap, off_in) != NULL && *SCARG(uap, off_in) < 0) || + (SCARG(uap, off_out) != NULL && *SCARG(uap, off_out) < 0) || + vattr_in.va_type != VREG || vattr_out.va_type != VREG) + { + error = EINVAL; + DPRINTF("%s: Invalid offset or file type\n", __func__); + goto out; + } + + if ((fp_in->f_flag & FREAD) == 0 || + (fp_out->f_flag & FWRITE) == 0 || (fp_out->f_flag & FAPPEND) != 0) { + DPRINTF("%s: input file can't be read or output file " + "can't be written\n", __func__); + error = EBADF; + goto out; + } + /* Retrieve and validate offsets if provided */ + if (SCARG(uap, off_in) != NULL) { + error = copyin(SCARG(uap, off_in), &off_in, sizeof(off_in)); + if (error) { + goto out; + } + have_off_in = true; + } + + if (SCARG(uap, off_out) != NULL) { + error = copyin(SCARG(uap, off_out), &off_out, sizeof(off_out)); + if (error) { + goto out; + } + have_off_out = true; + } + + off_t new_size = off_out + len; + if (new_size < 0) { + DPRINTF("%s: New size is greater than OFF_MAX\n", __func__); + error = EFBIG; + goto out; + } + + /* Identify overlapping ranges */ + if ((invp == outvp) && + ((off_in <= off_out && off_in + (off_t)len > off_out) || + (off_in > off_out && off_out + (off_t)len > off_in))) { + DPRINTF("%s: Ranges overlap\n", __func__); + error = EINVAL; + goto out; + } + + buffer = kmem_alloc(LINUX_COPY_FILE_RANGE_MAX_CHUNK, KM_SLEEP); + /* Allocation cannot fail, so no need for error handling? */ + if (buffer == NULL) { + error = ENOMEM; + goto out; + } + + bytes_left = len; + + while (bytes_left > 0) { + to_copy = MIN(bytes_left, LINUX_COPY_FILE_RANGE_MAX_CHUNK); + + /* Lock the input vnode for reading */ + vn_lock(fp_in->f_vnode, LK_SHARED | LK_RETRY); + /* Set up iovec and uio for reading */ + aiov.iov_base = buffer; + aiov.iov_len = to_copy; + auio.uio_iov = &aiov; + auio.uio_iovcnt = 1; + auio.uio_offset = have_off_in ? off_in : fp_in->f_offset; + auio.uio_resid = to_copy; + auio.uio_rw = UIO_READ; + auio.uio_vmspace = l->l_proc->p_vmspace; + UIO_SETUP_SYSSPACE(&auio); + + /* Perform read using vn_read */ + error = VOP_READ(fp_in->f_vnode, &auio, 0, l->l_cred); + VOP_UNLOCK(fp_in->f_vnode); + if (error) { + DPRINTF("%s: Read error %d\n", __func__, error); + break; + } + + size_t read_bytes = to_copy - auio.uio_resid; + if (read_bytes == 0) { + /* EOF reached */ + break; + } + + /* Lock the output vnode for writing */ + vn_lock(fp_out->f_vnode, LK_EXCLUSIVE | LK_RETRY); + /* Set up iovec and uio for writing */ + aiov.iov_base = buffer; + aiov.iov_len = read_bytes; + auio.uio_iov = &aiov; + auio.uio_iovcnt = 1; + auio.uio_offset = have_off_out ? off_out : fp_out->f_offset; + auio.uio_resid = read_bytes; + auio.uio_rw = UIO_WRITE; + auio.uio_vmspace = l->l_proc->p_vmspace; + UIO_SETUP_SYSSPACE(&auio); + + /* Perform the write */ + error = VOP_WRITE(fp_out->f_vnode, &auio, 0, l->l_cred); + VOP_UNLOCK(fp_out->f_vnode); + if (error) { + DPRINTF("%s: Write error %d\n", __func__, error); + break; + } + size_t written_bytes = read_bytes - auio.uio_resid; + total_copied += written_bytes; + bytes_left -= written_bytes; + + /* Update offsets if provided */ + if (have_off_in) { + off_in += written_bytes; + } else { + fp_in->f_offset += written_bytes; + } + if (have_off_out) { + off_out += written_bytes; + } else { + fp_out->f_offset += written_bytes; + } + } + + if (have_off_in) { + /* Adjust user space offset */ + error = copyout(&off_in, SCARG(uap, off_in), sizeof(off_t)); + if (error) { + DPRINTF("%s: Error adjusting user space offset\n", + __func__); + } + goto out; + } + + if (have_off_out) { + /* Adjust user space offset */ + error = copyout(&off_out, SCARG(uap, off_out), sizeof(off_t)); + if (error) { + DPRINTF("%s: Error adjusting user space offset\n", + __func__); + } + } + + *retval = total_copied; +out: + if (buffer) { + kmem_free(buffer, LINUX_COPY_FILE_RANGE_MAX_CHUNK); + } + if (fp_out) { + fd_putfile(fd_out); + } + if (fp_in) { + fd_putfile(fd_in); + } + return error; +} + + #define LINUX_NOT_SUPPORTED(fun) \ int \ fun(struct lwp *l, const struct fun##_args *uap, register_t *retval) \ Index: src/sys/compat/linux/common/linux_misc.c diff -u src/sys/compat/linux/common/linux_misc.c:1.264 src/sys/compat/linux/common/linux_misc.c:1.265 --- src/sys/compat/linux/common/linux_misc.c:1.264 Sat Jun 29 09:46:10 2024 +++ src/sys/compat/linux/common/linux_misc.c Sat Sep 28 15:35:56 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_misc.c,v 1.264 2024/06/29 13:46:10 christos Exp $ */ +/* $NetBSD: linux_misc.c,v 1.265 2024/09/28 19:35:56 christos 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.264 2024/06/29 13:46:10 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.265 2024/09/28 19:35:56 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -169,11 +169,11 @@ const struct linux_mnttypes linux_fstype }; const int linux_fstypes_cnt = sizeof(linux_fstypes) / sizeof(linux_fstypes[0]); -# ifdef DEBUG_LINUX -#define DPRINTF(a) uprintf a -# else -#define DPRINTF(a) -# endif +#ifdef DEBUG_LINUX +#define DPRINTF(a, ...) uprintf(a, __VA_ARGS__) +#else +#define DPRINTF(a, ...) +#endif /* Local linux_misc.c functions: */ static void linux_to_bsd_mmap_args(struct sys_mmap_args *, @@ -2052,8 +2052,8 @@ linux_sys_memfd_create(struct lwp *l, } if (lflags & ~LINUX_MFD_KNOWN_FLAGS) { - DPRINTF(("linux_sys_memfd_create: ignored flags %x\n", - lflags & ~LINUX_MFD_KNOWN_FLAGS)); + DPRINTF("%s: ignored flags %#x\n", __func__, + lflags & ~LINUX_MFD_KNOWN_FLAGS); } SCARG(&muap, name) = SCARG(uap, name); @@ -2171,3 +2171,63 @@ linux_sys_getcpu(lwp_t *l, const struct return 0; } + +int +linux_sys_clone3(struct lwp *l, const struct linux_sys_clone3_args *uap, register_t *retval) +{ + struct linux_user_clone3_args cl_args; + struct linux_sys_clone_args clone_args; + int error; + + if (SCARG(uap, size) != sizeof(cl_args)) { + DPRINTF("%s: Invalid size less or more\n", __func__); + return EINVAL; + } + + error = copyin(SCARG(uap, cl_args), &cl_args, SCARG(uap, size)); + if (error) { + DPRINTF("%s: Copyin failed: %d\n", __func__, error); + return error; + } + + DPRINTF("%sFlags: %#lx\n", (unsigned long)cl_args.flags); + + /* Define allowed flags */ + if (cl_args.flags & LINUX_CLONE_UNIMPLEMENTED_FLAGS) { + DPRINTF("%s: Unsupported flags for clone3: %#x\n", __func__, + cl_args.flags & LINUX_CLONE_UNIMPLEMENTED_FLAGS); + return EOPNOTSUPP; + } + if (cl_args.flags & ~LINUX_CLONE_ALLOWED_FLAGS) { + DPRINTF("%s: Disallowed flags for clone3: %#x\n", __func__, + cl_args.flags & ~LINUX_CLONE_ALLOWED_FLAGS); + return EINVAL; + } + + if ((cl_args.exit_signal & ~(uint64_t)LINUX_CLONE_CSIGNAL) != 0){ + DPRINTF("%s: Disallowed flags for clone3: %#x\n", __func__, + cl_args.exit_signal & ~(uint64_t)LINUX_CLONE_CSIGNAL); + return EINVAL; + } + + if (cl_args.stack == 0 && cl_args.stack_size != 0) { + DPRINTF("%s: Stack is NULL but stack size is not 0\n", + __func__); + return EINVAL; + } + if (cl_args.stack != 0 && cl_args.stack_size == 0) { + DPRINTF("%s: Stack is not NULL but stack size is 0\n", + __func__); + return EINVAL; + } + + int flags = cl_args.flags & LINUX_CLONE_ALLOWED_FLAGS; + int sig = cl_args.exit_signal & LINUX_CLONE_CSIGNAL; + SCARG(&clone_args, flags) = flags | sig; + SCARG(&clone_args, stack) = (void *)cl_args.stack; + SCARG(&clone_args, parent_tidptr) = (void *)cl_args.parent_tid; + SCARG(&clone_args, tls) = (void *)cl_args.tls; + SCARG(&clone_args, child_tidptr) = (void *)cl_args.child_tid; + + return linux_sys_clone(l, &clone_args, retval); +} Index: src/sys/compat/linux/common/linux_sched.h diff -u src/sys/compat/linux/common/linux_sched.h:1.10 src/sys/compat/linux/common/linux_sched.h:1.11 --- src/sys/compat/linux/common/linux_sched.h:1.10 Sun Sep 19 19:51:37 2021 +++ src/sys/compat/linux/common/linux_sched.h Sat Sep 28 15:35:56 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_sched.h,v 1.10 2021/09/19 23:51:37 thorpej Exp $ */ +/* $NetBSD: linux_sched.h,v 1.11 2024/09/28 19:35:56 christos Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -61,6 +61,38 @@ 0x01000000 /* set TID in the child */ #define LINUX_CLONE_STOPPED 0x02000000 /* start in stopped state */ +/* + * Flags that clone supports but are yet to be supported in NetBSD + */ + +#define LINUX_CLONE_PIDFD 0x00001000 /* since Linux 5.2 */ +#define LINUX_CLONE_NEWCGROUP 0x02000000 /* New cgroup NS */ +#define LINUX_CLONE_NEWUTS 0x04000000 +#define LINUX_CLONE_NEWIPC 0x08000000 +#define LINUX_CLONE_NEWUSER 0x10000000 +#define LINUX_CLONE_NEWPID 0x20000000 +#define LINUX_CLONE_NEWNET 0x40000000 +#define LINUX_CLONE_IO 0x80000000 + +/* Flags for the clone3() syscall. */ +#define LINUX_CLONE_CLEAR_SIGHAND 0x100000000ULL +#define LINUX_CLONE_INTO_CGROUP 0x200000000ULL +#define LINUX_CLONE_NEWTIME 0x00000080 + +#define LINUX_CLONE_LEGACY_FLAGS 0xffffffffULL + +#define LINUX_CLONE_ALLOWED_FLAGS ( \ + LINUX_CLONE_VM | LINUX_CLONE_FS | LINUX_CLONE_FILES | \ + LINUX_CLONE_SIGHAND | LINUX_CLONE_THREAD | LINUX_CLONE_VFORK | \ + LINUX_CLONE_PARENT_SETTID | LINUX_CLONE_CHILD_CLEARTID | \ + LINUX_CLONE_CHILD_SETTID | LINUX_CLONE_SETTLS) + +#define LINUX_CLONE_UNIMPLEMENTED_FLAGS ( \ + LINUX_CLONE_NEWNS | LINUX_CLONE_NEWUTS | LINUX_CLONE_NEWIPC | \ + LINUX_CLONE_NEWUSER | LINUX_CLONE_NEWPID | LINUX_CLONE_NEWNET | \ + LINUX_CLONE_PIDFD) + +#define LINUX_CSIGNAL 0x000000ff struct linux_sched_param { int sched_priority; }; @@ -79,6 +111,26 @@ struct linux_itimerspec { struct linux_timespec it_value; }; +struct linux_user_clone3_args { + uint64_t flags; /* Flags bit mask */ + uint64_t pidfd; /* Where to store PID file descriptor (int *) */ + uint64_t child_tid; /* Where to store child TID, in child's memory + (pid_t *) */ + uint64_t parent_tid; /* Where to store child TID, in parent's memory + (pid_t *) */ + uint64_t exit_signal; /* Signal to deliver to parent on child + termination */ + uint64_t stack; /* Pointer to lowest byte of stack */ + uint64_t stack_size; /* Size of stack */ + uint64_t tls; /* Location of new TLS */ + uint64_t set_tid; /* Pointer to a pid_t array (since Linux 5.5) */ + uint64_t set_tid_size; /* Number of elements in set_tid (since Linux + 5.5) */ + uint64_t cgroup; /* File descriptor for target cgroup of child + (since Linux 5.7) */ +}; + + #define LINUX_CLOCK_REALTIME 0 #define LINUX_CLOCK_MONOTONIC 1 #define LINUX_CLOCK_PROCESS_CPUTIME_ID 2