30 Commits

Author SHA1 Message Date
Matt Jenkins
5da189ad36 Changed %2 to %s in string format 2014-04-19 13:37:15 +01:00
Matt Jenkins
de9ae5c603 Merge branch 'master' into double_precision 2014-04-19 12:42:19 +01:00
Matt Jenkins
9cf1805a1d Added double precision test programs 2014-04-19 10:31:33 +01:00
Matt Jenkins
4e2777e9fb Added double precision test programs 2014-04-19 10:31:25 +01:00
Matt Jenkins
6316b05ec3 Added gccdump.s to gitignore 2014-04-19 10:26:30 +01:00
Matt Jenkins
738874016f Merge github.com:igor-m/retrobsd-1 into double_precision 2014-04-19 10:04:52 +01:00
igor-m
6ce8e28a85 Fix of 16byte stack alignment, doprnt.c does not require va_arg fix now 2014-04-19 09:50:04 +02:00
igor-m
4783836659 New SPI IOCTL modi - R,W,RB,WB,RWB 2014-04-17 19:49:40 +02:00
igor-m
249b5716bb Original spi.c and spi.h 2014-04-17 01:17:06 +02:00
igor-m
1d1151403b Revert "Added comment to spi.c"
This reverts commit 28aae2c427.
2014-04-17 01:06:49 +02:00
igor-m
54a771c6f0 Revert "Added comment to spi.c"
This reverts commit 28aae2c427.
2014-04-17 00:53:24 +02:00
igor-m
eddfd51e51 Fix of vaarg alignment addr calc 2014-04-17 00:14:41 +02:00
igor-m
d9033fbf2d target.mk back with -fno-short-double 2014-04-17 00:07:00 +02:00
igor-m
28aae2c427 Added comment to spi.c 2014-04-16 15:24:09 +02:00
igor-m
6d689c335c Added SPI modes R,W,RB,WB,RWB 2014-04-16 15:03:35 +02:00
igor-m
bad98ad239 Single -fno-short-double in target.mk 2014-04-14 13:30:22 +02:00
igor-m
c04495837f Fix of the vaarg fix 2014-04-13 09:34:13 +02:00
igor-m
297b14aa0c Fixes with aliasing - using ieee.h 2014-04-12 13:39:05 +02:00
igor-m
190aa1e633 Fixes with aliasing 2014-04-12 12:51:40 +02:00
igor-m
0220852a66 Fix of va_arg aliasing in doprnt.c 2014-04-12 01:25:31 +02:00
igor-m
2afff6f8aa Fix to doprnt.c and moded modff, modf etc 2014-04-12 01:14:47 +02:00
igor-m
5b1496e5c3 Fix6 2014-04-11 22:55:29 +02:00
igor-m
bcff791a3c Fix5 2014-04-11 22:45:22 +02:00
igor-m
98d034efe1 Fix4 2014-04-11 22:24:56 +02:00
igor-m
0f6e23c2fe Fix 3 2014-04-11 21:55:53 +02:00
igor-m
af3db0bcd2 Another attempt to fix isinff.c, grrh 2014-04-11 21:51:23 +02:00
igor-m
b73ccfb9dc Attempt to fix isinff.c 2014-04-11 21:23:23 +02:00
igor-m
c31e4fa1e8 Was within untracked files ?? 2014-04-11 20:13:51 +02:00
igor-m
16e7b63b48 Fix the Double Precision changes 2014-04-11 19:35:55 +02:00
igor-m
16214d4557 Double Precision Floating Math implementation 2014-04-11 13:36:20 +02:00
119 changed files with 2549 additions and 3470 deletions

View File

@@ -12,7 +12,6 @@
# Supported boards
#
MAX32 = sys/pic32/max32/MAX32
MAX32-ETH = sys/pic32/max32-eth/MAX32-ETH
UBW32 = sys/pic32/ubw32/UBW32
UBW32UART = sys/pic32/ubw32-uart/UBW32-UART
UBW32UARTSDRAM = sys/pic32/ubw32-uart-sdram/UBW32-UART-SDRAM
@@ -82,7 +81,6 @@ SHARE_FILES = share/re.help share/example/Makefile \
share/example/blkjack.bas share/example/hilow.bas \
share/example/stars.bas share/example/prime.scm \
share/example/fact.fth share/example/echo.S \
share/example/stdarg.c share/example/skeleton.c \
$(wildcard share/smallc/*)
MANFILES = share/man/ share/man/cat1/ share/man/cat2/ share/man/cat3/ \
share/man/cat4/ share/man/cat5/ share/man/cat6/ share/man/cat7/ \

View File

@@ -40,7 +40,6 @@ TARGET = $(MAXCOLOR) # for the Colour Maximite board
TARGET = $(EXPLORER16) # for the Explorer 16 board
TARGET = $(STARTERKIT) # for the PIC32 USB or Ethernet Starter Kit
TARGET = $(MAX32) # default
TARGET = $(MAX32-ETH) # for the chipKIT MAX32 board with Arduino Ethernet shield
TARGET = $(DUINOMITE) # for the Duinomite board with USB console
TARGET = $(DUINOMITEUART) # for the Duinomite board with UART console
TARGET = $(DUINOMITEE) # for the Duinomite E board with USB console
@@ -90,7 +89,7 @@ on a board used.
#### Max32 board:
```shell
$ cd sys/pic32/ubw32
$ AVRTOOLS=/Applications/Mpide.app/Contents/Resources/Java/hardware/tools/avr
$ AVRTOOLS=/Applications/Mpide.app/Contents/Resources/Java/hardware/tools
$AVRTOOLS/bin/avrdude -C$AVRTOOLS/etc/avrdude.conf -c stk500v2 -p pic32 \
-P /dev/tty.usbserial-* -b 115200 -v -U flash:w:unix.hex:i
```

0
cross.mk Normal file → Executable file
View File

View File

@@ -33,7 +33,29 @@
#ifndef _AOUT_H_
#define _AOUT_H_
#include <sys/exec_aout.h>
#include <sys/exec.h>
/* Valid magic number check. */
#define N_BADMAG(x) (((x).a_magic) != RMAGIC && \
((x).a_magic) != OMAGIC && \
((x).a_magic) != NMAGIC)
/* Text segment offset. */
#define N_TXTOFF(x) sizeof(struct exec)
/* Data segment offset. */
#define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text)
/* Text relocation table offset. */
#define N_TRELOFF(x) (N_DATOFF(x) + (x).a_data)
/* Data relocation table offset. */
#define N_DRELOFF(x) (N_TRELOFF(x) + (x).a_reltext)
/* Symbol table offset. */
#define N_SYMOFF(x) ((x).a_magic == RMAGIC ? \
N_DRELOFF(x) + (x).a_reldata : \
N_DATOFF(x) + (x).a_data)
#define _AOUT_INCLUDE_
#include <nlist.h>

47
include/ieee.h Normal file
View File

@@ -0,0 +1,47 @@
typedef union // LITTLE ENDIAN
{
double value;
struct
{
unsigned long lsw;
unsigned long msw;
} parts;
} ieee_double_shape_type;
/* Get two 32 bit ints from a double. */
#define EXTRACT_WORDS(ix0,ix1,d) \
do { \
ieee_double_shape_type ew_u; \
ew_u.value = (d); \
(ix0) = ew_u.parts.msw; \
(ix1) = ew_u.parts.lsw; \
} while (0)
/* Get the more significant 32 bit int from a double. */
#define GET_HIGH_WORD(i,d) \
do { \
ieee_double_shape_type gh_u; \
gh_u.value = (d); \
(i) = gh_u.parts.msw; \
} while (0)
/* Set a double from two 32 bit ints. */
#define INSERT_WORDS(d,ix0,ix1) \
do { \
ieee_double_shape_type iw_u; \
iw_u.parts.msw = (ix0); \
iw_u.parts.lsw = (ix1); \
(d) = iw_u.value; \
} while (0)
#define SET_HIGH_WORD(d,v) \
do { \
ieee_double_shape_type sh_u; \
sh_u.value = (d); \
sh_u.parts.msw = (v); \
(d) = sh_u.value; \
} while (0)

View File

@@ -12,8 +12,9 @@ extern double sinh(), cosh(), tanh();
extern double gamma();
extern double j0(), j1(), jn(), y0(), y1(), yn();
#define HUGE 1.701411733192644270e38
#define LOGHUGE 39
// ###PITO #define HUGE 1.701411733192644270e38
#define HUGE 1.79769313486231570000e+308
#define LOGHUGE 307
int isnanf(float x);
int isnan(double x);

View File

@@ -4,49 +4,32 @@
#ifndef _STDARG_H
#define _STDARG_H
/*
* Define va_start, va_arg, va_end, va_copy.
*/
#if defined(__GNUC__) /* Gnu C */
# define va_start(ap, last) __builtin_va_start((ap), last)
# define va_arg(ap, type) __builtin_va_arg((ap), type)
# define va_end(ap) __builtin_va_end((ap))
# define va_copy(dest, src) __builtin_va_copy((dest), (src))
/* Define __gnuc_va_list. */
#elif defined(__PCC__) /* PCC */
# define va_start(ap, last) __builtin_stdarg_start((ap), last)
# define va_arg(ap, type) __builtin_va_arg((ap), type)
# define va_end(ap) __builtin_va_end((ap))
# define va_copy(dest, src) __builtin_va_copy((dest), (src))
#else /* SmallerC, LCC */
# define va_start(ap, last) (ap = ((char*)&(last) + \
(((sizeof(last) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))))
# define va_arg(ap, type) ((type*)(ap += \
sizeof(type) == sizeof(int) ? sizeof(type) : \
(-(int)(ap) & (sizeof(type) - 1)) + sizeof(type)))[-1]
# define va_end(ap)
# define va_copy(dest, src) (dest = (src))
#ifdef __GNUC__
# ifndef __GNUC_VA_LIST
# define __GNUC_VA_LIST
typedef __builtin_va_list __gnuc_va_list;
# endif
# define va_start(ap, last) __builtin_va_start((ap), last)
#endif
#ifdef __PCC__
# define va_start(ap, last) __builtin_stdarg_start((ap), last)
#endif
#define va_arg(ap, type) __builtin_va_arg((ap), type)
#define va_end(ap) __builtin_va_end((ap))
#define va_copy(dest, src) __builtin_va_copy((dest), (src))
/*
* Define va_list.
*/
#ifndef _VA_LIST_T
# define _VA_LIST_T
# if defined(__GNUC__) || defined(__PCC__)
#ifndef _VA_LIST
#define _VA_LIST
#ifdef __GNUC__
typedef __builtin_va_list va_list;
# else
typedef char *va_list;
# endif
#endif
/*
* Define __gnuc_va_list.
*/
#if defined(__GNUC__) && !defined(__GNUC_VA_LIST)
# define __GNUC_VA_LIST
typedef __builtin_va_list __gnuc_va_list;
#ifdef __SMALLER_C__
typedef int *va_list;
#endif
#endif
#endif /* not _STDARG_H */

View File

@@ -110,12 +110,7 @@ int scanf (const char *, ...);
int sscanf (const char *, const char *, ...);
#ifndef _VA_LIST_
# ifdef __GNUC__
# define va_list __builtin_va_list /* For Gnu C */
# endif
# ifdef __SMALLER_C__
# define va_list char * /* For Smaller C */
# endif
#define va_list __builtin_va_list /* For GCC */
#endif
int vfprintf (FILE *, const char *, va_list);
@@ -131,7 +126,7 @@ int _doprnt (const char *, va_list, FILE *);
int _doscan (FILE *, const char *, va_list);
#ifndef _VA_LIST_
# undef va_list
#undef va_list
#endif
void perror (const char *);

View File

@@ -54,51 +54,49 @@
#define RAND_MAX 0x7fff
void abort (void);
void abort();
int abs (int);
int atexit (void (*)(void));
int atoi (const char *);
long atol (const char *);
double atof();
int atoi();
long atol();
void *calloc (size_t, size_t);
void exit (int);
void free (void *);
char *getenv (const char *);
char *getenv();
long labs (long);
void *malloc (size_t);
char *mktemp (char *);
int mkstemp (char *);
void qsort (void *, size_t, size_t, int (*)(const void *, const void *));
int rand (void);
void qsort();
int rand();
void *realloc (void*, size_t);
void srand (unsigned);
long strtol (const char *, char **, int);
unsigned long strtoul (const char *, char **, int);
int system (const char *);
void srand();
double strtod();
long strtol();
unsigned long strtoul();
int system();
int putenv (char *string);
int setenv (const char *name, const char *value, int overwrite);
int unsetenv (const char *name);
char *_findenv (const char *name, int *offset);
void *alloca (size_t size);
void *alloca();
int daemon (int, int);
char *devname (dev_t dev, mode_t type);
int getloadavg (unsigned loadavg[], int nelem);
int daemon();
char *devname();
int getloadavg(unsigned loadavg[], int nelem);
extern char *suboptarg; /* getsubopt(3) external variable */
int getsubopt (char **, char **, char **);
int getsubopt();
long random (void);
char *setstate (char *);
void srandom (unsigned);
#ifndef __SMALLER_C__
double atof (const char *);
double strtod (const char *, char **);
char *ecvt (double, int, int *, int *);
char *fcvt (double, int, int *, int *);
char *gcvt (double, int, char *);
#endif
char *ecvt (double, int, int *, int *);
char *fcvt (double, int, int *, int *);
char *gcvt (double, int, char *);
#endif /* _STDLIB_H_ */

View File

@@ -143,12 +143,7 @@ extern char *optarg; /* getopt(3) external variables */
extern int opterr, optind, optopt;
#ifndef _VA_LIST_
# ifdef __GNUC__
# define va_list __builtin_va_list /* For Gnu C */
# endif
# ifdef __SMALLER_C__
# define va_list char * /* For Smaller C */
# endif
#define va_list __builtin_va_list /* For GCC */
#endif
void err (int eval, const char *fmt, ...);
@@ -161,6 +156,6 @@ void vwarn (const char *fmt, va_list ap);
void vwarnx (const char *fmt, va_list ap);
#ifndef _VA_LIST_
# undef va_list
#undef va_list
#endif
#endif /* !_UNISTD_H_ */

0
lib/Makefile Normal file → Executable file
View File

View File

@@ -1,5 +1,5 @@
all: ashello echo chello
all: ashello echo
ashello: ashello.o
$(LD) ashello.o -o $@
@@ -11,4 +11,4 @@ echo: echo.o
$(LD) $@.o -o $@
clean:
rm -f *.o ashello echo chello *.dis *~
rm -f *.o ashello echo *.dis *~

View File

@@ -5,13 +5,13 @@ CFLAGS += -Werror
ASFLAGS += -DCROSS
ASLDFLAGS = --oformat=elf32-tradlittlemips -N -nostartfiles -T $(TOPSRC)/src/elf32-mips.ld
all: chello cplus echo stdarg
all: hello cplus
chello: chello.o
${CC} ${LDFLAGS} -o chello.elf chello.o ${LIBS}
${OBJDUMP} -S chello.elf > chello.dis
${SIZE} chello.elf
${ELF2AOUT} chello.elf $@
hello: hello.o
${CC} ${LDFLAGS} -o hello.elf hello.o ${LIBS}
${OBJDUMP} -S hello.elf > hello.dis
${SIZE} hello.elf
${ELF2AOUT} hello.elf $@
cplus: cplus.o
${CXX} ${LDFLAGS} -nostdlib -o cplus.elf cplus.o ${LIBS}
@@ -24,6 +24,7 @@ echo: echo.o
${OBJDUMP} -S $@.elf > $@.dis
${SIZE} $@.elf
${ELF2AOUT} $@.elf $@
./aout $@ > $@.dis
clean:
rm -f *.o *.elf ${MAN} chello cplus echo stdarg *.elf *.dis tags *~
rm -f *.o *.elf ${MAN} hello cplus *.elf *.dis tags *~

View File

@@ -2,6 +2,6 @@
int main()
{
printf ("Hello, C World!\n");
return 0;
printf ("Hello, C World!\n");
return 0;
}

View File

@@ -1,92 +0,0 @@
/*
* Generic skeleton for a C program.
* When you create your own program based on this skeleton,
* you can replace the author's name and copyright with
* whatever your want. When you redistribute this skeleton or
* enhance it, please leave my name and copyright on it.
*
* Copyright (C) 1993-2014 Serge Vakulenko, <vak@cronyx.ru>
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for any purpose and without fee is hereby
* granted, provided that the above copyright notice appear in all
* copies and that both that the copyright notice and this
* permission notice and warranty disclaimer appear in supporting
* documentation, and that the name of the author not be used in
* advertising or publicity pertaining to distribution of the
* software without specific, written prior permission.
*
* The author disclaim all warranties with regard to this
* software, including all implied warranties of merchantability
* and fitness. In no event shall the author be liable for any
* special, indirect or consequential damages or any damages
* whatsoever resulting from loss of use, data or profits, whether
* in an action of contract, negligence or other tortious action,
* arising out of or in connection with the use or performance of
* this software.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
const char version[] = "1.0";
const char copyright[] = "Copyright (C) 1993-2014 Serge Vakulenko";
char *progname; /* Name of the current program (argv[0]) */
int verbose; /* Option -v */
int trace; /* Option -t */
int debug; /* Option -d */
void usage ()
{
fprintf (stderr, "Generic C skeleton, Version %s, %s\n", version, copyright);
fprintf (stderr, "Usage:\n\t%s [-vtd] [-r count] file...\n", progname);
fprintf (stderr, "Options:\n");
fprintf (stderr, "\t-v\tverbose mode\n");
fprintf (stderr, "\t-t\ttrace mode\n");
fprintf (stderr, "\t-d\tdebug\n");
fprintf (stderr, "\t-r #\trepeat count\n");
exit (-1);
}
int main (int argc, char **argv)
{
int count = 1; /* Option -r # */
progname = *argv;
for (;;) {
switch (getopt (argc, argv, "vtdr:")) {
case EOF:
break;
case 'v':
++verbose;
continue;
case 't':
++trace;
continue;
case 'd':
++debug;
continue;
case 'r':
count = strtol (optarg, 0, 0);
continue;
default:
usage ();
}
break;
}
argc -= optind;
argv += optind;
if (argc < 1)
usage ();
while (count-- > 0) {
int i;
for (i=0; i<argc; ++i)
printf ("%s ", argv[i]);
printf ("\n");
}
return (0);
}

View File

@@ -1,34 +0,0 @@
#include <stdio.h>
#include <stdarg.h>
void print(char *fmt, ...)
{
va_list ap;
int d;
char c, *s;
va_start(ap, fmt);
while (*fmt) {
switch (*fmt++) {
case 's': /* string */
s = va_arg(ap, char*);
printf("string %s\n", s);
break;
case 'd': /* int */
d = va_arg(ap, int);
printf("int %d\n", d);
break;
case 'c': /* char */
c = va_arg(ap, int);
printf("char %c\n", c);
break;
}
}
va_end(ap);
}
int main()
{
print("sdcsdc", "abracadabra", 12345, 'Z', "foo", 365, '%');
return 0;
}

57
src/cmd/9degree/9degree.c Normal file
View File

@@ -0,0 +1,57 @@
#include <stdio.h>
#include <math.h>
#include <sys/time.h>
void print64x( double x ) {
char* p;
int j;
p = (char *) &x;
for( j=0; j< sizeof(x); j++) {
printf("%02X", p[(sizeof(x)-1)-j]&0xFF);
}
}
void print32x( float x ) {
char* p;
int j;
p = (char *) &x;
for( j=0; j< sizeof(x); j++) {
printf("%02X", p[(sizeof(x)-1)-j]&0xFF);
}
}
int main() {
struct timeval start, stop;
volatile double _p64, q64, r64, e64;
long i;
unsigned long elapsed;
_p64 = 3.1415926535897932384626433832795;
for(i=0;i<100;i++) {
// 64bit test
// 9 degree test input
q64 = i;
// Convert to radians
q64 = q64 * _p64 / 180.0;
// Make the test
gettimeofday(&start, NULL);
r64 = (asin(acos(atan(tan(cos(sin(q64)))))));
gettimeofday(&stop, NULL);
// Convert to degree
r64 = r64 * 180.0 / _p64;
elapsed = stop.tv_usec - start.tv_usec;
printf("%ld degree 64bit test result= %1.15e time= %lu " , i, r64, elapsed );
printf("= 0x");
print64x( r64 );
printf("\n");
}
return 0;
}

1
src/cmd/9degree/Makefile Symbolic link
View File

@@ -0,0 +1 @@
../generic.mk

View File

@@ -17,7 +17,7 @@ SUBDIR = adb adc-demo ar as awk basic cc chflags chpass \
rdprof ranlib re renice retroforth scm setty sl \
sed sh smallc smlrc stty sysctl test uname wiznet xargs \
zmodem gtest msec unixbench cron compress date2 tip \
talloc devupdate uucp smux
talloc devupdate uucp smux 9degree mathtest scantest
# /sbin
SUBDIR += chown chroot disktool fsck getty init \

View File

