Module Name: src Committed By: pooka Date: Mon Feb 21 23:20:20 UTC 2011
Modified Files: src/sys/kern: makesyscalls.sh syscalls.master Log Message: Add syscall type NOERR which signals that a system call is STD but does not return an errno the usual way. The main use case is to fix the posix_fadvise() rump stub (yes, posix_fadvise is a bit special... bologna). The list of NOERR syscalls currently matches the libc NOERR list (and the libc Makefile can in the future be autogenerated from this info). Problem spotted by, *shocker*, the automated test runs, specifically the posix_fadvise test. To generate a diff of this commit: cvs rdiff -u -r1.110 -r1.111 src/sys/kern/makesyscalls.sh cvs rdiff -u -r1.244 -r1.245 src/sys/kern/syscalls.master Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/makesyscalls.sh diff -u src/sys/kern/makesyscalls.sh:1.110 src/sys/kern/makesyscalls.sh:1.111 --- src/sys/kern/makesyscalls.sh:1.110 Mon Feb 21 11:29:53 2011 +++ src/sys/kern/makesyscalls.sh Mon Feb 21 23:20:19 2011 @@ -1,5 +1,5 @@ #! /bin/sh - -# $NetBSD: makesyscalls.sh,v 1.110 2011/02/21 11:29:53 pooka Exp $ +# $NetBSD: makesyscalls.sh,v 1.111 2011/02/21 23:20:19 pooka Exp $ # # Copyright (c) 1994, 1996, 2000 Christopher G. Demetriou # All rights reserved. @@ -717,7 +717,8 @@ > sysnamesbottom # output syscall number of header, if appropriate - if (type == "STD" || type == "NOARGS" || type == "INDIR") { + if (type == "STD" || type == "NOARGS" || type == "INDIR" || \ + type == "NOERR") { # output a prototype, to be used to generate lint stubs in # libc. printproto("") @@ -776,8 +777,9 @@ } printf("%s %s)\n", uncompattype(argtype[argc]), argname[argc]) \ > rumpcalls - printf("{\n\tregister_t rval[2] = {0, 0};\n\tint error = 0;\n") \ - > rumpcalls + printf("{\n\tregister_t rval[2] = {0, 0};\n") > rumpcalls + if (returntype != "void") + printf("\tint error = 0;\n") > rumpcalls argarg = "NULL" argsize = 0; @@ -805,20 +807,29 @@ } else { printf("\n") > rumpcalls } - printf("\terror = rsys_syscall(%s%s%s, " \ + printf("\t") > rumpcalls + if (returntype != "void") + printf("error = ") > rumpcalls + printf("rsys_syscall(%s%s%s, " \ "%s, %s, rval);\n", constprefix, compatwrap_, funcalias, \ argarg, argsize) > rumpcalls - printf("\trsys_seterrno(error);\n") > rumpcalls - printf("\tif (error) {\n\t\trval[0] = -1;\n\t}\n") > rumpcalls + if (type != "NOERR") { + printf("\trsys_seterrno(error);\n") > rumpcalls + printf("\tif (error) {\n\t\trval[0] = -1;\n\t}\n") > rumpcalls + rvariable = "rval[0]"; + } else { + rvariable = "error"; + } if (returntype != "void") { - printf("\treturn rval[0];\n") > rumpcalls + printf("\treturn %s;\n", rvariable) > rumpcalls } printf("}\n") > rumpcalls printf("rsys_alias(%s%s,rump_enosys)\n", \ compatwrap_, funcname) > rumpcalls } -$2 == "STD" || $2 == "NODEF" || $2 == "NOARGS" || $2 == "INDIR" { +$2 == "STD" || $2 == "NODEF" || $2 == "NOARGS" || $2 == "INDIR" \ + || $2 == "NOERR" { parseline() putent($2, "") syscall++ Index: src/sys/kern/syscalls.master diff -u src/sys/kern/syscalls.master:1.244 src/sys/kern/syscalls.master:1.245 --- src/sys/kern/syscalls.master:1.244 Mon Feb 21 12:49:06 2011 +++ src/sys/kern/syscalls.master Mon Feb 21 23:20:19 2011 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.244 2011/02/21 12:49:06 pooka Exp $ + $NetBSD: syscalls.master,v 1.245 2011/02/21 23:20:19 pooka Exp $ ; @(#)syscalls.master 8.2 (Berkeley) 1/13/94 @@ -13,7 +13,7 @@ ; Optional fields are specified after the type field ; (NOTE! they *must* be specified in this order): ; MODULAR:attempt to autoload system call if not present -; RUMP: the system call can be called directly from rumps +; RUMP: generate rump syscall entry point ; ; types: ; STD always included @@ -25,6 +25,7 @@ ; NOARGS included, but don't define the syscall args structure ; INDIR included, but don't define the syscall args structure, ; and allow it to be "really" varargs. +; NOERR included, syscall does not set errno ; ; arguments: ; PAD argument not part of the C interface, used only for padding @@ -90,13 +91,13 @@ long bufsize, int flags); } 19 COMPAT_43 MODULAR { long|sys||lseek(int fd, long offset, int whence); }\ olseek -20 STD RUMP { pid_t|sys||getpid_with_ppid(void); } getpid +20 NOERR RUMP { pid_t|sys||getpid_with_ppid(void); } getpid 21 COMPAT_40 MODULAR { int|sys||mount(const char *type, const char *path, \ int flags, void *data); } 22 STD RUMP { int|sys||unmount(const char *path, int flags); } 23 STD RUMP { int|sys||setuid(uid_t uid); } -24 STD RUMP { uid_t|sys||getuid_with_euid(void); } getuid -25 STD RUMP { uid_t|sys||geteuid(void); } +24 NOERR RUMP { uid_t|sys||getuid_with_euid(void); } getuid +25 NOERR RUMP { uid_t|sys||geteuid(void); } 26 STD { int|sys||ptrace(int req, pid_t pid, void *addr, \ int data); } 27 STD RUMP { ssize_t|sys||recvmsg(int s, struct msghdr *msg, \ @@ -115,16 +116,16 @@ 33 STD RUMP { int|sys||access(const char *path, int flags); } 34 STD RUMP { int|sys||chflags(const char *path, u_long flags); } 35 STD RUMP { int|sys||fchflags(int fd, u_long flags); } -36 STD RUMP { void|sys||sync(void); } +36 NOERR RUMP { void|sys||sync(void); } 37 STD { int|sys||kill(pid_t pid, int signum); } 38 COMPAT_43 MODULAR { int|sys||stat(const char *path, struct stat43 *ub); } \ stat43 -39 STD RUMP { pid_t|sys||getppid(void); } +39 NOERR RUMP { pid_t|sys||getppid(void); } 40 COMPAT_43 MODULAR { int|sys||lstat(const char *path, \ struct stat43 *ub); } lstat43 41 STD RUMP { int|sys||dup(int fd); } 42 STD RUMP { int|sys||pipe(void); } -43 STD RUMP { gid_t|sys||getegid(void); } +43 NOERR RUMP { gid_t|sys||getegid(void); } 44 STD { int|sys||profil(char *samples, size_t size, \ u_long offset, u_int scale); } 45 STD { int|sys||ktrace(const char *fname, int ops, \ @@ -132,7 +133,7 @@ 46 COMPAT_13 MODULAR { int|sys||sigaction(int signum, \ const struct sigaction13 *nsa, \ struct sigaction13 *osa); } sigaction13 -47 STD RUMP { gid_t|sys||getgid_with_egid(void); } getgid +47 NOERR RUMP { gid_t|sys||getgid_with_egid(void); } getgid 48 COMPAT_13 MODULAR { int|sys||sigprocmask(int how, \ int mask); } sigprocmask13 49 STD RUMP { int|sys||__getlogin(char *namebuf, size_t namelen); } @@ -588,7 +589,7 @@ 303 EXCL __shmctl13 #endif 304 STD RUMP { int|sys||lchflags(const char *path, u_long flags); } -305 STD RUMP { int|sys||issetugid(void); } +305 NOERR RUMP { int|sys||issetugid(void); } 306 STD { int|sys||utrace(const char *label, void *addr, \ size_t len); } 307 STD { int|sys||getcontext(struct __ucontext *ucp); } @@ -789,7 +790,7 @@ psetid_t *opsid); } 415 STD { int|sys||_pset_bind(idtype_t idtype, id_t first_id, \ id_t second_id, psetid_t psid, psetid_t *opsid); } -416 STD RUMP { int|sys|50|posix_fadvise(int fd, int PAD, \ +416 NOERR RUMP { int|sys|50|posix_fadvise(int fd, int PAD, \ off_t offset, off_t len, int advice); } 417 STD RUMP { int|sys|50|select(int nd, fd_set *in, fd_set *ou, \ fd_set *ex, struct timeval *tv); }