Merge changes from branch: linux68k platform, linuxppc platform (partially
working), and miscellaneous changes to support these.
This commit is contained in:
commit
d91a1dc1a6
5
h/out.h
5
h/out.h
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
38
mach/m68020/libem/pmfile
Normal 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"),
|
||||
}
|
|
@ -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:
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include <em_abs.h>
|
||||
|
||||
char *
|
||||
_trpstr(d)
|
||||
{
|
||||
|
|
|
@ -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
16
mach/m68020/libend/pmfile
Normal 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"),
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -53,12 +53,12 @@ PROPERTIES
|
|||
GPR24 GPR25 GPR26 GPR27 GPR28 GPR29 GPR30 GPR31
|
||||
|
||||
CR0 CR1
|
||||
|
||||
|
||||
FPR0 FPR1 FPR2 FPR3 FPR4 FPR5 FPR6 FPR7
|
||||
FPR8 FPR9 FPR10 FPR11 FPR12 FPR13 FPR14 FPR15
|
||||
FPR16 FPR17 FPR18 FPR19 FPR20 FPR21 FPR22 FPR23
|
||||
FPR24 FPR25 FPR26 FPR27 FPR28 FPR29 FPR30 FPR31
|
||||
|
||||
|
||||
REGISTERS
|
||||
|
||||
/* Reverse order to encourage ncg to allocate them from r31 down */
|
||||
|
@ -95,7 +95,7 @@ REGISTERS
|
|||
FP("fp") : GPR, GPRFP.
|
||||
SP("sp") : GPR, GPRSP.
|
||||
R0("r0") : GPR, GPR0.
|
||||
|
||||
|
||||
F31("f31") : FPR, FREG, FPR31.
|
||||
F30("f30") : FPR, FREG, FPR30.
|
||||
F29("f29") : FPR, FREG, FPR29.
|
||||
|
@ -1996,7 +1996,7 @@ PATTERNS
|
|||
|
||||
/* All very cheap and nasty --- this needs to be properly integrated into
|
||||
* the code generator. ncg doesn't like having separate FPU registers. */
|
||||
|
||||
|
||||
/* Single-precision */
|
||||
|
||||
pat zrf $1==INT32 /* Push zero */
|
||||
|
@ -2158,4 +2158,3 @@ PATTERNS
|
|||
gen
|
||||
bl {LABEL, ".fif8"}
|
||||
|
||||
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
*/
|
||||
/* $Id$ */
|
||||
|
||||
#undef NDEBUG
|
||||
#ifndef NDEBUG
|
||||
#define assert(x) if(!(x)) badassertion("x",__FILE__,__LINE__)
|
||||
#else
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
static char rcsid[] = "$Id$";
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "assert.h"
|
||||
#include "equiv.h"
|
||||
#include "param.h"
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -60,8 +60,6 @@ long con();
|
|||
#define get8() getc(emfile)
|
||||
|
||||
FILE *emfile;
|
||||
extern FILE *codefile;
|
||||
extern FILE *freopen();
|
||||
|
||||
int nextispseu,savetab1;
|
||||
int opcode;
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
static char rcsid[] = "$Id$";
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "assert.h"
|
||||
#include "param.h"
|
||||
#include "tables.h"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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%")
|
||||
}
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
static char rcsid[] = "$Id$";
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "assert.h"
|
||||
#include "param.h"
|
||||
#include "tables.h"
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "assert.h"
|
||||
#include "param.h"
|
||||
#include "tables.h"
|
||||
|
|
|
@ -3,6 +3,7 @@ static char rcsid[] = "$Id$";
|
|||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "assert.h"
|
||||
#include "param.h"
|
||||
#include "tables.h"
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
static char rcsid[] = "$Id$";
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "assert.h"
|
||||
#include "param.h"
|
||||
#include "tables.h"
|
||||
|
|
|
@ -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>
|
|
@ -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).
|
||||
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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).
|
||||
|
|
@ -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>
|
|
@ -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>
|
13
plat/linux/liblinux/isatty.c
Normal file
13
plat/linux/liblinux/isatty.c
Normal 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;
|
||||
}
|
|
@ -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>
|
|
@ -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
|
|
@ -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>
|
|
@ -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>
|
29
plat/linux/liblinux/pmfile
Normal file
29
plat/linux/liblinux/pmfile
Normal 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"),
|
||||
}
|
|
@ -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>
|
|
@ -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;
|
||||
}
|
|
@ -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>
|
|
@ -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
|
|
@ -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>
|
|
@ -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
|
||||
|
|
|
@ -3,8 +3,6 @@
|
|||
! $State$
|
||||
! $Revision$
|
||||
|
||||
#include "syscalls.h"
|
||||
|
||||
! Declare segments (the order is important).
|
||||
|
||||
.sect .text
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
/* $Source$
|
||||
* $State$
|
||||
* $Revision$
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int isatty(int fd)
|
||||
{
|
||||
return 0;
|
||||
}
|
|
@ -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"),
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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
26
plat/linux68k/.distr
Normal 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
42
plat/linux68k/README
Normal 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
87
plat/linux68k/boot.s
Normal 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
74
plat/linux68k/descr
Normal 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
|
14
plat/linux68k/include/ack/config.h
Normal file
14
plat/linux68k/include/ack/config.h
Normal 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
|
76
plat/linux68k/include/sys/ioctl.h
Normal file
76
plat/linux68k/include/sys/ioctl.h
Normal 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
|
123
plat/linux68k/include/unistd.h
Normal file
123
plat/linux68k/include/unistd.h
Normal 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
|
45
plat/linux68k/libsys/_syscall.s
Normal file
45
plat/linux68k/libsys/_syscall.s
Normal 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
|
13
plat/linux68k/libsys/pmfile
Normal file
13
plat/linux68k/libsys/pmfile
Normal 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
48
plat/linux68k/pmfile
Normal 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
26
plat/linuxppc/.distr
Normal 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
42
plat/linuxppc/README
Normal 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
56
plat/linuxppc/boot.s
Normal 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
81
plat/linuxppc/descr
Normal 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
|
18
plat/linuxppc/include/ack/config.h
Normal file
18
plat/linuxppc/include/ack/config.h
Normal 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
|
76
plat/linuxppc/include/sys/ioctl.h
Normal file
76
plat/linuxppc/include/sys/ioctl.h
Normal 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
|
123
plat/linuxppc/include/unistd.h
Normal file
123
plat/linuxppc/include/unistd.h
Normal 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
|
53
plat/linuxppc/libsys/_syscall.s
Normal file
53
plat/linuxppc/libsys/_syscall.s
Normal 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
|
14
plat/linuxppc/libsys/pmfile
Normal file
14
plat/linuxppc/libsys/pmfile
Normal 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
108
plat/linuxppc/libsys/trap.s
Normal 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
48
plat/linuxppc/pmfile
Normal 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
10
pmfile
|
@ -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.
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -112,10 +112,10 @@ showsect()
|
|||
struct outsect section;
|
||||
|
||||
rd_sect(§ion, 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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
em_table=$1
|
||||
h=${2-.}
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -16,6 +16,33 @@ static char rcsid[] = "$Id$";
|
|||
|
||||
#define UBYTE(x) ((x) & BYTEMASK)
|
||||
|
||||
static long read2(char* addr, int type)
|
||||
{
|
||||
unsigned short word0, word1;
|
||||
|
||||
if (type & RELBR)
|
||||
return (UBYTE(addr[0]) << WIDTH) + UBYTE(addr[1]);
|
||||
else
|
||||
return (UBYTE(addr[1]) << WIDTH) + UBYTE(addr[0]);
|
||||
}
|
||||
|
||||
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]);
|
||||
} else {
|
||||
word0 = (UBYTE(addr[1]) << WIDTH) + UBYTE(addr[0]);
|
||||
word1 = (UBYTE(addr[3]) << WIDTH) + UBYTE(addr[2]);
|
||||
}
|
||||
if (type & RELWR)
|
||||
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.
|
||||
|
@ -25,34 +52,60 @@ getvalu(addr, type)
|
|||
char addr[];
|
||||
char 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]);
|
||||
return read2(addr, type);
|
||||
case RELO4:
|
||||
if (type & RELBR) {
|
||||
word0 = (UBYTE(addr[0]) << WIDTH) + UBYTE(addr[1]);
|
||||
word1 = (UBYTE(addr[2]) << WIDTH) + UBYTE(addr[3]);
|
||||
} else {
|
||||
word0 = (UBYTE(addr[1]) << WIDTH) + UBYTE(addr[0]);
|
||||
word1 = (UBYTE(addr[3]) << WIDTH) + UBYTE(addr[2]);
|
||||
}
|
||||
if (type & RELWR)
|
||||
return ((long)word0 << (2 * WIDTH)) + word1;
|
||||
else
|
||||
return ((long)word1 << (2 * WIDTH)) + word0;
|
||||
return read4(addr, type);
|
||||
case RELOPPC:
|
||||
return read4(addr, type) & 0x03FFFFFD;
|
||||
case RELOH2:
|
||||
return read2(addr, type) << 16;
|
||||
default:
|
||||
fatal("bad relocation size");
|
||||
}
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
static void write2(long valu, char* addr, int type)
|
||||
{
|
||||
unsigned short word0, word1;
|
||||
|
||||
if (type & RELBR) {
|
||||
addr[0] = valu >> WIDTH;
|
||||
addr[1] = valu;
|
||||
} else {
|
||||
addr[0] = valu;
|
||||
addr[1] = valu >> WIDTH;
|
||||
}
|
||||
}
|
||||
|
||||
static void write4(long valu, char* addr, int type)
|
||||
{
|
||||
unsigned short word0, word1;
|
||||
|
||||
if (type & RELWR) {
|
||||
word0 = valu >> (2 * WIDTH);
|
||||
word1 = valu;
|
||||
} else {
|
||||
word0 = valu;
|
||||
word1 = valu >> (2 * WIDTH);
|
||||
}
|
||||
if (type & RELBR) {
|
||||
addr[0] = word0 >> WIDTH;
|
||||
addr[1] = word0;
|
||||
addr[2] = word1 >> WIDTH;
|
||||
addr[3] = word1;
|
||||
} else {
|
||||
addr[0] = word0;
|
||||
addr[1] = word0 >> WIDTH;
|
||||
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.
|
||||
|
@ -64,40 +117,26 @@ putvalu(valu, addr, type)
|
|||
char addr[];
|
||||
char 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;
|
||||
} else {
|
||||
addr[0] = valu;
|
||||
addr[1] = valu >> WIDTH;
|
||||
}
|
||||
write2(valu, addr, type);
|
||||
break;
|
||||
case RELO4:
|
||||
if (type & RELWR) {
|
||||
word0 = valu >> (2 * WIDTH);
|
||||
word1 = valu;
|
||||
} else {
|
||||
word0 = valu;
|
||||
word1 = valu >> (2 * WIDTH);
|
||||
}
|
||||
if (type & RELBR) {
|
||||
addr[0] = word0 >> WIDTH;
|
||||
addr[1] = word0;
|
||||
addr[2] = word1 >> WIDTH;
|
||||
addr[3] = word1;
|
||||
} else {
|
||||
addr[0] = word0;
|
||||
addr[1] = word0 >> WIDTH;
|
||||
addr[2] = word1;
|
||||
addr[3] = word1 >> WIDTH;
|
||||
}
|
||||
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:
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
|
||||
--
|
||||
|
|
Loading…
Reference in a new issue