@@ -55,7 +55,7 @@ int fgethdr (text, h)
register FILE *text;
register struct exec *h;
{
h->a_midmag = fgetword (text);
h->a_magic = fgetword (text);
h->a_text = fgetword (text);
h->a_data = fgetword (text);
h->a_bss = fgetword (text);
@@ -235,7 +235,7 @@ void disasm (fname)
return;
}
if (rflag) {
if (N_GETMAGIC(hdr) != RMAGIC) {
if (hdr.a_magic != RMAGIC) {
fprintf (stderr, "aout: %s is not relocatable\n",
fname);
rflag = 0;
@@ -250,9 +250,9 @@ void disasm (fname)
}
printf ("File %s:\n", fname);
printf (" a_magic = %08x (%s)\n", hdr.a_magic,
N_GETMAGIC(hdr) == RMAGIC ? "relocatable" :
N_GETMAGIC(hdr) == OMAGIC ? "OMAGIC" :
N_GETMAGIC(hdr) == NMAGIC ? "NMAGIC" : "unknown");
hdr.a_magic == RMAGIC ? "relocatable" :
hdr.a_magic == OMAGIC ? "OMAGIC" :
hdr.a_magic == NMAGIC ? "NMAGIC" : "unknown");
printf (" a_text = %08x (%u bytes)\n", hdr.a_text, hdr.a_text);
printf (" a_data = %08x (%u bytes)\n", hdr.a_data, hdr.a_data);
printf (" a_bss = %08x (%u bytes)\n", hdr.a_bss, hdr.a_bss);
@@ -261,7 +261,7 @@ void disasm (fname)
printf (" a_syms = %08x (%u bytes)\n", hdr.a_syms, hdr.a_syms);
printf (" a_entry = %08x\n", hdr.a_entry);
addr = ((hdr.a_magic) == RMAGIC) ? 0 : USER_CODE_START;
addr = (hdr.a_magic == RMAGIC) ? 0 : USER_CODE_START;
if (hdr.a_text > 0) {
printf ("\nSection .text:\n");

View File

@@ -83,7 +83,6 @@ enum {
LIDENT, /* .ident */
LWEAK, /* .weak */
LLOCAL, /* .local */
LNAN, /* .nan */
};
/*
@@ -373,7 +372,7 @@ int mode_reorder = 1; /* .set reorder option (default) */
int mode_macro; /* .set macro option */
int mode_mips16; /* .set mips16 option */
int mode_micromips; /* .set micromips option */
int mode_at = 1; /* .set at option */
int mode_at; /* .set at option */
int reorder_full; /* instruction buffered for reorder */
unsigned reorder_word; /* buffered instruction... */
unsigned reorder_clobber; /* ...modified this register */
@@ -732,9 +731,6 @@ int lookacmd ()
case 'm':
if (! strcmp (".mask", name)) return (LMASK);
break;
case 'n':
if (! strcmp (".nan", name)) return (LNAN);
break;
case 'p':
if (! strcmp (".previous", name)) return (LPREVIOUS);
break;
@@ -1242,7 +1238,7 @@ void emitword (w, r, clobber_reg)
reorder_word = w;
reorder_rel = *r;
reorder_full = 1;
reorder_clobber = clobber_reg & 15;
reorder_clobber = clobber_reg;
} else {
fputword (w, sfile[segm]);
fputrel (r, rfile[segm]);
@@ -1321,9 +1317,10 @@ void makecmd (opcode, type, emitfunc)
unsigned opcode;
void (*emitfunc) (unsigned, struct reloc*);
{
unsigned offset, orig_opcode = 0;
register int clex;
register unsigned offset;
struct reloc relinfo;
int clex, cval, segment, clobber_reg, negate_literal;
int cval, segment, clobber_reg, negate_literal;
offset = 0;
relinfo.flags = RABS;
@@ -1483,7 +1480,6 @@ frs1: clex = getlex (&cval);
cval = (opcode >> 11) & 31; /* get 1-st register */
newop |= cval << 16; /* set 1-st register */
newop |= opcode & (31 << 21); /* set 2-nd register */
orig_opcode = opcode;
opcode = newop;
type = FRT1 | FRS2 | FOFF16 | FMOD;
goto foff16;
@@ -1576,76 +1572,33 @@ fsa: offset = getexpr (&segment);
}
} else if (type & (FOFF16 | FOFF18 | FAOFF18 | FAOFF28 | FHIGH16)) {
/* Relocatable offset */
int valid_range;
if ((type & (FOFF16 | FOFF18 | FHIGH16)) && getlex (&cval) != ',')
uerror ("comma expected");
foff16: expr_flags = 0;
offset = getexpr (&segment);
relinfo.flags = segmrel [segment];
if (negate_literal) {
// Negate literal arg for sub and subu
offset = -offset;
if (relinfo.flags != RABS)
uerror ("cannot negate relocatable literal");
}
if (relinfo.flags == REXT)
relinfo.index = extref;
if (expr_flags & EXPR_GPREL)
relinfo.flags |= RGPREL;
switch (type & (FOFF16 | FOFF18 | FAOFF18 | FAOFF28 | FHIGH16)) {
case FOFF16: /* low 16-bit byte address */
/* Test whether the immediate is in valid range
* for the opcode. */
if (negate_literal) {
// Negate literal arg for sub and subu
offset = -offset;
if (relinfo.flags != RABS)
uerror ("cannot negate relocatable literal");
}
switch (opcode & 0xfc000000) {
default: /* addi, addiu, slti, sltiu, lw, sw */
/* 16-bit signed value. */
valid_range = (offset >= -0x8000) || (offset <= 0x7fff);
break;
case 0x30000000: /* andi */
case 0x34000000: /* ori */
case 0x38000000: /* xori */
/* 16-bit unsigned value. */
valid_range = (offset <= 0xffff);
break;
}
if (valid_range) {
opcode |= offset & 0xffff;
} else if (orig_opcode == 0 || ! mode_at) {
uerror ("value out of range");
} else {
/* Convert back to 3-reg opcode.
* Insert an extra LI instruction. */
if (segment != SABS)
uerror ("absolute value required");
if (negate_literal)
offset = -offset;
if (offset <= 0xffff) {
/* ori $1, $zero, value */
emitword (0x34010000 | offset, &relabs, 1);
} else if (offset >= -0x8000) {
/* addiu $1, $zero, value */
emitword (0x24010000 | (offset & 0xffff), &relabs, 1);
} else {
/* lui $1, value[31:16]
* ori $1, $1, value[15:0]) */
emitword (0x3c010000 | (offset >> 16), &relabs, 1);
emitword (0x34210000 | (offset & 0xffff), &relabs, 1);
}
opcode = orig_opcode | 0x10000;
}
opcode |= offset & 0xffff;
break;
case FHIGH16: /* high 16-bit byte address */
if (expr_flags & EXPR_HI) {
if (relinfo.flags != RABS) {
/* %hi function - assume signed offset */
relinfo.flags |= RHIGH16S;
relinfo.flags |= (expr_flags & EXPR_HI) ? RHIGH16S : RHIGH16;
relinfo.offset = offset & 0xffff;
offset += 0x8000;
opcode |= offset >> 16;
} else {
opcode |= offset & 0xffff;
}
opcode |= offset >> 16;
break;
case FOFF18: /* 18-bit PC-relative word address */
case FAOFF18:
@@ -2202,7 +2155,7 @@ void pass1 ()
case LSECTION:
/* .section name[,"flags"[,type[,entsize]]] */
clex = getlex (&cval);
if (clex != LNAME && clex != LBSS && clex != LTEXT && clex != LDATA)
if (clex != LNAME && clex != LBSS)
uerror ("bad name of .section");
setsection();
clex = getlex (&cval);
@@ -2210,12 +2163,7 @@ void pass1 ()
ungetlex (clex, cval);
break;
}
clex = getlex (&cval);
if (clex == '"') {
ungetlex (clex, cval);
skipstring();
} else if (clex != LNAME)
uerror ("bad type of .section");
skipstring();
clex = getlex (&cval);
if (clex != ',') {
ungetlex (clex, cval);
@@ -2262,12 +2210,6 @@ void pass1 ()
uerror ("bad parameter of .end");
cval = lookname();
break;
case LNAN:
/* .nan name */
clex = getlex (&cval);
if (clex != LNAME)
uerror ("bad parameter of .nan");
break;
case LTYPE:
/* .type name,type */
if (getlex (&cval) != LNAME)
@@ -2397,7 +2339,7 @@ void makeheader (rtsize, rdsize)
{
struct exec hdr;
hdr.a_midmag = RMAGIC;
hdr.a_magic = RMAGIC;
hdr.a_text = count [STEXT];
hdr.a_data = count [SDATA] + count [SSTRNG];
hdr.a_bss = count [SBSS];
@@ -2717,12 +2659,8 @@ int main (argc, argv)
break;
case 'I': /* include dir */
// TODO
if (cp[1] == 0) {
i++;
} else {
while (*++cp);
--cp;
}
while (*++cp);
--cp;
break;
case 'O': /* optimization level */
// TODO

View File

@@ -226,7 +226,7 @@ RDHWR Read Hardware Register Allows unprivileged acce
RDPGPR Read GPR from Previous Shadow Set Rt = SGPR[SRSCtl.PSS, Rd]
RESTORE Restore registers and deallocate stack See Architecture Reference Manual
frame (MIPS16e only)
frame (MIPS16eª only)
ROTR Rotate Word Right Rd = Rt[sa-1..0] || Rt[31..sa]

View File

@@ -1534,7 +1534,7 @@ int get_value()
value = get_num();
else {
++cmdptr;
switch ((int)c) {
switch (c) {
case '(': /* nesting */
value = eval_sub();
break;

View File

@@ -26,4 +26,4 @@ clean:
install: all
install cc $(DESTDIR)/bin/
install cc $(DESTDIR)/bin/scc
install cc $(DESTDIR)/bin/lcc
install cc $(DESTDIR)/bin/srcc

View File

@@ -449,16 +449,17 @@ main(int argc, char *argv[])
pass0 = LIBEXECDIR "/smallc";
incdir = STDINC "/smallc";
} else if (strcmp ("lcc", progname) == 0) {
/* LCC: retargetable C compiler. */
mode = MODE_LCC;
cppadd[0] = "-D__LCC__";
pass0 = LIBEXECDIR "/lccom";
} else {
} else if (strcmp ("srcc", progname) == 0) {
/* Smaller C. */
mode = MODE_SMALLERC;
cppadd[0] = "-D__SMALLER_C__";
pass0 = LIBEXECDIR "/smlrc";
incdir = STDINC "/smallerc";
} else {
/* LCC: retargetable C compiler. */
mode = MODE_LCC;
cppadd[0] = "-D__LCC__";
pass0 = LIBEXECDIR "/lccom";
}
if (argc == 1)

View File

@@ -24,7 +24,7 @@ $(MAN): ${MANSRC}
${MANROFF} $< > $@
clean:
rm -f *.o *.0 *.elf cpp *.dis tags *~ lex.yy.c y.tab.[ch] tests/run*
rm -f *.o *.0 *.elf cpp *.elf *.dis tags *~ lex.yy.c y.tab.[ch] tests/run*
install: all
install cpp $(DESTDIR)/bin/
@@ -41,23 +41,23 @@ cpy.o y.tab.h: cpy.y
$(CC) $(DEFS) $(CPPFLAGS) $(CFLAGS) -c -o cpy.o y.tab.c
test:
./cpp < tests/test1 > tests/run1
./cpp.elf < tests/test1 > tests/run1
cmp tests/run1 tests/res1
./cpp < tests/test2 > tests/run2
./cpp.elf < tests/test2 > tests/run2
cmp tests/run2 tests/res2
./cpp < tests/test3 > tests/run3
./cpp.elf < tests/test3 > tests/run3
cmp tests/run3 tests/res3
./cpp < tests/test4 > tests/run4
./cpp.elf < tests/test4 > tests/run4
cmp tests/run4 tests/res4
./cpp < tests/test5 > tests/run5
./cpp.elf < tests/test5 > tests/run5
cmp tests/run5 tests/res5
./cpp < tests/test6 > tests/run6
./cpp.elf < tests/test6 > tests/run6
cmp tests/run6 tests/res6
./cpp < tests/test7 > tests/run7
./cpp.elf < tests/test7 > tests/run7
cmp tests/run7 tests/res7
./cpp < tests/test8 > tests/run8
./cpp.elf < tests/test8 > tests/run8
cmp tests/run8 tests/res8
./cpp < tests/test9 > tests/run9
./cpp.elf < tests/test9 > tests/run9
cmp tests/run9 tests/res9
./cpp < tests/test10 > tests/run10
./cpp.elf < tests/test10 > tests/run10
cmp tests/run10 tests/res10

View File

@@ -350,8 +350,7 @@ addidir(char *idir, struct incs **ww)
return;
ww = &w->next;
}
w = calloc(sizeof(struct incs), 1);
if (w == NULL)
if ((w = calloc(sizeof(struct incs), 1)) == NULL)
error("couldn't add path %s", idir);
w->dir = (uchar *)idir;
w->dev = st.st_dev;
@@ -1311,18 +1310,14 @@ expdef(const uchar *vp, struct recur *rp, int gotwarn)
int ellips = 0, shot = gotwarn;
DPRINT(("expdef rp %s\n", (rp ? (const char *)rp->sp->namep : "")));
c = sloscan();
if (c != '(')
if ((c = sloscan()) != '(')
error("got %c, expected (", c);
if (vp[1] == VARG) {
narg = *vp--;
ellips = 1;
} else
narg = vp[1];
args = malloc(sizeof(uchar *) * (narg+ellips));
if (args == NULL)
if ((args = malloc(sizeof(uchar *) * (narg+ellips))) == NULL)
error("expdef: out of mem");
/*

View File

@@ -58,7 +58,7 @@ extern int ofd;
#define ENTER 1
/* buffer used internally */
#define CPPBUF 512
#define CPPBUF BUFSIZ
#define NAMEMAX CPPBUF /* currently pushbackbuffer */
@@ -138,8 +138,13 @@ void line(void);
uchar *sheap(const char *fmt, ...);
void xwarning(uchar *);
void xerror(uchar *);
#define warning(args...) xwarning(sheap(args))
#define error(args...) xerror(sheap(args))
#ifdef HAVE_CPP_VARARG_MACRO_GCC
#define warning(...) xwarning(sheap(__VA_ARGS__))
#define error(...) xerror(sheap(__VA_ARGS__))
#else
#define warning printf
#define error printf
#endif
void expmac(struct recur *);
int cinput(void);
void getcmnt(void);

932
src/cmd/cpp/scanner.l Normal file
View File

@@ -0,0 +1,932 @@
%{
/*
* Copyright (c) 2004 Anders Magnusson. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include "compat.h"
#include "cpp.h"
#include "y.tab.h"
%}
%{
static void cvtdig(int rad);
static int charcon(uchar *);
static void elsestmt(void);
static void ifdefstmt(void);
static void ifndefstmt(void);
static void endifstmt(void);
static void ifstmt(void);
static void cpperror(void);
static void pragmastmt(void);
static void undefstmt(void);
static void cpperror(void);
static void elifstmt(void);
static void storepb(void);
static void badop(const char *);
void include(void);
void define(void);
extern int yyget_lineno (void);
extern void yyset_lineno (int);
static int inch(void);
static int scale, gotdef, contr;
int inif;
#ifdef FLEX_SCANNER /* should be set by autoconf instead */
static int
yyinput(char *b, int m)
{
int c, i;
for (i = 0; i < m; i++) {
if ((c = inch()) < 0)
break;
*b++ = c;
if (c == '\n') {
i++;
break;
}
}
return i;
}
#undef YY_INPUT
#undef YY_BUF_SIZE
#define YY_BUF_SIZE (8*65536)
#define YY_INPUT(b,r,m) (r = yyinput(b, m))
#ifdef HAVE_CPP_VARARG_MACRO_GCC
#define fprintf(x, ...) error(__VA_ARGS__)
#endif
#define ECHO putstr((uchar *)yytext)
#undef fileno
#define fileno(x) 0
#if YY_FLEX_SUBMINOR_VERSION >= 31
/* Hack to avoid unnecessary warnings */
FILE *yyget_in (void);
FILE *yyget_out (void);
int yyget_leng (void);
char *yyget_text (void);
void yyset_in (FILE * in_str );
void yyset_out (FILE * out_str );
int yyget_debug (void);
void yyset_debug (int bdebug );
int yylex_destroy (void);
#endif
#else /* Assume lex here */
#undef input
#undef unput
#define input() inch()
#define unput(ch) unch(ch)
#endif
#define PRTOUT(x) if (YYSTATE || slow) return x; if (!flslvl) putstr((uchar *)yytext);
/* protection against recursion in #include */
#define MAX_INCLEVEL 100
static int inclevel;
%}
D [0-9]
L [a-zA-Z_]
H [a-fA-F0-9]
E [Ee][+-]?{D}+
FS (f|F|l|L)
IS (u|U|l|L)*
WS [\t ]
%s IFR CONTR DEF COMMENT
%%
"\n" { int os = YYSTATE;
if (os != IFR)
BEGIN 0;
ifiles->lineno++;
if (flslvl == 0) {
if (ifiles->lineno == 1)
prtline();
else
putch('\n');
}
if ((os != 0 || slow) && !contr)
return '\n';
contr = 0;
}
"\r" { ; /* Ignore CR's */ }
<IFR>"++" { badop("++"); }
<IFR>"--" { badop("--"); }
<IFR>"==" { return EQ; }
<IFR>"!=" { return NE; }
<IFR>"<=" { return LE; }
<IFR>"<<" { return LS; }
<IFR>">>" { return RS; }
<IFR>">=" { return GE; }
<IFR>"||" { return OROR; }
<IFR>"&&" { return ANDAND; }
<IFR>"defined" { int p, c;
gotdef = 1;
if ((p = c = yylex()) == '(')
c = yylex();
if (c != IDENT || (p != IDENT && p != '('))
error("syntax error");
if (p == '(' && yylex() != ')')
error("syntax error");
return NUMBER;
}
<IFR>{WS}+ { ; }
<IFR>{L}({L}|{D})* {
yylval.node.op = NUMBER;
if (gotdef) {
yylval.node.nd_val
= lookup((uchar *)yytext, FIND) != 0;
gotdef = 0;
return IDENT;
}
yylval.node.nd_val = 0;
return NUMBER;
}
[0-9][0-9]* {
if (slow && !YYSTATE)
return IDENT;
scale = yytext[0] == '0' ? 8 : 10;
goto num;
}
0[xX]{H}+{IS}? { scale = 16;
num: if (YYSTATE == IFR)
cvtdig(scale);
PRTOUT(NUMBER);
}
0{D}+{IS}? { scale = 8; goto num; }
{D}+{IS}? { scale = 10; goto num; }
'(\\.|[^\\'])+' {
if (YYSTATE || slow) {
yylval.node.op = NUMBER;
yylval.node.nd_val = charcon((uchar *)yytext);
return (NUMBER);
}
if (tflag)
yyless(1);
if (!flslvl)
putstr((uchar *)yytext);
}
<IFR>. { return yytext[0]; }
{D}+{E}{FS}? { PRTOUT(FPOINT); }
{D}*"."{D}+({E})?{FS}? { PRTOUT(FPOINT); }
{D}+"."{D}*({E})?{FS}? { PRTOUT(FPOINT); }
^{WS}*#{WS}* { extern int inmac;
if (inmac)
error("preprocessor directive found "
"while expanding macro");
contr = 1;
BEGIN CONTR;
}
{WS}+ { PRTOUT(WSPACE); }
<CONTR>"ifndef" { contr = 0; ifndefstmt(); }
<CONTR>"ifdef" { contr = 0; ifdefstmt(); }
<CONTR>"if" { contr = 0; storepb(); BEGIN IFR; ifstmt(); BEGIN 0; }
<CONTR>"include" { contr = 0; BEGIN 0; include(); prtline(); }
<CONTR>"else" { contr = 0; elsestmt(); }
<CONTR>"endif" { contr = 0; endifstmt(); }
<CONTR>"error" { contr = 0; if (slow) return IDENT; cpperror(); BEGIN 0; }
<CONTR>"define" { contr = 0; BEGIN DEF; define(); BEGIN 0; }
<CONTR>"undef" { contr = 0; if (slow) return IDENT; undefstmt(); }
<CONTR>"line" { contr = 0; storepb(); BEGIN 0; line(); }
<CONTR>"pragma" { contr = 0; pragmastmt(); BEGIN 0; }
<CONTR>"elif" { contr = 0; storepb(); BEGIN IFR; elifstmt(); BEGIN 0; }
"//".*$ { /* if (tflag) yyless(..) */
if (Cflag && !flslvl && !slow)
putstr((uchar *)yytext);
else if (!flslvl)
putch(' ');
}
"/*" { int c, wrn;
int prtcm = Cflag && !flslvl && !slow;
extern int readmac;
if (Cflag && !flslvl && readmac)
return CMNT;
if (prtcm)
putstr((uchar *)yytext);
wrn = 0;
more: while ((c = input()) && c != '*') {
if (c == '\n')
putch(c), ifiles->lineno++;
else if (c == 1) /* WARN */
wrn = 1;
else if (prtcm)
putch(c);
}
if (c == 0)
return 0;
if (prtcm)
putch(c);
if ((c = input()) && c != '/') {
unput(c);
goto more;
}
if (prtcm)
putch(c);
if (c == 0)
return 0;
if (!tflag && !Cflag && !flslvl)
unput(' ');
if (wrn)
unput(1);
}
<DEF>"##" { return CONCAT; }
<DEF>"#" { return MKSTR; }
<DEF>"..." { return ELLIPS; }
<DEF>"__VA_ARGS__" { return VA_ARGS; }
L?\"(\\.|[^\\"])*\" { PRTOUT(STRING); }
[a-zA-Z_0-9]+ { /* {L}({L}|{D})* */
struct symtab *nl;
if (slow)
return IDENT;
if (YYSTATE == CONTR) {
if (flslvl == 0) {
/*error("undefined control");*/
while (input() != '\n')
;
unput('\n');
BEGIN 0;
goto xx;
} else {
BEGIN 0; /* do nothing */
}
}
if (flslvl) {
; /* do nothing */
} else if (isdigit((int)yytext[0]) == 0 &&
(nl = lookup((uchar *)yytext, FIND)) != 0) {
uchar *op = stringbuf;
putstr(gotident(nl));
stringbuf = op;
} else
putstr((uchar *)yytext);
xx: ;
}
. {
if (contr) {
while (input() != '\n')
;
unput('\n');
BEGIN 0;
contr = 0;
goto yy;
}
if (YYSTATE || slow)
return yytext[0];
if (yytext[0] == 6) { /* PRAGS */
uchar *obp = stringbuf;
extern uchar *prtprag(uchar *);
*stringbuf++ = yytext[0];
do {
*stringbuf = input();
} while (*stringbuf++ != 14);
prtprag(obp);
stringbuf = obp;
} else {
PRTOUT(yytext[0]);
}
yy:;
}
%%
uchar *yyp, yybuf[CPPBUF];
int yylex(void);
int yywrap(void);
static int
inpch(void)
{
int len;
if (ifiles->curptr < ifiles->maxread)
return *ifiles->curptr++;
if ((len = read(ifiles->infil, ifiles->buffer, CPPBUF)) < 0)
error("read error on file %s", ifiles->orgfn);
if (len == 0)
return -1;
ifiles->curptr = ifiles->buffer;
ifiles->maxread = ifiles->buffer + len;
return inpch();
}
#define unch(c) *--ifiles->curptr = c
static int
inch(void)
{
int c;
again: switch (c = inpch()) {
case '\\': /* continued lines */
msdos: if ((c = inpch()) == '\n') {
ifiles->lineno++;
putch('\n');
goto again;
} else if (c == '\r')
goto msdos;
unch(c);
return '\\';
case '?': /* trigraphs */
if ((c = inpch()) != '?') {
unch(c);
return '?';
}
switch (c = inpch()) {
case '=': c = '#'; break;
case '(': c = '['; break;
case ')': c = ']'; break;
case '<': c = '{'; break;
case '>': c = '}'; break;
case '/': c = '\\'; break;
case '\'': c = '^'; break;
case '!': c = '|'; break;
case '-': c = '~'; break;
default:
unch(c);
unch('?');
return '?';
}
unch(c);
goto again;
default:
return c;
}
}
/*
* Let the command-line args be faked defines at beginning of file.
*/
static void
prinit(struct initar *it, struct includ *ic)
{
char *a, *pre, *post;
if (it->next)
prinit(it->next, ic);
pre = post = NULL; /* XXX gcc */
switch (it->type) {
case 'D':
pre = "#define ";
if ((a = strchr(it->str, '=')) != NULL) {
*a = ' ';
post = "\n";
} else
post = " 1\n";
break;
case 'U':
pre = "#undef ";
post = "\n";
break;
case 'i':
pre = "#include \"";
post = "\"\n";
break;
default:
error("prinit");
}
strlcat((char *)ic->buffer, pre, CPPBUF+1);
strlcat((char *)ic->buffer, it->str, CPPBUF+1);
if (strlcat((char *)ic->buffer, post, CPPBUF+1) >= CPPBUF+1)
error("line exceeds buffer size");
ic->lineno--;
while (*ic->maxread)
ic->maxread++;
}
/*
* A new file included.
* If ifiles == NULL, this is the first file and already opened (stdin).
* Return 0 on success, -1 if file to be included is not found.
*/
int
pushfile(uchar *file)
{
extern struct initar *initar;
struct includ ibuf;
struct includ *ic;
int c, otrulvl;
ic = &ibuf;
ic->next = ifiles;
slow = 0;
if (file != NULL) {
if ((ic->infil = open((char *)file, O_RDONLY)) < 0)
return -1;
ic->orgfn = ic->fname = file;
if (++inclevel > MAX_INCLEVEL)
error("Limit for nested includes exceeded");
} else {
ic->infil = 0;
ic->orgfn = ic->fname = (uchar *)"<stdin>";
}
ic->buffer = ic->bbuf+NAMEMAX;
ic->curptr = ic->buffer;
ifiles = ic;
ic->lineno = 1;
ic->maxread = ic->curptr;
prtline();
if (initar) {
*ic->maxread = 0;
prinit(initar, ic);
if (dMflag)
write(ofd, ic->buffer, strlen((char *)ic->buffer));
initar = NULL;
}
otrulvl = trulvl;
if ((c = yylex()) != 0)
error("yylex returned %d", c);
if (otrulvl != trulvl || flslvl)
error("unterminated conditional");
ifiles = ic->next;
close(ic->infil);
inclevel--;
return 0;
}
/*
* Print current position to output file.
*/
void
prtline()
{
uchar *s, *os = stringbuf;
if (Mflag) {
if (dMflag)
return; /* no output */
if (ifiles->lineno == 1) {
s = sheap("%s: %s\n", Mfile, ifiles->fname);
write(ofd, s, strlen((char *)s));
}
} else if (!Pflag)
putstr(sheap("# %d \"%s\"\n", ifiles->lineno, ifiles->fname));
stringbuf = os;
}
void
cunput(int c)
{
#ifdef CPP_DEBUG
extern int dflag;
if (dflag)printf(": '%c'(%d)", c > 31 ? c : ' ', c);
#endif
unput(c);
}
int yywrap(void) { return 1; }
static int
dig2num(int c)
{
if (c >= 'a')
c = c - 'a' + 10;
else if (c >= 'A')
c = c - 'A' + 10;
else
c = c - '0';
return c;
}
/*
* Convert string numbers to unsigned long long and check overflow.
*/
static void
cvtdig(int rad)
{
unsigned long long rv = 0;
unsigned long long rv2 = 0;
char *y = yytext;
int c;
c = *y++;
if (rad == 16)
y++;
while (isxdigit(c)) {
rv = rv * rad + dig2num(c);
/* check overflow */
if (rv / rad < rv2)
error("Constant \"%s\" is out of range", yytext);
rv2 = rv;
c = *y++;
}
y--;
while (*y == 'l' || *y == 'L')
y++;
yylval.node.op = *y == 'u' || *y == 'U' ? UNUMBER : NUMBER;
yylval.node.nd_uval = rv;
if ((rad == 8 || rad == 16) && yylval.node.nd_val < 0)
yylval.node.op = UNUMBER;
if (yylval.node.op == NUMBER && yylval.node.nd_val < 0)
/* too large for signed */
error("Constant \"%s\" is out of range", yytext);
}
static int
charcon(uchar *p)
{
int val, c;
p++; /* skip first ' */
val = 0;
if (*p++ == '\\') {
switch (*p++) {
case 'a': val = '\a'; break;
case 'b': val = '\b'; break;
case 'f': val = '\f'; break;
case 'n': val = '\n'; break;
case 'r': val = '\r'; break;
case 't': val = '\t'; break;
case 'v': val = '\v'; break;
case '\"': val = '\"'; break;
case '\'': val = '\''; break;
case '\\': val = '\\'; break;
case 'x':
while (isxdigit(c = *p)) {
val = val * 16 + dig2num(c);
p++;
}
break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7':
p--;
while (isdigit(c = *p)) {
val = val * 8 + (c - '0');
p++;
}
break;
default: val = p[-1];
}
} else
val = p[-1];
return val;
}
static void
chknl(int ignore)
{
int t;
slow = 1;
while ((t = yylex()) == WSPACE)
;
if (t != '\n') {
if (ignore) {
warning("newline expected, got \"%s\"", yytext);
/* ignore rest of line */
while ((t = yylex()) && t != '\n')
;
}
else
error("newline expected, got \"%s\"", yytext);
}
slow = 0;
}
static void
elsestmt(void)
{
if (flslvl) {
if (elflvl > trulvl)
;
else if (--flslvl!=0) {
flslvl++;
} else {
trulvl++;
prtline();
}
} else if (trulvl) {
flslvl++;
trulvl--;
} else
error("If-less else");
if (elslvl==trulvl+flslvl)
error("Too many else");
elslvl=trulvl+flslvl;
chknl(1);
}
static void
ifdefstmt(void)
{
int t;
if (flslvl) {
/* just ignore the rest of the line */
while (input() != '\n')
;
unput('\n');
yylex();
flslvl++;
return;
}
slow = 1;
do
t = yylex();
while (t == WSPACE);
if (t != IDENT)
error("bad ifdef");
slow = 0;
if (flslvl == 0 && lookup((uchar *)yytext, FIND) != 0)
trulvl++;
else
flslvl++;
chknl(0);
}
static void
ifndefstmt(void)
{
int t;
slow = 1;
do
t = yylex();
while (t == WSPACE);
if (t != IDENT)
error("bad ifndef");
slow = 0;
if (flslvl == 0 && lookup((uchar *)yytext, FIND) == 0)
trulvl++;
else
flslvl++;
chknl(0);
}
static void
endifstmt(void)
{
if (flslvl) {
flslvl--;
if (flslvl == 0)
prtline();
} else if (trulvl)
trulvl--;
else
error("If-less endif");
if (flslvl == 0)
elflvl = 0;
elslvl = 0;
chknl(1);
}
/*
* Note! Ugly!
* Walk over the string s and search for defined, and replace it with
* spaces and a 1 or 0.
*/
static void
fixdefined(uchar *s)
{
uchar *bc, oc;
for (; *s; s++) {
if (*s != 'd')
continue;
if (memcmp(s, "defined", 7))
continue;
/* Ok, got defined, can scratch it now */
memset(s, ' ', 7);
s += 7;
#define WSARG(x) (x == ' ' || x == '\t')
if (*s != '(' && !WSARG(*s))
continue;
while (WSARG(*s))
s++;
if (*s == '(')
s++;
while (WSARG(*s))
s++;
#define IDARG(x) ((x>= 'A' && x <= 'Z') || (x >= 'a' && x <= 'z') || (x == '_'))
#define NUMARG(x) (x >= '0' && x <= '9')
if (!IDARG(*s))
error("bad defined arg");
bc = s;
while (IDARG(*s) || NUMARG(*s))
s++;
oc = *s;
*s = 0;
*bc = (lookup(bc, FIND) != 0) + '0';
memset(bc+1, ' ', s-bc-1);
*s = oc;
}
}
/*
* get the full line of identifiers after an #if, pushback a WARN and
* the line and prepare for expmac() to expand.
* This is done before switching state. When expmac is finished,
* pushback the expanded line, change state and call yyparse.
*/
static void
storepb(void)
{
uchar *opb = stringbuf;
int c;
while ((c = input()) != '\n') {
if (c == '/') {
if ((c = input()) == '*') {
/* ignore comments here whatsoever */
uchar *g = stringbuf;
getcmnt();
stringbuf = g;
continue;
} else if (c == '/') {
while ((c = input()) && c != '\n')
;
break;
}
unput(c);
c = '/';
}
savch(c);
}
cunput('\n');
savch(0);
fixdefined(opb); /* XXX can fail if #line? */
cunput(1); /* WARN XXX */
unpstr(opb);
stringbuf = opb;
slow = 1;
expmac(NULL);
slow = 0;
/* line now expanded */
while (stringbuf > opb)
cunput(*--stringbuf);
}
static void
ifstmt(void)
{
if (flslvl == 0) {
slow = 1;
if (yyparse())
++trulvl;
else
++flslvl;
slow = 0;
} else
++flslvl;
}
static void
elifstmt(void)
{
if (flslvl == 0)
elflvl = trulvl;
if (flslvl) {
if (elflvl > trulvl)
;
else if (--flslvl!=0)
++flslvl;
else {
slow = 1;
if (yyparse()) {
++trulvl;
prtline();
} else
++flslvl;
slow = 0;
}
} else if (trulvl) {
++flslvl;
--trulvl;
} else
error("If-less elif");
}
static uchar *
svinp(void)
{
int c;
uchar *cp = stringbuf;
while ((c = input()) && c != '\n')
savch(c);
savch('\n');
savch(0);
BEGIN 0;
return cp;
}
static void
cpperror(void)
{
uchar *cp;
int c;
if (flslvl)
return;
c = yylex();
if (c != WSPACE && c != '\n')
error("bad error");
cp = svinp();
if (flslvl)
stringbuf = cp;
else
error("%s", cp);
}
static void
undefstmt(void)
{
struct symtab *np;
slow = 1;
if (yylex() != WSPACE || yylex() != IDENT)
error("bad undef");
if (flslvl == 0 && (np = lookup((uchar *)yytext, FIND)))
np->value = 0;
slow = 0;
chknl(0);
}
static void
pragmastmt(void)
{
int c;
slow = 1;
if (yylex() != WSPACE)
error("bad pragma");
if (!flslvl)
putstr((uchar *)"#pragma ");
do {
c = input();
if (!flslvl)
putch(c); /* Do arg expansion instead? */
} while (c && c != '\n');
ifiles->lineno++;
prtline();
slow = 0;
}
static void
badop(const char *op)
{
error("invalid operator in preprocessor expression: %s", op);
}
int
cinput()
{
return input();
}

