Date: Sun, 8 Oct 1995 11:35:48 +1000 From: Bruce Evans <bde@zeta.org.au> To: CVS-commiters@freefall.freebsd.org, cvs-sys@freefall.freebsd.org, swallace@freefall.freebsd.org Subject: Re: cvs commit: src/sys/kern kern_exit.c uipc_syscalls.c Message-ID: <199510080135.LAA10967@godzilla.zeta.org.au>
next in thread | raw e-mail | index | archive | help
> Modified: sys/kern kern_exit.c uipc_syscalls.c > Log: > Remove compat_43 psuedo-argument hack, and replace with a better hack. > Instead of using a fake "compat" argument, pass a real compat int to function > if COMPAT_43 is defined. Functions involved: wait4, accept, recvfrom, > getsockname. The global changes related to this get in my way a bit. I include <sys/sysproto.h> everywhere necessary, and yesterday's changes caused errors for about 200 out of 220 syscalls. Most were for redefined arg structs. I hoped to reduce the number of changes by leaving the old bogusly placed arg struct declarations alone until later (I have about 500K of diffs for prototype-related changes in 350 files to commit when the 2.1 release stops getting in the way of current development). Some of the errors were for real inconsistencies. E.g., fcntl() is declared as having type `int fcntl(int fd, int cmd, void *arg)' in syscalls.master but its type is actually `int fcntl(int fd, int cmd, ...)' although it is documented as having type `int fcntl(int fd, int cmd, int arg)' in fcntl.1. The version with `int arg' is implemented (using bogus casts that fail when ints are 32 bits and pointers is 64 bits to convert `arg' to a pointer when the actual arg was a pointer). This breaks messily when there is a correct prototype in scope. In 4.4lite2 and presumably in NetBSD, fcntl() is implemented to support the `void *' version. The bogus handling of types is enshrined in syscallarg() and SCARG() macros. Many changes are required, and the type system is abused more than before :-(. The correct way to handle all this is to pass around `void *' args and cast them to pointers to the appropriate structs. If inline functions are allowed, then the casts and the uap's can be hidden inside automatically generated inline functions so that the sources look simple. > With the compat psuedo-argument, this introduces an argument structure > that can have two possible sizes depending on compat options. I was just looking at the compat kludge when I gave up on this last night. > This makes life difficult for lkm modules like ibcs2, which would > have to guess what size used in kernel when compiled. Also, > the prototype generator for these structures cannot generate proper sizes. > > Now there is only one fixed structure and makes everybody happy. Good. There is no such thing as a variant struct, `compat' is `#if defined(COMPAT_43) || defined(COMPAT_IBCS2)' in <sys/systm.h> although it is used in all cases. The args struct declarations in <sys/systm.h> are another thing that break when <sys/sysproto.h> is included enough. > I recommend these changes be introduced to 2.1 so that ibcs2, linux > lkm's generated for 2.2 can still run on a 2.1 kernel. This area will change a lot soon. I doubt that 2.2 lkms will remain compatible for long. I think mine are already calling functions that don't exist in current, and I only added a few functions because the existing ones cause type mismatches if prototypes are in scope. ibcs2 currently causes about 200 lines of warnings here (with prototypes for all the syscall functions are in scope). These are mainly for passing args of the wrong type to fcntl(), ioctl() and lseek(). This is particularly annoying because the args must be repacked for these functions and it would be easy to pack them into the correct structs. Have you fixed some of these problems? There are suites of syscall type mismatches for the standard syscalls and for each emulated suite of syscalls. I hope to only have to fix the standard ones. Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199510080135.LAA10967>