commit 984e353160593b20d1e2944e1f2e9ce2117c8490 from: rsc date: Sun Aug 22 15:39:56 2004 UTC PowerPC Linux support from ericvh. Mainly adding va_copy/va_end. Also fix bug in sprint wrapping around top of memory. commit - c8c0df440f1a22effd43023368c801e1351e31ed commit + 984e353160593b20d1e2944e1f2e9ce2117c8490 blob - 7fe300ba20af67fe6a064cd0a6e401d3f7986655 blob + 9ced5330d6a2258580ac8f0b3ada6691d6886df2 --- src/Makefile +++ src/Makefile @@ -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 blob - fe2ad3cc8c262face66ae8bed8bff68fa9e2be39 blob + c682f49f4b5433f5666a0ac002a4d840273dc1f7 --- src/lib9/fmt/fmtprint.c +++ src/lib9/fmt/fmtprint.c @@ -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; blob - 6aed013d95c82a1cd3150d4ba1b01287570dbaa4 blob + 60974a0b17442ec0a5c1bb087e60f1f67a92aebc --- src/lib9/fmt/fmtvprint.c +++ src/lib9/fmt/fmtvprint.c @@ -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; blob - a02a3adb6436dca0cff661e2253e79007c2f98ac blob + 4df496ccd229f141e5970647adeedf8e07b33fbc --- src/lib9/fmt/nan64.c +++ src/lib9/fmt/nan64.c @@ -7,7 +7,7 @@ #include "nan.h" -#ifdef __APPLE__ +#if defined (__APPLE__) || (__powerpc__) #define _NEEDLL #endif blob - e4cc1ea87d1db23580570fc3fb8ac7899faf16e5 blob + a9ef99b912db83b94b5464dd88b1d66ff018f793 --- src/lib9/fmt/runevseprint.c +++ src/lib9/fmt/runevseprint.c @@ -31,8 +31,9 @@ runevseprint(Rune *buf, Rune *e, char *fmt, va_list ar 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; } blob - 71c23d844d3b1791692eb1f898ac591d9dbc5bd8 blob + 3326da81efc7cac076a74946f9ca106c72bbbff3 --- src/lib9/fmt/runevsmprint.c +++ src/lib9/fmt/runevsmprint.c @@ -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'; blob - 933a04ca9b2a6eb226319243ebba717b52a73a01 blob + 71557e5b77c09f65effe8bd1038b76529e0677dc --- src/lib9/fmt/runevsnprint.c +++ src/lib9/fmt/runevsnprint.c @@ -31,8 +31,9 @@ runevsnprint(Rune *buf, int len, char *fmt, va_list ar 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; } blob - 57150c36b205bd2f55f3598079bd814ef2104295 blob + ac68851bece9facbc31666a1c49f62b63eb5a10c --- src/lib9/fmt/sprint.c +++ src/lib9/fmt/sprint.c @@ -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; } blob - e4ab82acbd3837a90d8267f8c41acb5b53156fc1 blob + 711b6588fad535c8d8ed659dd75ca924f97fd6cc --- src/lib9/fmt/vfprint.c +++ src/lib9/fmt/vfprint.c @@ -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; blob - 85ed810bd535bcb4caa29a40664db3484562c5a8 blob + a1be5e40ccdc66fd085e29a10251f1cd741222f0 --- src/lib9/fmt/vseprint.c +++ src/lib9/fmt/vseprint.c @@ -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; } blob - 34a1b36f7ecf535d2b072f098ce91cddf85b9d0f blob + 4f55c41cbb03af7f6b36a9698060fbe1a26c19f8 --- src/lib9/fmt/vsmprint.c +++ src/lib9/fmt/vsmprint.c @@ -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); blob - 21662e6d435232962ce4dfb31a628affa1a439d3 blob + ad64203a39dfac105303ae19d2dcd4bb609d5891 --- src/lib9/fmt/vsnprint.c +++ src/lib9/fmt/vsnprint.c @@ -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; @@ -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; } blob - 2b66605ce5ed5a352c2aac24ae4a51dd5eba944b blob + f8a4d94f18dc7d5ebfc95ac19d85d4e782343719 --- src/libbio/bprint.c +++ src/libbio/bprint.c @@ -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; blob - 5161e3738095cabb3968ccd220ca0966bc6439a0 blob + c3cef2d029cc2216a680a713c0f668cc441cc95d --- src/libthread/label.h +++ src/libthread/label.h @@ -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 blob - f8ec8e806b520a40b82927f2688ae802a872983f blob + 221cb818214b7e7b017e9fe97c42c1f3ee9ede72 --- src/libthread/mkfile +++ src/libthread/mkfile @@ -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 blob - 1f80171207d2e933ad1d9f7301cebbf737f71e63 blob + 9229e92f6d12633293708e0cfcfd18ce00ef6171 --- src/mkhdr +++ src/mkhdr @@ -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