View File

@@ -767,10 +767,8 @@ pushfile(const uchar *file, const uchar *fn, int idx, void *incs)
if (file != NULL) {
ic->infil = open((const char *)file, O_RDONLY);
if (ic->infil < 0) {
free(ic);
if (ic->infil < 0)
return -1;
}
ic->orgfn = ic->fname = file;
if (++inclevel > MAX_INCLEVEL)
error("Limit for nested includes exceeded");

31
src/cmd/generic.mk Normal file
View File

@@ -0,0 +1,31 @@
#==========================================
# Makefile: makefile for adc-demo
# Copyright 2012 Majenko Technolohies
# (matt@majenko.co.uk
# Last Modified: 29/01/2012
#==========================================
TOPSRC = $(shell cd ../../..; pwd)
include $(TOPSRC)/target.mk
PWD = $(shell pwd)
PROG = $(shell basename "$(PWD)")
OBJS = $(PROG).o
SRCS = $(PROG).c
all: $(PROG)
-include Makefile.app
$(PROG): ${OBJS}
${CC} ${LDFLAGS} -o $(PROG).elf ${OBJS} ${LIBS}
${OBJDUMP} -S $(PROG).elf > $(PROG).dis
${SIZE} $(PROG).elf
${ELF2AOUT} $(PROG).elf $@
clean:
-rm -f $(PROG) ${OBJS} $(PROG).elf $(PROG).dis
install: all
install $(PROG) $(DESTDIR)/bin/

View File

@@ -61,7 +61,7 @@ $Binits.o: inits.c; $(CC) $(CFLAGS) -c -I. -o $@ $<
$Binput.o: input.c; $(CC) $(CFLAGS) -c -I. -o $@ $<
$Blex.o: lex.c; $(CC) $(CFLAGS) -c -I. -o $@ $<
$Blist.o: list.c; $(CC) $(CFLAGS) -c -I. -o $@ $<
$Bmain.o: main.c; $(CC) $(CFLAGS) -DVERSION=\"$(VERSION)\" -c -I. -o $@ $<
$Bmain.o: main.c; $(CC) $(CFLAGS) -DVERSION=\"`svnversion`\" -c -I. -o $@ $<
$Bnull.o: null.c; $(CC) $(CFLAGS) -c -I. -o $@ $<
$Boutput.o: output.c; $(CC) $(CFLAGS) -c -I. -o $@ $<
$Bprof.o: prof.c; $(CC) $(CFLAGS) -c -I. -o $@ $<

View File

@@ -172,7 +172,7 @@ int fgethdr (text, h)
register FILE *text;
register struct exec *h;
{
h->a_midmag = fgetword (text);
h->a_magic = fgetword (text);
h->a_text = fgetword (text);
h->a_data = fgetword (text);
h->a_bss = fgetword (text);
@@ -860,7 +860,7 @@ void readhdr (loc)
fseek (text, loc, 0);
if (! fgethdr (text, &filhdr))
error (2, "bad format");
if (N_GETMAGIC(filhdr) != RMAGIC)
if (filhdr.a_magic != RMAGIC)
error (2, "bad magic");
if (filhdr.a_text % W)
error (2, "bad length of text");
@@ -880,7 +880,7 @@ int load1 (loc, libflg, nloc)
int savindex, ndef, type, symlen, nsymbol;
readhdr (loc);
if (N_GETMAGIC(filhdr) != RMAGIC) {
if (filhdr.a_magic != RMAGIC) {
error (1, "file not relocatable");
return (0);
}
@@ -1494,7 +1494,7 @@ void finishout ()
while (ssize++ % W)
putc (0, outb);
}
filhdr.a_midmag = output_relinfo ? RMAGIC : OMAGIC;
filhdr.a_magic = output_relinfo ? RMAGIC : OMAGIC;
filhdr.a_text = tsize;
filhdr.a_data = dsize;
filhdr.a_bss = bsize;

1
src/cmd/mathtest/Makefile Symbolic link
View File

@@ -0,0 +1 @@
../generic.mk

View File

@@ -0,0 +1,49 @@
// Pito 12/2013
#include <stdio.h>
#include <math.h>
// print out double (IEEE 64bit) variable in HEX
// ie. 9.0 is 4022000000000000
// more on http://babbage.cs.qc.cuny.edu/IEEE-754/
void print64x( double x ) {
const unsigned char* p;
int j;
p = (unsigned char *) &x;
printf("%02X", p[7]);
printf("%02X", p[6]);
printf("%02X", p[5]);
printf("%02X", p[4]);
printf("%02X", p[3]);
printf("%02X", p[2]);
printf("%02X", p[1]);
printf("%02X", p[0]);
}
void print32x( float x ) {
const char* p;
int j;
p = (char *) &x;
for( j=0; j< sizeof(x); j++) {
printf("%02X", p[(sizeof(x)-1)-j]&0xFF);
}
}
int main() {
volatile double num1 = 1.2499999999999998193580478994e-10;
volatile double num2 = 2.16000000000000081281633984229e-10;
volatile double res = 0;
res = num1 + num2;
// print64x(num1);
// printf(" + ");
// print64x(num2);
// printf(" = ");
// print64x(res);
// printf("\n");
printf("%1.15e + %1.15e = %1.15e\n", num1, num2, res);
return 0;
}

1
src/cmd/scantest/Makefile Symbolic link
View File

@@ -0,0 +1 @@
../generic.mk

View File

@@ -0,0 +1,84 @@
// Pito 12/2013
#include <stdio.h>
#include <math.h>
// print out double (IEEE 64bit) variable in HEX
// ie. 9.0 is 4022000000000000
// more on http://babbage.cs.qc.cuny.edu/IEEE-754/
void print64x( double x ) {
const unsigned char* p;
int j;
p = (unsigned char *) &x;
printf("%02X", p[7]);
printf("%02X", p[6]);
printf("%02X", p[5]);
printf("%02X", p[4]);
printf("%02X", p[3]);
printf("%02X", p[2]);
printf("%02X", p[1]);
printf("%02X", p[0]);
}
void print32x( float x ) {
const char* p;
int j;
p = (char *) &x;
for( j=0; j< sizeof(x); j++) {
printf("%02X", p[(sizeof(x)-1)-j]&0xFF);
}
}
int main() {
double num;
int i;
double sum;
FILE *InFile, *OutFile;
char str[100];
double backup;
double result;
if ((OutFile = fopen("num.dat","w")) == 0) {
printf("num.dat not found\n");
return (1);
}
for (i=0; i<=10000; i++) {
num = 0.0001L * (double)(i);
num = num * num * num;
fprintf(OutFile, "%1.15e\n", num);
}
fclose(OutFile);
if ((InFile = fopen("num.dat","r")) == 0) {
printf("num.dat not found\n");
return (1);
}
sum = 0;
num = 0;
for (i=0; i<=10000; i++) {
backup = sum;
fgets (str, 80, InFile);
sscanf (str,"%le",&num);
result = sum + num;
if (sum != backup) {
printf("*** SUM CHANGED: %1.15e => %1.15e ***\n", backup, sum);
}
sum = result;
}
printf("Sum test result = %1.15e\n", sum);
printf("Shall be result = 2.500500025000002e+03\n");
printf("Sum test result (HEX) = ");
print64x( sum );
printf("\n");
printf("Shall be result (HEX) = 40A389000346DC62\n");
fclose(InFile);
return 0;
}

View File

@@ -1,12 +1,12 @@
TOPSRC = $(shell cd ../../..; pwd)
include $(TOPSRC)/target.mk
#include $(TOPSRC)/cross.mk
CFLAGS = -Os -Wall -DMIPS -DNO_ANNOTATIONS -DNO_PREPROCESSOR \
-DNO_PPACK -D_RETROBSD -D__SMALLER_C_SCHAR__ \
-D__SMALLER_C__ -D__SMALLER_C_32__
# For cross compile
#include $(TOPSRC)/cross.mk
#CFLAGS = -Os -Wall -DMIPS -m32
#LDFLAGS = -m32

View File

@@ -37,11 +37,6 @@ either expressed or implied, of the FreeBSD Project.
/* */
/*****************************************************************************/
// Works around bugs in RetroBSD's as instruction reordering
#define REORDER_WORKAROUND
// Works around bugs in RetroBSD's as immediate operand truncation to 16 bits
//#define INSTR_IMM_WORKAROUND
int UseGp = 0;
void GenInit(void)
@@ -52,7 +47,7 @@ void GenInit(void)
CodeHeader = "\t.text";
DataHeader = "\t.data";
UseLeadingUnderscores = 0;
#ifdef REORDER_WORKAROUND
#ifndef NO_REORDER_WORKAROUND
FileHeader = "\t.set\tnoreorder";
#else
FileHeader = "\t.set\treorder";
@@ -68,12 +63,6 @@ int GenInitParams(int argc, char** argv, int* idx)
UseGp = 1;
return 1;
}
else if (!strcmp(argv[*idx], "-v"))
{
// RetroBSD's cc may supply this parameter. Just need to consume it.
return 1;
}
return 0;
}
@@ -142,19 +131,15 @@ void GenStartAsciiString(void)
printf2("\t.ascii\t");
}
void GenAddrData(int Size, char* Label, int ofs)
void GenAddrData(int Size, char* Label)
{
ofs = truncInt(ofs);
if (Size == 1)
printf2("\t.byte\t");
else if (Size == 2)
printf2("\t.half\t");
else if (Size == 4)
printf2("\t.word\t");
GenPrintLabel(Label);
if (ofs)
printf2(" %+d", ofs);
puts2("");
GenPrintLabel(Label); puts2("");
}
#define MipsInstrNop 0x00
@@ -301,7 +286,7 @@ void GenPrintInstr(int instr, int val)
#define MipsOpLabelGpOption 0x83
#define MipsOpIndLocal MipsOpIndRegFp
#ifdef REORDER_WORKAROUND
#ifndef NO_REORDER_WORKAROUND
void GenNop(void)
{
puts2("\tnop");
@@ -370,7 +355,7 @@ void GenPrintInstr1Operand(int instr, int instrval, int operand, int operandval)
GenPrintOperand(operand, operandval);
GenPrintNewLine();
#ifdef REORDER_WORKAROUND
#ifndef NO_REORDER_WORKAROUND
if (instr == MipsInstrJ || instr == MipsInstrJAL)
GenNop();
#endif
@@ -394,61 +379,10 @@ void GenPrintInstr3Operands(int instr, int instrval,
int operand2, int operand2val,
int operand3, int operand3val)
{
#ifdef INSTR_IMM_WORKAROUND
int useAt = 0;
#endif
if (operand3 == MipsOpConst && operand3val == 0 &&
(instr == MipsInstrAddU || instr == MipsInstrSubU))
return;
#ifdef INSTR_IMM_WORKAROUND
if (operand3 == MipsOpConst)
{
unsigned imm = truncUint(operand3val);
switch (instr)
{
// signed imm16:
// addi[u], subi[u], slti[u]
case MipsInstrAddU:
case MipsInstrSLT:
case MipsInstrSLTU:
if (imm > 0x7FFF && imm < 0xFFFF8000) // if not (-0x8000 <= imm <= 0x7FFF)
useAt = 1;
break;
case MipsInstrSubU:
// subi[u] will be transformed into addi[u] and the immediate will be negated,
// hence the immediate range is shifted by 1
if (imm > 0x8000 && imm < 0xFFFF8001) // if not (-0x7FFF <= imm <= 0x8000)
useAt = 1;
break;
// unsigned imm16:
// andi, ori, xori
case MipsInstrAnd:
case MipsInstrOr:
case MipsInstrXor:
if (imm > 0xFFFF)
useAt = 1;
break;
// also: various trap instructions
default:
break;
}
}
if (useAt)
{
puts2("\t.set\tnoat");
GenPrintInstr2Operands(MipsInstrLI, 0,
MipsOpRegAt, 0,
MipsOpConst, operand3val);
operand3 = MipsOpRegAt;
}
#endif
GenPrintInstr(instr, instrval);
GenPrintOperand(operand1, operand1val);
GenPrintOperandSeparator();
@@ -457,14 +391,7 @@ void GenPrintInstr3Operands(int instr, int instrval,
GenPrintOperand(operand3, operand3val);
GenPrintNewLine();
#ifdef INSTR_IMM_WORKAROUND
if (useAt)
{
puts2("\t.set\tat");
}
#endif
#ifdef REORDER_WORKAROUND
#ifndef NO_REORDER_WORKAROUND
if (instr == MipsInstrBEQ || instr == MipsInstrBNE)
GenNop();
#endif
@@ -1198,13 +1125,11 @@ void GenExpr0(void)
{
int reg = GenPopReg(MipsOpRegT0);
if (tok == '/' || tok == '%')
GenPrintInstr3Operands(MipsInstrDiv, 0,
MipsOpRegZero, 0,
GenPrintInstr2Operands(MipsInstrDiv, 0,
reg, 0,
MipsOpRegV0, 0);
else
GenPrintInstr3Operands(MipsInstrDivU, 0,
MipsOpRegZero, 0,
GenPrintInstr2Operands(MipsInstrDivU, 0,
reg, 0,
MipsOpRegV0, 0);
if (tok == '%' || tok == tokUMod)
@@ -1307,13 +1232,11 @@ void GenExpr0(void)
GenReadIndirect(MipsOpRegT1, reg, v);
if (tok == tokAssignDiv || tok == tokAssignMod)
GenPrintInstr3Operands(MipsInstrDiv, 0,
MipsOpRegZero, 0,
GenPrintInstr2Operands(MipsInstrDiv, 0,
MipsOpRegT1, 0,
MipsOpRegV0, 0);
else
GenPrintInstr3Operands(MipsInstrDivU, 0,
MipsOpRegZero, 0,
GenPrintInstr2Operands(MipsInstrDivU, 0,
MipsOpRegT1, 0,
MipsOpRegV0, 0);
if (tok == tokAssignMod || tok == tokAssignUMod)
@@ -1673,11 +1596,11 @@ void GenFin(void)
"\taddiu\t$3, $3, 1");
printf2("\tbne\t$4, $0, "); GenPrintNumLabel(lbl);
puts2("");
#ifdef REORDER_WORKAROUND
#ifndef NO_REORDER_WORKAROUND
GenNop();
#endif
puts2("\tj\t$31");
#ifdef REORDER_WORKAROUND
#ifndef NO_REORDER_WORKAROUND
GenNop();
#endif

View File

@@ -237,9 +237,8 @@ void GenStartAsciiString(void)
printf2("\tdb\t");
}
void GenAddrData(int Size, char* Label, int ofs)
void GenAddrData(int Size, char* Label)
{
ofs = truncInt(ofs);
#ifdef CAN_COMPILE_32BIT
if (OutputFormat == FormatSegHuge)
{
@@ -257,10 +256,7 @@ void GenAddrData(int Size, char* Label, int ofs)
else if (Size == 4)
printf2("\tdd\t");
#endif
GenPrintLabel(Label);
if (ofs)
printf2(" %+d", ofs);
puts2("");
GenPrintLabel(Label); puts2("");
if (!isdigit(*Label))
GenAddGlobal(Label, 2);
}
@@ -803,79 +799,6 @@ void GenFxnEpilog(void)
GenPrintInstrNoOperand(X86InstrRet);
}
#ifdef CAN_COMPILE_32BIT
/*
struct INTREGS
{
unsigned short gs, fs, es, ds;
unsigned edi, esi, ebp, esp, ebx, edx, ecx, eax;
unsigned short ss, ip, cs, flags;
};
void __interrupt isr(struct INTREGS** ppRegs)
{
// **ppRegs (input/output values of registers) can be modified to
// handle software interrupts requested via the int instruction and
// communicate data via registers
// *ppRegs (directly related to the stack pointer) can be modified to
// return to a different location & implement preemptive scheduling,
// e.g. save *ppRegs of the interrupted task somewhere, update *ppRegs
// with a value from another interrupted task.
}
*/
void GenIsrProlog(void)
{
// The CPU has already done these:
// push flags
// push cs
// push ip
puts2("\tpush\tss");
puts2("\tpushad");
puts2("\tpush\tds\n"
"\tpush\tes\n"
"\tpush\tfs\n"
"\tpush\tgs");
// The context has been saved
puts2("\txor\teax, eax\n\tmov\tax, ss"); // mov r32, sreg leaves top 16 bits undefined on pre-Pentium CPUs
puts2("\txor\tebx, ebx\n\tmov\tbx, sp"); // top 16 bits of esp can contain garbage as well
puts2("\tshl\teax, 4\n\tadd\teax, ebx");
puts2("\tpush\teax"); // pointer to the structure with register values
puts2("\tsub\teax, 4\n\tpush\teax"); // pointer to the pointer to the structure with register values
puts2("\tpush\teax"); // fake return address allowing to use the existing bp-relative addressing of locals and params
puts2("\tpush\tebp\n"
"\tmov\tebp, esp");
}
void GenIsrEpilog(void)
{
puts2("\tdb\t0x66\n\tleave");
puts2("\tpop\teax"); // fake return address
puts2("\tpop\teax"); // pointer to the pointer to the structure with register values
puts2("\tpop\tebx"); // pointer to the structure with register values
puts2("\tror\tebx, 4\n\tmov\tds, bx\n\tshr\tebx, 28"); // ds:bx = pointer to the structure with register values
puts2("\tmov\tax, [bx+4*10]\n\tmov\tbx, [bx+4*5]\n\tsub\tbx, 4*10"); // ax:bx = proper pointer (with original segment) to the struct...
puts2("\tmov\tss, ax\n\tmov\tsp, bx"); // restore ss:sp that we had after push gs
// The context is now going to be restored
puts2("\tpop\tgs\n"
"\tpop\tfs\n"
"\tpop\tes\n"
"\tpop\tds");
puts2("\tpopad");
puts2("\tpop\tss");
puts2("\tiret");
}
#endif
void GenReadIdent(int opSz, int label)
{
GenPrintInstr2Operands(X86InstrMov, 0,

File diff suppressed because it is too large Load Diff

View File

@@ -35,7 +35,7 @@ strip(name)
status = 1;
goto out;
}
if (head.a_syms == 0 && (head.a_magic) != RMAGIC)
if (head.a_syms == 0 && head.a_magic != RMAGIC)
goto out;
size = N_DATOFF(head) + head.a_data;
@@ -45,7 +45,7 @@ strip(name)
status = 1;
goto out;
}
head.a_midmag = OMAGIC;
head.a_magic = OMAGIC;
head.a_reltext = 0;
head.a_reldata = 0;
head.a_syms = 0;

View File

@@ -92,7 +92,7 @@ SECTIONS
*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
}
.sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) }
.eh_frame_hdr : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) }
.eh_frame_hdr : { *(.eh_frame_hdr) }
.eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) }
.gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
/* Adjust the address for the data segment. */

View File

@@ -13,7 +13,7 @@ OBJS = battlestar.o cmd1.o cmd2.o cmd3.o cmd4.o cmd5.o cmd6.o cmd7.o
init.o cypher.o getcom.o parse.o room.o save.o fly.o misc.o \
_globals.o _dayfile.o _nightfile.o dayobjs.o nightobjs.o words.o \
curses.o doprnt.o
LIBS = -lc
LIBS =
MAN = battlestar.0
MANSRC = battlestar.6

View File

@@ -12,7 +12,7 @@ CFLAGS += -Os -mips16 -Werror -Wall
OBJS = main.o pl_main.o pl_1.o pl_2.o pl_3.o pl_4.o pl_5.o pl_6.o pl_7.o \
dr_main.o dr_1.o dr_2.o dr_3.o dr_4.o dr_5.o lo_main.o \
assorted.o game.o globals.o misc.o parties.o sync.o version.o doprnt.o
LIBS = -lcurses -ltermcap -lc
LIBS = -lcurses -ltermcap
MAN = sail.0
MANSRC = sail.6

View File

@@ -357,7 +357,7 @@ Sync()
switch (*p++ = getc(sync_fp)) {
case '\n':
p--;
case (char)EOF:
case EOF:
break;
default:
if (p >= buf + sizeof buf)

View File

@@ -17,7 +17,7 @@ OBJS = abandon.o attack.o autover.o capture.o check_out.o checkcond.o
ranf.o rest.o schedule.o score.o setup.o setwarp.o shell.o \
shield.o snova.o srscan.o systemname.o torped.o utility.o \
visual.o warp.o win.o
LIBS = -lm -lc
LIBS = -lm
MAN = trek.0
MANSRC = trek.6

View File

@@ -121,7 +121,7 @@ main(argc, argv)
{
long vect;
/* extern FILE *f_log; */
/* register char opencode; */
register char opencode;
int prio;
register int ac;
register char **av;
@@ -132,7 +132,7 @@ main(argc, argv)
av++;
time(&vect);
srand(vect);
/* opencode = 'w'; */
opencode = 'w';
prio = PRIO;
if (ioctl(1, TIOCGETP, &argp) == 0)
{
@@ -144,7 +144,7 @@ main(argc, argv)
switch (av[0][1])
{
case 'a': /* append to log file */
/* opencode = 'a'; */
opencode = 'a';
break;
case 'f': /* set fast mode */
@@ -179,6 +179,10 @@ main(argc, argv)
}
if (ac > 2)
syserr(0, "arg count");
/*
if (ac > 1)
f_log = fopen(av[0], opencode);
*/
printf("\n * * * S T A R T R E K * * *\n\nPress return to continue.\n");

0
src/libc/compat/Makefile Normal file → Executable file
View File

View File

@@ -18,7 +18,7 @@ memccpy(vt, vf, c, n)
register char *t = vt;
register const char *f = vf;
while (n-- > 0)
while (--n >= 0)
if ((*t++ = *f++) == c)
return (t);
return (0);

View File

@@ -16,7 +16,7 @@ memchr(vs, c, n)
{
register const char *s = vs;
while (n-- > 0)
while (--n >= 0)
if (*s++ == c)
return (void*) --s;
return (0);

View File

@@ -15,7 +15,7 @@ memcmp (vs1, vs2, n)
{
register const char *s1 = vs1, *s2 = vs2;
while (n-- > 0)
while (--n >= 0)
if (*s1++ != *s2++)
return (*--s1 - *--s2);
return (0);

View File

@@ -17,7 +17,7 @@ memcpy (vt, vf, n)
register char *t = vt;
register const char *f = vf;
while (n-- > 0)
while (--n >= 0)
*t++ = *f++;
return vt;

View File

@@ -16,7 +16,7 @@ memset (vs, c, n)
{
register char *s = vs;
while (n-- > 0)
while (--n >= 0)
*s++ = c;
return vs;

4
src/libc/gen/Makefile Normal file → Executable file
View File

@@ -19,7 +19,7 @@ STDSRC = abort.c alarm.c atof.c atoi.c atol.c calloc.c closedir.c crypt.c \
getpass.c getpwent.c getloadavg.c getmntinfo.c \
getttyent.c getttynam.c getusershell.c getwd.c \
initgroups.c isatty.c isinff.c isnanf.c ldexp.c malloc.c mktemp.c \
modff.c ndbm.c nlist.c knlist.c opendir.c perror.c popen.c \
modff.c modf.c ndbm.c nlist.c knlist.c opendir.c perror.c popen.c \
psignal.c qsort.c random.c readdir.c regex.c scandir.c \
seekdir.c setmode.c sethostname.c setenv.c siglist.c \
signal.c siginterrupt.c sigsetops.c \
@@ -36,7 +36,7 @@ STDOBJ = abort.o alarm.o atof.o atoi.o atol.o calloc.o closedir.o crypt.o \
getpass.o getpwent.o getloadavg.o getmntinfo.o \
getttyent.o getttynam.o getusershell.o getwd.o \
initgroups.o isatty.o isinff.o isnanf.o ldexp.o malloc.o mktemp.o \
modff.o ndbm.o nlist.o knlist.o opendir.o perror.o popen.o \
modff.o modf.o ndbm.o nlist.o knlist.o opendir.o perror.o popen.o \
psignal.o qsort.o random.o readdir.o regex.o scandir.o \
seekdir.o setmode.o sethostname.o setenv.o siglist.o \
signal.o siginterrupt.o sigsetops.o \

View File

@@ -14,7 +14,7 @@
*/
char *
getenv(name)
const char *name;
char *name;
{
int offset;
char *_findenv();

View File

@@ -27,4 +27,4 @@ int isinff (float x)
/*
* For PIC32, double is the same as float.
*/
int isinf (double x) __attribute__((alias ("isinff")));
//int isinf (double x) __attribute__((alias ("isinff")));

View File

@@ -27,4 +27,4 @@ int isnanf (float x)
/*
* For PIC32, double is the same as float.
*/
int isnan (double x) __attribute__((alias ("isnanf")));
//int isnan (double x) __attribute__((alias ("isnanf")));

View File

@@ -1,46 +1,46 @@
#include <math.h>
#include <ieee.h>
static const double
two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
huge = 1.0e+308,
tiny = 1.0e-307;
static double
_copysign(double x, double y)
{
unsigned long hx,hy;
GET_HIGH_WORD(hx,x);
GET_HIGH_WORD(hy,y);
SET_HIGH_WORD(x,(hx&0x7fffffff)|(hy&0x80000000));
return x;
}
double
ldexp(fr, exp)
double fr;
int exp;
ldexp(double x, int n)
{
double huge = 1.701411834604692293e38;
int neg;
int i;
neg = 0;
if (fr < 0) {
fr = -fr;
neg = 1;
unsigned long k,hx,lx;
EXTRACT_WORDS(hx,lx,x);
k = (hx&0x7ff00000)>>20; /* extract exponent */
if (k==0) { /* 0 or subnormal x */
if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
x *= two54;
GET_HIGH_WORD(hx,x);
k = ((hx&0x7ff00000)>>20) - 54;
if (n< -50000) return tiny*x; /*underflow*/
}
if (k==0x7ff) return x+x; /* NaN or Inf */
k = k+n;
if (k > 0x7fe) return huge*_copysign(huge,x); /* overflow */
if (k > 0) /* normal result */
{SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
if (k <= -54) {
if (n > 50000) /* in case integer overflow in n+k */
return huge*_copysign(huge,x); /*overflow*/
else return tiny*_copysign(tiny,x); /*underflow*/
}
fr = frexp(fr, &i);
while (fr < 0.5) {
fr = 2*fr;
i = i-1;
}
exp = exp+i;
if (exp > 127) {
if (neg)
return(-huge);
else
return(huge);
}
if (exp < -127)
return(0);
while (exp > 30) {
fr = fr*(1L<<30);
exp = exp-30;
}
while (exp < -30) {
fr = fr/(1L<<30);
exp = exp+30;
}
if (exp > 0)
fr = fr*(1L<<exp);
if (exp < 0)
fr = fr/(1L<<-exp);
if (neg)
fr = -fr;
return(fr);
k += 54; /* subnormal result */
SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
return x*twom54;
}

View File

@@ -7,18 +7,7 @@
* is preserved.
*/
#include <math.h>
/* Get two 32 bit ints from a double. */
#define EXTRACT_WORDS(high,low,d) \
high = *(unsigned long long*) &d; \
low = (*(unsigned long long*) &d) >> 32
/* Set a double from two 32 bit ints. */
#define INSERT_WORDS(d,high,low) \
*(unsigned long long*) &(x) = (unsigned long long) (high) << 32 | (low)
#include <ieee.h>
/*
* modf(double x, double *iptr)
@@ -37,10 +26,12 @@ double modf (double x, double *iptr)
unsigned long i;
EXTRACT_WORDS (i0, i1, x);
//
j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; /* exponent of x */
if (j0 < 20) { /* integer part in high x */
if (j0 < 0) { /* |x|<1 */
INSERT_WORDS (*iptr, i0 & 0x80000000, 0);
//
/* *iptr = +-0 */
return x;
} else {
@@ -48,10 +39,12 @@ double modf (double x, double *iptr)
if (((i0 & i) | i1) == 0) { /* x is integral */
*iptr = x;
INSERT_WORDS (x, i0 & 0x80000000, 0);
//
/* return +-0 */
return x;
} else {
INSERT_WORDS (*iptr, i0 & (~i), 0);
//
return x - *iptr;
}
}
@@ -62,6 +55,7 @@ double modf (double x, double *iptr)
return x * one;
INSERT_WORDS (x, i0 & 0x80000000, 0);
//
/* return +-0 */
return x;
} else { /* fraction part in low x */
@@ -69,10 +63,12 @@ double modf (double x, double *iptr)
if ((i1 & i) == 0) { /* x is integral */
*iptr = x;
INSERT_WORDS (x, i0 & 0x80000000, 0);
//
/* return +-0 */
return x;
} else {
INSERT_WORDS (*iptr, i0, i1 & (~i));
//
return x - *iptr;
}
}

View File

@@ -52,4 +52,4 @@ float modff (float fx, float *iptr)
/*
* For PIC32, double is the same as float.
*/
double modf (double x, double *iptr) __attribute__((alias ("modff")));
//double modf (double x, double *iptr) __attribute__((alias ("modff")));

0
src/libc/gen/ndbm.c Normal file → Executable file
View File

View File

@@ -64,8 +64,8 @@ strncasecmp(s1, s2, n)
{
register char *cm = charmap;
while (n-- > 0 && cm[(unsigned char)*s1] == cm[(unsigned char)*s2++])
while (--n >= 0 && cm[(unsigned char)*s1] == cm[(unsigned char)*s2++])
if (*s1++ == '\0')
return(0);
return(n == -1 ? 0 : cm[(unsigned char)*s1] - cm[(unsigned char)*--s2]);
return(n < 0 ? 0 : cm[(unsigned char)*s1] - cm[(unsigned char)*--s2]);
}

View File

@@ -18,7 +18,7 @@ strncat(s1, s2, n)
;
--s1;
while ((*s1++ = *s2++))
if (n-- == 0) {
if (--n < 0) {
*--s1 = '\0';
break;
}

View File

@@ -10,7 +10,7 @@ strncpy(s1, s2, n)
register const char *s2;
size_t n;
{
size_t i;
register int i;
register char *os1;
os1 = s1;

0
src/libc/mips/sys/Makefile Normal file → Executable file
View File

0
src/libc/stdio/Makefile Normal file → Executable file
View File

View File

@@ -42,7 +42,9 @@
#include <math.h>
/* Max number conversion buffer length: a long in base 2, plus NUL byte. */
#define MAXNBUF (sizeof(long) * 8 + 1)
//#define MAXNBUF (sizeof(long) * 8 + 1)
/* Max number conversion buffer length: MAXEXP(308) + MAXFRACTION(15) + 2 */
#define MAXNBUF 308+15+2
static unsigned char *ksprintn (unsigned char *buf, unsigned long v, unsigned char base,
int width, unsigned char *lp);
@@ -61,6 +63,8 @@ _doprnt (char const *fmt, va_list ap, FILE *stream)
int n, width, dwidth, retval, uppercase, extrazeros, sign;
unsigned long ul;
double d;
if (! stream)
return 0;
if (! fmt)
@@ -361,7 +365,11 @@ number: if (sign && ((long) ul != 0L)) {
case 'F':
case 'g':
case 'G': {
double d = va_arg (ap, double);
// ---va_arg alignment fix
d = va_arg(ap, double);
// ---
/*
* don't do unrealistic precision; just pad it with
* zeroes later, so buffer size stays rational.
@@ -583,10 +591,11 @@ cvt (double number, int prec, int sharpflag, unsigned char *negp, unsigned char
* get integer portion of number; put into the end of the buffer; the
* .01 is added for modf (356.0 / 10, &integer) returning .59999999...
*/
for (p = endp - 1; integer; ++expcnt) {
tmp = modf (integer / 10, &integer);
*p-- = (int) ((tmp + .01) * 10) + '0';
}
p = endp - 1;
for (; integer && p >= startp; ++expcnt) {
tmp = modf(integer * 0.1L , &integer);
*p-- = (int)((tmp + .01L) * 10) + '0';
}
switch (fmtch) {
case 'f':
/* reverse integer into beginning of buffer */

View File

@@ -1,6 +1,10 @@
#include <stdio.h>
#include <ctype.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#define HAVE_FLOAT 1
#define SPC 01
#define STP 02

0
src/libc/stdlib/Makefile Normal file → Executable file
View File

View File

@@ -43,8 +43,7 @@ char *suboptarg;
int
getsubopt(optionp, tokens, valuep)
register char **optionp;
register char **valuep;
register char **optionp, **valuep;
register char **tokens;
{
register int cnt;

View File

@@ -43,11 +43,11 @@
*/
long
strtol(nptr, endptr, base)
const char *nptr;
char *nptr;
char **endptr;
register int base;
{
register const char *s = nptr;
register char *s = nptr;
register unsigned long acc;
register int c;
register unsigned long cutoff;

View File

@@ -43,11 +43,11 @@
*/
unsigned long
strtoul(nptr, endptr, base)
const char *nptr;
char *nptr;
char **endptr;
register int base;
{
register const char *s = nptr;
register char *s = nptr;
register unsigned long acc;
register int c;
register unsigned long cutoff;

View File

@@ -7,7 +7,7 @@ TOPSRC = $(shell cd ../../..; pwd)
include $(TOPSRC)/target.mk
DEFS =
CFLAGS += ${DEFS} -Os
CFLAGS += ${DEFS}
SRCS = strcspn.c strpbrk.c strerror.c strsep.c strspn.c strstr.c strtok.c strtok_r.c
OBJS = strcspn.o strpbrk.o strerror.o strsep.o strspn.o strstr.o strtok.o strtok_r.o

View File

@@ -39,15 +39,17 @@ asin(arg)
double
acos(arg)
double arg;
double arg;
{
if(arg < 0)
arg = -arg;
double sign = 1.0;
if(arg < 0.0){
arg = -arg;
sign = -1.0;
}
if(arg > 1.0){
errno = EDOM;
return(0.0);
}
if(arg > 1.){
errno = EDOM;
return(0.);
}
return(pio2 - asin(arg));
return(pio2 - sign*asin(arg));
}

View File

@@ -13,7 +13,7 @@
*/
#include <math.h>
double static sq2p1 =2.414213562373095048802e0;
static double sq2p1 =2.414213562373095048802e0;
static double sq2m1 = .414213562373095048802e0;
static double pio2 =1.570796326794896619231e0;
static double pio4 = .785398163397448309615e0;

View File

@@ -1,23 +1,47 @@
/* Get two 32 bit ints from a double. */
#define EXTRACT_WORDS(high,low,d) \
high = *(unsigned long long*) &d; \
low = (*(unsigned long long*) &d) >> 32
/* Set a double from two 32 bit ints. */
#define INSERT_WORDS(d,high,low) \
*(unsigned long long*) &(x) = (unsigned long long) (high) << 32 | (low)
typedef union
typedef union // LITTLE ENDIAN
{
double value;
struct
{
uint32_t lsw;
uint32_t msw;
unsigned long lsw;
unsigned long msw;
} parts;
} ieee_double_shape_type;
/* Get two 32 bit ints from a double. */
#define EXTRACT_WORDS(ix0,ix1,d) \
do { \
ieee_double_shape_type ew_u; \
ew_u.value = (d); \
(ix0) = ew_u.parts.msw; \
(ix1) = ew_u.parts.lsw; \
} while (0)
/* Get the more significant 32 bit int from a double. */
#define GET_HIGH_WORD(i,d) \
do { \
ieee_double_shape_type gh_u; \
gh_u.value = (d); \
(i) = gh_u.parts.msw; \
} while (0)
/* Set a double from two 32 bit ints. */
#define INSERT_WORDS(d,ix0,ix1) \
do { \
ieee_double_shape_type iw_u; \
iw_u.parts.msw = (ix0); \
iw_u.parts.lsw = (ix1); \
(d) = iw_u.value; \
} while (0)
#define SET_HIGH_WORD(d,v) \
do { \
ieee_double_shape_type sh_u; \
sh_u.value = (d); \
sh_u.parts.msw = (v); \
(d) = sh_u.value; \
} while (0)

View File

@@ -4,103 +4,25 @@
* specifies the terms and conditions for redistribution.
*/
#ifndef _SYS_EXEC_H_
#define _SYS_EXEC_H_
#ifdef KERNEL
#ifdef EXEC_SCRIPT
#define SHSIZE 64
#define SHPATHLEN 64
#endif
#ifdef EXEC_ELF
#define STRLEN 32
#endif
#ifdef EXEC_AOUT
#include "exec_aout.h"
#endif
#ifdef EXEC_ELF
#include "exec_elf.h"
#endif
#define NO_ADDR ((caddr_t)(~0U)) /* Indicates addr. not yet filled in */
struct memsect {
caddr_t vaddr;
unsigned len;
#ifndef _EXEC_
#define _EXEC_
/*
* Header prepended to each a.out file.
*/
struct exec {
int a_magic; /* magic number */
unsigned int a_text; /* size of text segment */
unsigned int a_data; /* size of initialized data */
unsigned int a_bss; /* size of uninitialized data */
unsigned int a_reltext; /* size of text relocation info */
unsigned int a_reldata; /* size of data relocation info */
unsigned int a_syms; /* size of symbol table */
unsigned int a_entry; /* entry point */
};
struct exec_params {
char *userfname; /* The arguments to the exec() call */
char **userargp;
char **userenvp;
union {
#ifdef EXEC_SCRIPT
char sh[SHSIZE];
#endif
#ifdef EXEC_AOUT
struct exec aout;
#endif
#ifdef EXEC_ELF
struct elf_ehdr elf;
#endif
} hdr; /* head of file to exec */
int hdr_len; /* number of bytes valid in image_header */
char **argp, **envp;
u_short argc, envc; /* count of argument and environment strings */
u_short argbc, envbc; /* total number of chars in argc and envc string pool */
union {
#ifdef EXEC_SCRIPT
struct {
char interpname[20]; /* real name of the script interpreter */
char interparg[SHPATHLEN]; /* interpreter arg */
char interpreted; /* flag - this executable is interpreted */
} sh;
#endif
#ifdef EXEC_ELF
struct {
struct buf *stbp; /* String table buffer pointer */
int stbpos; /* String table pos in buffer */
int stsize; /* String table size */
int stoffset; /* String table file pos */
char str[STRLEN];
} elf;
#endif
#ifdef EXEC_AOUT
struct {
} aout;
#endif
};
/* a_magic */
#define RMAGIC 0406 /* relocatable object file */
#define OMAGIC 0407 /* old impure format */
#define NMAGIC 0410 /* read-only text */
gid_t gid;
uid_t uid;
#define MAXALLOCBUF 6
struct {
struct buf *bp; /* Memory allocator buffer */
u_short fill; /* Memory allocator "free" pointer */
} alloc[MAXALLOCBUF];
u_long ep_taddr, ep_tsize, ep_daddr, ep_dsize;
struct inode *ip; /* executable file ip */
struct memsect text, data, bss, heap, stack;
};
struct execsw {
int (*es_check)(struct exec_params *epp);
const char* es_name;
};
extern const struct execsw execsw[];
extern int nexecs, exec_maxhdrsz;
struct buf *exec_copy_args(char **argp, struct exec_params *epp, int isargv, int *argc, int *argbc);
int exec_check(struct exec_params *epp);
void exec_setupstack(unsigned entryaddr, struct exec_params *epp);
void exec_alloc_freeall(struct exec_params *epp);
void *exec_alloc(int size, int ru, struct exec_params *epp);
int exec_estab(struct exec_params *epp);
void exec_save_args(struct exec_params *epp);
void exec_clear(struct exec_params *epp);
#else /* KERNEL */
#include <sys/exec_aout.h>
#endif
#endif

View File

@@ -1,102 +0,0 @@
#ifndef _SYS_EXEC_AOUT_H_
#define _SYS_EXEC_AOUT_H_
/*
* Header prepended to each a.out file.
*/
struct exec {
unsigned a_midmag; /* magic number */
unsigned a_text; /* size of text segment */
unsigned a_data; /* size of initialized data */
unsigned a_bss; /* size of uninitialized data */
unsigned a_reltext; /* size of text relocation info */
unsigned a_reldata; /* size of data relocation info */
unsigned a_syms; /* size of symbol table */
unsigned a_entry; /* entry point */
};
#define a_magic a_midmag & 0xffff
/* a_magic (a_midmag & 0x0000ffff) */
#define RMAGIC 0406 /* relocatable object file */
#define OMAGIC 0407 /* old impure format */
#define NMAGIC 0410 /* read-only text */
/*
* a_mid ((a_midmag & 0x03ff0000) >> 16)
*/
#define MID_ZERO 0 /* unknown - implementation dependent */
#define MID_SUN010 1 /* sun 68010/68020 binary */
#define MID_SUN020 2 /* sun 68020-only binary */
#define MID_PC386 100 /* 386 PC binary. (so quoth BFD) */
#define MID_HP200 200 /* hp200 (68010) BSD binary */
#define MID_I386 134 /* i386 BSD binary */
#define MID_M68K 135 /* m68k BSD binary with 8K page sizes */
#define MID_M68K4K 136 /* m68k BSD binary with 4K page sizes */
#define MID_NS32532 137 /* ns32532 */
#define MID_SPARC 138 /* sparc */
#define MID_PMAX 139 /* pmax */
#define MID_VAX1K 140 /* vax 1K page size binaries */
#define MID_ALPHA 141 /* Alpha BSD binary */
#define MID_MIPS 142 /* big-endian MIPS */
#define MID_ARM6 143 /* ARM6 */
#define MID_SH3 145 /* SH3 */
#define MID_POWERPC 149 /* big-endian PowerPC */
#define MID_VAX 150 /* vax */
#define MID_SPARC64 151 /* LP64 sparc */
#define MID_HP300 300 /* hp300 (68020+68881) BSD binary */
#define MID_HPUX 0x20C /* hp200/300 HP-UX binary */
#define MID_HPUX800 0x20B /* hp800 HP-UX binary */
/*
* a_flags ((a_midmag & 0xfc000000 ) << 26)
*/
#define EX_PIC 0x10
#define EX_DYNAMIC 0x20
#define EX_DPMASK 0x30
/*
* Interpretation of the (a_flags & EX_DPMASK) bits:
*
* 00 traditional executable or object file
* 01 object file contains PIC code (set by `as -k')
* 10 dynamic executable
* 11 position independent executable image
* (eg. a shared library)
*/
/*
* The a.out structure's a_midmag field is a network-byteorder encoding
* of this int
* FFFFFFmmmmmmmmmmMMMMMMMMMMMMMMMM
* Where `F' is 6 bits of flag like EX_DYNAMIC,
* `m' is 10 bits of machine-id like MID_I386, and
* `M' is 16 bits worth of magic number, ie. ZMAGIC.
* The macros below will set/get the needed fields.
*/
#define N_GETMAGIC(ex) (((ex).a_midmag)&0x0000ffff)
#define N_GETMID(ex) ((((ex).a_midmag)&0x03ff0000) >> 16)
#define N_GETFLAG(ex) ((((ex).a_midmag)&0xfc000000 ) << 26)
/* Valid magic number check. */
#define N_BADMAG(x) (N_GETMAGIC(x) != RMAGIC && \
N_GETMAGIC(x) != OMAGIC && \
N_GETMAGIC(x) != NMAGIC)
/* Text segment offset. */
#define N_TXTOFF(x) sizeof(struct exec)
/* Data segment offset. */
#define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text)
/* Text relocation table offset. */
#define N_TRELOFF(x) (N_DATOFF(x) + (x).a_data)
/* Data relocation table offset. */
#define N_DRELOFF(x) (N_TRELOFF(x) + (x).a_reltext)
/* Symbol table offset. */
#define N_SYMOFF(x) (N_GETMAGIC(x) == RMAGIC ? \
N_DRELOFF(x) + (x).a_reldata : \
N_DATOFF(x) + (x).a_data)
#endif

View File

@@ -1,496 +0,0 @@
/* $NetBSD: exec_elf.h,v 1.37.4.1 2000/07/26 23:57:06 mycroft Exp $ */
/*-
* Copyright (c) 1994 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Christos Zoulas.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _SYS_EXEC_ELF_H_
#define _SYS_EXEC_ELF_H_
#ifndef _SYS_TYPES_H_
#include <machine/types.h>
#endif
/*
* ELF Header
*/
#define ELF_NIDENT 16
struct elf_ehdr {
unsigned char e_ident[ELF_NIDENT]; /* Id bytes */
unsigned short e_type; /* file type */
unsigned short e_machine; /* machine type */
unsigned int e_version; /* version number */
unsigned int e_entry; /* entry point */
unsigned int e_phoff; /* Program header table offset */
unsigned int e_shoff; /* Section header table offset */
unsigned int e_flags; /* Processor flags (currently unused, should be 0) */
unsigned short e_ehsize; /* sizeof elf_ehdr */
unsigned short e_phentsize; /* Program header entry size */
unsigned short e_phnum; /* Number of program headers */
unsigned short e_shentsize; /* Section header entry size */
unsigned short e_shnum; /* Number of section headers */
unsigned short e_shstrndx; /* String table index */
};
/* e_ident offsets */
#define EI_MAG0 0 /* first byte of magic number */
#define ELFMAG0 0x7f
#define EI_MAG1 1 /* second byte of magic number */
#define ELFMAG1 'E'
#define EI_MAG2 2 /* third byte of magic number */
#define ELFMAG2 'L'
#define EI_MAG3 3 /* fourth byte of magic number */
#define ELFMAG3 'F'
#define EI_CLASS 4 /* 5:th byte: File class */
#define ELFCLASSNONE 0 /* Invalid class */
#define ELFCLASS32 1 /* 32-bit objects */
#define ELFCLASS64 2 /* 64-bit objects */
#define ELFCLASSNUM 3
#define EI_DATA 5 /* 6:th byte: Data encoding */
#define ELFDATANONE 0 /* Unknown data format */
#define ELFDATA2LSB 1 /* two's complement, little-endian */
#define ELFDATA2MSB 2 /* two's complement, big-endian */
#define EI_VERSION 6 /* Version number of the ELF specification */
#define EV_NONE 0 /* Invalid version */
#define EV_CURRENT 1 /* Current version */
#define EV_NUM 2
#define EI_OSABI 7 /* Operating system/ABI identification */
#define ELFOSABI_SYSV 0 /* UNIX System V ABI */
#define ELFOSABI_HPUX 1 /* HP-UX operating system */
#define ELFOSABI_NETBSD /* NetBSD ABI */
#define ELFOSABI_LINUX /* Linux ABI */
#define ELFOSABI_SOLARIS /* Solaris ABI */
#define ELFOSABI_FREEBSD /* FreeBSD ABI */
#define ELFOSABI_ARM /* ARM architecture ABI */
#define ELFOSABI_STANDALONE 255 /* Stand-alone (embedded) application */
#define EI_ABIVERSION 8 /* ABI version */
#define EI_PAD 9 /* Start of padding bytes up to EI_NIDENT*/
#define ELFMAG "\177ELF"
#define SELFMAG 4
/* e_type */
#define ET_NONE 0 /* Unknown file type */
#define ET_REL 1 /* A Relocatable file */
#define ET_EXEC 2 /* An Executable file */
#define ET_DYN 3 /* A Shared object file */
#define ET_CORE 4 /* A Core file */
#define ET_NUM 5
#define ET_LOOS 0xfe00 /* Operating system specific range */
#define ET_HIOS 0xfeff
#define ET_LOPROC 0xff00 /* Processor-specific range */
#define ET_HIPROC 0xffff
/* e_machine */
#define EM_NONE 0 /* No machine */
#define EM_M32 1 /* AT&T WE 32100 */
#define EM_SPARC 2 /* SPARC */
#define EM_386 3 /* Intel 80386 */
#define EM_68K 4 /* Motorola 68000 */
#define EM_88K 5 /* Motorola 88000 */
#define EM_486 6 /* Intel 80486 */
#define EM_860 7 /* Intel 80860 */
#define EM_MIPS 8 /* MIPS I Architecture */
#define EM_S370 9 /* Amdahl UTS on System/370 */
#define EM_MIPS_RS3_LE 10 /* MIPS RS3000 Little-endian */
#define EM_RS6000 11 /* IBM RS/6000 XXX reserved */
#define EM_PARISC 15 /* Hewlett-Packard PA-RISC */
#define EM_NCUBE 16 /* NCube XXX reserved */
#define EM_VPP500 17 /* Fujitsu VPP500 */
#define EM_SPARC32PLUS 18 /* Enhanced instruction set SPARC */
#define EM_960 19 /* Intel 80960 */
#define EM_PPC 20 /* PowerPC */
#define EM_V800 36 /* NEC V800 */
#define EM_FR20 37 /* Fujitsu FR20 */
#define EM_RH32 38 /* TRW RH-32 */
#define EM_RCE 39 /* Motorola RCE */
#define EM_ARM 40 /* Advanced RISC Machines ARM */
#define EM_ALPHA 41 /* DIGITAL Alpha */
#define EM_SH 42 /* Hitachi Super-H */
#define EM_SPARCV9 43 /* SPARC Version 9 */
#define EM_TRICORE 44 /* Siemens Tricore */
#define EM_ARC 45 /* Argonaut RISC Core */
#define EM_H8_300 46 /* Hitachi H8/300 */
#define EM_H8_300H 47 /* Hitachi H8/300H */
#define EM_H8S 48 /* Hitachi H8S */
#define EM_H8_500 49 /* Hitachi H8/500 */
#define EM_IA_64 50 /* Intel Merced Processor */
#define EM_MIPS_X 51 /* Stanford MIPS-X */
#define EM_COLDFIRE 52 /* Motorola Coldfire */
#define EM_68HC12 53 /* Motorola MC68HC12 */
#define EM_VAX 75 /* DIGITAL VAX */
#define EM_ALPHA_EXP 36902 /* used by NetBSD/alpha; obsolete */
#define EM_NUM 36903
/*
* ELF Program Header
*/
struct elf_phdr {
unsigned int p_type; /* entry type */
unsigned int p_offset; /* file offset */
unsigned int p_vaddr; /* virtual address */
unsigned int p_paddr; /* physical address (reserved, 0) */
unsigned int p_filesz; /* file size of segment (may be 0) */
unsigned int p_memsz; /* memory size of segment (may be 0) */
unsigned int p_flags; /* flags */
unsigned int p_align; /* memory & file alignment */
};
/* p_type */
#define PT_NULL 0 /* Program header table entry unused */
#define PT_LOAD 1 /* Loadable program segment */
#define PT_DYNAMIC 2 /* Dynamic linking information */
#define PT_INTERP 3 /* Program interpreter */
#define PT_NOTE 4 /* Auxiliary information */
#define PT_SHLIB 5 /* Reserved, unspecified semantics */
#define PT_PHDR 6 /* Entry for header table itself */
#define PT_NUM 7
#define PT_LOPROC 0x70000000 /* Start of processor-specific semantics */
#define PT_HIPROC 0x7fffffff /* end of processor-specific semantics */
#define PT_GNU_STACK /* GNU stack extension */
/* p_flags */
#define PF_R 0x4 /* Segment is readable */
#define PF_W 0x2 /* Segment is writable */
#define PF_X 0x1 /* Segment is executable */
/* A text segment commonly have PF_X|PF_R, a data segment PF_X|PF_W and PF_R */
#define PF_MASKOS 0x0ff00000 /* Opersting system specific values */
#define PF_MASKPROC 0xf0000000 /* Processor-specific values */
#define PT_MIPS_REGINFO 0x70000000
/*
* Section Headers
*/
struct elf_shdr {
unsigned int sh_name; /* section name (.shstrtab index) */
unsigned int sh_type; /* section type */
unsigned int sh_flags; /* section flags */
unsigned int sh_addr; /* virtual address */
unsigned int sh_offset; /* file offset */
unsigned int sh_size; /* section size */
unsigned int sh_link; /* link to another */
unsigned int sh_info; /* misc info */
unsigned int sh_addralign; /* memory alignment */
unsigned int sh_entsize; /* table entry size */
};
/* sh_type */
#define SHT_NULL 0 /* inactive */
#define SHT_PROGBITS 1 /* program defined contents */
#define SHT_SYMTAB 2 /* holds symbol table */
#define SHT_STRTAB 3 /* holds string table */
#define SHT_RELA 4 /* holds relocation info with explicit addends */
#define SHT_HASH 5 /* holds symbol hash table */
#define SHT_DYNAMIC 6 /* holds dynamic linking information */
#define SHT_NOTE 7 /* holds information marking */
#define SHT_NOBITS 8 /* holds a section that does not occupy space */
#define SHT_REL 9 /* holds relocation info without explicit addends */
#define SHT_SHLIB 10 /* reserved with unspecified semantics */
#define SHT_DYNSYM 11 /* holds a minimal set of dynamic linking symbols */
#define SHT_NUM 12
#define SHT_LOOS 0x60000000 /* Operating system specific range */
#define SHT_HIOS 0x6fffffff
#define SHT_LOPROC 0x70000000 /* Processor-specific range */
#define SHT_HIPROC 0x7fffffff
#define SHT_LOUSER 0x80000000 /* Application-specific range */
#define SHT_HIUSER 0xffffffff
/* sh_flags */
#define SHF_WRITE 0x1 /* Section contains writable data */
#define SHF_ALLOC 0x2 /* Section occupies memory */
#define SHF_EXECINSTR 0x4 /* Section contains executable insns */
#define SHF_MASKOS 0x0f000000 /* Operating system specific values */
#define SHF_MASKPROC 0xf0000000 /* Processor-specific values */
/*
* Symbol Table
*/
struct elf_sym {
unsigned int st_name; /* Symbol name (.symtab index) */
unsigned int st_value; /* value of symbol */
unsigned int st_size; /* size of symbol */
unsigned char st_info; /* type / binding attrs */
unsigned char st_other; /* unused */
unsigned short st_shndx; /* section index of symbol */
};
/* Symbol Table index of the undefined symbol */
#define ELF_SYM_UNDEFINED 0
/* st_info: Symbol Bindings */
#define STB_LOCAL 0 /* local symbol */
#define STB_GLOBAL 1 /* global symbol */
#define STB_WEAK 2 /* weakly defined global symbol */
#define STB_NUM 3
#define STB_LOOS 10 /* Operating system specific range */
#define STB_HIOS 12
#define STB_LOPROC 13 /* Processor-specific range */
#define STB_HIPROC 15
/* st_info: Symbol Types */
#define STT_NOTYPE 0 /* Type not specified */
#define STT_OBJECT 1 /* Associated with a data object */
#define STT_FUNC 2 /* Associated with a function */
#define STT_SECTION 3 /* Associated with a section */
#define STT_FILE 4 /* Associated with a file name */
#define STT_NUM 5
#define STT_LOOS 10 /* Operating system specific range */
#define STT_HIOS 12
#define STT_LOPROC 13 /* Processor-specific range */
#define STT_HIPROC 15
/* st_info utility macros */
#define ELF_ST_BIND(info) ((unsigned int)(info) >> 4)
#define ELF_ST_TYPE(info) ((unsigned int)(info) & 0xf)
#define ELF_ST_INFO(bind,type) ((unsigned char)(((bind) << 4) | ((type) & 0xf)))
/*
* Special section indexes
*/
#define SHN_UNDEF 0 /* Undefined section */
#define SHN_LORESERVE 0xff00 /* Start of Reserved range */
#define SHN_ABS 0xfff1 /* Absolute symbols */
#define SHN_COMMON 0xfff2 /* Common symbols */
#define SHN_HIRESERVE 0xffff
#define SHN_LOPROC 0xff00 /* Start of Processor-specific range */
#define SHN_HIPROC 0xff1f
#define SHN_LOOS 0xff20 /* Operating system specific range */
#define SHN_HIOS 0xff3f
#define SHN_MIPS_ACOMMON 0xff00
#define SHN_MIPS_TEXT 0xff01
#define SHN_MIPS_DATA 0xff02
#define SHN_MIPS_SCOMMON 0xff03
/*
* Relocation Entries
*/
struct elf_rel {
unsigned int r_offset; /* where to do it */
unsigned int r_info; /* index & type of relocation */
};
struct elf_rela {
unsigned int r_offset; /* where to do it */
unsigned int r_info; /* index & type of relocation */
int r_addend; /* adjustment value */
};
/* r_info utility macros */
#define ELF_R_SYM(info) ((info) >> 8)
#define ELF_R_TYPE(info) ((info) & 0xff)
#define ELF_R_INFO(sym, type) (((sym) << 8) + (unsigned char)(type))
/*
* Dynamic Section structure array
*/
struct elf_dyn {
unsigned int d_tag; /* entry tag value */
union {
unsigned int d_ptr;
unsigned int d_val;
} d_un;
};
/* d_tag */
#define DT_NULL 0 /* Marks end of dynamic array */
#define DT_NEEDED 1 /* Name of needed library (DT_STRTAB offset) */
#define DT_PLTRELSZ 2 /* Size, in bytes, of relocations in PLT */
#define DT_PLTGOT 3 /* Address of PLT and/or GOT */
#define DT_HASH 4 /* Address of symbol hash table */
#define DT_STRTAB 5 /* Address of string table */
#define DT_SYMTAB 6 /* Address of symbol table */
#define DT_RELA 7 /* Address of Rela relocation table */
#define DT_RELASZ 8 /* Size, in bytes, of DT_RELA table */
#define DT_RELAENT 9 /* Size, in bytes, of one DT_RELA entry */
#define DT_STRSZ 10 /* Size, in bytes, of DT_STRTAB table */
#define DT_SYMENT 11 /* Size, in bytes, of one DT_SYMTAB entry */
#define DT_INIT 12 /* Address of initialization function */
#define DT_FINI 13 /* Address of termination function */
#define DT_SONAME 14 /* Shared object name (DT_STRTAB offset) */
#define DT_RPATH 15 /* Library search path (DT_STRTAB offset) */
#define DT_SYMBOLIC 16 /* Start symbol search within local object */
#define DT_REL 17 /* Address of Rel relocation table */
#define DT_RELSZ 18 /* Size, in bytes, of DT_REL table */
#define DT_RELENT 19 /* Size, in bytes, of one DT_REL entry */
#define DT_PLTREL 20 /* Type of PLT relocation entries */
#define DT_DEBUG 21 /* Used for debugging; unspecified */
#define DT_TEXTREL 22 /* Relocations might modify non-writable seg */
#define DT_JMPREL 23 /* Address of relocations associated with PLT */
#define DT_BIND_NOW 24 /* Process all relocations at load-time */
#define DT_INIT_ARRAY 25 /* Address of initialization function array */
#define DT_FINI_ARRAY 26 /* Size, in bytes, of DT_INIT_ARRAY array */
#define DT_INIT_ARRAYSZ 27 /* Address of termination function array */
#define DT_FINI_ARRAYSZ 28 /* Size, in bytes, of DT_FINI_ARRAY array*/
#define DT_NUM 29
#define DT_LOOS 0x60000000 /* Operating system specific range */
#define DT_HIOS 0x6fffffff
#define DT_LOPROC 0x70000000 /* Processor-specific range */
#define DT_HIPROC 0x7fffffff
/*
* Auxiliary Vectors
*/
struct elf_auxinfo {
unsigned int a_type; /* 32-bit id */
unsigned int a_v; /* 32-bit id */
};
/* a_type */
#define AT_NULL 0 /* Marks end of array */
#define AT_IGNORE 1 /* No meaning, a_un is undefined */
#define AT_EXECFD 2 /* Open file descriptor of object file */
#define AT_PHDR 3 /* &phdr[0] */
#define AT_PHENT 4 /* sizeof(phdr[0]) */
#define AT_PHNUM 5 /* # phdr entries */
#define AT_PAGESZ 6 /* PAGESIZE */
#define AT_BASE 7 /* Interpreter base addr */
#define AT_FLAGS 8 /* Processor flags */
#define AT_ENTRY 9 /* Entry address of executable */
#define AT_DCACHEBSIZE 10 /* Data cache block size */
#define AT_ICACHEBSIZE 11 /* Instruction cache block size */
#define AT_UCACHEBSIZE 12 /* Unified cache block size */
/* Vendor specific */
#define AT_MIPS_NOTELF 10 /* XXX a_val != 0 -> MIPS XCOFF executable */
#define AT_SUN_UID 2000 /* euid */
#define AT_SUN_RUID 2001 /* ruid */
#define AT_SUN_GID 2002 /* egid */
#define AT_SUN_RGID 2003 /* rgid */
/* Solaris kernel specific */
#define AT_SUN_LDELF 2004 /* dynamic linker's ELF header */
#define AT_SUN_LDSHDR 2005 /* dynamic linker's section header */
#define AT_SUN_LDNAME 2006 /* dynamic linker's name */
#define AT_SUN_LPGSIZE 2007 /* large pagesize */
/* Other information */
#define AT_SUN_PLATFORM 2008 /* sysinfo(SI_PLATFORM) */
#define AT_SUN_HWCAP 2009 /* process hardware capabilities */
#define AT_SUN_IFLUSH 2010 /* do we need to flush the instruction cache? */
#define AT_SUN_CPU 2011 /* cpu name */
/* ibcs2 emulation band aid */
#define AT_SUN_EMUL_ENTRY 2012 /* coff entry point */
#define AT_SUN_EMUL_EXECFD 2013 /* coff file descriptor */
/* Executable's fully resolved name */
#define AT_SUN_EXECNAME 2014
/*
* Note Headers
*/
struct elf_nhdr {
unsigned int n_namesz;
unsigned int n_descsz;
unsigned int n_type;
};
#define ELF_NOTE_TYPE_OSVERSION 1
/* NetBSD-specific note type: Emulation name. desc is emul name string. */
#define ELF_NOTE_NETBSD_TYPE_EMULNAME 2
/* NetBSD-specific note name and description sizes */
#define ELF_NOTE_NETBSD_NAMESZ 7
#define ELF_NOTE_NETBSD_DESCSZ 4
/* NetBSD-specific note name */
#define ELF_NOTE_NETBSD_NAME "NetBSD\0\0"
/* GNU-specific note name and description sizes */
#define ELF_NOTE_GNU_NAMESZ 4
#define ELF_NOTE_GNU_DESCSZ 4
/* GNU-specific note name */
#define ELF_NOTE_GNU_NAME "GNU\0"
/* GNU-specific OS/version value stuff */
#define ELF_NOTE_GNU_OSMASK (unsigned int)0xff000000
#define ELF_NOTE_GNU_OSLINUX (unsigned int)0x01000000
#define ELF_NOTE_GNU_OSMACH (unsigned int)0x00000000
//#define CONCAT(x,y) __CONCAT(x,y)
#include <machine/elf_machdep.h>
#ifdef _KERNEL
#define ELF_AUX_ENTRIES 8 /* Size of aux array passed to loader */
struct elf_args {
unsigned int arg_entry; /* program entry point */
unsigned int arg_interp; /* Interpreter load address */
unsigned int arg_phaddr; /* program header address */
unsigned int arg_phentsize; /* Size of program header */
unsigned int arg_phnum; /* Number of program headers */
};
#ifndef _LKM
#include "opt_execfmt.h"
#endif
#ifdef EXEC_ELF
int exec_elf_makecmds __P((struct proc *, struct exec_package *));
int elf_read_from __P((struct proc *, struct vnode *, u_long,
caddr_t, int));
void *elf_copyargs __P((struct exec_package *, struct ps_strings *,
void *, void *));
#endif
/* common */
int exec_elf_setup_stack __P((struct proc *, struct exec_package *));
#endif /* _KERNEL */
#endif /* !_SYS_EXEC_ELF_H_ */

View File

@@ -97,7 +97,7 @@ struct proc *pidhash [PIDHSZ];
extern struct proc proc[]; /* the proc table itself */
struct proc *freeproc, *zombproc, *allproc, *qs;
/* lists of procs in various states */
extern int nproc;
int nproc;
/*
* Init the process queues.
@@ -272,8 +272,6 @@ void fatalsig (int signum);
*/
int procxmt (void);
void execsigs(register struct proc *p);
#endif /* KERMEL */
/* stat codes */

View File

@@ -113,6 +113,7 @@ struct sigstack {
struct sigcontext {
int sc_onstack; /* sigstack state to restore */
long sc_mask; /* signal mask to restore */
int sc_align[2]; /* align to 16 bytes */
int sc_r1; /* r1 to restore */
int sc_r2; /* and other registers */
int sc_r3;

View File

@@ -1,95 +0,0 @@
#include "param.h"
#include "systm.h"
#include "map.h"
#include "inode.h"
#include "user.h"
#include "proc.h"
#include "buf.h"
#include "namei.h"
#include "fs.h"
#include "mount.h"
#include "file.h"
#include "resource.h"
#include "exec.h"
#include "exec_aout.h"
#include "dir.h"
#include "uio.h"
#include "debug.h"
int exec_aout_check(struct exec_params *epp)
{
int error;
if (epp->hdr_len < sizeof(struct exec))
return ENOEXEC;
if (!(N_GETMID(epp->hdr.aout) == MID_ZERO &&
N_GETFLAG(epp->hdr.aout) == 0))
return ENOEXEC;
switch (N_GETMAGIC(epp->hdr.aout)) {
case OMAGIC:
epp->hdr.aout.a_data += epp->hdr.aout.a_text;
epp->hdr.aout.a_text = 0;
break;
default:
printf("Bad a.out magic = %0o\n", N_GETMAGIC(epp->hdr.aout));
return ENOEXEC;
}
/*
* Save arglist
*/
exec_save_args(epp);
DEBUG("Exec file header:\n");
DEBUG("a_midmag = %#x\n", epp->hdr.aout.a_midmag); /* magic number */
DEBUG("a_text = %d\n", epp->hdr.aout.a_text); /* size of text segment */
DEBUG("a_data = %d\n", epp->hdr.aout.a_data); /* size of initialized data */
DEBUG("a_bss = %d\n", epp->hdr.aout.a_bss); /* size of uninitialized data */
DEBUG("a_reltext = %d\n", epp->hdr.aout.a_reltext); /* size of text relocation info */
DEBUG("a_reldata = %d\n", epp->hdr.aout.a_reldata); /* size of data relocation info */
DEBUG("a_syms = %d\n", epp->hdr.aout.a_syms); /* size of symbol table */
DEBUG("a_entry = %#x\n", epp->hdr.aout.a_entry); /* entry point */
/*
* Set up memory allocation
*/
epp->text.vaddr = epp->heap.vaddr = NO_ADDR;
epp->text.len = epp->heap.len = 0;
epp->data.vaddr = (caddr_t)USER_DATA_START;
epp->data.len = epp->hdr.aout.a_data;
epp->bss.vaddr = epp->data.vaddr + epp->data.len;
epp->bss.len = epp->hdr.aout.a_bss;
epp->heap.vaddr = epp->bss.vaddr + epp->bss.len;
epp->heap.len = 0;
epp->stack.len = SSIZE + roundup(epp->argbc + epp->envbc, NBPW) + (epp->argc + epp->envc+4)*NBPW;
epp->stack.vaddr = (caddr_t)USER_DATA_END - epp->stack.len;
/*
* Allocate core at this point, committed to the new image.
* TODO: What to do for errors?
*/
exec_estab(epp);
/* read in text and data */
DEBUG("reading a.out image\n");
error = rdwri (UIO_READ, epp->ip,
(caddr_t)epp->data.vaddr, epp->hdr.aout.a_data,
sizeof(struct exec) + epp->hdr.aout.a_text, IO_UNIT, 0);
if (error)
DEBUG("read image returned error=%d\n", error);
if (error) {
/*
* Error - all is lost, when the old image is possible corrupt
* and we could not load a new.
*/
psignal (u.u_procp, SIGSEGV);
return error;
}
exec_clear(epp);
exec_setupstack(epp->hdr.aout.a_entry, epp);
return 0;
}

View File

@@ -1,59 +0,0 @@
/* $NetBSD: exec_conf.c,v 1.43 2000/06/09 22:38:57 oki Exp $ */
/*
* Copyright (c) 1993, 1994 Christopher G. Demetriou
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Christopher G. Demetriou.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "param.h"
#include "inode.h"
#include "exec.h"
#ifdef EXEC_SCRIPT
int exec_script_check(struct exec_params *epp);
#endif
#ifdef EXEC_AOUT
int exec_aout_check(struct exec_params *epp);
#endif
#ifdef EXEC_ELF
int exec_elf_check(struct exec_params *epp);
#endif
const struct execsw execsw[] = {
#ifdef EXEC_AOUT
{ exec_aout_check, "a.out" }, /* a.out binaries */
#endif
#ifdef EXEC_ELF
{ exec_elf_check, "elf" }, /* 32bit ELF bins */
#endif
#ifdef EXEC_SCRIPT
{ exec_script_check, "script" }, /* shell scripts */
#endif
};
int nexecs = (sizeof(execsw) / sizeof(*execsw));
int exec_maxhdrsz;

View File

@@ -1,207 +0,0 @@
/* $NetBSD: exec_elf32.c,v 1.49.2.2 2000/11/03 20:00:38 tv Exp $ */
/*-
* Copyright (c) 1994 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Christos Zoulas.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Copyright (c) 1996 Christopher G. Demetriou
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "param.h"
#include "systm.h"
#include "kernel.h"
#include "map.h"
#include "user.h"
#include "proc.h"
//#include "malloc.h"
#include "inode.h"
#include "namei.h"
//#include "vnode.h"
#include "exec.h"
#include "exec_elf.h"
#include "fcntl.h"
//#include "syscall.h"
#include "signalvar.h"
#include "mount.h"
#include "stat.h"
extern char sigcode[], esigcode[];
/* round up and down to page boundaries. */
#define ELF_ROUND(a, b) (((a) + (b) - 1) & ~((b) - 1))
#define ELF_TRUNC(a, b) ((a) & ~((b) - 1))
/*
* elf_check(): Prepare an Elf binary's exec package
*
* First, set of the various offsets/lengths in the exec package.
*
* Then, mark the text image busy (so it can be demand paged) or error
* out if this is not possible. Finally, set up vmcmds for the
* text, data, bss, and stack segments.
*/
int
exec_elf_check(struct exec_params *epp)
{
struct elf_phdr *ph;
int error, i, phsize;
const char elfident[] = {ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3,
ELFCLASS32, ELFDATA2LSB, EV_CURRENT, ELFOSABI_SYSV, 0};
/*
* Check that this is an ELF file that we can handle,
* and do some sanity checks on the header
*/
if (epp->hdr_len < sizeof(struct elf_ehdr))
return ENOEXEC;
for (i = 0; i < sizeof elfident; i++)
if (epp->hdr.elf.e_ident[i] != elfident[i])
return ENOEXEC;
if (epp->hdr.elf.e_type != ET_EXEC)
return ENOEXEC;
if (epp->hdr.elf.e_machine != EM_MIPS || epp->hdr.elf.e_version != EV_CURRENT)
return ENOEXEC;
if (epp->hdr.elf.e_phentsize != sizeof(struct elf_phdr) || epp->hdr.elf.e_phoff == 0 || epp->hdr.elf.e_phnum == 0)
return ENOEXEC;
if (epp->hdr.elf.e_shnum == 0 || epp->hdr.elf.e_shentsize != sizeof(struct elf_shdr))
return ENOEXEC;
/*
* Read program headers
*/
phsize = epp->hdr.elf.e_phnum * sizeof(struct elf_phdr);
ph = exec_alloc(phsize, NBPW, epp);
if (ph == NULL) {
printf("can't alloc ph[] sz=%d\n", phsize);
return ENOEXEC;
}
if ((error = rdwri(UIO_READ, epp->ip, (caddr_t)ph, phsize, epp->hdr.elf.e_phoff, IO_UNIT, 0)) != 0)
return ENOEXEC;
epp->text.len = epp->data.len = epp->bss.len = epp->stack.len = epp->heap.len = 0;
epp->text.vaddr = epp->data.vaddr = epp->bss.vaddr = epp->stack.vaddr = epp->heap.vaddr = NO_ADDR;
if (epp->hdr.elf.e_phnum == 1 && ph[0].p_type == PT_LOAD && ph[0].p_flags == (PF_R|PF_W|PF_X)) {
/*
* In the simple a.out type link, in elf format, there is only
* one loadable segment that is RWE containing everything
* Here we fix the memory allocation, and we are done.
*/
epp->data.vaddr = (caddr_t)ph[0].p_vaddr;
epp->data.len = ph[0].p_memsz;
epp->heap.vaddr = (caddr_t)ph[0].p_vaddr + ph[0].p_memsz;
epp->heap.len = 0;
epp->stack.len = SSIZE + epp->argbc + epp->envbc + (epp->argc+epp->envc+4)*NBPW;
epp->stack.vaddr = (caddr_t)USER_DATA_END - epp->stack.len;
/*
* We assume .bss is the different between the memory data
* section size and the file size.
*/
epp->bss.vaddr = epp->data.vaddr + ph[0].p_filesz;
epp->bss.len = ph[0].p_memsz - ph[0].p_filesz;
epp->data.len = epp->bss.vaddr - epp->data.vaddr;
} else {
/*
* At the current moment we don't handle anything else
* The rest of the code is implemented as need arise.
*/
return ENOEXEC;
}
/*
* Save arglist
*/
exec_save_args(epp);
/*
* Establish memory
*/
if ((error = exec_estab(epp)) != 0)
return error;
/*
* Now load the program sections into memory
*/
for (i = 0; i < epp->hdr.elf.e_phnum; i++) {
if (ph[i].p_type != PT_LOAD)
continue;
/*
* Sanity check that the load is to our intended address space.
*/
if (!((epp->text.vaddr != NO_ADDR
&& ((caddr_t)ph[i].p_vaddr >= epp->text.vaddr
&& (caddr_t)ph[i].p_vaddr + ph[i].p_filesz <= epp->text.vaddr + epp->text.len))
|| (epp->data.vaddr != NO_ADDR
&& (caddr_t)ph[i].p_vaddr >= epp->data.vaddr
&& (caddr_t)ph[i].p_vaddr + ph[i].p_filesz <= epp->data.vaddr + epp->data.len))
|| ph[i].p_filesz >= ph[i].p_memsz || ph[i].p_filesz <= 0)
return ENOEXEC;
error = rdwri(UIO_READ, epp->ip, (caddr_t)ph[i].p_vaddr, ph[i].p_filesz, ph[i].p_offset, IO_UNIT, 0);
}
exec_clear(epp);
exec_setupstack(epp->hdr.elf.e_entry, epp);
return 0;
}

View File

@@ -1,96 +0,0 @@
#include "param.h"
#include "inode.h"
#include "dir.h"
#include "namei.h"
#include "exec.h"
#include "user.h"
#include "systm.h"
int
exec_script_check(struct exec_params *epp)
{
char *cp;
struct nameidata nd;
struct nameidata *ndp;
int error;
struct inode *ip = 0;
/*
* We come here with the first line of the executable
* script file.
* Check is to see if it starts with the magic marker: #!
*/
if (epp->hdr.sh[0] != '#' || epp->hdr.sh[1] != '!' || epp->sh.interpreted)
return ENOEXEC;
epp->sh.interpreted = 1;
/*
* If setuid/gid scripts were to be disallowed this is where it would
* have to be done.
* u.u_uid = uid;
* u.u_gid = u_groups[0];
*/
/*
* The first line of the text file
* should be one line on the format:
* #! <interpreter-name> <interpreter-argument>\n
*/
cp = &epp->hdr.sh[2];
while (cp < &epp->hdr.sh[MIN(epp->hdr_len, SHSIZE)]) {
if (*cp == '\t')
*cp = ' ';
else if (*cp == '\n') {
*cp = '\0';
break;
}
cp++;
}
if (cp == &epp->hdr.sh[MIN(epp->hdr_len, SHSIZE)])
return ENOEXEC;
/*
* Pick up script interpreter file name
*/
cp = &epp->hdr.sh[2];
while (*cp == ' ')
cp++;
if (!*cp)
return ENOEXEC;
bzero(&nd, sizeof nd);
ndp = &nd;
ndp->ni_dirp = cp;
while (*cp && *cp != ' ')
cp++;
if (*cp != '\0') {
*cp++ = 0;
while (*cp && *cp == ' ')
cp++;
if (*cp) {
if ((error = copystr(cp, epp->sh.interparg, sizeof epp->sh.interparg, NULL)))
goto done;
}
}
/*
* the interpreter is the new file to exec
*/
ndp->ni_nameiop = LOOKUP | FOLLOW;
ip = namei (ndp);
if (ip == NULL)
return u.u_error;
if ((error = copystr(ndp->ni_dent.d_name, epp->sh.interpname, sizeof epp->sh.interpname, NULL)))
goto done;
/*
* Everything set up, do the recursive exec()
*/
if (epp->ip)
iput(epp->ip);
epp->ip = ip;
error = exec_check(epp);
done:
if (ip)
iput(ip);
return error;
}

View File

@@ -1,425 +0,0 @@
#include "param.h"
#include "systm.h"
#include "map.h"
#include "inode.h"
#include "user.h"
#include "proc.h"
#include "buf.h"
#include "namei.h"
#include "fs.h"
#include "mount.h"
#include "file.h"
#include "resource.h"
#include "exec.h"
#include "dir.h"
#include "uio.h"
#include "debug.h"
/*
* How memory is set up.
*
* var a:
* USER_DATA_END: !----------!
* ! +P_ssize ! stack
* p_saddr -> ¡----------!
*
* !----------!
* ! +P_dsize ! .data + .bss + heap
* P_daddr -> !----------!
*
* var b:
*
* USER_DATA_END: !--------!
* ! +ssize ! stack
* saddr -> ¡--------!
* ! +hsize ! heap
* haddr -> !--------!
* ! +dsize ! .data + .bss
* daddr -> !--------!
* ! +tsize ! .text
* taddr -> !--------!
* paddr -> +psize
*
* var c:
* !--------!
* ! +tsize ! .text (read only section)
* taddr -> !--------!
* ! +ssize ! stack
* saddr -> ¡--------!
* ! +hsize ! heap
* haddr -> !--------!
* ! +dsize ! .data + .bss
* daddr -> !--------!
* paddr -> +psize
*
*/
/*
* Set up user memory.
*
* The following is a key to top of the stack and the variables used.
*
* topp-> [argv] top word for /bin/ps
* <0>
* n
* g
* r
* a
* ...
* <0>
* 0
* g
* r
* ucp -> a
* [0]
* [envn]
* ...
* envp -> [env0]
* [0]
* [argn] ptr to argn
* ...
* argp -> [arg0] ptr to arg0
* []
* []
* []
* sp -> []
*
*/
void exec_setupstack(unsigned entryaddr, struct exec_params *epp)
{
int nc,i;
u_int len;
char *ucp;
char **argp, **envp, ***topp;
DEBUG("exec_setupstack:\n");
/*
* Set up top of stack structure as above
* This depends on that kernel and user spaces
* map to the same addresses.
*/
topp = (char ***)(epp->stack.vaddr + epp->stack.len - NBPW); /* Last word of RAM */
ucp = (char *)((unsigned)topp - roundup(epp->envbc + epp->argbc,NBPW)); /* arg string space */
envp = (char **)(ucp - (epp->envc+1)*NBPW); /* Make place for envp[...], +1 for the 0 */
argp = envp - (epp->argc+1)*NBPW; /* Make place for argv[...] */
u.u_frame [FRAME_SP] = (int)(argp-16);
u.u_frame [FRAME_R4] = epp->argc; /* $a0 := argc */
u.u_frame [FRAME_R5] = (int)argp; /* $a1 := argp */
u.u_frame [FRAME_R6] = (int)envp; /* $a2 := env */
*topp = argp; /* for /bin/ps */
/*
* copy the arguments into the structure
*/
nc = 0;
for (i = 0; i < epp->argc; i++) {
argp[i] = (caddr_t)ucp;
if (copystr((caddr_t)epp->argp[i], (caddr_t)ucp, (caddr_t)topp-ucp, &len) == 0) {
nc += len;
ucp += len;
}
}
argp[epp->argc] = NULL;
for (i = 0; i < epp->envc; i++) {
envp[i] = ucp;
if (copystr((caddr_t)epp->envp[i], (caddr_t)ucp, (caddr_t)topp-ucp, &len) == 0) {
nc += len;
ucp += len;
}
}
envp[epp->envc] = NULL;
ucp = (caddr_t)roundup((unsigned)ucp, NBPW);
if ((caddr_t)ucp != (caddr_t)topp) {
DEBUG("Copying of arg list went wrong, ucp=%#x, topp=%#x\n", ucp, topp);
panic("exec check");
}
u.u_frame [FRAME_PC] = entryaddr;
DEBUG("Setting up new PC=%#x\n", entryaddr);
/*
* Remember file name for accounting.
*/
(void) copystr(argp[0], u.u_comm, MAXCOMLEN, 0);
}
/*
* A simple memory allocator used within exec code using file buffers as storage.
* Will return NULL if allocation is not possible.
* Total max memory allocatable is MAXALLOCBUF*MAXBSIZE
* Max size of allocatable chunk is MAXBSIZE
*
* All memory allocated with this function will be freed by a call
* to exec_alloc_freeall()
*/
void *exec_alloc(int size, int ru, struct exec_params *epp)
{
char *cp;
int i;
for (i = 0; i < MAXALLOCBUF; i++)
if (MAXBSIZE - (ru<=1?epp->alloc[i].fill:roundup(epp->alloc[i].fill,ru)) >= size)
break;
if (i == MAXALLOCBUF)
return NULL;
if (epp->alloc[i].bp == NULL) {
if ((epp->alloc[i].bp = geteblk()) == NULL) {
DEBUG("exec_alloc: no buf\n");
return NULL;
}
}
if (ru > 1)
epp->alloc[i].fill = roundup(epp->alloc[i].fill, ru);
cp = epp->alloc[i].bp->b_addr + epp->alloc[i].fill;
epp->alloc[i].fill += size;
bzero (cp, size);
return cp;
}
/*
* this will deallocate all memory allocated by exec_alloc
*/
void exec_alloc_freeall(struct exec_params *epp)
{
int i;
for (i = 0; i < MAXALLOCBUF; i++) {
if (epp->alloc[i].bp) {
brelse(epp->alloc[i].bp);
epp->alloc[i].bp = NULL;
epp->alloc[i].fill = 0;
}
}
}
/*
* Establish memory for the image based on the
* values picked up from the executable file and stored
* in the exec params block.
*/
int exec_estab(struct exec_params *epp)
{
DEBUG("text = %#x..%#x, len=%d\n", epp->text.vaddr, epp->text.vaddr+epp->text.len, epp->text.len);
DEBUG("data = %#x..%#x, len=%d\n", epp->data.vaddr, epp->data.vaddr+epp->data.len, epp->data.len);
DEBUG("bss = %#x..%#x, len=%d\n", epp->bss.vaddr, epp->bss.vaddr+epp->bss.len, epp->bss.len);
DEBUG("heap = %#x..%#x, len=%d\n", epp->heap.vaddr, epp->heap.vaddr+epp->heap.len, epp->heap.len);
DEBUG("stack = %#x..%#x, len=%d\n", epp->stack.vaddr, epp->stack.vaddr+epp->stack.len, epp->stack.len);
/*
* Right now we can only handle the simple original a.out
* case, so we double check for that case here.
*/
if (epp->text.vaddr != NO_ADDR || epp->data.vaddr == NO_ADDR
|| epp->data.vaddr != (caddr_t)USER_DATA_START || epp->stack.vaddr != (caddr_t)USER_DATA_END - epp->stack.len)
return ENOMEM;
/*
* Try out for overflow
*/
if (epp->text.len + epp->data.len + epp->heap.len + epp->stack.len > MAXMEM)
return ENOMEM;
if (roundup((unsigned)epp->data.vaddr + epp->data.len, NBPW) != roundup((unsigned)epp->bss.vaddr, NBPW)) {
DEBUG(".bss do not follow .data\n");
return ENOMEM;
}
/*
* Allocate core at this point, committed to the new image.
*/
u.u_prof.pr_scale = 0;
if (u.u_procp->p_flag & SVFORK)
endvfork();
u.u_procp->p_dsize = epp->data.len + epp->bss.len;
u.u_procp->p_daddr = (size_t)epp->data.vaddr;
u.u_procp->p_ssize = epp->stack.len;
u.u_procp->p_saddr = (size_t)epp->stack.vaddr;
DEBUG("core allocation: \n");
DEBUG("daddr =%#x..%#x\n", u.u_procp->p_daddr, u.u_procp->p_daddr + u.u_procp->p_dsize);
DEBUG("saddr =%#x..%#x\n", u.u_procp->p_saddr, u.u_procp->p_saddr + u.u_procp->p_ssize);
return 0;
}
/*
* Save argv[] and envp[]
*/
void exec_save_args(struct exec_params *epp)
{
unsigned len;
caddr_t cp;
int argc, i, l;
char **argp, *ap;
epp->argc = epp->envc = 0;
epp->argbc = epp->envbc = 0;
argc = 0;
if ((argp = epp->userargp) != NULL)
while (argp[argc])
argc++;
#ifdef EXEC_SCRIPT
if (epp->sh.interpreted) {
argc++;
if (epp->sh.interparg[0])
argc++;
}
#endif
if (argc != 0) {
if ((epp->argp = (char **)exec_alloc(argc * sizeof(char *), NBPW, epp)) == NULL)
return;
for (;;) {
/*
* For a interpreter script, the arg list is changed to
* #! <interpreter name> <interpreter arg>
* arg[0] - the interpreter executable name (path)
* arg[1] - interpreter arg (optional)
* arg[2 or 1] - script name
* arg[3 or 2...] - script arg[1...]
*/
if (argp)
ap = *argp++;
else
ap = NULL;
#ifdef EXEC_SCRIPT
if (epp->sh.interpreted) {
if (epp->argc == 0)
ap = epp->sh.interpname;
else if (epp->argc == 1 && epp->sh.interparg[0]) {
ap = epp->sh.interparg;
--argp;
} else if ((epp->argc == 1 || (epp->argc == 2 && epp->sh.interparg[0]))) {
ap = epp->userfname;
--argp;
}
}
#endif
if (ap == 0)
break;
l = strlen(ap)+1;
if ((cp = exec_alloc(l, 1, epp)) == NULL)
return;
if (copystr(ap, cp, l, &len) != 0)
return;
epp->argp[epp->argc++] = cp;
epp->argbc += len;;
}
}
argc = 0;
if ((argp = epp->userenvp) != NULL)
while (argp[argc])
argc++;
epp->envc = 0;
epp->envbc = 0;
if (argc != 0) {
if ((epp->envp = (char **)exec_alloc(argc * sizeof(char *), NBPW, epp)) == NULL)
return;
for (;;) {
if (argp)
ap = *argp++;
else
ap = NULL;
if (ap == 0)
break;
l = strlen(ap)+1;
if ((cp = exec_alloc(l, 1, epp)) == NULL)
return;
if (copystr(ap, cp, l, &len) != 0)
return;
epp->envp[epp->envc++] = cp;
epp->envbc += len;
}
}
for (i = 0; i < epp->argc; i++)
DEBUG("arg[%d] = \"%s\"\n", i, epp->argp[i]);
for (i = 0; i < epp->envc; i++)
DEBUG("env[%d] = \"%s\"\n", i, epp->envp[i]);
/*
* Number of string pool chars needed for this arg list
*/
// return (bc + NBPW-1) & ~(NBPW-1);
return;
}
void exec_clear(struct exec_params *epp)
{
char *cp;
int cc;
/* clear BSS */
if (epp->bss.len > 0)
bzero((void *)epp->bss.vaddr, epp->bss.len);
if (epp->heap.len > 0)
bzero((void *)epp->heap.vaddr, epp->heap.len);
/* Clear stack */
bzero((void *)epp->stack.vaddr, epp->stack.len);
/*
* set SUID/SGID protections, if no tracing
*/
if ((u.u_procp->p_flag & P_TRACED) == 0) {
u.u_uid = epp->uid;
u.u_procp->p_uid = epp->uid;
u.u_groups[0] = epp->gid;
} else
psignal (u.u_procp, SIGTRAP);
u.u_svuid = u.u_uid;
u.u_svgid = u.u_groups[0];
u.u_tsize = epp->text.len;
u.u_dsize = epp->data.len + epp->bss.len;
u.u_ssize = epp->stack.len;
/*
* Clear registers.
*/
u.u_frame [FRAME_R1] = 0; /* $at */
u.u_frame [FRAME_R2] = 0; /* $v0 */
u.u_frame [FRAME_R3] = 0; /* $v1 */
u.u_frame [FRAME_R7] = 0; /* $a3 */
u.u_frame [FRAME_R8] = 0; /* $t0 */
u.u_frame [FRAME_R9] = 0; /* $t1 */
u.u_frame [FRAME_R10] = 0; /* $t2 */
u.u_frame [FRAME_R11] = 0; /* $t3 */
u.u_frame [FRAME_R12] = 0; /* $t4 */
u.u_frame [FRAME_R13] = 0; /* $t5 */
u.u_frame [FRAME_R14] = 0; /* $t6 */
u.u_frame [FRAME_R15] = 0; /* $t7 */
u.u_frame [FRAME_R16] = 0; /* $s0 */
u.u_frame [FRAME_R17] = 0; /* $s1 */
u.u_frame [FRAME_R18] = 0; /* $s2 */
u.u_frame [FRAME_R19] = 0; /* $s3 */
u.u_frame [FRAME_R20] = 0; /* $s4 */
u.u_frame [FRAME_R21] = 0; /* $s5 */
u.u_frame [FRAME_R22] = 0; /* $s6 */
u.u_frame [FRAME_R23] = 0; /* $s7 */
u.u_frame [FRAME_R24] = 0; /* $t8 */
u.u_frame [FRAME_R25] = 0; /* $t9 */
u.u_frame [FRAME_FP] = 0;
u.u_frame [FRAME_RA] = 0;
u.u_frame [FRAME_LO] = 0;
u.u_frame [FRAME_HI] = 0;
u.u_frame [FRAME_GP] = 0;
execsigs (u.u_procp);
/*
* Clear (close) files
*/
for (cp = u.u_pofile, cc = 0; cc <= u.u_lastfile; cc++, cp++) {
if (*cp & UF_EXCLOSE) {
(void) closef (u.u_ofile [cc]);
u.u_ofile [cc] = NULL;
*cp = 0;
}
}
while (u.u_lastfile >= 0 && u.u_ofile [u.u_lastfile] == NULL)
u.u_lastfile--;
}

555
sys/kernel/kern_exec.c Normal file → Executable file
View File

@@ -6,17 +6,15 @@
#include "param.h"
#include "systm.h"
#include "map.h"
#include "inode.h"
#include "user.h"
#include "proc.h"
#include "buf.h"
#include "inode.h"
#include "namei.h"
#include "fs.h"
#include "mount.h"
#include "file.h"
#include "signalvar.h"
#include "exec.h"
#include "debug.h"
/*
* exec system call, with and without environments.
@@ -28,70 +26,135 @@ struct execa {
};
/*
* This is the internal form of the exec() function.
*
* It is called with the inode of the executable
* and the exec_params structure, which is used to
* keep information during the exec.
*
* It returns the error code, and with the ip still locked.
* Reset signals for an exec of the specified process. In 4.4 this function
* was in kern_sig.c but since in 2.11 kern_sig and kern_exec will likely be
* in different overlays placing this here potentially saves a kernel overlay
* switch.
*/
int exec_check(struct exec_params *epp)
static void
execsigs(p)
register struct proc *p;
{
int error, i, r;
DEBUG("Entering exec_check\n");
if (access (epp->ip, IEXEC))
return ENOEXEC;
if ((u.u_procp->p_flag & P_TRACED) && access (epp->ip, IREAD))
return ENOEXEC;
if ((epp->ip->i_mode & IFMT) != IFREG ||
(epp->ip->i_mode & (IEXEC | (IEXEC>>3) | (IEXEC>>6))) == 0)
return EACCES;
register int nc;
unsigned long mask;
/*
* Read in first few bytes of file for segment sizes, magic number:
* 407 = plain executable
* Also an ASCII line beginning with #! is
* the file name of a ``interpreter'' and arguments may be prepended
* to the argument list if given here.
*
* INTERPRETER NAMES ARE LIMITED IN LENGTH.
*
* ONLY ONE ARGUMENT MAY BE PASSED TO THE INTERPRETER FROM
* THE ASCII LINE.
* Reset caught signals. Held signals remain held
* through p_sigmask (unless they were caught,
* and are now ignored by default).
*/
/*
* Read the first 'SHSIZE' bytes from the file to execute
*/
DEBUG("Read header %d bytes from %d\n", sizeof(epp->hdr), 0);
#ifdef EXEC_SCRIPT
epp->hdr.sh[0] = '\0'; /* for zero length files */
#endif
error = rdwri (UIO_READ, epp->ip,
(caddr_t) &epp->hdr, sizeof(epp->hdr),
(off_t)0, IO_UNIT, &r);
if (error)
return error;
epp->hdr_len = sizeof(epp->hdr) - r;
/*
* Given the first part of the image
* loop through the exec file handlers to find
* someone who can handle this file format.
*/
error = ENOEXEC;
DEBUG("Trying %d exec formats\n", nexecs);
for (i = 0; i < nexecs && error != 0; i++) {
DEBUG("Trying exec format %d : %s\n", i, execsw[i].es_name);
if (execsw[i].es_check == NULL)
continue;
error = (*execsw[i].es_check)(epp);
if (error == 0)
break;
while (p->p_sigcatch) {
nc = ffs(p->p_sigcatch);
mask = sigmask(nc);
p->p_sigcatch &= ~mask;
if (sigprop[nc] & SA_IGNORE) {
if (nc != SIGCONT)
p->p_sigignore |= mask;
p->p_sig &= ~mask;
}
u.u_signal[nc] = SIG_DFL;
}
return error;
/*
* Reset stack state to the user stack (disable the alternate stack).
*/
u.u_sigstk.ss_flags = SA_DISABLE;
u.u_sigstk.ss_size = 0;
u.u_sigstk.ss_base = 0;
u.u_psflags = 0;
}
/*
* Read in and set up memory for executed file.
* u.u_error set on error
*/
static void
getxfile (ip, ep, nargc, uid, gid)
struct inode *ip;
register struct exec *ep;
int nargc, uid, gid;
{
u_int ds, ts, ss;
if (ep->a_magic == OMAGIC) {
ep->a_data += ep->a_text;
ep->a_text = 0;
}
if (ep->a_text != 0 && (ip->i_flag & ITEXT) == 0 &&
ip->i_count != 1) {
register struct file *fp;
for (fp = file; fp < file+NFILE; fp++) {
if (fp->f_type == DTYPE_INODE &&
fp->f_count > 0 &&
(struct inode*)fp->f_data == ip &&
(fp->f_flag & FWRITE)) {
u.u_error = ETXTBSY;
return;
}
}
}
/*
* find text and data sizes try; them out for possible
* overflow of max sizes
*/
ts = ep->a_text;
ds = ep->a_data + ep->a_bss;
ss = SSIZE + nargc;
//printf ("getxfile: size t/d/s = %u/%u/%u\n", ts, ds, ss);
if (ts + ds + ss > MAXMEM) {
u.u_error = ENOMEM;
return;
}
/*
* Allocate core at this point, committed to the new image.
*/
u.u_prof.pr_scale = 0;
if (u.u_procp->p_flag & SVFORK)
endvfork();
u.u_procp->p_dsize = ds;
u.u_procp->p_daddr = USER_DATA_START;
u.u_procp->p_ssize = ss;
u.u_procp->p_saddr = USER_DATA_END - ss;
/* read in text and data */
//printf ("getxfile: read %u bytes at %08x\n", ep->a_data, USER_DATA_START);
rdwri (UIO_READ, ip, (caddr_t) USER_DATA_START, ep->a_data,
sizeof(struct exec) + ep->a_text, IO_UNIT, (int*) 0);
/* clear BSS and stack */
//printf ("getxfile: clear %u bytes at %08x\n", USER_DATA_END - USER_DATA_START - ep->a_data, USER_DATA_START + ep->a_data);
bzero ((void*) (USER_DATA_START + ep->a_data),
USER_DATA_END - USER_DATA_START - ep->a_data);
/*
* set SUID/SGID protections, if no tracing
*/
if ((u.u_procp->p_flag & P_TRACED) == 0) {
u.u_uid = uid;
u.u_procp->p_uid = uid;
u.u_groups[0] = gid;
} else
psignal (u.u_procp, SIGTRAP);
u.u_svuid = u.u_uid;
u.u_svgid = u.u_groups[0];
u.u_tsize = ts;
u.u_dsize = ds;
u.u_ssize = ss;
}
void printmem (unsigned addr, int nbytes)
{
for (; nbytes>0; addr+=16, nbytes-=16) {
unsigned char *p = (unsigned char*) addr;
printf ("%08x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
addr, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
}
}
void
@@ -106,51 +169,371 @@ execv()
void
execve()
{
register char *cp;
register struct buf *bp;
struct execa *uap = (struct execa *)u.u_arg;
int error;
int nc, na, ne, ucp, ap, indir, uid, gid, resid, error;
register int cc;
unsigned len;
char *sharg;
struct inode *ip;
size_t bno;
char cfname [MAXCOMLEN + 1];
#define SHSIZE 32
char cfarg [SHSIZE];
union {
char ex_shell [SHSIZE]; /* #! and name of interpreter */
struct exec ex_exec;
} exdata;
struct nameidata nd;
register struct nameidata *ndp = &nd;
struct exec_params eparam;
DEBUG("execve ('%s', ['%s', '%s', ...])\n", uap->fname, uap->argp[0], uap->argp[1]);
//printf ("execve ('%s', ['%s', '%s', ...])\n", uap->fname, uap->argp[0], uap->argp[1]);
NDINIT (ndp, LOOKUP, FOLLOW, uap->fname);
ip = namei (ndp);
if (ip == NULL) {
DEBUG("execve: file '%s' not found\n", uap->fname);
//printf ("execve: file not found\n");
return;
}
/*
* The exec_param structure is used to
* keep information about the executable during exec's processing
*/
bzero(&eparam, sizeof eparam);
eparam.userfname = uap->fname;
eparam.userargp = uap->argp;
eparam.userenvp = uap->envp;
eparam.uid = u.u_uid;
eparam.gid = u.u_groups[0];
bno = 0;
bp = 0;
indir = 0;
uid = u.u_uid;
gid = u.u_groups[0];
if (ip->i_fs->fs_flags & MNT_NOEXEC) {
//printf ("execve: NOEXEC, flags=%o\n", ip->i_fs->fs_flags);
u.u_error = EACCES;
DEBUG("EACCES\n");
goto done;
}
if ((ip->i_fs->fs_flags & MNT_NOSUID) == 0) {
if (ip->i_mode & ISUID)
eparam.uid = ip->i_uid;
uid = ip->i_uid;
if (ip->i_mode & ISGID)
eparam.gid = ip->i_gid;
gid = ip->i_gid;
}
again:
if (access (ip, IEXEC)) {
//printf ("execve: no IEXEC\n");
goto done;
}
if ((u.u_procp->p_flag & P_TRACED) && access (ip, IREAD)) {
//printf ("execve: traced, but no IREAD\n");
goto done;
}
if ((ip->i_mode & IFMT) != IFREG ||
(ip->i_mode & (IEXEC | (IEXEC>>3) | (IEXEC>>6))) == 0) {
//printf ("execve: no IEXEC, mode=%o\n", ip->i_mode);
u.u_error = EACCES;
goto done;
}
eparam.ip = ip;
DEBUG("calling exec_check()\n");
if ((error = exec_check(&eparam)))
u.u_error = error;
DEBUG("back from exec_check()\n");
/*
* Read in first few bytes of file for segment sizes, magic number:
* 407 = plain executable
* Also an ASCII line beginning with #! is
* the file name of a ``shell'' and arguments may be prepended
* to the argument list if given here.
*
* SHELL NAMES ARE LIMITED IN LENGTH.
*
* ONLY ONE ARGUMENT MAY BE PASSED TO THE SHELL FROM
* THE ASCII LINE.
*/
exdata.ex_shell[0] = '\0'; /* for zero length files */
u.u_error = rdwri (UIO_READ, ip, (caddr_t) &exdata, sizeof(exdata),
(off_t) 0, IO_UNIT, &resid);
if (u.u_error) {
//printf ("execve: rdwri error %d\n", u.u_error);
goto done;
}
if (resid > sizeof(exdata) - sizeof(exdata.ex_exec) &&
exdata.ex_shell[0] != '#') {
//printf ("execve: short read, resid = %d, shell=%.32s\n", resid, exdata.ex_shell);
u.u_error = ENOEXEC;
goto done;
}
//printf ("execve: text=%u, data=%u, bss=%u\n", exdata.ex_exec.a_text, exdata.ex_exec.a_data, exdata.ex_exec.a_bss);
switch ((int) exdata.ex_exec.a_magic) {
case OMAGIC:
case NMAGIC:
break;
default:
if (exdata.ex_shell[0] != '#' ||
exdata.ex_shell[1] != '!' ||
indir) {
//printf ("execve: bad shell=%.32s\n", exdata.ex_shell);
u.u_error = ENOEXEC;
goto done;
}
/*
* If setuid/gid scripts were to be disallowed this is where it would
* have to be done.
* u.u_uid = uid;
* u.u_gid = u_groups[0];
*/
cp = &exdata.ex_shell[2]; /* skip "#!" */
while (cp < &exdata.ex_shell[SHSIZE]) {
if (*cp == '\t')
*cp = ' ';
else if (*cp == '\n') {
*cp = '\0';
break;
}
cp++;
}
if (*cp != '\0') {
u.u_error = ENOEXEC;
goto done;
}
cp = &exdata.ex_shell[2];
while (*cp == ' ')
cp++;
ndp->ni_dirp = cp;
while (*cp && *cp != ' ')
cp++;
cfarg[0] = '\0';
if (*cp) {
*cp++ = '\0';
while (*cp == ' ')
cp++;
if (*cp)
bcopy ((caddr_t) cp, (caddr_t) cfarg, SHSIZE);
}
indir = 1;
iput (ip);
ndp->ni_nameiop = LOOKUP | FOLLOW;
ip = namei (ndp);
if (ip == NULL)
return;
bcopy ((caddr_t) ndp->ni_dent.d_name, (caddr_t) cfname, MAXCOMLEN);
cfname [MAXCOMLEN] = '\0';
goto again;
}
/*
* Collect arguments on "file" in swap space.
*/
na = 0;
ne = 0;
nc = 0;
cc = 0;
cp = 0;
bno = malloc (swapmap, btod (NCARGS + MAXBSIZE));
if (bno == 0) {
u.u_error = ENOMEM;
goto done;
}
/*
* Copy arguments into file in argdev area.
*/
if (uap->argp) for (;;) {
ap = NULL;
sharg = NULL;
if (indir && na == 0) {
sharg = cfname;
ap = (int) sharg;
uap->argp++; /* ignore argv[0] */
} else if (indir && (na == 1 && cfarg[0])) {
sharg = cfarg;
ap = (int) sharg;
} else if (indir && (na == 1 || (na == 2 && cfarg[0])))
ap = (int) uap->fname;
else if (uap->argp) {
ap = *(int*) uap->argp;
uap->argp++;
}
if (ap == NULL && uap->envp) {
uap->argp = NULL;
ap = *(int*) uap->envp;
if (ap != NULL)
uap->envp++, ne++;
}
if (ap == NULL)
break;
na++;
if (ap == -1) {
u.u_error = EFAULT;
break;
}
do {
if (cc <= 0) {
/*
* We depend on NCARGS being a multiple of
* DEV_BSIZE. This way we need only check
* overflow before each buffer allocation.
*/
if (nc >= NCARGS-1) {
//printf ("execve: too many args = %d\n", nc);
error = E2BIG;
break;
}
if (bp) {
bdwrite(bp);
}
cc = DEV_BSIZE;
bp = getblk (swapdev, dbtofsb(bno) + lblkno(nc));
cp = bp->b_addr;
}
if (sharg) {
error = copystr (sharg, cp, (unsigned) cc, &len);
//printf ("execve arg%d=%s: %u bytes from %08x to %08x\n", na-1, sharg, len, sharg, cp);
sharg += len;
} else {
error = copystr ((caddr_t) ap, cp, (unsigned) cc, &len);
//printf ("execve arg%d=%s: %u bytes from %08x to %08x\n", na-1, ap, len, ap, cp);
ap += len;
}
cp += len;
nc += len;
cc -= len;
} while (error == ENOENT);
if (error) {
//printf ("execve: copy arg error = %d\n", error);
u.u_error = error;
if (bp) {
bp->b_flags |= B_AGE;
bp->b_flags &= ~B_DELWRI;
brelse(bp);
}
bp = 0;
goto badarg;
}
}
//printf ("execve: argc=%d, envc=%d, total %d bytes\n", na, ne, nc);
if (bp) {
bdwrite (bp);
}
bp = 0;
nc = (nc + NBPW-1) & ~(NBPW-1);
getxfile (ip, &exdata.ex_exec, nc + (na+4)*NBPW, uid, gid);
if (u.u_error) {
//printf ("execve: getxfile error = %d\n", u.u_error);
badarg:
for (cc = 0; cc < nc; cc += DEV_BSIZE) {
daddr_t blkno;
blkno = dbtofsb(bno) + lblkno(cc);
if (incore (swapdev, blkno)) {
bp = bread (swapdev, blkno);
bp->b_flags |= B_AGE; /* throw away */
bp->b_flags &= ~B_DELWRI; /* cancel io */
brelse(bp);
bp = 0;
}
}
goto done;
}
iput(ip);
ip = NULL;
/*
* Copy back arglist.
*/
ucp = USER_DATA_END - nc - NBPW;
ap = ucp - na*NBPW - 2*NBPW;
u.u_frame [FRAME_SP] = (ap - 16) & ~0xf; /* align to 16 bytes */
u.u_frame [FRAME_R4] = na - ne; /* $a0 := argc */
u.u_frame [FRAME_R5] = ap; /* $a1 := argv */
u.u_frame [FRAME_R6] = ap + (na-ne+1)*NBPW; /* $a2 := env */
*(int*) (USER_DATA_END - NBPW) = ap; /* for /bin/ps */
nc = 0;
cc = 0;
for (;;) {
if (na == ne) {
*(int*) ap = 0;
ap += NBPW;
}
if (--na < 0)
break;
*(int*) ap = ucp;
do {
if (cc <= 0) {
if (bp) {
brelse(bp);
}
cc = DEV_BSIZE;
bp = bread (swapdev, dbtofsb(bno) + lblkno(nc));
bp->b_flags |= B_AGE; /* throw away */
bp->b_flags &= ~B_DELWRI; /* cancel io */
cp = bp->b_addr;
}
error = copystr (cp, (caddr_t) ucp, (unsigned) cc,
&len);
//printf ("execve copy '%s' %u bytes from %08x to %08x\n", cp, len, cp, ucp);
ucp += len;
cp += len;
nc += len;
cc -= len;
} while (error == ENOENT);
if (error == EFAULT)
panic ("exec: EFAULT");
ap += NBPW;
}
*(int*) ap = 0;
if (bp) {
bp->b_flags |= B_AGE;
brelse (bp);
bp = NULL;
}
execsigs (u.u_procp);
for (cp = u.u_pofile, cc = 0; cc <= u.u_lastfile; cc++, cp++) {
if (*cp & UF_EXCLOSE) {
(void) closef (u.u_ofile [cc]);
u.u_ofile [cc] = NULL;
*cp = 0;
}
}
while (u.u_lastfile >= 0 && u.u_ofile [u.u_lastfile] == NULL)
u.u_lastfile--;
/*
* Clear registers.
*/
u.u_frame [FRAME_R1] = 0; /* $at */
u.u_frame [FRAME_R2] = 0; /* $v0 */
u.u_frame [FRAME_R3] = 0; /* $v1 */
u.u_frame [FRAME_R7] = 0; /* $a3 */
u.u_frame [FRAME_R8] = 0; /* $t0 */
u.u_frame [FRAME_R9] = 0; /* $t1 */
u.u_frame [FRAME_R10] = 0; /* $t2 */
u.u_frame [FRAME_R11] = 0; /* $t3 */
u.u_frame [FRAME_R12] = 0; /* $t4 */
u.u_frame [FRAME_R13] = 0; /* $t5 */
u.u_frame [FRAME_R14] = 0; /* $t6 */
u.u_frame [FRAME_R15] = 0; /* $t7 */
u.u_frame [FRAME_R16] = 0; /* $s0 */
u.u_frame [FRAME_R17] = 0; /* $s1 */
u.u_frame [FRAME_R18] = 0; /* $s2 */
u.u_frame [FRAME_R19] = 0; /* $s3 */
u.u_frame [FRAME_R20] = 0; /* $s4 */
u.u_frame [FRAME_R21] = 0; /* $s5 */
u.u_frame [FRAME_R22] = 0; /* $s6 */
u.u_frame [FRAME_R23] = 0; /* $s7 */
u.u_frame [FRAME_R24] = 0; /* $t8 */
u.u_frame [FRAME_R25] = 0; /* $t9 */
u.u_frame [FRAME_FP] = 0;
u.u_frame [FRAME_RA] = 0;
u.u_frame [FRAME_LO] = 0;
u.u_frame [FRAME_HI] = 0;
u.u_frame [FRAME_GP] = 0;
u.u_frame [FRAME_PC] = exdata.ex_exec.a_entry;
/*
* Remember file name for accounting.
*/
bcopy ((caddr_t) (indir ? cfname : ndp->ni_dent.d_name),
(caddr_t) u.u_comm, MAXCOMLEN);
done:
exec_alloc_freeall(&eparam);
//printf ("execve done: PC=%08x, SP=%08x, R4=%08x, R5=%08x, R6=%08x\n",
// u.u_frame [FRAME_PC], u.u_frame [FRAME_SP],
// u.u_frame [FRAME_R4], u.u_frame [FRAME_R5], u.u_frame [FRAME_R6]);
if (bp) {
bp->b_flags |= B_AGE;
brelse (bp);
}
if (bno)
mfree (swapmap, btod (NCARGS + MAXBSIZE), bno);
if (ip)
iput(ip);
}

View File

@@ -662,40 +662,3 @@ postsig(sig)
}
exit(sig);
}
/*
* Reset signals for an exec of the specified process. In 4.4 this function
* was in kern_sig.c but since in 2.11 kern_sig and kern_exec will likely be
* in different overlays placing this here potentially saves a kernel overlay
* switch.
*/
void
execsigs(register struct proc *p)
{
register int nc;
unsigned long mask;
/*
* Reset caught signals. Held signals remain held
* through p_sigmask (unless they were caught,
* and are now ignored by default).
*/
while (p->p_sigcatch) {
nc = ffs(p->p_sigcatch);
mask = sigmask(nc);
p->p_sigcatch &= ~mask;
if (sigprop[nc] & SA_IGNORE) {
if (nc != SIGCONT)
p->p_sigignore |= mask;
p->p_sig &= ~mask;
}
u.u_signal[nc] = SIG_DFL;
}
/*
* Reset stack state to the user stack (disable the alternate stack).
*/
u.u_sigstk.ss_flags = SA_DISABLE;
u.u_sigstk.ss_size = 0;
u.u_sigstk.ss_base = 0;
u.u_psflags = 0;
}

View File

@@ -164,9 +164,8 @@ static inline int init_device(int root,int flag)
for(i=0; i<4; i++)
{
struct partition part = mbr->partitions[i];
dflags[root].start[i] = part.lbastart >> 1;
dflags[root].len[i] = part.lbalength >> 1;
dflags[root].start[i] = mbr->partitions[i].lbastart>>1;
dflags[root].len[i] = mbr->partitions[i].lbalength>>1;
}
dflags[root].blocks = disks[root].size(unit);
brelse(bp);

View File

@@ -6,7 +6,7 @@ S = ../../../tools/configsys/../../sys/kernel
vpath %.c $(M):$(S)
vpath %.S $(M):$(S)
KERNOBJ += _startup.o adc.o clock.o cons.o devsw.o exception.o exec_aout.o exec_conf.o exec_elf.o exec_script.o exec_subr.o gpio.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o oc.o rd_sd.o rd_sdramp.o rdisk.o sdram.o signal.o spi_bus.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o uart.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o
KERNOBJ += _startup.o adc.o clock.o cons.o devsw.o exception.o gpio.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o oc.o rd_sd.o rd_sdramp.o rdisk.o sdram.o signal.o spi_bus.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o uart.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o
EXTRA_TARGETS = bootloader
DEFS += -DADC_ENABLED=YES
@@ -48,9 +48,6 @@ DEFS += -DDC3_SRS=DEVCFG3_FSRSSEL_7
DEFS += -DDC3_USBID=DEVCFG3_FUSBIDIO
DEFS += -DDC3_USERID=0xffff
DEFS += -DDC3_VBUSON=DEVCFG3_FVBUSONIO
DEFS += -DEXEC_AOUT
DEFS += -DEXEC_ELF
DEFS += -DEXEC_SCRIPT
DEFS += -DFLASH_USER=0x1d005000
DEFS += -DGPIO_ENABLED=YES
DEFS += -DHID_FEATURE_REPORT_BYTES=2

View File

@@ -5,8 +5,7 @@ SUBDIR = baremetal dip duinomite duinomite-uart duinomite-e \
duinomite-e-uart explorer16 max32 max32-eth maximite \
meb pinguino-micro starter-kit ubw32 ubw32-uart \
ubw32-uart-sdram baremetal fubarino fubarino-uart \
fubarino-uart-sramc mmb-mx7 maximite-color \
32mxsdram-uart
fubarino-uart-sramc mmb-mx7 maximite-color 32mxsdram-uart
default:

View File

@@ -6,7 +6,7 @@ S = ../../../tools/configsys/../../sys/kernel
vpath %.c $(M):$(S)
vpath %.S $(M):$(S)
KERNOBJ += _startup.o clock.o cons.o devcfg.o devsw.o exception.o exec_aout.o exec_conf.o exec_elf.o exec_script.o exec_subr.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o rd_sd.o rdisk.o signal.o spi_bus.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o uart.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o
KERNOBJ += _startup.o clock.o cons.o devcfg.o devsw.o exception.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o rd_sd.o rdisk.o signal.o spi_bus.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o uart.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o
EXTRA_TARGETS =
DEFS += -DBUS_DIV=1
@@ -41,9 +41,6 @@ DEFS += -DDC3_SRS=DEVCFG3_FSRSSEL_7
DEFS += -DDC3_USBID=DEVCFG3_FUSBIDIO
DEFS += -DDC3_USERID=0xffff
DEFS += -DDC3_VBUSON=DEVCFG3_FVBUSONIO
DEFS += -DEXEC_AOUT
DEFS += -DEXEC_ELF
DEFS += -DEXEC_SCRIPT
DEFS += -DKERNEL
DEFS += -DLED_DISK_PIN=2
DEFS += -DLED_DISK_PORT=TRISD

View File

@@ -1,9 +1,6 @@
always
define KERNEL
define UCB_METER
define EXEC_AOUT
define EXEC_ELF
define EXEC_SCRIPT
file _startup.o
file clock.o
file devsw.o
@@ -12,11 +9,6 @@ always
file machdep.o
file mem.o
file exception.o
file exec_aout.o
file exec_conf.o
file exec_elf.o
file exec_script.o
file exec_subr.o
file init_main.o
file init_sysent.o
file kern_clock.o

View File

@@ -6,7 +6,7 @@ S = ../../../tools/configsys/../../sys/kernel
vpath %.c $(M):$(S)
vpath %.S $(M):$(S)
KERNOBJ += _startup.o clock.o cons.o devsw.o exception.o exec_aout.o exec_conf.o exec_elf.o exec_script.o exec_subr.o gpio.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o rd_sd.o rdisk.o signal.o spi_bus.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o usb_device.o usb_function_cdc.o usb_uart.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o
KERNOBJ += _startup.o clock.o cons.o devsw.o exception.o gpio.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o rd_sd.o rdisk.o signal.o spi_bus.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o usb_device.o usb_function_cdc.o usb_uart.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o
EXTRA_TARGETS = bootloader
DEFS += -DBL_BUTTON_PIN=6
@@ -52,9 +52,6 @@ DEFS += -DDC3_SRS=DEVCFG3_FSRSSEL_7
DEFS += -DDC3_USBID=DEVCFG3_FUSBIDIO
DEFS += -DDC3_USERID=0xffff
DEFS += -DDC3_VBUSON=DEVCFG3_FVBUSONIO
DEFS += -DEXEC_AOUT
DEFS += -DEXEC_ELF
DEFS += -DEXEC_SCRIPT
DEFS += -DFLASH_JUMP=0x9d000000
DEFS += -DGPIO_ENABLED=YES
DEFS += -DHID_FEATURE_REPORT_BYTES=2

View File

@@ -6,7 +6,7 @@ S = ../../../tools/configsys/../../sys/kernel
vpath %.c $(M):$(S)
vpath %.S $(M):$(S)
KERNOBJ += _startup.o clock.o cons.o devsw.o exception.o exec_aout.o exec_conf.o exec_elf.o exec_script.o exec_subr.o gpio.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o rd_sd.o rdisk.o signal.o spi_bus.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o uart.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o
KERNOBJ += _startup.o clock.o cons.o devsw.o exception.o gpio.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o rd_sd.o rdisk.o signal.o spi_bus.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o uart.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o
EXTRA_TARGETS =
DEFS += -DBUS_DIV=1
@@ -41,9 +41,6 @@ DEFS += -DDC3_SRS=DEVCFG3_FSRSSEL_7
DEFS += -DDC3_USBID=DEVCFG3_FUSBIDIO
DEFS += -DDC3_USERID=0xffff
DEFS += -DDC3_VBUSON=DEVCFG3_FVBUSONIO
DEFS += -DEXEC_AOUT
DEFS += -DEXEC_ELF
DEFS += -DEXEC_SCRIPT
DEFS += -DGPIO_ENABLED=YES
DEFS += -DKERNEL
DEFS += -DLED_DISK_PIN=12

View File

@@ -6,7 +6,7 @@ S = ../../../tools/configsys/../../sys/kernel
vpath %.c $(M):$(S)
vpath %.S $(M):$(S)
KERNOBJ += _startup.o clock.o cons.o devsw.o exception.o exec_aout.o exec_conf.o exec_elf.o exec_script.o exec_subr.o gpio.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o rd_sd.o rdisk.o signal.o spi_bus.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o usb_device.o usb_function_cdc.o usb_uart.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o
KERNOBJ += _startup.o clock.o cons.o devsw.o exception.o gpio.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o rd_sd.o rdisk.o signal.o spi_bus.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o usb_device.o usb_function_cdc.o usb_uart.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o
EXTRA_TARGETS =
DEFS += -DBUS_DIV=1
@@ -41,9 +41,6 @@ DEFS += -DDC3_SRS=DEVCFG3_FSRSSEL_7
DEFS += -DDC3_USBID=DEVCFG3_FUSBIDIO
DEFS += -DDC3_USERID=0xffff
DEFS += -DDC3_VBUSON=DEVCFG3_FVBUSONIO
DEFS += -DEXEC_AOUT
DEFS += -DEXEC_ELF
DEFS += -DEXEC_SCRIPT
DEFS += -DGPIO_ENABLED=YES
DEFS += -DKERNEL
DEFS += -DLED_DISK_PIN=12

View File

@@ -1,88 +0,0 @@
/* $NetBSD: elf_machdep.h,v 1.7 2000/04/02 15:35:50 minoura Exp $ */
#define ELF_MACHDEP_ID_CASES \
case EM_MIPS: \
break;
#define ARCH_ELFSIZE 32 /* MD native binary size */
/* mips relocs. */
#define R_MIPS_NONE 0
#define R_MIPS_16 1
#define R_MIPS_32 2
#define R_MIPS_REL32 3
#define R_MIPS_REL R_MIPS_REL32
#define R_MIPS_26 4
#define R_MIPS_HI16 5 /* high 16 bits of symbol value */
#define R_MIPS_LO16 6 /* low 16 bits of symbol value */
#define R_MIPS_GPREL16 7 /* GP-relative reference */
#define R_MIPS_LITERAL 8 /* Reference to literal section */
#define R_MIPS_GOT16 9 /* Reference to global offset table */
#define R_MIPS_GOT R_MIPS_GOT16
#define R_MIPS_PC16 10 /* 16 bit PC relative reference */
#define R_MIPS_CALL16 11 /* 16 bit call thru glbl offset tbl */
#define R_MIPS_CALL R_MIPS_CALL16
#define R_MIPS_GPREL32 12
/* 13, 14, 15 are not defined at this point. */
#define R_MIPS_UNUSED1 13
#define R_MIPS_UNUSED2 14
#define R_MIPS_UNUSED3 15
/*
* The remaining relocs are apparently part of the 64-bit Irix ELF ABI.
*/
#define R_MIPS_SHIFT5 16
#define R_MIPS_SHIFT6 17
#define R_MIPS_64 18
#define R_MIPS_GOT_DISP 19
#define R_MIPS_GOT_PAGE 20
#define R_MIPS_GOT_OFST 21
#define R_MIPS_GOT_HI16 22
#define R_MIPS_GOT_LO16 23
#define R_MIPS_SUB 24
#define R_MIPS_INSERT_A 25
#define R_MIPS_INSERT_B 26
#define R_MIPS_DELETE 27
#define R_MIPS_HIGHER 28
#define R_MIPS_HIGHEST 29
#define R_MIPS_CALL_HI16 30
#define R_MIPS_CALL_LO16 31
#define R_MIPS_SCN_DISP 32
#define R_MIPS_REL16 33
#define R_MIPS_ADD_IMMEDIATE 34
#define R_MIPS_PJUMP 35
#define R_MIPS_RELGOT 36
#define R_MIPS_max 37
#define R_TYPE(name) __CONCAT(R_MIPS_,name)
/* mips dynamic tags */
#define DT_MIPS_RLD_VERSION 0x70000001
#define DT_MIPS_TIME_STAMP 0x70000002
#define DT_MIPS_ICHECKSUM 0x70000003
#define DT_MIPS_IVERSION 0x70000004
#define DT_MIPS_FLAGS 0x70000005
#define DT_MIPS_BASE_ADDRESS 0x70000006
#define DT_MIPS_CONFLICT 0x70000008
#define DT_MIPS_LIBLIST 0x70000009
#define DT_MIPS_CONFLICTNO 0x7000000b
#define DT_MIPS_LOCAL_GOTNO 0x7000000a /* number of local got ents */
#define DT_MIPS_LIBLISTNO 0x70000010
#define DT_MIPS_SYMTABNO 0x70000011 /* number of .dynsym entries */
#define DT_MIPS_UNREFEXTNO 0x70000012
#define DT_MIPS_GOTSYM 0x70000013 /* first dynamic sym in got */
#define DT_MIPS_HIPAGENO 0x70000014
#define DT_MIPS_RLD_MAP 0x70000016 /* address of loader map */
/*
* Tell the kernel ELF exec code not to try relocating the interpreter
* (ld.so) for dynamically-linked ELF binaries.
*/
#ifdef _KERNEL
#define ELF_INTERP_NON_RELOCATABLE
#endif

View File

@@ -6,7 +6,7 @@ S = ../../../tools/configsys/../../sys/kernel
vpath %.c $(M):$(S)
vpath %.S $(M):$(S)
KERNOBJ += _startup.o clock.o cons.o devcfg.o devsw.o exception.o exec_aout.o exec_conf.o exec_elf.o exec_script.o exec_subr.o gpio.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o rd_sd.o rdisk.o signal.o spi_bus.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o uart.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o
KERNOBJ += _startup.o clock.o cons.o devcfg.o devsw.o exception.o gpio.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o rd_sd.o rdisk.o signal.o spi_bus.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o uart.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o
EXTRA_TARGETS =
DEFS += -DBUS_DIV=1
@@ -41,9 +41,6 @@ DEFS += -DDC3_SRS=DEVCFG3_FSRSSEL_7
DEFS += -DDC3_USBID=DEVCFG3_FUSBIDIO
DEFS += -DDC3_USERID=0xffff
DEFS += -DDC3_VBUSON=DEVCFG3_FVBUSONIO
DEFS += -DEXEC_AOUT
DEFS += -DEXEC_ELF
DEFS += -DEXEC_SCRIPT
DEFS += -DGPIO_ENABLED=YES
DEFS += -DKERNEL
DEFS += -DLED_DISK_PIN=0

View File

@@ -24,19 +24,29 @@
* The values are dependant upon the presence of the -fno-short-double
* compiler option.
*/
#define DBL_EPSILON FLT_EPSILON
#define DBL_MAX FLT_MAX
#define DBL_MIN FLT_MIN
#define DBL_DIG FLT_DIG
#define DBL_MANT_DIG FLT_MANT_DIG
#define DBL_MAX_10_EXP FLT_MAX_10_EXP
#define DBL_MAX_EXP FLT_MAX_EXP
#define DBL_MIN_10_EXP FLT_MIN_10_EXP
#define DBL_MIN_EXP FLT_MIN_EXP
//#define DBL_EPSILON FLT_EPSILON
//#define DBL_MAX FLT_MAX
//#define DBL_MIN FLT_MIN
//#define DBL_DIG FLT_DIG
//#define DBL_MANT_DIG FLT_MANT_DIG
//#define DBL_MAX_10_EXP FLT_MAX_10_EXP
//#define DBL_MAX_EXP FLT_MAX_EXP
//#define DBL_MIN_10_EXP FLT_MIN_10_EXP
//#define DBL_MIN_EXP FLT_MIN_EXP
/*
* These values provide information pertaining to the long double type.
*/
#define DBL_EPSILON 2.2204460492503131E-16
#define DBL_MAX 1.7976931348623157E+308
#define DBL_MIN 2.2250738585072014E-308
#define DBL_DIG 15
#define DBL_MANT_DIG 53
#define DBL_MAX_10_EXP 308
#define DBL_MAX_EXP 1024
#define DBL_MIN_10_EXP (-307)
#define DBL_MIN_EXP (-1021)
#define LDBL_EPSILON 2.2204460492503131E-16
#define LDBL_MAX 1.7976931348623157E+308
#define LDBL_MIN 2.2250738585072014E-308

Some files were not shown because too many files have changed in this diff Show More