Return to BSD News archive
Path: sserve!manuel.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!agate!apple!kaleida.com!conklin
From: conklin@kaleida.com (J.T. Conklin)
Newsgroups: comp.os.386bsd.development
Subject: Re: Anyone converted xdr_float.c for 386BSD?
Date: 4 Mar 93 10:46:04
Organization: Kaleida Labs, Inc., Mountain View, CA
Lines: 227
Message-ID: <CONKLIN.93Mar4104604@ngai.kaleida.com>
References: <C38405.2tyz@austin.ibm.com>
Reply-To: conklin@kaleida.com
NNTP-Posting-Host: ngai.kaleida.com
In-reply-to: fredriks@austin.ibm.com's message of Mon, 1 Mar 1993 18:43:16 GMT
Lars> I got the sunrpc package from ref.tfs.com, but when I tried
Lars> to compile the rpc library, xdr_float.c bombed out. I was under the
Lars> impression that the software was ported already, but there were no
Lars> diffs that I could find.
The sunrpc code on ref is based on rpc 3.9, while the version in
/usr/src/lib is based on rpc 4.0. I made my diffs against the
version in /usr/src/lib.
This was submitted for the patchkit long ago:
The xdr_float() and xdr_double routines from the xdr/rpc library were not
ported to the '386 (xdr_float.c was excluded in the makefile). Since the
'386, like the 68k and sparc, uses IEEE floating point, all that was needed
was to take word ordering into account for xdr_double().
I rearranged the code slightly: rather than testing mc68000, sparc, i386,
etc. several times throughout the code, I test once and define the IEEEFP
and BIGENDIAN macros accordingly. This will make things easier for anyone
who ports 386BSD to another architecture.
The following diff updates Makefile and xdr_float.c in /usr/src/lib/librpc/rpc.
*** 1.1 1993/01/21 19:41:14
--- Makefile 1993/01/22 03:41:46
***************
*** 8,17 ****
pmap_clnt.c pmap_getmaps.c pmap_getport.c pmap_prot.c \
pmap_prot2.c pmap_rmt.c rpc_prot.c rpc_commondata.c rpc_callmsg.c \
svc.c svc_auth.c svc_auth_unix.c svc_raw.c svc_run.c svc_simple.c \
! svc_tcp.c svc_udp.c xdr.c xdr_array.c xdr_mem.c \
xdr_rec.c xdr_reference.c xdr_stdio.c
-
- UNSUPPORTED= xdr_float.c
HDRS= auth.h auth_unix.h clnt.h pmap_clnt.h \
pmap_prot.h pmap_rmt.h rpc.h rpc_msg.h svc.h svc_auth.h types.h xdr.h
--- 8,15 ----
pmap_clnt.c pmap_getmaps.c pmap_getport.c pmap_prot.c \
pmap_prot2.c pmap_rmt.c rpc_prot.c rpc_commondata.c rpc_callmsg.c \
svc.c svc_auth.c svc_auth_unix.c svc_raw.c svc_run.c svc_simple.c \
! svc_tcp.c svc_udp.c xdr.c xdr_array.c xdr_float.c xdr_mem.c \
xdr_rec.c xdr_reference.c xdr_stdio.c
HDRS= auth.h auth_unix.h clnt.h pmap_clnt.h \
pmap_prot.h pmap_rmt.h rpc.h rpc_msg.h svc.h svc_auth.h types.h xdr.h
*** 1.1 1993/01/21 19:39:19
--- xdr_float.c 1993/01/22 05:36:18
***************
*** 48,56 ****
/*
* NB: Not portable.
! * This routine works on Suns (Sky / 68000's) and Vaxen.
*/
#ifdef vax
/* What IEEE single precision floating point looks like on a Vax */
--- 48,66 ----
/*
* NB: Not portable.
! * This routine works on Suns (Sky / 68000's), i386's and Vaxen.
*/
+ #if defined(mc68000) || defined(sparc)
+ #define IEEEFP
+ #define BIGENDIAN 1
+ #endif
+
+ #if defined(i386)
+ #define IEEEFP
+ #define BIGENDIAN 0
+ #endif
+
#ifdef vax
/* What IEEE single precision floating point looks like on a Vax */
***************
*** 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;
--- 97,103 ----
register XDR *xdrs;
register float *fp;
{
! #ifndef IEEEFP
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);
--- 106,112 ----
switch (xdrs->x_op) {
case XDR_ENCODE:
! #ifdef IEEEFP
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;
--- 128,134 ----
#endif
case XDR_DECODE:
! #ifdef IEEEFP
return (XDR_GETLONG(xdrs, (long *)fp));
#else
vsp = (struct vax_single *)fp;
***************
*** 148,154 ****
}
/*
! * This routine works on Suns (Sky / 68000's) and Vaxen.
*/
#ifdef vax
--- 158,164 ----
}
/*
! * This routine works on Suns (Sky / 68000's), i386's and Vaxen.
*/
#ifdef vax
***************
*** 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;
--- 203,209 ----
double *dp;
{
register long *lp;
! #ifndef IEEEFP
struct ieee_double id;
struct vax_double vd;
register struct dbl_limits *lim;
***************
*** 203,210 ****
switch (xdrs->x_op) {
case XDR_ENCODE:
! #if defined(mc68000) || defined(sparc)
lp = (long *)dp;
#else
vd = *((struct vax_double *)dp);
for (i = 0, lim = dbl_limits;
--- 213,225 ----
switch (xdrs->x_op) {
case XDR_ENCODE:
! #ifdef IEEEFP
lp = (long *)dp;
+ #if BIGENDIAN
+ return (XDR_PUTLONG(xdrs, lp++) && XDR_PUTLONG(xdrs, lp));
+ #else
+ return (XDR_PUTLONG(xdrs, lp+1) && XDR_PUTLONG(xdrs, lp));
+ #endif
#else
vd = *((struct vax_double *)dp);
for (i = 0, lim = dbl_limits;
***************
*** 227,239 ****
shipit:
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))
--- 242,258 ----
shipit:
id.sign = vd.sign;
lp = (long *)&id;
return (XDR_PUTLONG(xdrs, lp++) && XDR_PUTLONG(xdrs, lp));
+ #endif
case XDR_DECODE:
! #ifdef IEEEFP
lp = (long *)dp;
+ #if BIGENDIAN
return (XDR_GETLONG(xdrs, lp++) && XDR_GETLONG(xdrs, lp));
+ #else
+ return (XDR_GETLONG(xdrs, lp+1) && XDR_GETLONG(xdrs, lp));
+ #endif
#else
lp = (long *)&id;
if (!XDR_GETLONG(xdrs, lp++) || !XDR_GETLONG(xdrs, lp))
--
J.T. Conklin <jtc@wimsey.com> | Your source for floppy distributions
Winning Strategies, Inc. | of the 386BSD OS and binaries
61 Crestwood Drive #18 | Send e-mail for complete product list
Daly City, CA 94015 +---------------------------------------