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