tPowerPC Linux support from ericvh. Mainly adding va_copy/va_end. Also fix bug in sprint wrapping around top of memory. - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 984e353160593b20d1e2944e1f2e9ce2117c8490
 (DIR) parent c8c0df440f1a22effd43023368c801e1351e31ed
 (HTM) Author: rsc <devnull@localhost>
       Date:   Sun, 22 Aug 2004 15:39:56 +0000
       
       PowerPC Linux support from ericvh.
       Mainly adding va_copy/va_end.
       Also fix bug in sprint wrapping
       around top of memory.
       
       Diffstat:
         M src/Makefile                        |       2 +-
         M src/lib9/fmt/fmtprint.c             |       5 +++--
         M src/lib9/fmt/fmtvprint.c            |       8 +++++---
         M src/lib9/fmt/nan64.c                |       2 +-
         M src/lib9/fmt/runevseprint.c         |       3 ++-
         M src/lib9/fmt/runevsmprint.c         |       3 ++-
         M src/lib9/fmt/runevsnprint.c         |       3 ++-
         M src/lib9/fmt/sprint.c               |      11 ++++++++++-
         M src/lib9/fmt/vfprint.c              |       3 ++-
         M src/lib9/fmt/vseprint.c             |       3 ++-
         M src/lib9/fmt/vsmprint.c             |       3 ++-
         M src/lib9/fmt/vsnprint.c             |       4 +++-
         M src/libbio/bprint.c                 |       3 ++-
         M src/libthread/label.h               |      15 +++++++++++++++
         M src/libthread/mkfile                |       1 +
         M src/mkhdr                           |       2 +-
       
       16 files changed, 54 insertions(+), 17 deletions(-)
       ---
 (DIR) diff --git a/src/Makefile b/src/Makefile
       t@@ -1,6 +1,6 @@
        ../bin/mk: mkmk.sh
                SYSNAME=`uname` export SYSNAME; \
       -        OBJTYPE=`uname -m | sed 's;i.86;386;; s;/.*;;; s; ;;g'` export OBJTYPE; \
       +        OBJTYPE=`uname -m | sed 's;i.86;386;; s;/.*;;; s; ;;g' | sed 's/ppc64/power/g' | sed 's/ppc/power/g'` export OBJTYPE; \
                PATH=`pwd`/../bin:$$PATH export PATH; \
                PLAN9=`pwd`/.. export PLAN9; \
                sh -x mkmk.sh
 (DIR) diff --git a/src/lib9/fmt/fmtprint.c b/src/lib9/fmt/fmtprint.c
       t@@ -32,14 +32,15 @@ fmtprint(Fmt *f, char *fmt, ...)
                f->flags = 0;
                f->width = 0;
                f->prec = 0;
       -        va = f->args;
       +        va_copy(va, f->args);
                va_start(f->args, fmt);
                n = dofmt(f, fmt);
                va_end(f->args);
                f->flags = 0;
                f->width = 0;
                f->prec = 0;
       -        f->args = va;
       +        va_copy(f->args,va);
       +        va_end(va);
                if(n >= 0)
                        return 0;
                return n;
 (DIR) diff --git a/src/lib9/fmt/fmtvprint.c b/src/lib9/fmt/fmtvprint.c
       t@@ -32,13 +32,15 @@ fmtvprint(Fmt *f, char *fmt, va_list args)
                f->flags = 0;
                f->width = 0;
                f->prec = 0;
       -        va = f->args;
       -        f->args = args;
       +        va_copy(va,f->args);
       +        va_copy(f->args,args);
                n = dofmt(f, fmt);
                f->flags = 0;
                f->width = 0;
                f->prec = 0;
       -        f->args = va;
       +        va_end(f->args);
       +        va_copy(f->args,va);
       +        va_end(va);
                if(n >= 0)
                        return 0;
                return n;
 (DIR) diff --git a/src/lib9/fmt/nan64.c b/src/lib9/fmt/nan64.c
       t@@ -7,7 +7,7 @@
        
        #include "nan.h"
        
       -#ifdef __APPLE__
       +#if defined (__APPLE__) || (__powerpc__)
        #define _NEEDLL
        #endif
        
 (DIR) diff --git a/src/lib9/fmt/runevseprint.c b/src/lib9/fmt/runevseprint.c
       t@@ -31,8 +31,9 @@ runevseprint(Rune *buf, Rune *e, char *fmt, va_list args)
                f.flush = nil;
                f.farg = nil;
                f.nfmt = 0;
       -        f.args = args;
       +        va_copy(f.args,args);
                dofmt(&f, fmt);
       +        va_end(f.args);
                *(Rune*)f.to = '\0';
                return (Rune*)f.to;
        }
 (DIR) diff --git a/src/lib9/fmt/runevsmprint.c b/src/lib9/fmt/runevsmprint.c
       t@@ -28,8 +28,9 @@ runevsmprint(char *fmt, va_list args)
        
                if(runefmtstrinit(&f) < 0)
                        return nil;
       -        f.args = args;
       +        va_copy(f.args,args);
                n = dofmt(&f, fmt);
       +        va_end(f.args);
                if(n < 0)
                        return nil;
                *(Rune*)f.to = '\0';
 (DIR) diff --git a/src/lib9/fmt/runevsnprint.c b/src/lib9/fmt/runevsnprint.c
       t@@ -31,8 +31,9 @@ runevsnprint(Rune *buf, int len, char *fmt, va_list args)
                f.flush = nil;
                f.farg = nil;
                f.nfmt = 0;
       -        f.args = args;
       +        va_copy(f.args,args);
                dofmt(&f, fmt);
       +        va_end(f.args);
                *(Rune*)f.to = '\0';
                return (Rune*)f.to - buf;
        }
 (DIR) diff --git a/src/lib9/fmt/sprint.c b/src/lib9/fmt/sprint.c
       t@@ -18,10 +18,19 @@ int
        sprint(char *buf, char *fmt, ...)
        {
                int n;
       +        uint len;
                va_list args;
        
       +        len = 1<<30;  /* big number, but sprint is deprecated anyway */
       +        /*
       +         * on PowerPC, the stack is near the top of memory, so
       +         * we must be sure not to overflow a 32-bit pointer.
       +         */
       +        if(buf+len < buf)
       +                len = -(uint)buf-1;
       +
                va_start(args, fmt);
       -        n = vsnprint(buf, 65536, fmt, args);        /* big number, but sprint is deprecated anyway */
       +        n = vsnprint(buf, len, fmt, args);
                va_end(args);
                return n;
        }
 (DIR) diff --git a/src/lib9/fmt/vfprint.c b/src/lib9/fmt/vfprint.c
       t@@ -23,8 +23,9 @@ vfprint(int fd, char *fmt, va_list args)
                int n;
        
                fmtfdinit(&f, fd, buf, sizeof(buf));
       -        f.args = args;
       +        va_copy(f.args,args);
                n = dofmt(&f, fmt);
       +        va_end(f.args);
                if(n > 0 && __fmtFdFlush(&f) == 0)
                        return -1;
                return n;
 (DIR) diff --git a/src/lib9/fmt/vseprint.c b/src/lib9/fmt/vseprint.c
       t@@ -29,8 +29,9 @@ vseprint(char *buf, char *e, char *fmt, va_list args)
                f.flush = 0;
                f.farg = nil;
                f.nfmt = 0;
       -        f.args = args;
       +        va_copy(f.args,args);
                dofmt(&f, fmt);
       +        va_end(f.args);
                *(char*)f.to = '\0';
                return (char*)f.to;
        }
 (DIR) diff --git a/src/lib9/fmt/vsmprint.c b/src/lib9/fmt/vsmprint.c
       t@@ -27,8 +27,9 @@ vsmprint(char *fmt, va_list args)
        
                if(fmtstrinit(&f) < 0)
                        return nil;
       -        f.args = args;
       +        va_copy(f.args,args);
                n = dofmt(&f, fmt);
       +        va_end(f.args);
                if(n < 0)
                        return nil;
                return fmtstrflush(&f);
 (DIR) diff --git a/src/lib9/fmt/vsnprint.c b/src/lib9/fmt/vsnprint.c
       t@@ -20,6 +20,7 @@ int
        vsnprint(char *buf, int len, char *fmt, va_list args)
        {
                Fmt f;
       +        int x = 0;
        
                if(len <= 0)
                        return -1;
       t@@ -30,8 +31,9 @@ vsnprint(char *buf, int len, char *fmt, va_list args)
                f.flush = 0;
                f.farg = nil;
                f.nfmt = 0;
       -        f.args = args;
       +        va_copy(f.args,args);
                dofmt(&f, fmt);
       +        va_end(f.args);
                *(char*)f.to = '\0';
                return (char*)f.to - buf;
        }
 (DIR) diff --git a/src/libbio/bprint.c b/src/libbio/bprint.c
       t@@ -11,9 +11,10 @@ Bprint(Biobuf *bp, char *fmt, ...)
                if(Bfmtinit(&f, bp) < 0)
                        return -1;
                va_start(args, fmt);
       -        f.args = args;
       +        va_copy(f.args, args);
                n = dofmt(&f, fmt);
                va_end(args);
       +        va_end(f.args);
                if(n > 0 && Bfmtflush(&f) < 0)
                        return -1;
                return n;
 (DIR) diff --git a/src/libthread/label.h b/src/libthread/label.h
       t@@ -40,6 +40,21 @@ struct Label
                ulong        sp;                /* %o6 */
                ulong        link;                /* %o7 */
        };
       +#elif defined(__powerpc__)
       +struct Label
       +{
       +        ulong        pc;                /* lr */
       +        ulong        cr;                /* mfcr */
       +        ulong        ctr;                /* mfcr */
       +        ulong        xer;                /* mfcr */
       +        ulong        sp;                /* callee saved: r1 */
       +        ulong        toc;                /* callee saved: r2 */
       +        ulong        gpr[19];        /* callee saved: r13-r31 */
       +// XXX: currently do not save vector registers or floating-point state
       +//        ulong        pad;
       +//        uvlong        fpr[18];        /* callee saved: f14-f31 */
       +//        ulong        vr[4*12];        /* callee saved: v20-v31, 256-bits each */
       +};
        #else
        #error "Unknown or unsupported architecture"
        #endif
 (DIR) diff --git a/src/libthread/mkfile b/src/libthread/mkfile
       t@@ -53,6 +53,7 @@ trend: trend.$O $PLAN9/lib/$LIB
        
        CLEANFILES=$CLEANFILES tprimes texec
        
       +asm-Linux-ppc.$O: asm-Linux-386.s
        asm-Linux-386.$O: asm-FreeBSD-386.s
        asm-NetBSD-386.$O: asm-FreeBSD-386.s
        asm-OpenBSD-386.$O: asm-FreeBSD-386.s
 (DIR) diff --git a/src/mkhdr b/src/mkhdr
       t@@ -1,5 +1,5 @@
        SYSNAME=`uname`
       -OBJTYPE=`uname -m | sed 's;i.86;386;; s;/.*;;; s; ;;g'`
       +OBJTYPE=`uname -m | sed 's;i.86;386;; s;/.*;;; s; ;;g' | sed 's/ppc64/power/g' | sed 's/ppc/power/g'`
        
        BIN=$PLAN9/bin
        LIBDIR=$PLAN9/lib