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