PowerPC Linux support from ericvh.
Mainly adding va_copy/va_end. Also fix bug in sprint wrapping around top of memory.
This commit is contained in:
parent
c8c0df440f
commit
984e353160
16 changed files with 54 additions and 17 deletions
|
|
@ -1,6 +1,6 @@
|
||||||
../bin/mk: mkmk.sh
|
../bin/mk: mkmk.sh
|
||||||
SYSNAME=`uname` export SYSNAME; \
|
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; \
|
PATH=`pwd`/../bin:$$PATH export PATH; \
|
||||||
PLAN9=`pwd`/.. export PLAN9; \
|
PLAN9=`pwd`/.. export PLAN9; \
|
||||||
sh -x mkmk.sh
|
sh -x mkmk.sh
|
||||||
|
|
|
||||||
|
|
@ -32,14 +32,15 @@ fmtprint(Fmt *f, char *fmt, ...)
|
||||||
f->flags = 0;
|
f->flags = 0;
|
||||||
f->width = 0;
|
f->width = 0;
|
||||||
f->prec = 0;
|
f->prec = 0;
|
||||||
va = f->args;
|
va_copy(va, f->args);
|
||||||
va_start(f->args, fmt);
|
va_start(f->args, fmt);
|
||||||
n = dofmt(f, fmt);
|
n = dofmt(f, fmt);
|
||||||
va_end(f->args);
|
va_end(f->args);
|
||||||
f->flags = 0;
|
f->flags = 0;
|
||||||
f->width = 0;
|
f->width = 0;
|
||||||
f->prec = 0;
|
f->prec = 0;
|
||||||
f->args = va;
|
va_copy(f->args,va);
|
||||||
|
va_end(va);
|
||||||
if(n >= 0)
|
if(n >= 0)
|
||||||
return 0;
|
return 0;
|
||||||
return n;
|
return n;
|
||||||
|
|
|
||||||
|
|
@ -32,13 +32,15 @@ fmtvprint(Fmt *f, char *fmt, va_list args)
|
||||||
f->flags = 0;
|
f->flags = 0;
|
||||||
f->width = 0;
|
f->width = 0;
|
||||||
f->prec = 0;
|
f->prec = 0;
|
||||||
va = f->args;
|
va_copy(va,f->args);
|
||||||
f->args = args;
|
va_copy(f->args,args);
|
||||||
n = dofmt(f, fmt);
|
n = dofmt(f, fmt);
|
||||||
f->flags = 0;
|
f->flags = 0;
|
||||||
f->width = 0;
|
f->width = 0;
|
||||||
f->prec = 0;
|
f->prec = 0;
|
||||||
f->args = va;
|
va_end(f->args);
|
||||||
|
va_copy(f->args,va);
|
||||||
|
va_end(va);
|
||||||
if(n >= 0)
|
if(n >= 0)
|
||||||
return 0;
|
return 0;
|
||||||
return n;
|
return n;
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
#include "nan.h"
|
#include "nan.h"
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#if defined (__APPLE__) || (__powerpc__)
|
||||||
#define _NEEDLL
|
#define _NEEDLL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,8 +31,9 @@ runevseprint(Rune *buf, Rune *e, char *fmt, va_list args)
|
||||||
f.flush = nil;
|
f.flush = nil;
|
||||||
f.farg = nil;
|
f.farg = nil;
|
||||||
f.nfmt = 0;
|
f.nfmt = 0;
|
||||||
f.args = args;
|
va_copy(f.args,args);
|
||||||
dofmt(&f, fmt);
|
dofmt(&f, fmt);
|
||||||
|
va_end(f.args);
|
||||||
*(Rune*)f.to = '\0';
|
*(Rune*)f.to = '\0';
|
||||||
return (Rune*)f.to;
|
return (Rune*)f.to;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,8 +28,9 @@ runevsmprint(char *fmt, va_list args)
|
||||||
|
|
||||||
if(runefmtstrinit(&f) < 0)
|
if(runefmtstrinit(&f) < 0)
|
||||||
return nil;
|
return nil;
|
||||||
f.args = args;
|
va_copy(f.args,args);
|
||||||
n = dofmt(&f, fmt);
|
n = dofmt(&f, fmt);
|
||||||
|
va_end(f.args);
|
||||||
if(n < 0)
|
if(n < 0)
|
||||||
return nil;
|
return nil;
|
||||||
*(Rune*)f.to = '\0';
|
*(Rune*)f.to = '\0';
|
||||||
|
|
|
||||||
|
|
@ -31,8 +31,9 @@ runevsnprint(Rune *buf, int len, char *fmt, va_list args)
|
||||||
f.flush = nil;
|
f.flush = nil;
|
||||||
f.farg = nil;
|
f.farg = nil;
|
||||||
f.nfmt = 0;
|
f.nfmt = 0;
|
||||||
f.args = args;
|
va_copy(f.args,args);
|
||||||
dofmt(&f, fmt);
|
dofmt(&f, fmt);
|
||||||
|
va_end(f.args);
|
||||||
*(Rune*)f.to = '\0';
|
*(Rune*)f.to = '\0';
|
||||||
return (Rune*)f.to - buf;
|
return (Rune*)f.to - buf;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,10 +18,19 @@ int
|
||||||
sprint(char *buf, char *fmt, ...)
|
sprint(char *buf, char *fmt, ...)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
|
uint len;
|
||||||
va_list args;
|
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);
|
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);
|
va_end(args);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,8 +23,9 @@ vfprint(int fd, char *fmt, va_list args)
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
fmtfdinit(&f, fd, buf, sizeof(buf));
|
fmtfdinit(&f, fd, buf, sizeof(buf));
|
||||||
f.args = args;
|
va_copy(f.args,args);
|
||||||
n = dofmt(&f, fmt);
|
n = dofmt(&f, fmt);
|
||||||
|
va_end(f.args);
|
||||||
if(n > 0 && __fmtFdFlush(&f) == 0)
|
if(n > 0 && __fmtFdFlush(&f) == 0)
|
||||||
return -1;
|
return -1;
|
||||||
return n;
|
return n;
|
||||||
|
|
|
||||||
|
|
@ -29,8 +29,9 @@ vseprint(char *buf, char *e, char *fmt, va_list args)
|
||||||
f.flush = 0;
|
f.flush = 0;
|
||||||
f.farg = nil;
|
f.farg = nil;
|
||||||
f.nfmt = 0;
|
f.nfmt = 0;
|
||||||
f.args = args;
|
va_copy(f.args,args);
|
||||||
dofmt(&f, fmt);
|
dofmt(&f, fmt);
|
||||||
|
va_end(f.args);
|
||||||
*(char*)f.to = '\0';
|
*(char*)f.to = '\0';
|
||||||
return (char*)f.to;
|
return (char*)f.to;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,8 +27,9 @@ vsmprint(char *fmt, va_list args)
|
||||||
|
|
||||||
if(fmtstrinit(&f) < 0)
|
if(fmtstrinit(&f) < 0)
|
||||||
return nil;
|
return nil;
|
||||||
f.args = args;
|
va_copy(f.args,args);
|
||||||
n = dofmt(&f, fmt);
|
n = dofmt(&f, fmt);
|
||||||
|
va_end(f.args);
|
||||||
if(n < 0)
|
if(n < 0)
|
||||||
return nil;
|
return nil;
|
||||||
return fmtstrflush(&f);
|
return fmtstrflush(&f);
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ int
|
||||||
vsnprint(char *buf, int len, char *fmt, va_list args)
|
vsnprint(char *buf, int len, char *fmt, va_list args)
|
||||||
{
|
{
|
||||||
Fmt f;
|
Fmt f;
|
||||||
|
int x = 0;
|
||||||
|
|
||||||
if(len <= 0)
|
if(len <= 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -30,8 +31,9 @@ vsnprint(char *buf, int len, char *fmt, va_list args)
|
||||||
f.flush = 0;
|
f.flush = 0;
|
||||||
f.farg = nil;
|
f.farg = nil;
|
||||||
f.nfmt = 0;
|
f.nfmt = 0;
|
||||||
f.args = args;
|
va_copy(f.args,args);
|
||||||
dofmt(&f, fmt);
|
dofmt(&f, fmt);
|
||||||
|
va_end(f.args);
|
||||||
*(char*)f.to = '\0';
|
*(char*)f.to = '\0';
|
||||||
return (char*)f.to - buf;
|
return (char*)f.to - buf;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,9 +11,10 @@ Bprint(Biobuf *bp, char *fmt, ...)
|
||||||
if(Bfmtinit(&f, bp) < 0)
|
if(Bfmtinit(&f, bp) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
f.args = args;
|
va_copy(f.args, args);
|
||||||
n = dofmt(&f, fmt);
|
n = dofmt(&f, fmt);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
va_end(f.args);
|
||||||
if(n > 0 && Bfmtflush(&f) < 0)
|
if(n > 0 && Bfmtflush(&f) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
return n;
|
return n;
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,21 @@ struct Label
|
||||||
ulong sp; /* %o6 */
|
ulong sp; /* %o6 */
|
||||||
ulong link; /* %o7 */
|
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
|
#else
|
||||||
#error "Unknown or unsupported architecture"
|
#error "Unknown or unsupported architecture"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,7 @@ trend: trend.$O $PLAN9/lib/$LIB
|
||||||
|
|
||||||
CLEANFILES=$CLEANFILES tprimes texec
|
CLEANFILES=$CLEANFILES tprimes texec
|
||||||
|
|
||||||
|
asm-Linux-ppc.$O: asm-Linux-386.s
|
||||||
asm-Linux-386.$O: asm-FreeBSD-386.s
|
asm-Linux-386.$O: asm-FreeBSD-386.s
|
||||||
asm-NetBSD-386.$O: asm-FreeBSD-386.s
|
asm-NetBSD-386.$O: asm-FreeBSD-386.s
|
||||||
asm-OpenBSD-386.$O: asm-FreeBSD-386.s
|
asm-OpenBSD-386.$O: asm-FreeBSD-386.s
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
SYSNAME=`uname`
|
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
|
BIN=$PLAN9/bin
|
||||||
LIBDIR=$PLAN9/lib
|
LIBDIR=$PLAN9/lib
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue