*BSD News Article 12082


Return to BSD News archive

Newsgroups: comp.os.386bsd.development
Path: sserve!manuel.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!saimiri.primate.wisc.edu!sdd.hp.com!swrinde!cs.utexas.edu!wupost!dsuvax.dsu.edu!ghelmer
From: ghelmer@dsuvax.dsu.edu (Guy Helmer)
Subject: Re: Anyone converted xdr_float.c for 386BSD?
Message-ID: <1993Mar1.201716.5381@dsuvax.dsu.edu>
Organization: Dakota State University
References: <C38405.2tyz@austin.ibm.com>
Date: Mon, 1 Mar 1993 20:17:16 GMT
Lines: 168

In <C38405.2tyz@austin.ibm.com> fredriks@austin.ibm.com (Lars Fredriksen) writes:

>Hi,
>	I got the sunrpc package from ref.tfs.com, but when I tried
>to compile the rpc library, xdr_float.c bombed out. I was under the
>impression that the software was ported already, but there were no
>diffs that I could find. 

>	Anyone seen it?

Here's patches I worked up a while ago and used with pvm (parallel virtual
machine) on 386bsd.  I never took the time to clean up the patches.
The testing I did with pvm on 386bsd versus pvm on a Sun workstation
showed no differences in the output, so I assume it mostly works.

Since Intel's format is IEEE format (if there are exceptions in Intel's
implementation the code should be modified to account for those
differences, but I don't know of any), the bytes & words just need to be
swapped around so the changes are simple.

Here's the diffs for /usr/src/lib/librpc/rpc/xdr_float.c:
--------------------------------------------------------------------
diff -c /usr/src/lib/librpc/rpc/xdr_float.c xdr_float.c
*** /usr/src/lib/librpc/rpc/xdr_float.c	Thu Aug 23 17:38:15 1990
--- xdr_float.c	Thu Nov 12 14:09:12 1992
***************
*** 1,5 ****
--- 1,11 ----
  /* @(#)xdr_float.c	2.1 88/07/29 4.0 RPCSRC */
  /*
+   Hacked by Guy Helmer (08/27/92) to support 386BSD on Intel 80386
+   and compatible CPUS.
+   At this point, operation of xdr_double is not guaranteed and
+   may not be correct.  Testing is needed.
+ */
+ /*
   * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
   * unrestricted use provided that this legend is included on all tape
   * media and as a part of the software program in whole or part.  Users
***************
*** 87,93 ****
  	register XDR *xdrs;
  	register float *fp;
  {
! #if !defined(mc68000) && !defined(sparc)
  	struct ieee_single is;
  	struct vax_single vs, *vsp;
  	struct sgl_limits *lim;
--- 93,99 ----
  	register XDR *xdrs;
  	register float *fp;
  {
! #if !defined(mc68000) && !defined(sparc) && !defined(__386BSD__)
  	struct ieee_single is;
  	struct vax_single vs, *vsp;
  	struct sgl_limits *lim;
***************
*** 96,102 ****
  	switch (xdrs->x_op) {
  
  	case XDR_ENCODE:
! #if defined(mc68000) || defined(sparc)
  		return (XDR_PUTLONG(xdrs, (long *)fp));
  #else
  		vs = *((struct vax_single *)fp);
--- 102,108 ----
  	switch (xdrs->x_op) {
  
  	case XDR_ENCODE:
! #if defined(mc68000) || defined(sparc) || defined(__386BSD__)
  		return (XDR_PUTLONG(xdrs, (long *)fp));
  #else
  		vs = *((struct vax_single *)fp);
***************
*** 118,124 ****
  #endif
  
  	case XDR_DECODE:
! #if defined(mc68000) || defined(sparc)
  		return (XDR_GETLONG(xdrs, (long *)fp));
  #else
  		vsp = (struct vax_single *)fp;
--- 124,130 ----
  #endif
  
  	case XDR_DECODE:
! #if defined(mc68000) || defined(sparc) || defined(__386BSD__)
  		return (XDR_GETLONG(xdrs, (long *)fp));
  #else
  		vsp = (struct vax_single *)fp;
***************
*** 193,199 ****
  	double *dp;
  {
  	register long *lp;
! #if !defined(mc68000) && !defined(sparc)
  	struct	ieee_double id;
  	struct	vax_double vd;
  	register struct dbl_limits *lim;
--- 199,205 ----
  	double *dp;
  {
  	register long *lp;
! #if !defined(mc68000) && !defined(sparc) && !defined(__386BSD__)
  	struct	ieee_double id;
  	struct	vax_double vd;
  	register struct dbl_limits *lim;
***************
*** 203,209 ****
  	switch (xdrs->x_op) {
  
  	case XDR_ENCODE:
! #if defined(mc68000) || defined(sparc)
  		lp = (long *)dp;
  #else
  		vd = *((struct vax_double *)dp);
--- 209,215 ----
  	switch (xdrs->x_op) {
  
  	case XDR_ENCODE:
! #if defined(mc68000) || defined(sparc) || defined(__386BSD__)
  		lp = (long *)dp;
  #else
  		vd = *((struct vax_double *)dp);
***************
*** 228,239 ****
  		id.sign = vd.sign;
  		lp = (long *)&id;
  #endif
  		return (XDR_PUTLONG(xdrs, lp++) && XDR_PUTLONG(xdrs, lp));
  
  	case XDR_DECODE:
! #if defined(mc68000) || defined(sparc)
  		lp = (long *)dp;
  		return (XDR_GETLONG(xdrs, lp++) && XDR_GETLONG(xdrs, lp));
  #else
  		lp = (long *)&id;
  		if (!XDR_GETLONG(xdrs, lp++) || !XDR_GETLONG(xdrs, lp))
--- 234,256 ----
  		id.sign = vd.sign;
  		lp = (long *)&id;
  #endif
+ #if defined(__386BSD__)
+ 		/*
+ 		  Deal with reversed word order.
+ 		  */
+ 		return (XDR_PUTLONG(xdrs, (lp + 1)) && XDR_PUTLONG(xdrs, lp));
+ #else
  		return (XDR_PUTLONG(xdrs, lp++) && XDR_PUTLONG(xdrs, lp));
+ #endif
  
  	case XDR_DECODE:
! #if defined(mc68000) || defined(sparc) || defined(__386BSD__)
  		lp = (long *)dp;
+ #if defined(__386BSD__)
+ 		return (XDR_GETLONG(xdrs, (lp + 1)) && XDR_GETLONG(xdrs, lp));
+ #else
  		return (XDR_GETLONG(xdrs, lp++) && XDR_GETLONG(xdrs, lp));
+ #endif
  #else
  		lp = (long *)&id;
  		if (!XDR_GETLONG(xdrs, lp++) || !XDR_GETLONG(xdrs, lp))

--------------------------------------------------------------------------

-- 
Guy Helmer, Dakota State University Computing Services - ghelmer@dsuvax.dsu.edu