Merge changes from branch: linux68k platform, linuxppc platform (partially

working), and miscellaneous changes to support these.
This commit is contained in:
David Given 2013-05-09 18:14:16 +01:00
commit d91a1dc1a6
81 changed files with 1582 additions and 261 deletions

View file

@ -61,7 +61,10 @@ struct outname {
#define RELSZ 0x07 /* relocation length */
#define RELO1 1 /* 1 byte */
#define RELO2 2 /* 2 bytes */
#define RELO4 4 /* 4 bytes */
#define RELO4 3 /* 4 bytes */
#define RELOPPC 4 /* PowerPC 26-bit address */
#define RELOH2 5 /* write top 2 bytes of 4 byte word */
#define RELPC 0x08 /* pc relative */
#define RELBR 0x10 /* High order byte lowest address. */
#define RELWR 0x20 /* High order word lowest address. */

View file

@ -14,8 +14,8 @@ del = 0177
.sect .text
.diagnos:
movem.l d0/d1/d2/a0, -(sp)
move.l (.lino), -(sp)
move.l (.filn), d2
move.l (hol0), -(sp)
move.l (hol0+4), d2
beq 1f
move.l d2, a0
move.l #40, d0

View file

@ -9,7 +9,7 @@
move.l (.limhp),-(sp)
move.l (.reghp),-(sp)
pea (12, sp)
move.l (.lino),-(sp)
move.l (hol0),-(sp)
pea (fmt)
jsr (.diagnos)
lea (20, sp), sp

38
mach/m68020/libem/pmfile Normal file
View file

@ -0,0 +1,38 @@
-- $Source: /cvsroot/tack/Ack/mach/i386/libem/pmfile,v $
-- $State: Exp $
-- $Revision: 1.1 $
local d = ROOTDIR.."mach/m68020/libem/"
libem_m68020 = acklibrary {
outputs = {"%U%/libem-%PLATFORM%.a"},
ACKINCLUDES = {PARENT, ROOTDIR.."h"},
ackfile (d.."fp68881.s"),
ackfile (d.."aar.s"),
ackfile (d.."lar.s"),
ackfile (d.."sar.s"),
ackfile (d.."csa.s"),
ackfile (d.."csb.s"),
ackfile (d.."shp.s"),
ackfile (d.."set.s"),
ackfile (d.."inn.s"),
ackfile (d.."fat.s"),
ackfile (d.."trp.s"),
ackfile (d.."trpstr.c"),
ackfile (d.."mon.s"),
ackfile (d.."nop.s"),
ackfile (d.."dia.s"),
ackfile (d.."cii.s"),
ackfile (d.."cuu.s"),
ackfile (d.."cmi.s"),
ackfile (d.."cms.s"),
ackfile (d.."cmu.s"),
ackfile (d.."cvf.s"),
ackfile (d.."exg.s"),
ackfile (d.."los.s"),
ackfile (d.."sts.s"),
install = pm.install("%BINDIR%lib/%PLATFORM%/libem.a"),
}

View file

@ -15,7 +15,7 @@ fmt: .asciz "%s\n"
move.l d0, (12, sp)
cmp.l #16, d0
bcc 1f
move.l (.trpim), d1
move.l (.ignmask), d1
btst d0, d1
bne 3f
1:

View file

@ -1,4 +1,5 @@
#include <em_abs.h>
char *
_trpstr(d)
{

View file

@ -1,22 +1,24 @@
! $Source: /cvsroot/tack/Ack/mach/i386/libend/em_end.s,v $
! $State: Exp $
! $Revision: 1.2 $
.sect .text
.sect .rom
.sect .data
.sect .bss
.define endtext,enddata,endbss,__end
.sect .text
.align 4
.sect .rom
.align 4
.sect .data
.align 4
.sect .bss
.align 4
.sect .end ! only for declaration of _end, __end and endbss.
.define endtext, endrom, enddata, endbss, __end
.sect .text
.align 4
endtext:
.sect .rom
.align 4
endrom:
.sect .data
.align 4
enddata:
.sect .end
.align 4
__end:
endbss:

16
mach/m68020/libend/pmfile Normal file
View file

@ -0,0 +1,16 @@
-- $Source: /cvsroot/tack/Ack/mach/i386/libend/pmfile,v $
-- $State: Exp $
-- $Revision: 1.1 $
local d = ROOTDIR.."mach/m68020/libend/"
libend_m68020 = acklibrary {
outputs = {"%U%/libend-%PLATFORM%.a"},
ackfile (d.."edata.s"),
ackfile (d.."em_end.s"),
ackfile (d.."end.s"),
ackfile (d.."etext.s"),
install = pm.install("%BINDIR%lib/%PLATFORM%/libend.a"),
}

View file

@ -5840,7 +5840,7 @@ with any_int STACK
jsr {absolute4, ".exg"}
pat fil
gen move_l {ext_addr, $1}, {absolute4, ".filn"}
gen move_l {ext_addr, $1}, {absolute4, "hol0+4"}
pat gto
with STACK
@ -5854,15 +5854,15 @@ with STACK
jmp {indirect4, %a}
#endif
pat lim yields {absolute_int, ".trpim"}
pat lim yields {absolute_int, ".ignmask"}
pat lin
kills posextern
gen move_i {const, $1}, {absolute_int, ".lino"}
gen move_i {const, $1}, {absolute_int, "hol0"}
pat lni
kills posextern
gen add_i {const, 1}, {absolute_int, ".lino"}
gen add_i {const, 1}, {absolute_int, "hol0"}
pat lor $1==0 yields lb
@ -5955,7 +5955,7 @@ with any4
pat sim
with any_int
kills posextern
gen move_i %1, {absolute_int, ".trpim"}
gen move_i %1, {absolute_int, ".ignmask"}
pat str $1==0
with any4 STACK

View file

@ -6,4 +6,4 @@
#define WORD_SIZE 4 /* should be 2 or 4 */
#define TBL68020 1 /* should be TBL68020 or TBL68000 */
/* #define TBL68881 1 /* use floating point processor */
#define TBL68881 1 /* use floating point processor */

View file

@ -3,6 +3,9 @@
local d = ROOTDIR.."mach/m68020/"
include (d.."libem/pmfile")
include (d.."libend/pmfile")
mach_m68020 = group {
ARCH = "m68020",
@ -10,20 +13,11 @@ mach_m68020 = group {
proto_ncg { ARCHDIR = "m68020" },
proto_top,
ego_descr,
install = {
pm.install("%ROOTDIR%/lib/%ARCH%/descr", "%BINDIR%%PLATIND%/%ARCH%/descr"),
}
}
-- Revision history
-- $Log$
-- Revision 1.3 2006-07-22 12:31:19 dtrg
-- Added support for the top target peephole optimiser.
--
-- Revision 1.2 2006/07/22 00:52:01 dtrg
-- Added support for the ego global optimisation suite.
--
-- Revision 1.1 2006/07/20 23:18:18 dtrg
-- First version in CVS.
--
support_m68020 = group {
OPTIMISATION = "-O6",
libem_m68020,
libend_m68020,
}

View file

@ -2158,4 +2158,3 @@ PATTERNS
gen
bl {LABEL, ".fif8"}

View file

@ -41,7 +41,7 @@
#define GENLAB "I" /* compiler generated labels */
#define valu_t short /* type of expression values */
#define valu_t long /* type of expression values */
#define ADDR_T unsigned short /* type of dot */
#define word_t short /* type of keyword value */
/*
@ -113,6 +113,7 @@ _include <signal.h>
#define lowb(z) ((int)(z) & 0xFF)
#define loww(z) ((int)(z) & 0xFFFF)
#define fitx(x, d) ((((x) + (1<<(d-1))) & ~((int)(1<<(d))-1)) == 0)
#define fitb(x) ((((x) + 0x80) & ~((int)0xFF)) == 0)
#define fitw(x) ((((x) + 0x8000L) & ~0xFFFFL) == 0)

View file

@ -4,6 +4,7 @@
*/
/* $Id$ */
#undef NDEBUG
#ifndef NDEBUG
#define assert(x) if(!(x)) badassertion("x",__FILE__,__LINE__)
#else

View file

@ -2,6 +2,8 @@
static char rcsid[] = "$Id$";
#endif
#include <stdlib.h>
#include <stdio.h>
#include "assert.h"
#include "param.h"
#include "tables.h"
@ -778,7 +780,10 @@ normalfailed: if (stackpad!=tokpatlen) {
compute(&enodes[nodeno], &result);
assert(result.e_typ!=EV_INT && result.e_typ!=EV_ADDR);
if (result.e_typ==EV_REG)
erasereg(result.e_v.e_reg);
{
int regno = result.e_v.e_reg;
erasereg(regno);
}
break;
}
case DO_TOKREPLACE: {
@ -904,6 +909,23 @@ normalfailed: if (stackpad!=tokpatlen) {
break;
}
#endif
#ifdef USE_NOFRAMEPOINTER
case DO_STACKADJUST: {
result_t result;
int nodeno;
DEBUG("STACKADJUST");
/* The offset is an expression, which we need to evaluate. */
getint(nodeno,codep);
compute(&enodes[nodeno], &result);
assert(result.e_typ==EV_INT);
if (toplevel)
stackoffset += result.e_v.e_con;
break;
}
#endif
}
}

View file

@ -2,6 +2,8 @@
static char rcsid[] = "$Id$";
#endif
#include <stdlib.h>
#include <stdio.h>
#include "assert.h"
#include "equiv.h"
#include "param.h"

View file

@ -20,6 +20,9 @@ extern rl_p curreglist; /* side effect of findcoerc() */
#ifndef NDEBUG
extern int Debug; /* on/off debug printout */
#endif
#ifdef USE_NOFRAMEPOINTER
extern int stackoffset; /* offset from localbase to sp */
#endif
/*
* Next descriptions are external declarations for tables created
@ -52,3 +55,6 @@ extern struct reginfo **reglist[]; /* lists of registers per property */
extern int nregvar[]; /* # of register variables per type */
extern int *rvnumbers[]; /* lists of numbers */
#endif
extern FILE *codefile;
extern FILE *freopen();

View file

@ -60,8 +60,6 @@ long con();
#define get8() getc(emfile)
FILE *emfile;
extern FILE *codefile;
extern FILE *freopen();
int nextispseu,savetab1;
int opcode;

View file

@ -2,6 +2,8 @@
static char rcsid[] = "$Id$";
#endif
#include <stdlib.h>
#include <stdio.h>
#include "assert.h"
#include "param.h"
#include "tables.h"

View file

@ -2,6 +2,8 @@
static char rcsid[] = "$Id$";
#endif
#include <stdlib.h>
#include <stdio.h>
#include <em_spec.h>
#include <em_flag.h>
#include "assert.h"

View file

@ -1,5 +1,5 @@
-- $Source$
-- $State$
-- $Source: /cvsroot/tack/Ack/mach/proto/ncg/pmfile,v $
-- $State: Exp $
local d = ROOTDIR.."mach/proto/ncg/"
@ -18,6 +18,8 @@ local cfile_with_tables = cfile {
proto_ncg = cprogram {
class = "proto_ncg",
exename = "ncg",
CINCLUDES = {
PARENT,
"mach/%PLATFORM%/ncg",
@ -50,6 +52,6 @@ proto_ncg = cprogram {
lib_em_data,
lib_flt_arith,
outputs = {"%U%/%PLATFORM%-ncg"},
install = pm.install("%BINDIR%%PLATDEP%/%PLATFORM%/ncg")
outputs = {"%U%/%PLATFORM%-%exename%"},
install = pm.install("%BINDIR%%PLATDEP%/%PLATFORM%/%exename%")
}

View file

@ -2,6 +2,8 @@
static char rcsid[] = "$Id$";
#endif
#include <stdlib.h>
#include <stdio.h>
#include "assert.h"
#include "param.h"
#include "tables.h"

View file

@ -1,3 +1,5 @@
#include <stdlib.h>
#include <stdio.h>
#include "assert.h"
#include "param.h"
#include "tables.h"

View file

@ -3,6 +3,7 @@ static char rcsid[] = "$Id$";
#endif
#include <stdlib.h>
#include <stdio.h>
#include "assert.h"
#include "param.h"
#include "tables.h"

View file

@ -2,6 +2,8 @@
static char rcsid[] = "$Id$";
#endif
#include <stdlib.h>
#include <stdio.h>
#include "assert.h"
#include "param.h"
#include "tables.h"

View file

@ -1,6 +1,6 @@
/* $Source$
* $State$
* $Revision$
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/_exit.c,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#include <stdlib.h>

View file

@ -1,7 +1,7 @@
#
! $Source$
! $State$
! $Revision$
! $Source: /cvsroot/tack/Ack/plat/linux386/libsys/_hol0.s,v $
! $State: Exp $
! $Revision: 1.1 $
! Declare segments (the order is important).

View file

@ -1,6 +1,6 @@
/* $Source$
* $State$
* $Revision$
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/brk.c,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#include <stdlib.h>

View file

@ -1,6 +1,6 @@
/* $Source$
* $State$
* $Revision$
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/close.c,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#include <stdlib.h>

View file

@ -1,6 +1,6 @@
/* $Source$
* $State$
* $Revision$
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/creat.c,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#include <stdlib.h>

View file

@ -1,7 +1,7 @@
#
! $Source$
! $State$
! $Revision$
! $Source: /cvsroot/tack/Ack/plat/linux386/libsys/errno.s,v $
! $State: Exp $
! $Revision: 1.1 $
! Declare segments (the order is important).

View file

@ -1,6 +1,6 @@
/* $Source$
* $State$
* $Revision$
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/getpid.c,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#include <stdlib.h>

View file

@ -1,6 +1,6 @@
/* $Source$
* $State$
* $Revision$
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/gettimeofday.c,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#include <stdlib.h>

View file

@ -0,0 +1,13 @@
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/isatty.c,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
int isatty(int fd)
{
return 0;
}

View file

@ -1,6 +1,6 @@
/* $Source$
* $State$
* $Revision$
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/kill.c,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#include <stdlib.h>

View file

@ -1,6 +1,6 @@
/* $Source$
* $State$
* $Revision$
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/libsys.h,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#ifndef LIBSYS_H

View file

@ -1,6 +1,6 @@
/* $Source$
* $State$
* $Revision$
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/lseek.c,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#include <stdlib.h>

View file

@ -1,6 +1,6 @@
/* $Source$
* $State$
* $Revision$
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/open.c,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#include <stdlib.h>

View file

@ -0,0 +1,29 @@
-- $Source: /cvsroot/tack/Ack/plat/linux386/libsys/pmfile,v $
-- $State: Exp $
-- $Revision: 1.1 $
local d = ROOTDIR.."plat/linux/liblinux/"
liblinux = acklibrary {
ACKINCLUDES = {"%BINDIR%include"},
ackfile (d.."errno.s"),
ackfile (d.."_hol0.s"),
ackfile (d.."brk.c"),
ackfile (d.."close.c"),
ackfile (d.."creat.c"),
ackfile (d.."getpid.c"),
ackfile (d.."gettimeofday.c"),
ackfile (d.."_exit.c"),
ackfile (d.."isatty.c"),
ackfile (d.."kill.c"),
ackfile (d.."lseek.c"),
ackfile (d.."open.c"),
ackfile (d.."read.c"),
ackfile (d.."sbrk.c"),
ackfile (d.."signal.c"),
ackfile (d.."write.c"),
install = pm.install("%BINDIR%lib/%PLATFORM%/liblinux.a"),
}

View file

@ -1,6 +1,6 @@
/* $Source$
* $State$
* $Revision$
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/read.c,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#include <stdlib.h>

View file

@ -1,35 +1,32 @@
/* $Source$
* $State$
* $Revision$
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/sbrk.c,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "libsys.h"
#define OUT_OF_MEMORY (void*)(-1) /* sbrk returns this on failure */
static char* current = NULL;
extern char _end[1];
static char* current = _end;
void* sbrk(intptr_t increment)
{
char* old;
char* new;
char* actual;
if (!current)
current = (char*) _syscall(__NR_brk, 0, 0, 0);
if (increment == 0)
return current;
old = current;
new = old + increment;
actual = (char*) _syscall(__NR_brk, (quad) new, 0, 0);
if (actual < new)
if (brk(new) < 0)
return OUT_OF_MEMORY;
current = actual;
current = new;
return old;
}

View file

@ -1,6 +1,6 @@
/* $Source$
* $State$
* $Revision$
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/signal.c,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#include <stdlib.h>

View file

@ -1,6 +1,6 @@
/* $Source$
* $State$
* $Revision$
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/syscalls.h,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#ifndef SYSCALLS_H

View file

@ -1,6 +1,6 @@
/* $Source$
* $State$
* $Revision$
/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/write.c,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#include <stdlib.h>

View file

@ -59,7 +59,9 @@ name led
(.ocm:{TAIL}={PLATFORMDIR}/liboccam.a) \
(.ocm.b.mod.c.p:{TAIL}={PLATFORMDIR}/libc.a) \
{FLOATS?} \
(.e:{TAIL}={PLATFORMDIR}/libem.a \
(.e:{TAIL}={PLATFORMDIR}/liblinux.a \
{PLATFORMDIR}/libem.a \
{PLATFORMDIR}/liblinux.a \
{PLATFORMDIR}/libsys.a \
{PLATFORMDIR}/libend.a)
linker

View file

@ -3,8 +3,6 @@
! $State$
! $Revision$
#include "syscalls.h"
! Declare segments (the order is important).
.sect .text

View file

@ -1,13 +0,0 @@
/* $Source$
* $State$
* $Revision$
*/
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
int isatty(int fd)
{
return 0;
}

View file

@ -1,33 +1,13 @@
-- $Source$
-- $State$
-- $Revision$
-- $Source: /cvsroot/tack/Ack/plat/linux386/libsys/pmfile,v $
-- $State: Exp $
-- $Revision: 1.1 $
local d = ROOTDIR.."plat/linux386/libsys/"
libsys_linux386 = acklibrary {
ACKBUILDFLAGS = {PARENT, "-ansi"},
ACKINCLUDES = {"%BINDIR%include"},
ackfile (d.."errno.s"),
ackfile (d.."_hol0.s"),
ackfile (d.."_syscall.s"),
ackfile (d.."brk.c"),
ackfile (d.."close.c"),
ackfile (d.."creat.c"),
ackfile (d.."getpid.c"),
ackfile (d.."gettimeofday.c"),
ackfile (d.."_exit.c"),
ackfile (d.."isatty.c"),
ackfile (d.."kill.c"),
ackfile (d.."lseek.c"),
ackfile (d.."open.c"),
ackfile (d.."read.c"),
ackfile (d.."sbrk.c"),
ackfile (d.."signal.c"),
ackfile (d.."write.c"),
ackfile (d.."unlink.c"),
ackfile (d.."remove.c"),
install = pm.install("%BINDIR%lib/%PLATFORM%/libsys.a"),
}

View file

@ -1,15 +0,0 @@
/* $Source$
* $State$
* $Revision$
*/
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <stdarg.h>
#include "libsys.h"
int remove(const char* path)
{
return unlink(path);
}

View file

@ -1,15 +0,0 @@
/* $Source$
* $State$
* $Revision$
*/
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <stdarg.h>
#include "libsys.h"
int unlink(const char* path)
{
return _syscall(__NR_unlink, (quad) path, 0, 0);
}

View file

@ -5,6 +5,7 @@
local d = ROOTDIR.."plat/linux386/"
include (d.."libsys/pmfile")
include "plat/linux/liblinux/pmfile"
local bootsector = ackfile {
file (d.."boot.s"),
@ -41,6 +42,7 @@ platform_linux386 = group {
-- Build the PC standalone syscall library.
liblinux,
libsys_linux386,
bootsector,
}

26
plat/linux68k/.distr Normal file
View file

@ -0,0 +1,26 @@
descr
boot.s
pmfile
README
include/ack/config.h
include/unistd.h
libsys/pmfile
libsys/_exit.c
libsys/_hol0.s
libsys/_syscall.s
libsys/brk.c
libsys/close.c
libsys/creat.c
libsys/errno.s
libsys/getpid.c
libsys/gettimeofday.c
libsys/isatty.c
libsys/kill.c
libsys/libsys.h
libsys/lseek.c
libsys/open.c
libsys/read.c
libsys/sbrk.c
libsys/signal.c
libsys/syscalls.h
libsys/write.c

42
plat/linux68k/README Normal file
View file

@ -0,0 +1,42 @@
# $Source: /cvsroot/tack/Ack/plat/linux386/README,v $
# $State: Exp $
# $Revision: 1.2 $
The linux386 platform
=====================
linux386 is an i386-based BSP that produces Linux ELF executables.
This port only implements a very limited number of system calls; basically,
just enough to make the demo apps run. Adding more is easy, but there are some
subtleties that require more thought. The port should be considered only in
proof-of-concept stage right now.
Important note: you *can't* link access ELF shared libraries from these
executables. In other words, you have to all your work from inside ACK.
IEEE floating point is available, but requires an FPU.
The executables are generated with aelfslod and are extremely simple; there's
one rwx ELF section which contains all the application's code and data. This
is not optimal, but it does work.
Bugs
====
isatty() is a stub and always returns 0.
Example command line
====================
ack -mlinux386 -O -o linux386.exe examples/paranoia.c
The file linux386.exe can then be run on a i386 Linux machine (or on an
emulation thereof).
David Given
dg@cowlark.com

87
plat/linux68k/boot.s Normal file
View file

@ -0,0 +1,87 @@
#
! $Source: /cvsroot/tack/Ack/plat/linux386/boot.s,v $
! $State: Exp $
! $Revision: 1.3 $
! Declare segments (the order is important).
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
begtext:
! This code is placed at the beginning of the ELF executable and is the
! first thing that runs.
!
! On entry, the stack looks like this:
!
! sp+.. NULL
! sp+8+(4*argc) env (X quads)
! sp+4+(4*argc) NULL
! sp+4 argv (argc quads)
! sp argc
!
! The ACK actually expects:
!
! sp+8 argc
! sp+4 argv
! sp env
move.l (0, sp), d0 ! d0 = argc
move.l (4, sp), d1 ! d1 = argv
move.l d0, d2
asl.l #2, d2
move.l (sp, d2), d2
add.l #12, d2 ! d2 = environ
move.l d2, -(sp) ! environ
move.l d0, -(sp) ! argc
move.l d1, -(sp) ! argv
pea (0) ! dummy, representing the return address
jmp (__m_a_i_n)
#if 0
mov eax, (esp) ! eax = argc
lea ebx, 4(esp) ! ebx = argv
lea ecx, (esp)(eax*4)
add ecx, 12 ! environ
push ecx ! environ
push ebx ! argc
push eax ! argv
push eax ! dummy, representing the return argument
xor ebp, ebp
#endif
! This provides an emergency exit routine used by EM.
.define EXIT
.extern EXIT
EXIT:
pea (1)
jmp (__exit)
! This is used by the trap routine for diagnostics.
.define WRITE
.extern WRITE
WRITE:
jmp (_write)
! Define symbols at the beginning of our various segments, so that we can find
! them. (Except .text, which has already been done.)
.sect .data; begdata:
.sect .rom; begrom:
.sect .bss; begbss:
! Some magic data. All EM systems need these.
.define .trppc, .ignmask, _errno
.comm .trppc, 4
.comm .ignmask, 4
.comm _errno, 4

74
plat/linux68k/descr Normal file
View file

@ -0,0 +1,74 @@
# $Source: /cvsroot/tack/Ack/plat/linux386/descr,v $
# $State: Exp $
# $Revision: 1.1 $
var w=4
var p=4
var s=2
var l=4
var f=4
var d=8
var ARCH=m68020
var PLATFORM=linux68k
var PLATFORMDIR={EM}/lib/{PLATFORM}
var CPP_F=-D__unix -D__mc68020 -D__m68k -D__mc68000 -D__M68020
var ALIGN=-a0:4 -a1:4 -a2:4 -a3:4 -b0:0x08000054
var C_LIB={PLATFORMDIR}/libc-ansi.a
# bitfields reversed for compatibility with (g)cc.
var CC_ALIGN=-Vr
var OLD_C_LIB={C_LIB}
var MACHOPT_F=-ml10
# Override the setting in fe so that files compiled for linux68k can see
# the platform-specific headers.
var C_INCLUDES=-I{PLATFORMDIR}/include -I{EM}/include/ansi
name be
from .m.g
to .s
program {EM}/lib.bin/{PLATFORM}/ncg
mapflag -gdb GF=-gdb
args {GF?} <
stdout
need .e
end
name as
from .s.so
to .o
program {EM}/lib.bin/{PLATFORM}/as
args - -o > <
prep cond
end
name led
from .o.a
to .out
program {EM}/lib.bin/em_led
mapflag -l* LNAME={PLATFORMDIR}/lib*
mapflag -fp FLOATS={EM}/{LIB}fp
args {ALIGN} {SEPID?} \
(.e:{HEAD}={PLATFORMDIR}/boot.o) \
({RTS}:.ocm.b={PLATFORMDIR}/c-ansi.o) \
({RTS}:.c={PLATFORMDIR}/c-ansi.o) \
({RTS}:.mod={PLATFORMDIR}/modula2.o) \
({RTS}:.p={PLATFORMDIR}/pascal.o) \
-o > < \
(.p:{TAIL}={PLATFORMDIR}/libpascal.a) \
(.b:{TAIL}={PLATFORMDIR}/libbasic.a) \
(.mod:{TAIL}={PLATFORMDIR}/libmodula2.a) \
(.ocm:{TAIL}={PLATFORMDIR}/liboccam.a) \
(.ocm.b.mod.c.p:{TAIL}={PLATFORMDIR}/libc.a) \
{FLOATS?} \
(.e:{TAIL}={PLATFORMDIR}/libem.a \
{PLATFORMDIR}/liblinux.a \
{PLATFORMDIR}/libsys.a \
{PLATFORMDIR}/libend.a)
linker
end
name cv
from .out
to .exe
program {EM}/bin/aelflod
args -m4 -b < >
outfile linux68k.exe
end

View file

@ -0,0 +1,14 @@
/* $Source: /cvsroot/tack/Ack/plat/linux386/include/ack/config.h,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#ifndef _ACK_CONFIG_H
#define _ACK_CONFIG_H
/* We're providing a time() system call rather than wanting a wrapper around
* gettimeofday() in the libc. */
/* #define ACKCONF_TIME_IS_A_SYSCALL */
#endif

View file

@ -0,0 +1,76 @@
/* $Source: /cvsroot/tack/Ack/plat/linux386/include/sys/ioctl.h,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#ifndef _SYS_IOCTL_H
#define _SYS_IOCTL_H
/* These are copied from the ioctl_list(2) man page. */
/* <include/asm-i386/socket.h> */
#define FIOSETOWN 0x00008901
#define SIOCSPGRP 0x00008902
#define FIOGETOWN 0x00008903
#define SIOCGPGRP 0x00008904
#define SIOCATMARK 0x00008905
#define SIOCGSTAMP 0x00008906
/* <include/asm-i386/termios.h> */
#define TCGETS 0x00005401
#define TCSETS 0x00005402
#define TCSETSW 0x00005403
#define TCSETSF 0x00005404
#define TCGETA 0x00005405
#define TCSETA 0x00005406
#define TCSETAW 0x00005407
#define TCSETAF 0x00005408
#define TCSBRK 0x00005409
#define TCXONC 0x0000540A
#define TCFLSH 0x0000540B
#define TIOCEXCL 0x0000540C
#define TIOCNXCL 0x0000540D
#define TIOCSCTTY 0x0000540E
#define TIOCGPGRP 0x0000540F
#define TIOCSPGRP 0x00005410
#define TIOCOUTQ 0x00005411
#define TIOCSTI 0x00005412
#define TIOCGWINSZ 0x00005413
#define TIOCSWINSZ 0x00005414
#define TIOCMGET 0x00005415
#define TIOCMBIS 0x00005416
#define TIOCMBIC 0x00005417
#define TIOCMSET 0x00005418
#define TIOCGSOFTCAR 0x00005419
#define TIOCSSOFTCAR 0x0000541A
#define FIONREAD 0x0000541B
#define TIOCINQ 0x0000541B
#define TIOCLINUX 0x0000541C
#define TIOCCONS 0x0000541D
#define TIOCGSERIAL 0x0000541E
#define TIOCSSERIAL 0x0000541F
#define TIOCPKT 0x00005420
#define FIONBIO 0x00005421
#define TIOCNOTTY 0x00005422
#define TIOCSETD 0x00005423
#define TIOCGETD 0x00005424
#define TCSBRKP 0x00005425
#define TIOCTTYGSTRUCT 0x00005426
#define FIONCLEX 0x00005450
#define FIOCLEX 0x00005451
#define FIOASYNC 0x00005452
#define TIOCSERCONFIG 0x00005453
#define TIOCSERGWILD 0x00005454
#define TIOCSERSWILD 0x00005455
#define TIOCGLCKTRMIOS 0x00005456
#define TIOCSLCKTRMIOS 0x00005457
#define TIOCSERGSTRUCT 0x00005458
#define TIOCSERGETLSR 0x00005459
#define TIOCSERGETMULTI 0x0000545A
#define TIOCSERSETMULTI 0x0000545B
#endif

View file

@ -0,0 +1,123 @@
/*
* unistd.h - standard system calls
*/
/* $Id$ */
#ifndef _UNISTD_H
#define _UNISTD_H
#include <stddef.h>
#include <time.h>
/* Types */
typedef int pid_t;
typedef int mode_t;
typedef long suseconds_t;
/* Time handling. */
struct timeval
{
time_t tv_sec;
suseconds_t tv_usec;
};
struct timezone
{
int tz_minuteswest;
int tz_dsttime;
}; /* obsolete, unused */
extern int gettimeofday(struct timeval* tv, struct timezone* tz);
extern int settimeofday(const struct timeval* tv, const struct timezone* tz);
/* File access. */
enum
{
O_ACCMODE = 0x3,
O_RDONLY = 0,
O_WRONLY = 1,
O_RDWR = 2,
O_CREAT = 0x10,
O_TRUNC = 0x20,
O_APPEND = 0x40
};
extern int open(const char* path, int access, ...);
extern int creat(const char* path, mode_t mode);
extern int close(int d);
extern int read(int fd, void* buffer, size_t count);
extern int write(int fd, void* buffer, size_t count);
extern off_t lseek(int fildes, off_t offset, int whence);
extern int fcntl(int fd, int op, ...);
/* Special variables */
extern char** environ;
/* Implemented system calls */
extern void _exit(int);
extern pid_t getpid(void);
extern int brk(void* ptr);
extern void* sbrk(intptr_t increment);
extern int isatty(int d);
/* Signal handling */
typedef int sig_atomic_t;
#define SIG_ERR ((sighandler_t) -1) /* Error return. */
#define SIG_DFL ((sighandler_t) 0) /* Default action. */
#define SIG_IGN ((sighandler_t) 1) /* Ignore signal. */
#define SIGHUP 1 /* Hangup (POSIX). */
#define SIGINT 2 /* Interrupt (ANSI). */
#define SIGQUIT 3 /* Quit (POSIX). */
#define SIGILL 4 /* Illegal instruction (ANSI). */
#define SIGTRAP 5 /* Trace trap (POSIX). */
#define SIGABRT 6 /* Abort (ANSI). */
#define SIGIOT 6 /* IOT trap (4.2 BSD). */
#define SIGBUS 7 /* BUS error (4.2 BSD). */
#define SIGFPE 8 /* Floating-point exception (ANSI). */
#define SIGKILL 9 /* Kill, unblockable (POSIX). */
#define SIGUSR1 10 /* User-defined signal 1 (POSIX). */
#define SIGSEGV 11 /* Segmentation violation (ANSI). */
#define SIGUSR2 12 /* User-defined signal 2 (POSIX). */
#define SIGPIPE 13 /* Broken pipe (POSIX). */
#define SIGALRM 14 /* Alarm clock (POSIX). */
#define SIGTERM 15 /* Termination (ANSI). */
#define SIGSTKFLT 16 /* Stack fault. */
#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */
#define SIGCHLD 17 /* Child status has changed (POSIX). */
#define SIGCONT 18 /* Continue (POSIX). */
#define SIGSTOP 19 /* Stop, unblockable (POSIX). */
#define SIGTSTP 20 /* Keyboard stop (POSIX). */
#define SIGTTIN 21 /* Background read from tty (POSIX). */
#define SIGTTOU 22 /* Background write to tty (POSIX). */
#define SIGURG 23 /* Urgent condition on socket (4.2 BSD). */
#define SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */
#define SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */
#define SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */
#define SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */
#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */
#define SIGPOLL SIGIO /* Pollable event occurred (System V). */
#define SIGIO 29 /* I/O now possible (4.2 BSD). */
#define SIGPWR 30 /* Power failure restart (System V). */
#define SIGSYS 31 /* Bad system call. */
#define SIGUNUSED 31
#define _NSIG 32 /* Biggest signal number + 1
(not including real-time signals). */
typedef void (*sighandler_t)(int);
extern sighandler_t signal(int signum, sighandler_t handler);
extern int raise(int signum);
#endif

View file

@ -0,0 +1,45 @@
#
! $Source: /cvsroot/tack/Ack/plat/linux386/libsys/_syscall.s,v $
! $State: Exp $
! $Revision: 1.1 $
! Declare segments (the order is important).
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
EINVAL = 22
! Perform a Linux system call.
.define __syscall
__syscall:
move.l (4, sp), d0
move.l (8, sp), d1
move.l (12, sp), d2
move.l (16, sp), d3
trap #0
tst.l d0
bmi 1f
rts
1:
neg.l d0
! It just so happens that errnos 1-34 are the same in Linux as in ACK.
cmp.l #1, d0
blt 2f
cmp.l #34, d0
bgt 2f
move.l d0, (_errno)
3:
move.l #-1, d0
rts
2:
move.l #EINVAL, (_errno)
bra 3b

View file

@ -0,0 +1,13 @@
-- $Source: /cvsroot/tack/Ack/plat/linux386/libsys/pmfile,v $
-- $State: Exp $
-- $Revision: 1.1 $
local d = ROOTDIR.."plat/linux68k/libsys/"
libsys_linux68k = acklibrary {
ACKINCLUDES = {"%BINDIR%include"},
ackfile (d.."_syscall.s"),
install = pm.install("%BINDIR%lib/%PLATFORM%/libsys.a"),
}

48
plat/linux68k/pmfile Normal file
View file

@ -0,0 +1,48 @@
-- $Source: /cvsroot/tack/Ack/plat/linux386/pmfile,v $
-- $State: Exp $
-- $Revision: 1.3 $
local d = ROOTDIR.."plat/linux68k/"
include (d.."libsys/pmfile")
include "plat/linux/liblinux/pmfile"
local bootsector = ackfile {
file (d.."boot.s"),
install = pm.install("%BINDIR%lib/%PLATFORM%/boot.o"),
}
local descr = group {
install = pm.install(d.."descr", "%BINDIR%%PLATIND%/%PLATFORM%/descr")
}
local headers = group {
install = {
pm.install(d.."include/ack/config.h", "%BINDIR%%PLATIND%/%PLATFORM%/include/ack/config.h"),
pm.install(d.."include/unistd.h", "%BINDIR%%PLATIND%/%PLATFORM%/include/unistd.h"),
}
}
platform_linux68k = group {
ARCH = "m68020",
PLATFORM = "linux68k",
OPTIMISATION = "-O6",
-- Ensure the descr and headers are installed first because we'll need it
-- to build the libraries.
descr,
headers,
-- Build the back-end support.
mach_m68020,
support_m68020,
lang_runtimes,
-- Build the PC standalone syscall library.
liblinux,
libsys_linux68k,
bootsector,
}

26
plat/linuxppc/.distr Normal file
View file

@ -0,0 +1,26 @@
descr
boot.s
pmfile
README
include/ack/config.h
include/unistd.h
libsys/pmfile
libsys/_exit.c
libsys/_hol0.s
libsys/_syscall.s
libsys/brk.c
libsys/close.c
libsys/creat.c
libsys/errno.s
libsys/getpid.c
libsys/gettimeofday.c
libsys/isatty.c
libsys/kill.c
libsys/libsys.h
libsys/lseek.c
libsys/open.c
libsys/read.c
libsys/sbrk.c
libsys/signal.c
libsys/syscalls.h
libsys/write.c

42
plat/linuxppc/README Normal file
View file

@ -0,0 +1,42 @@
# $Source: /cvsroot/tack/Ack/plat/linux386/README,v $
# $State: Exp $
# $Revision: 1.2 $
The linux386 platform
=====================
linux386 is an i386-based BSP that produces Linux ELF executables.
This port only implements a very limited number of system calls; basically,
just enough to make the demo apps run. Adding more is easy, but there are some
subtleties that require more thought. The port should be considered only in
proof-of-concept stage right now.
Important note: you *can't* link access ELF shared libraries from these
executables. In other words, you have to all your work from inside ACK.
IEEE floating point is available, but requires an FPU.
The executables are generated with aelfslod and are extremely simple; there's
one rwx ELF section which contains all the application's code and data. This
is not optimal, but it does work.
Bugs
====
isatty() is a stub and always returns 0.
Example command line
====================
ack -mlinux386 -O -o linux386.exe examples/paranoia.c
The file linux386.exe can then be run on a i386 Linux machine (or on an
emulation thereof).
David Given
dg@cowlark.com

56
plat/linuxppc/boot.s Normal file
View file

@ -0,0 +1,56 @@
#
! $Source: /cvsroot/tack/Ack/plat/linux386/boot.s,v $
! $State: Exp $
! $Revision: 1.3 $
! Declare segments (the order is important).
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
begtext:
! This code is placed at the beginning of the ELF executable and is the
! first thing that runs.
!
! On entry, the stack looks like this:
!
! sp+... NULL
! sp+8+(4*argc) env (X quads)
! sp+4+(4*argc) NULL
! sp+4 argv (argc quads)
! sp argc
!
! The ACK actually expects:
!
! sp+8 argc
! sp+4 ptr to argv
! sp ptr to env
lwz r3, 0(sp) ! r3 = argc
addi r4, sp, 4 ! r4 = argv
rlwinm r5, r3, 32-2, 2, 31 ! shift left 2 bits
add r5, r5, r4
addi r5, r5, 8 ! r5 = env
stwu r5, -4(sp)
stwu r4, -4(sp)
stwu r3, -4(sp)
b __m_a_i_n
! Some magic data. All EM systems need these.
.define _errno
.comm _errno, 4 ! Posix errno storage
.define .trppc, .ignmask
.comm .trppc, 4 ! ptr to user trap handler
.comm .ignmask, 4 ! user trap ignore mask
.define .linenumber, .filename
.comm .linenumber, 4 ! current linenumber (used for debugging)
.comm .filename, 4 ! ptr to current filename (used for debugging)

81
plat/linuxppc/descr Normal file
View file

@ -0,0 +1,81 @@
# $Source: /cvsroot/tack/Ack/plat/linux386/descr,v $
# $State: Exp $
# $Revision: 1.1 $
var w=4
var p=4
var s=2
var l=4
var f=4
var d=8
var ARCH=powerpc
var PLATFORM=linuxppc
var PLATFORMDIR={EM}/lib/{PLATFORM}
var CPP_F=-D__unix -D__POWERPC
var ALIGN=-a0:4 -a1:4 -a2:4 -a3:4 -b0:0x80000054
var C_LIB={PLATFORMDIR}/libc-ansi.a
# bitfields reversed for compatibility with (g)cc.
var CC_ALIGN=-Vr
var OLD_C_LIB={C_LIB}
var MACHOPT_F=
# Override the setting in fe so that files compiled for linuxppc can see
# the platform-specific headers.
var C_INCLUDES=-I{PLATFORMDIR}/include -I{EM}/include/ansi
name be
from .m.g
to .s
program {EM}/lib.bin/{PLATFORM}/ncg
mapflag -gdb GF=-gdb
args {GF?} <
stdout
need .e
end
name asopt
from .s
to .so
program {EM}/lib.bin/{PLATFORM}/top
args
optimizer
stdin
stdout
end
name as
from .s.so
to .o
program {EM}/lib.bin/{PLATFORM}/as
args - -o > <
prep cond
end
name led
from .o.a
to .out
program {EM}/lib.bin/em_led
mapflag -l* LNAME={PLATFORMDIR}/lib*
mapflag -fp FLOATS={EM}/{LIB}fp
args {ALIGN} {SEPID?} \
{PLATFORMDIR}/boot.o \
({RTS}:.ocm.b.c={PLATFORMDIR}/c-ansi.o) \
({RTS}:.mod={PLATFORMDIR}/modula2.o) \
({RTS}:.p={PLATFORMDIR}/pascal.o) \
-o > < \
(.p:{TAIL}={PLATFORMDIR}/libpascal.a) \
(.b:{TAIL}={PLATFORMDIR}/libbasic.a) \
(.mod:{TAIL}={PLATFORMDIR}/libmodula2.a) \
(.ocm:{TAIL}={PLATFORMDIR}/liboccam.a) \
(.ocm.b.mod.c.p:{TAIL}={PLATFORMDIR}/libc.a) \
{PLATFORMDIR}/liblinux.a \
{PLATFORMDIR}/libem.a \
{PLATFORMDIR}/libsys.a \
{PLATFORMDIR}/libend.a
linker
end
name cv
from .out
to .exe
program {EM}/bin/aelflod
args -m20 -b < >
outfile linuxppc.exe
end

View file

@ -0,0 +1,18 @@
/* $Source: /cvsroot/tack/Ack/plat/linux386/include/ack/config.h,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#ifndef _ACK_CONFIG_H
#define _ACK_CONFIG_H
/* We're providing a time() system call rather than wanting a wrapper around
* gettimeofday() in the libc. */
/* #define ACKCONF_TIME_IS_A_SYSCALL */
/* We don't support floating point right now. */
/* #define ACKCONF_NO_STDIO_FLOAT */
#endif

View file

@ -0,0 +1,76 @@
/* $Source: /cvsroot/tack/Ack/plat/linux386/include/sys/ioctl.h,v $
* $State: Exp $
* $Revision: 1.1 $
*/
#ifndef _SYS_IOCTL_H
#define _SYS_IOCTL_H
/* These are copied from the ioctl_list(2) man page. */
/* <include/asm-i386/socket.h> */
#define FIOSETOWN 0x00008901
#define SIOCSPGRP 0x00008902
#define FIOGETOWN 0x00008903
#define SIOCGPGRP 0x00008904
#define SIOCATMARK 0x00008905
#define SIOCGSTAMP 0x00008906
/* <include/asm-i386/termios.h> */
#define TCGETS 0x00005401
#define TCSETS 0x00005402
#define TCSETSW 0x00005403
#define TCSETSF 0x00005404
#define TCGETA 0x00005405
#define TCSETA 0x00005406
#define TCSETAW 0x00005407
#define TCSETAF 0x00005408
#define TCSBRK 0x00005409
#define TCXONC 0x0000540A
#define TCFLSH 0x0000540B
#define TIOCEXCL 0x0000540C
#define TIOCNXCL 0x0000540D
#define TIOCSCTTY 0x0000540E
#define TIOCGPGRP 0x0000540F
#define TIOCSPGRP 0x00005410
#define TIOCOUTQ 0x00005411
#define TIOCSTI 0x00005412
#define TIOCGWINSZ 0x00005413
#define TIOCSWINSZ 0x00005414
#define TIOCMGET 0x00005415
#define TIOCMBIS 0x00005416
#define TIOCMBIC 0x00005417
#define TIOCMSET 0x00005418
#define TIOCGSOFTCAR 0x00005419
#define TIOCSSOFTCAR 0x0000541A
#define FIONREAD 0x0000541B
#define TIOCINQ 0x0000541B
#define TIOCLINUX 0x0000541C
#define TIOCCONS 0x0000541D
#define TIOCGSERIAL 0x0000541E
#define TIOCSSERIAL 0x0000541F
#define TIOCPKT 0x00005420
#define FIONBIO 0x00005421
#define TIOCNOTTY 0x00005422
#define TIOCSETD 0x00005423
#define TIOCGETD 0x00005424
#define TCSBRKP 0x00005425
#define TIOCTTYGSTRUCT 0x00005426
#define FIONCLEX 0x00005450
#define FIOCLEX 0x00005451
#define FIOASYNC 0x00005452
#define TIOCSERCONFIG 0x00005453
#define TIOCSERGWILD 0x00005454
#define TIOCSERSWILD 0x00005455
#define TIOCGLCKTRMIOS 0x00005456
#define TIOCSLCKTRMIOS 0x00005457
#define TIOCSERGSTRUCT 0x00005458
#define TIOCSERGETLSR 0x00005459
#define TIOCSERGETMULTI 0x0000545A
#define TIOCSERSETMULTI 0x0000545B
#endif

View file

@ -0,0 +1,123 @@
/*
* unistd.h - standard system calls
*/
/* $Id$ */
#ifndef _UNISTD_H
#define _UNISTD_H
#include <stddef.h>
#include <time.h>
/* Types */
typedef int pid_t;
typedef int mode_t;
typedef long suseconds_t;
/* Time handling. */
struct timeval
{
time_t tv_sec;
suseconds_t tv_usec;
};
struct timezone
{
int tz_minuteswest;
int tz_dsttime;
}; /* obsolete, unused */
extern int gettimeofday(struct timeval* tv, struct timezone* tz);
extern int settimeofday(const struct timeval* tv, const struct timezone* tz);
/* File access. */
enum
{
O_ACCMODE = 0x3,
O_RDONLY = 0,
O_WRONLY = 1,
O_RDWR = 2,
O_CREAT = 0x10,
O_TRUNC = 0x20,
O_APPEND = 0x40
};
extern int open(const char* path, int access, ...);
extern int creat(const char* path, mode_t mode);
extern int close(int d);
extern int read(int fd, void* buffer, size_t count);
extern int write(int fd, void* buffer, size_t count);
extern off_t lseek(int fildes, off_t offset, int whence);
extern int fcntl(int fd, int op, ...);
/* Special variables */
extern char** environ;
/* Implemented system calls */
extern void _exit(int);
extern pid_t getpid(void);
extern int brk(void* ptr);
extern void* sbrk(intptr_t increment);
extern int isatty(int d);
/* Signal handling */
typedef int sig_atomic_t;
#define SIG_ERR ((sighandler_t) -1) /* Error return. */
#define SIG_DFL ((sighandler_t) 0) /* Default action. */
#define SIG_IGN ((sighandler_t) 1) /* Ignore signal. */
#define SIGHUP 1 /* Hangup (POSIX). */
#define SIGINT 2 /* Interrupt (ANSI). */
#define SIGQUIT 3 /* Quit (POSIX). */
#define SIGILL 4 /* Illegal instruction (ANSI). */
#define SIGTRAP 5 /* Trace trap (POSIX). */
#define SIGABRT 6 /* Abort (ANSI). */
#define SIGIOT 6 /* IOT trap (4.2 BSD). */
#define SIGBUS 7 /* BUS error (4.2 BSD). */
#define SIGFPE 8 /* Floating-point exception (ANSI). */
#define SIGKILL 9 /* Kill, unblockable (POSIX). */
#define SIGUSR1 10 /* User-defined signal 1 (POSIX). */
#define SIGSEGV 11 /* Segmentation violation (ANSI). */
#define SIGUSR2 12 /* User-defined signal 2 (POSIX). */
#define SIGPIPE 13 /* Broken pipe (POSIX). */
#define SIGALRM 14 /* Alarm clock (POSIX). */
#define SIGTERM 15 /* Termination (ANSI). */
#define SIGSTKFLT 16 /* Stack fault. */
#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */
#define SIGCHLD 17 /* Child status has changed (POSIX). */
#define SIGCONT 18 /* Continue (POSIX). */
#define SIGSTOP 19 /* Stop, unblockable (POSIX). */
#define SIGTSTP 20 /* Keyboard stop (POSIX). */
#define SIGTTIN 21 /* Background read from tty (POSIX). */
#define SIGTTOU 22 /* Background write to tty (POSIX). */
#define SIGURG 23 /* Urgent condition on socket (4.2 BSD). */
#define SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */
#define SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */
#define SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */
#define SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */
#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */
#define SIGPOLL SIGIO /* Pollable event occurred (System V). */
#define SIGIO 29 /* I/O now possible (4.2 BSD). */
#define SIGPWR 30 /* Power failure restart (System V). */
#define SIGSYS 31 /* Bad system call. */
#define SIGUNUSED 31
#define _NSIG 32 /* Biggest signal number + 1
(not including real-time signals). */
typedef void (*sighandler_t)(int);
extern sighandler_t signal(int signum, sighandler_t handler);
extern int raise(int signum);
#endif

View file

@ -0,0 +1,53 @@
#
! $Source: /cvsroot/tack/Ack/plat/linux386/libsys/_syscall.s,v $
! $State: Exp $
! $Revision: 1.1 $
! Declare segments (the order is important).
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
EINVAL = 22
#define IFFALSE 4
#define IFTRUE 12
#define ALWAYS 20
#define LT 0
#define GT 1
#define EQ 2
#define OV 3
! Perform a Linux system call.
.define __syscall
__syscall:
lwz r0, 0(sp)
lwz r3, 4(sp)
lwz r4, 8(sp)
lwz r5, 12(sp)
sc 0
bclr IFFALSE, OV, 0
! On error, r3 contains the errno.
! It just so happens that errnos 1-34 are the same in Linux as in ACK.
cmpi cr0, 0, r3, 1
bc IFTRUE, LT, 2f
cmpi cr0, 0, r3, 34
bc IFTRUE, GT, 2f
3:
addis r4, r0, <_errno
ori r4, r4, >_errno
stw r3, 0(r4)
addi r3, r0, -1
bclr ALWAYS, 0, 0
2:
addi r3, r0, EINVAL
b 3b

View file

@ -0,0 +1,14 @@
-- $Source: /cvsroot/tack/Ack/plat/linux386/libsys/pmfile,v $
-- $State: Exp $
-- $Revision: 1.1 $
local d = ROOTDIR.."plat/linuxppc/libsys/"
libsys_linuxppc = acklibrary {
ACKINCLUDES = {"%BINDIR%include"},
ackfile (d.."_syscall.s"),
ackfile (d.."trap.s"),
install = pm.install("%BINDIR%lib/%PLATFORM%/libsys.a"),
}

108
plat/linuxppc/libsys/trap.s Normal file
View file

@ -0,0 +1,108 @@
#
! $Source: /cvsroot/tack/Ack/plat/linux386/libsys/_syscall.s,v $
! $State: Exp $
! $Revision: 1.1 $
! Declare segments (the order is important).
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
#define IFFALSE 4
#define IFTRUE 12
#define ALWAYS 20
#define LT 0
#define GT 1
#define EQ 2
#define OV 3
EARRAY = 0
ERANGE = 1
ESET = 2
EIOVFL = 3
EFOVFL = 4
EFUNFL = 5
EIDIVZ = 6
EFDIVZ = 7
EIUND = 8
EFUND = 9
ECONV = 10
ESTACK = 16
EHEAP = 17
EILLINS = 18
EODDZ = 19
ECASE = 20
EMEMFLT = 21
EBADPTR = 22
EBADPC = 23
EBADLAE = 24
EBADMON = 25
EBADLIN = 26
EBADGTO = 27
EUNIMPL = 63 ! unimplemented em-instruction called
! EM trap handling.
.define .trap_ecase
.trap_ecase:
addi r3, r0, ECASE
b .trap
.define .trap_earray
.trap_earray:
addi r3, r0, EARRAY
b .trap
.define .trap
.trap:
cmpi cr0, 0, r3, 15 ! traps >15 can't be ignored
bc IFTRUE, LT, 1f
addi r4, r0, 1
rlwnm r4, r4, r3, 0, 31 ! calculate trap bit
addis r5, r0, <.ignmask
ori r5, r5, >.ignmask
lwz r5, 0(r5) ! load ignore mask
and. r4, r4, r5 ! compare
bclr IFFALSE, EQ, 0 ! return if non-zero
1:
addis r4, r0, <.trppc
ori r4, r4, >.trppc
lwz r5, 0(r4) ! load user trap routine
or. r5, r5, r5 ! test
bc IFTRUE, EQ, fatal ! if no user trap routine, bail out
addi r0, r0, 0
stw r0, 0(r4) ! reset trap routine
mfspr r0, lr
stwu r0, -4(sp) ! save old lr
stwu r3, -4(sp)
mtspr ctr, r5
bcctrl ALWAYS, 0, 0 ! call trap routine
lwz r0, 4(sp) ! load old lr again
addi sp, sp, 8 ! retract over stack usage
bclr ALWAYS, 0, 0 ! return
fatal:
addi r3, r0, 1
addis r4, r0, <message
ori r4, r4, >message
addi r5, r0, 6
addi r0, r0, 4 ! write()
sc 0
addi r0, r0, 1 ! exit()
sc 0
.sect .rom
message:
.ascii "TRAP!\n"

48
plat/linuxppc/pmfile Normal file
View file

@ -0,0 +1,48 @@
-- $Source: /cvsroot/tack/Ack/plat/linux386/pmfile,v $
-- $State: Exp $
-- $Revision: 1.3 $
local d = ROOTDIR.."plat/linuxppc/"
include (d.."libsys/pmfile")
include "plat/linux/liblinux/pmfile"
local bootsector = ackfile {
file (d.."boot.s"),
install = pm.install("%BINDIR%lib/%PLATFORM%/boot.o"),
}
local descr = group {
install = pm.install(d.."descr", "%BINDIR%%PLATIND%/%PLATFORM%/descr")
}
local headers = group {
install = {
pm.install(d.."include/ack/config.h", "%BINDIR%%PLATIND%/%PLATFORM%/include/ack/config.h"),
pm.install(d.."include/unistd.h", "%BINDIR%%PLATIND%/%PLATFORM%/include/unistd.h"),
}
}
platform_linuxppc = group {
ARCH = "powerpc",
PLATFORM = "linuxppc",
OPTIMISATION = "-O",
-- Ensure the descr and headers are installed first because we'll need it
-- to build the libraries.
descr,
headers,
-- Build the back-end support.
mach_powerpc,
support_powerpc,
lang_runtimes,
-- Build the PC standalone syscall library.
liblinux,
libsys_linuxppc,
bootsector,
}

10
pmfile
View file

@ -95,6 +95,12 @@ include "plat/pc86/pmfile" -- PC standalone
include "mach/i386/pmfile" -- generic i386
include "plat/linux386/pmfile" -- Linux executables
include "mach/powerpc/pmfile" -- generic PowerPC
include "plat/linuxppc/pmfile" -- Linux executables
include "mach/m68020/pmfile" -- generic M68k
include "plat/linux68k/pmfile" -- Linux executables
include "mach/i80/pmfile" -- generic 8080
include "plat/cpm/pmfile" -- CP/M
@ -180,7 +186,9 @@ default = group {
platform_pc86,
platform_linux386,
platform_cpm
-- platform_linuxppc,
platform_linux68k,
platform_cpm,
}
-- Ensure that the work directories exist.

View file

@ -32,7 +32,8 @@
/* Global settings. */
int bigendian = 0;
int elfmachine;
int elfabi = 3; /* abi = Linux */
int elfmachine = 3; /* machine = EM_386 */
/* Header and section table of an ack object file. */
@ -116,7 +117,7 @@ int follows(struct outsect* pa, struct outsect* pb)
{
/* return 1 if pa follows pb */
return (pa->os_base == align(pb->os_base+pb->os_size, pa->os_lign));
return (pa->os_base >= align(pb->os_base+pb->os_size, pa->os_lign));
}
/* Writes a byte. */
@ -276,11 +277,27 @@ int main(int argc, char* argv[])
{
switch (argv[1][1])
{
case 'a':
elfabi = atoi(&argv[1][2]);
break;
case 'b':
bigendian = 1;
break;
case 'h':
fprintf(stderr, "%s: Syntax: aelflod [-h] <inputfile> <outputfile>\n",
fprintf(stderr, "%s: Syntax: aelflod [-a<number>] [-b] [-h] [-l]\n\t[-m<number>] <inputfile> <outputfile>\n",
program);
exit(0);
case 'l':
bigendian = 0;
break;
case 'm':
elfmachine = atoi(&argv[1][2]);
break;
default:
syntaxerror:
fatal("syntax error --- try -h for help");
@ -382,13 +399,13 @@ int main(int argc, char* argv[])
emit8(1); /* class = ELFCLASS32 */
emit8(bigendian ? 2 : 1); /* endianness */
emit8(1); /* ELF version */
emit8(3); /* ABI = Linux */
emit8(elfabi); /* ABI */
emit8(0); /* ABI version */
emit8(0); emit16(0); /* padding... */
emit32(0); /* ...to offset 0x10 */
emit16(2); /* type = ET_EXEC */
emit16(3); /* machine = EM_386 */
emit16(elfmachine); /* machine */
emit32(1); /* ELF version again */
emit32(outsect[TEXT].os_base); /* entry point */
emit32(ELF_HEADER_SIZE); /* program header offset */

View file

@ -112,10 +112,10 @@ showsect()
struct outsect section;
rd_sect(&section, 1);
printf("\tstartaddress in machine\t%ld\n", section.os_base);
printf("\tsection size in machine\t%ld\n", section.os_size);
printf("\tstartaddress in file\t%ld\n", section.os_foff);
printf("\tsection size in file\t%ld\n", section.os_flen);
printf("\tstartaddress in machine\t0x%lX\n", section.os_base);
printf("\tsection size in machine\t0x%lX\n", section.os_size);
printf("\tstartaddress in file\t0x%lX\n", section.os_foff);
printf("\tsection size in file\t0x%lX\n", section.os_flen);
printf("\tsection alignment\t%ld\n", section.os_lign);
}
@ -137,8 +137,14 @@ showrelo()
case RELO4:
printf("\t4 bytes\n");
break;
case RELOPPC:
printf("\tPowerPC 26-bit address\n");
break;
case RELOH2:
printf("\ttop 2 bytes of a 4 byte word\n");
break;
default:
error("\tunexpected relocation length\n");
printf("\tunknown relocation type %d\n", relrec.or_type & RELSZ);
break;
}
if (relrec.or_type & RELPC) printf("\tpc relative\n");
@ -194,7 +200,7 @@ showname(namep)
printf("\tstab 0x%x\n", namep->on_type >> 8);
printf("\tdesc 0x%x\n", namep->on_desc);
}
printf("\tvalue %ld\n", namep->on_valu);
printf("\tvalue 0x%lX\n", namep->on_valu);
}
/*

View file

@ -1,4 +1,5 @@
#!/bin/sh
set -e
em_table=$1
h=${2-.}

View file

@ -161,7 +161,9 @@ struct outrelo {
#define RELSZ 0x07 /* relocation length */
#define RELO1 0x01 /* 1 byte */
#define RELO2 0x02 /* 2 bytes */
#define RELO4 0x04 /* 4 bytes */
#define RELO4 0x03 /* 4 bytes */
#define RELOPPC 0x04 /* 26-bit PowerPC address */
#define RELOH2 0x05 /* write top 2 bytes of 4 byte word */
#define RELPC 0x08 /* pc relative */
#define RELBR 0x10 /* High order byte lowest address. */
#define RELWR 0x20 /* High order word lowest address. */

View file

@ -31,8 +31,8 @@ tool_led = cprogram {
}
-- Revision history
-- $Log$
-- Revision 1.2 2006-07-22 20:52:44 dtrg
-- $Log: pmfile,v $
-- Revision 1.2 2006/07/22 20:52:44 dtrg
-- led now gets installed into the right place.
--
-- Revision 1.1 2006/07/22 20:04:41 dtrg

View file

@ -16,26 +16,20 @@ static char rcsid[] = "$Id$";
#define UBYTE(x) ((x) & BYTEMASK)
/*
* The bits in type indicate how many bytes the value occupies and what
* significance should be attributed to each byte.
*/
static long
getvalu(addr, type)
char addr[];
char type;
static long read2(char* addr, int type)
{
unsigned short word0, word1;
switch (type & RELSZ) {
case RELO1:
return UBYTE(addr[0]);
case RELO2:
if (type & RELBR)
return (UBYTE(addr[0]) << WIDTH) + UBYTE(addr[1]);
else
return (UBYTE(addr[1]) << WIDTH) + UBYTE(addr[0]);
case RELO4:
}
static long read4(char* addr, int type)
{
unsigned short word0, word1;
if (type & RELBR) {
word0 = (UBYTE(addr[0]) << WIDTH) + UBYTE(addr[1]);
word1 = (UBYTE(addr[2]) << WIDTH) + UBYTE(addr[3]);
@ -47,30 +41,38 @@ getvalu(addr, type)
return ((long)word0 << (2 * WIDTH)) + word1;
else
return ((long)word1 << (2 * WIDTH)) + word0;
}
/*
* The bits in type indicate how many bytes the value occupies and what
* significance should be attributed to each byte.
*/
static long
getvalu(addr, type)
char addr[];
char type;
{
switch (type & RELSZ) {
case RELO1:
return UBYTE(addr[0]);
case RELO2:
return read2(addr, type);
case RELO4:
return read4(addr, type);
case RELOPPC:
return read4(addr, type) & 0x03FFFFFD;
case RELOH2:
return read2(addr, type) << 16;
default:
fatal("bad relocation size");
}
/* NOTREACHED */
}
/*
* The bits in type indicate how many bytes the value occupies and what
* significance should be attributed to each byte.
* We do not check for overflow.
*/
static
putvalu(valu, addr, type)
long valu;
char addr[];
char type;
static void write2(long valu, char* addr, int type)
{
unsigned short word0, word1;
switch (type & RELSZ) {
case RELO1:
addr[0] = valu;
break;
case RELO2:
if (type & RELBR) {
addr[0] = valu >> WIDTH;
addr[1] = valu;
@ -78,8 +80,12 @@ putvalu(valu, addr, type)
addr[0] = valu;
addr[1] = valu >> WIDTH;
}
break;
case RELO4:
}
static void write4(long valu, char* addr, int type)
{
unsigned short word0, word1;
if (type & RELWR) {
word0 = valu >> (2 * WIDTH);
word1 = valu;
@ -98,6 +104,39 @@ putvalu(valu, addr, type)
addr[2] = word1;
addr[3] = word1 >> WIDTH;
}
}
/*
* The bits in type indicate how many bytes the value occupies and what
* significance should be attributed to each byte.
* We do not check for overflow.
*/
static
putvalu(valu, addr, type)
long valu;
char addr[];
char type;
{
switch (type & RELSZ) {
case RELO1:
addr[0] = valu;
break;
case RELO2:
write2(valu, addr, type);
break;
case RELO4:
write4(valu, addr, type);
break;
case RELOPPC:
{
long i = read4(addr, type) & ~0x03FFFFFD;
i |= valu & 0x03FFFFFD;
write4(i, addr, type);
break;
}
case RELOH2:
write2(valu>>16, addr, type);
break;
default:
fatal("bad relocation size");
@ -182,6 +221,7 @@ relocate(head, emit, names, relo, off)
* Pick up previous value at location to be relocated.
*/
valu = getvalu(emit + (relo->or_addr - off), relo->or_type);
/*
* Or_nami is an index in the name table of the considered module.
* The name of which it is an index can be:

View file

@ -15,8 +15,8 @@
#define BORS(x,y) y
#endif
#define MAXREGS BORS(40,30)
#define MAXPROPS BORS(30,20)
#define MAXREGS BORS(80,30)
#define MAXPROPS BORS(120,20)
#define MAXTOKENS BORS(100,60)
#define MAXATT 6
#define MAXSETS BORS(200,100)
@ -27,14 +27,14 @@
#define MAXPATTERNS BORS(40,30)
#define MAXALLREG 5
#define MAXINSTANCES BORS(500,300)
#define MAXMOVES BORS(40,20)
#define MAXMOVES BORS(80,20)
#define MAXTESTS 10
#define MAXSTACKS BORS(30,20)
#define MAXCOERCS BORS(50,30)
#define MAXSPLCOERC BORS(20,10)
#define MAXSPLIT 3
#define MAXPATBYTES BORS(14000,7000)
#define MAXREGVAR 10
#define MAXREGVAR 64
#define MAXSOURCELINES 7000
#define MAXPROCARG 10

View file

@ -61,27 +61,7 @@ ncgg = simple {
outputs = {"%U%/tables.c", "%U%/tables.h"},
command = {
"cd %out[1]:dirname% && (%BINDIR%%PLATDEP%/cpp.ansi -P -I%NCGGINCLUDEDIR% %in% | %TOOLDIR%ncgg)",
"cd %out[1]:dirname% && (%BINDIR%%PLATDEP%/cpp.ansi -I%NCGGINCLUDEDIR% %in% | %TOOLDIR%ncgg)",
"mv %out[1]:dirname%/tables.H %out[2]%"
},
}
--[[
@echo HOSTNCG $SRCDIR/src/arch/$table/ncg/table
@mkdir -p \$(dir \$@)
@(cd $OBJDIR/src/arch/$1/ncg && $DESTDIR/bin/cpp -P -I$SRCDIR/src/arch/$1/ncg $SRCDIR/src/arch/$table/ncg/table | \
$DESTDIR/bin/ncgg) > /dev/null
@(cd $OBJDIR/src/arch/$1/ncg && mv tables.H tables.h)
--]]
-- Revision history
-- $Log$
-- Revision 1.3 2007-04-23 23:40:59 dtrg
-- Modified to run ncgg input files through the ANSI preprocessor rather than the K&R one.
--
-- Revision 1.2 2006/07/22 20:58:27 dtrg
-- cpp now gets installed in the right place.
--
-- Revision 1.1 2006/07/20 23:24:28 dtrg
-- First version in CVS.
--