Subject: Re: FreeBSD emulation broken?
To: None <khym@bga.com>
From: enami tsugutomo <enami@but-b.or.jp>
List: port-i386
Date: 10/18/1997 22:15:51
Date: Sat, 18 Oct 97 7:00:19 WET DST
From: Dave Huang <khym@bga.com>
FreeBSD emulation seems to be broken on my October 17 kernel; almost
all FreeBSD programs get a bus error and dump core. Is it working for
anyone else? One program that doesn't always core is
/emul/freebsd/sbin/ldconfig. If I run ldconfig -h, it prints the usage
message, but plain ldconfig cores.
It seems that argument for freebsd stat, lstat and fstat should be
struct stat12 instead of struct stat.
How about following changes? It seems work for me.
# note that it contains only diffs for source file; you need to run `sh
# ../../kern/makesyscalls.sh syscalls.conf syscalls.master' in
# sys/compat/freebsd.
enami.
Index: syscalls.master
===================================================================
RCS file: /cvsroot/src/sys/compat/freebsd/syscalls.master,v
retrieving revision 1.11
diff -c -r1.11 syscalls.master
*** syscalls.master 1997/10/16 23:48:18 1.11
--- syscalls.master 1997/10/18 13:07:39
***************
*** 351,359 ****
186 UNIMPL
187 UNIMPL
#endif
! 188 STD { int freebsd_sys_stat(char *path, struct stat *ub); }
! 189 NOARGS { int sys_fstat(int fd, struct stat *sb); }
! 190 STD { int freebsd_sys_lstat(char *path, struct stat *ub); }
191 STD { int freebsd_sys_pathconf(char *path, int name); }
192 NOARGS { int sys_fpathconf(int fd, int name); }
193 UNIMPL
--- 351,362 ----
186 UNIMPL
187 UNIMPL
#endif
! 188 STD { int freebsd_sys_stat(char *path, \
! struct stat12 *ub); }
! 189 NOARGS { int compat_12_sys_fstat(int fd, \
! struct stat12 *sb); }
! 190 STD { int freebsd_sys_lstat(char *path, \
! struct stat12 *ub); }
191 STD { int freebsd_sys_pathconf(char *path, int name); }
192 NOARGS { int sys_fpathconf(int fd, int name); }
193 UNIMPL
Index: freebsd_file.c
===================================================================
RCS file: /cvsroot/src/sys/compat/freebsd/freebsd_file.c,v
retrieving revision 1.7
diff -c -r1.7 freebsd_file.c
*** freebsd_file.c 1997/10/16 23:48:22 1.7
--- freebsd_file.c 1997/10/18 13:07:40
***************
*** 566,577 ****
{
struct freebsd_sys_stat_args /* {
syscallarg(char *) path;
! syscallarg(struct stat *) ub;
} */ *uap = v;
caddr_t sg = stackgap_init(p->p_emul);
FREEBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
! return sys_stat(p, uap, retval);
}
int
--- 566,577 ----
{
struct freebsd_sys_stat_args /* {
syscallarg(char *) path;
! syscallarg(struct stat12 *) ub;
} */ *uap = v;
caddr_t sg = stackgap_init(p->p_emul);
FREEBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
! return compat_12_sys_stat(p, uap, retval);
}
int
***************
*** 582,593 ****
{
struct freebsd_sys_lstat_args /* {
syscallarg(char *) path;
! syscallarg(struct stat *) ub;
} */ *uap = v;
caddr_t sg = stackgap_init(p->p_emul);
FREEBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
! return sys_lstat(p, uap, retval);
}
int
--- 582,593 ----
{
struct freebsd_sys_lstat_args /* {
syscallarg(char *) path;
! syscallarg(struct stat12 *) ub;
} */ *uap = v;
caddr_t sg = stackgap_init(p->p_emul);
FREEBSD_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
! return compat_12_sys_lstat(p, uap, retval);
}
int