Subject: kern/8622: FreeBSD compat support fails for FreeBSD-current binaries.
To: None <gnats-bugs@gnats.netbsd.org>
From: None <paul@plectere.com>
List: netbsd-bugs
Date: 10/13/1999 22:33:53
>Number: 8622
>Category: kern
>Synopsis: FreeBSD -current binaries crash.
>Confidential: no
>Severity: critical
>Priority: medium
>Responsible: kern-bug-people (Kernel Bug People)
>State: open
>Class: change-request
>Submitter-Id: net
>Arrival-Date: Wed Oct 13 22:33:00 1999
>Last-Modified:
>Originator: Paul Shupak
>Organization:
>Release: NetBSD-current Mon Oct 11 1999
>Environment:
System: NetBSD cobalt 1.4L NetBSD 1.4L (COBALT) #211: Mon Oct 11 19:32:36 PDT 1999 paul@cobalt:/usr/src/sys/arch/i386/compile/COBALT i386
>Description:
FreeBSD -current has added several new (to FreeBSD) systems calls.
These calls cause binaries to fail (i.e. exit w/ SIGSYS).
>How-To-Repeat:
Run a FreeBSD-current "/bin/pwd"
>Fix:
The following patches allow most FreeBSD -current programs to run again.
( notable exceptions are "sysctl" and some instances of "dd" )
tested only on i386, not Alpha.
*** files.freebsd-ORIG Mon Oct 11 19:15:07 1999
--- files.freebsd Mon Oct 11 19:26:05 1999
***************
*** 16 ****
--- 16,17 ----
file compat/freebsd/freebsd_syscalls.c compat_freebsd
+ file compat/freebsd/freebsd_sigaction.c compat_freebsd
*** /dev/null Wed Oct 13 02:08:53 1999
--- freebsd_sigaction.h Mon Oct 11 19:27:38 1999
***************
*** 0 ****
--- 1,16 ----
+ /* $NetBSD: freebsd_sigaction.h,v 1.0 1999/10/05 23:59:59 paul Exp $ */
+
+ #ifndef _FREEBSD_SIGACTION_H
+ #define _FREEBSD_SIGACTION_H 1
+
+ #ifdef _KERNEL
+
+ struct freebsd_sigaction { /* A lie, but good enough */
+ void (*sa_handler) __P((int)); /* signal handler */
+ int sa_flags;
+ sigset_t sa_mask; /* signal mask to apply */
+ };
+
+ #endif /* !_KERNEL */
+
+ #endif /* _FREEBSD_SIGACTION_H */
*** /dev/null Wed Oct 13 02:08:53 1999
--- freebsd_sigaction.c Mon Oct 11 19:28:52 1999
***************
*** 0 ****
--- 1,79 ----
+ /* $NetBSD: freebsd_sigaction.c,v 1.0 1999/10/05 23:59:59 paul Exp $ */
+
+ #include <sys/param.h>
+ #include <sys/systm.h>
+ #include <sys/proc.h>
+ #include <sys/filedesc.h>
+ #include <sys/mount.h>
+ #include <sys/kernel.h>
+ #include <sys/signal.h>
+ #include <sys/signalvar.h>
+
+ #include <sys/syscallargs.h>
+
+ #include <compat/freebsd/freebsd_sigaction.h>
+ #include <compat/freebsd/freebsd_syscallargs.h>
+
+ static void freebsd_to_native_sigaction __P(( struct sigaction *pnsa,
+ const struct freebsd_sigaction *pfsa));
+ static void native_to_freebsd_sigaction __P(( struct freebsd_sigaction *pfsa,
+ const struct sigaction *pnsa));
+
+ static void
+ freebsd_to_native_sigaction(pnsa, pfsa)
+ struct sigaction *pnsa;
+ const struct freebsd_sigaction *pfsa;
+ {
+ pnsa->sa_handler = pfsa->sa_handler;
+ pnsa->sa_flags = pfsa->sa_flags;
+ memcpy(&pnsa->sa_mask, &pfsa->sa_mask, sizeof pnsa->sa_mask);
+
+ return;
+ }
+
+ static void
+ native_to_freebsd_sigaction(pfsa, pnsa)
+ struct freebsd_sigaction *pfsa;
+ const struct sigaction *pnsa;
+ {
+ pfsa->sa_handler = pnsa->sa_handler;
+ pfsa->sa_flags = pnsa->sa_flags;
+ memcpy(&pfsa->sa_mask, &pnsa->sa_mask, sizeof pnsa->sa_mask);
+
+ return;
+ }
+
+ /* ARGSUSED */
+ int
+ freebsd_sys__sigaction(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+ {
+ struct freebsd_sys__sigaction_args /* {
+ syscallarg(int) signum;
+ syscallarg(const struct freebsd_sigaction *) nsa;
+ syscallarg(struct freebsd_sigaction *) osa;
+ } */ *uap = v;
+ struct sigaction nsa, osa;
+ struct freebsd_sigaction nfsa, ofsa;
+ int error;
+
+ if (SCARG(uap, nsa)) {
+ error = copyin(SCARG(uap, nsa), &nfsa, sizeof nfsa);
+ if (error)
+ return error;
+ freebsd_to_native_sigaction(&nsa, &nfsa);
+ }
+ error = sigaction1(p, SCARG(uap, signum),
+ SCARG(uap, nsa) ? &nsa : 0, SCARG(uap, osa) ? &osa : 0);
+ if (error)
+ return error;
+ if (SCARG(uap, osa)) {
+ native_to_freebsd_sigaction(&ofsa, &osa);
+ error = copyout(&ofsa, SCARG(uap, osa), sizeof ofsa);
+ if (error)
+ return error;
+ }
+ return 0;
+ }
*** syscalls.master-ORIG Wed Aug 25 04:44:18 1999
--- syscalls.master Mon Oct 11 17:53:25 1999
***************
*** 291,295 ****
; Some of these calls are now supported by BSD...
! 151 UNIMPL
! 152 UNIMPL
! 153 UNIMPL
154 UNIMPL
--- 291,295 ----
; Some of these calls are now supported by BSD...
! 151 UNIMPL sem_lock
! 152 UNIMPL sem_wakeup
! 153 UNIMPL asyncdaemon
154 UNIMPL
***************
*** 298,300 ****
#else
! 155 UNIMPL
#endif
--- 298,300 ----
#else
! 155 UNIMPL nfssvc
#endif
***************
*** 345,353 ****
172 UNIMPL
! 173 UNIMPL
! 174 UNIMPL
175 UNIMPL
176 STD { int freebsd_ntp_adjtime(struct freebsd_timex *tp); }
! 177 UNIMPL
! 178 UNIMPL
! 179 UNIMPL
180 UNIMPL
--- 345,355 ----
172 UNIMPL
! 173 NOARGS { ssize_t sys_pread(int fd, void *buf, \
! size_t nbyte, int pad, off_t offset); }
! 174 NOARGS { ssize_t sys_pwrite(int fd, const void *buf, \
! size_t nbyte, int pad, off_t offset); }
175 UNIMPL
176 STD { int freebsd_ntp_adjtime(struct freebsd_timex *tp); }
! 177 UNIMPL sfork
! 178 UNIMPL getdescriptor
! 179 UNIMPL setdescriptor
180 UNIMPL
***************
*** 366,371 ****
#else
! 184 UNIMPL
! 185 UNIMPL
! 186 UNIMPL
! 187 UNIMPL
#endif
--- 368,373 ----
#else
! 184 UNIMPL lfs_bmapv
! 185 UNIMPL lfs_markv
! 186 UNIMPL lfs_segclean
! 187 UNIMPL lfs_segwait
#endif
***************
*** 401,403 ****
#else
! 205 UNIMPL
#endif
--- 403,405 ----
#else
! 205 UNIMPL undelete
#endif
***************
*** 492,494 ****
; syscall numbers initially used in OpenBSD
! 250 UNIMPL minherit
251 UNIMPL rfork
--- 494,497 ----
; syscall numbers initially used in OpenBSD
! 250 NOARGS { int sys_minherit(void *addr, size_t len, \
! int inherit); }
251 UNIMPL rfork
***************
*** 542,546 ****
296 UNIMPL
! 297 UNIMPL
! 298 UNIMPL
! 299 UNIMPL
; syscall numbers for FreeBSD
--- 545,551 ----
296 UNIMPL
! 297 NOARGS { int sys_fhstatfs(const fhandle_t *fhp, \
! struct statfs *buf); }
! 298 NOARGS { int sys_fhopen(const fhandle_t *fhp, int flags); }
! 299 NOARGS { int sys_fhstat(const fhandle_t *fhp, \
! struct stat *sb); }
; syscall numbers for FreeBSD
***************
*** 556,558 ****
309 UNIMPL kldfirstmod
! 310 UNIMPL getsid
311 UNIMPL setresuid
--- 561,563 ----
309 UNIMPL kldfirstmod
! 310 NOARGS { pid_t sys_getsid(pid_t pid); }
311 UNIMPL setresuid
***************
*** 570,574 ****
323 UNIMPL thr_wakeup
! 324 UNIMPL mlockall
! 325 UNIMPL munlockall
! 326 UNIMPL __getcwd
327 UNIMPL sched_setparam
--- 575,579 ----
323 UNIMPL thr_wakeup
! 324 NOARGS { int sys_mlockall(int flags); }
! 325 NOARGS { int sys_munlockall(void); }
! 326 NOARGS { int sys___getcwd(char *bufp, size_t length); }
327 UNIMPL sched_setparam
***************
*** 584 ****
--- 589,602 ----
337 UNIMPL kldsym
+ 338 UNIMPL jail
+ 339 UNIMPL pioctl
+ 340 NOARGS { int sys___sigprocmask14(int how, \
+ const sigset_t *set, \
+ sigset_t *oset); }
+ 341 NOARGS { int sys___sigsuspend14(const sigset_t *set); }
+ 342 STD { int freebsd_sys__sigaction(int signum, \
+ const struct freebsd_sigaction *nsa, \
+ struct freebsd_sigaction *osa); }
+ 343 NOARGS { int sys___sigpending14(sigset_t *set); }
+ 344 UNIMPL sigreturn
+ 345 UNIMPL sigtimedwait
+ 346 UNIMPL sigwaitinfo
>Audit-Trail:
>Unformatted: