kern/91293: [svr4] [patch] *Experimental* Update to the SVR4 emulation (from NetBSD)

Pedro F. Giffuni giffunip at asme.org
Fri Mar 17 23:50:22 UTC 2006


The following reply was made to PR kern/91293; it has been noted by GNATS.

From: "Pedro F. Giffuni" <giffunip at asme.org>
To: bug-followup at FreeBSD.org
Cc:  
Subject: Re: kern/91293: [svr4] [patch] *Experimental* Update to the SVR4
 emulation (from NetBSD)
Date: Fri, 17 Mar 2006 18:40:47 -0500

 Yet another update:
 
 This new patch compiled cleanly on my QEMU test environment by cleaning 
 out more NetBSD dependent code,
 
 Unfortunately my execution tests were nonconclusive as the combination 
 of old shared libraries (from a deprecated linux svr4 kit) and a recent 
 executable (unzip) core dump with and without my patches! I think the 
 patch is ready but we still lack testing.
 ________
 
 diff -ru svr4.orig/svr4_misc.c svr4/svr4_misc.c
 --- svr4.orig/svr4_misc.c    Tue Jan  3 16:41:01 2006
 +++ svr4/svr4_misc.c    Tue Jan  3 21:33:41 2006
 @@ -369,7 +369,7 @@
              svr4_dirent.d_off = (svr4_off_t)(off + reclen);
              svr4_dirent.d_reclen = (u_short) svr4reclen;
          }
 -        strcpy(svr4_dirent.d_name, bdp->d_name);
 +        strlcpy(svr4_dirent.d_name, bdp->d_name, 
 sizeof(svr4_dirent.d_name));
          if ((error = copyout((caddr_t)&svr4_dirent, outp, svr4reclen)))
              goto out;
          inp += reclen;
 @@ -483,7 +483,10 @@
          reclen = bdp->d_reclen;
          if (reclen & 3)
              panic("svr4_sys_getdents64: bad reclen");
 -        off = *cookie++;    /* each entry points to the next */
 +        if (cookie)
 +            off = *cookie++;    /* each entry points to the next */
 +        else
 +            off += reclen;
          if ((off >> 32) != 0) {
              uprintf("svr4_sys_getdents64: dir offset too large for 
 emulated program");
              error = EINVAL;
 @@ -507,7 +510,7 @@
          idb.d_ino = (svr4_ino_t)bdp->d_fileno;
          idb.d_off = (svr4_off_t)off;
          idb.d_reclen = (u_short)svr4_reclen;
 -        strcpy(idb.d_name, bdp->d_name);
 +        strlcpy(idb.d_name, bdp->d_name,sizeof(idb.d_name));
          if ((error = copyout((caddr_t)&idb, outp, svr4_reclen)))
              goto out;
          /* advance past this real entry */
 @@ -781,7 +784,45 @@
  #endif
          break;
  #endif /* NOTYET */
 -
 +    case SVR4_CONFIG_COHERENCY:
 +        *retval = 0;    /* XXX */
 +        break;
 +    case SVR4_CONFIG_SPLIT_CACHE:
 +        *retval = 0;    /* XXX */
 +        break;
 +    case SVR4_CONFIG_ICACHESZ:
 +        *retval = 256;    /* XXX */
 +        break;
 +    case SVR4_CONFIG_DCACHESZ:
 +        *retval = 256;    /* XXX */
 +        break;
 +    case SVR4_CONFIG_ICACHELINESZ:
 +        *retval = 64;    /* XXX */
 +        break;
 +    case SVR4_CONFIG_DCACHELINESZ:
 +        *retval = 64;    /* XXX */
 +        break;
 +    case SVR4_CONFIG_ICACHEBLKSZ:
 +        *retval = 64;    /* XXX */
 +        break;
 +    case SVR4_CONFIG_DCACHEBLKSZ:
 +        *retval = 64;    /* XXX */
 +        break;
 +    case SVR4_CONFIG_DCACHETBLKSZ:
 +        *retval = 64;    /* XXX */
 +        break;
 +    case SVR4_CONFIG_ICACHE_ASSOC:
 +        *retval = 1;    /* XXX */
 +        break;
 +    case SVR4_CONFIG_DCACHE_ASSOC:
 +        *retval = 1;    /* XXX */
 +        break;
 +    case SVR4_CONFIG_MAXPID:
 +        *retval = PID_MAX;
 +        break;
 +    case SVR4_CONFIG_STACK_PROT:
 +        *retval = PROT_READ|PROT_WRITE|PROT_EXEC;
 +        break;
      default:
          return EINVAL;
      }
 @@ -1664,6 +1705,6 @@
      *retval = ncopy;
  bad:
      NDFREE(&nd, NDF_ONLY_PNBUF);
 -    vput(nd.ni_vp);
 +    vrele(nd.ni_vp);
      return error;
  }
 diff -ru svr4.orig/svr4_resource.c svr4/svr4_resource.c
 --- svr4.orig/svr4_resource.c    Tue Jan  3 16:41:01 2006
 +++ svr4/svr4_resource.c    Tue Jan  3 18:27:46 2006
 @@ -127,7 +127,7 @@
  
  int
  svr4_sys_getrlimit(td, uap)
 -    register struct thread *td;
 +    struct thread *td;
      struct svr4_sys_getrlimit_args *uap;
  {
      int rl = svr4_to_native_rl(uap->which);
 @@ -174,7 +174,7 @@
  
  int
  svr4_sys_setrlimit(td, uap)
 -    register struct thread *td;
 +    struct thread *td;
      struct svr4_sys_setrlimit_args *uap;
  {
      int rl = svr4_to_native_rl(uap->which);
 @@ -225,7 +225,7 @@
  
  int
  svr4_sys_getrlimit64(td, uap)
 -    register struct thread *td;
 +    struct thread *td;
      struct svr4_sys_getrlimit64_args *uap;
  {
      int rl = svr4_to_native_rl(uap->which);
 @@ -272,7 +272,7 @@
  
  int
  svr4_sys_setrlimit64(td, uap)
 -    register struct thread *td;
 +    struct thread *td;
      struct svr4_sys_setrlimit64_args *uap;
  {
      int rl = svr4_to_native_rl(uap->which);
 diff -ru svr4.orig/svr4_signal.c svr4/svr4_signal.c
 --- svr4.orig/svr4_signal.c    Tue Jan  3 16:41:01 2006
 +++ svr4/svr4_signal.c    Tue Jan  3 21:59:52 2006
 @@ -560,7 +560,6 @@
              uap->uc));
          return ENOSYS;
      }
 -    return 0;
  }
  
  int
 diff -ru svr4.orig/svr4_socket.c svr4/svr4_socket.c
 --- svr4.orig/svr4_socket.c    Tue Jan  3 16:41:01 2006
 +++ svr4/svr4_socket.c    Tue Jan  3 18:44:04 2006
 @@ -114,7 +114,8 @@
      struct stat *st;
  {
      struct svr4_sockcache_entry *e;
 -    int len, error;
 +    size_t len;
 +    int error;
  
      mtx_lock(&Giant);
  
 diff -ru svr4.orig/svr4_stat.c svr4/svr4_stat.c
 --- svr4.orig/svr4_stat.c    Tue Jan  3 16:41:01 2006
 +++ svr4/svr4_stat.c    Tue Jan  3 19:33:39 2006
 @@ -444,9 +450,21 @@
      case SVR4_SI_ARCHITECTURE:
          str = machine;
          break;
 +    case SVR4_SI_ISALIST:
 +#if defined(__sparc__)
 +        str = "sparcv9 sparcv9-fsmuld sparcv8 sparcv8-fsmuld sparcv7 
 sparc";
 +#elif defined(__i386__)
 +        str = "i386";
 +#elif defined(__amd64__)
 +        str = "amd64";
 +#else
 +        str = "unknown";
 +       #endif
 +                       break;
  
      case SVR4_SI_HW_SERIAL:
 -        str = "0";
 +        snprintf(buf, sizeof(buf), "%lu", hostid);
 +        str = buf;
          break;
  
      case SVR4_SI_HW_PROVIDER:
 @@ -543,7 +561,6 @@
      default:
          return ENOSYS;
      }
 -    return ENOSYS;
  }
  
  
 diff -ru svr4.orig/svr4_sysconfig.h svr4/svr4_sysconfig.h
 --- svr4.orig/svr4_sysconfig.h    Tue Jan  3 16:41:01 2006
 +++ svr4/svr4_sysconfig.h    Tue Jan  3 22:25:50 2006
 @@ -43,20 +43,36 @@
  #define SVR4_CONFIG_PROF_TCK        0x0a
  #define SVR4_CONFIG_NPROC_CONF        0x0b
  #define    SVR4_CONFIG_NPROC_ONLN        0x0c
 -#define    SVR4_CONFIG_AIO_LISTIO_MAX    0x0e
 -#define    SVR4_CONFIG_AIO_MAX        0x0f
 -#define    SVR4_CONFIG_AIO_PRIO_DELTA_MAX    0x10
 -#define    SVR4_CONFIG_DELAYTIMER_MAX    0x11
 -#define    SVR4_CONFIG_MQ_OPEN_MAX        0x12
 -#define    SVR4_CONFIG_MQ_PRIO_MAX        0x13
 -#define    SVR4_CONFIG_RTSIG_MAX        0x14
 -#define    SVR4_CONFIG_SEM_NSEMS_MAX    0x15
 -#define    SVR4_CONFIG_SEM_VALUE_MAX    0x16
 -#define    SVR4_CONFIG_SIGQUEUE_MAX    0x17
 -#define    SVR4_CONFIG_SIGRT_MIN        0x18
 -#define    SVR4_CONFIG_SIGRT_MAX        0x19
 -#define    SVR4_CONFIG_TIMER_MAX        0x20
 -#define    SVR4_CONFIG_PHYS_PAGES        0x21
 -#define    SVR4_CONFIG_AVPHYS_PAGES    0x22
 +#define    SVR4_CONFIG_AIO_LISTIO_MAX    0x0d
 +#define    SVR4_CONFIG_AIO_MAX        0x0e
 +#define    SVR4_CONFIG_AIO_PRIO_DELTA_MAX    0x0f
 +#define    SVR4_CONFIG_DELAYTIMER_MAX    0x10
 +#define    SVR4_CONFIG_MQ_OPEN_MAX        0x11
 +#define    SVR4_CONFIG_MQ_PRIO_MAX        0x12
 +#define    SVR4_CONFIG_RTSIG_MAX        0x13
 +#define    SVR4_CONFIG_SEM_NSEMS_MAX    0x14
 +#define    SVR4_CONFIG_SEM_VALUE_MAX    0x15
 +#define    SVR4_CONFIG_SIGQUEUE_MAX    0x16
 +#define    SVR4_CONFIG_SIGRT_MIN        0x17
 +#define    SVR4_CONFIG_SIGRT_MAX        0x18
 +#define    SVR4_CONFIG_TIMER_MAX        0x19
 +#define    SVR4_CONFIG_PHYS_PAGES        0x1a
 +#define    SVR4_CONFIG_AVPHYS_PAGES    0x1b
 +#define    SVR4_CONFIG_COHERENCY        0x1c
 +#define    SVR4_CONFIG_SPLIT_CACHE        0x1d
 +#define    SVR4_CONFIG_ICACHESZ        0x1e
 +#define    SVR4_CONFIG_DCACHESZ        0x1f
 +#define    SVR4_CONFIG_ICACHELINESZ    0x20
 +#define    SVR4_CONFIG_DCACHELINESZ    0x21
 +#define    SVR4_CONFIG_ICACHEBLKSZ        0x22
 +#define    SVR4_CONFIG_DCACHEBLKSZ        0x23
 +#define    SVR4_CONFIG_DCACHETBLKSZ    0x24
 +#define    SVR4_CONFIG_ICACHE_ASSOC    0x25
 +#define    SVR4_CONFIG_DCACHE_ASSOC    0x26
 +#define    SVR4_CONFIG_UNUSED_2        0x27
 +#define    SVR4_CONFIG_UNUSED_3        0x28
 +#define    SVR4_CONFIG_UNUSED_4        0x29
 +#define    SVR4_CONFIG_MAXPID        0x2a
 +#define    SVR4_CONFIG_STACK_PROT        0x2b
  
  #endif /* !_SVR4_SYSCONFIG_H_ */


More information about the freebsd-emulation mailing list