iq2000 port.
This commit is contained in:
parent
75d7d17700
commit
045e4d2e08
|
@ -1,3 +1,20 @@
|
|||
2003-06-06 Stan Cox <scox@redhat.com>
|
||||
Jeff Johnston <jjohnstn@redhat.com>
|
||||
Anthony Green <green@redhat.com>
|
||||
|
||||
* configure.in: Add iq2000 support.
|
||||
* configure: Rebuilt.
|
||||
* iq2000/Makefile.in, iq2000/access.c, iq2000/_exit.c,
|
||||
iq2000/configure, iq2000/chmod.c, iq2000/chown.c, iq2000/close.c,
|
||||
iq2000/configure.in, iq2000/creat.c, iq2000/crt0.S, iq2000/crt1.c,
|
||||
iq2000/execv.c, iq2000/execve.c, iq2000/fork.c, iq2000/fstat.c,
|
||||
iq2000/getpid.c, iq2000/gettime.c, iq2000/isatty.c, iq2000/kill.c,
|
||||
iq2000/lseek.c, iq2000/open.c, iq2000/pipe.c, iq2000/read.c,
|
||||
iq2000/sbrk.c, iq2000/sim.ld, iq2000/stat.c, iq2000/test.c,
|
||||
iq2000/time.c, iq2000/times.c, iq2000/trap.c, iq2000/trap.h,
|
||||
iq2000/unlink.c, iq2000/utime.c, iq2000/wait.c, iq2000/write.c:
|
||||
New files.
|
||||
|
||||
2003-05-27 Jeff Johnston <jjohnstn@redhat.com>
|
||||
|
||||
* libnosys/Makefile.in: Add errno.o.
|
||||
|
|
|
@ -0,0 +1,148 @@
|
|||
# Copyright (c) 2000, Cygnus Solutions, A Red Hat Company
|
||||
#
|
||||
# The authors hereby grant permission to use, copy, modify, distribute,
|
||||
# and license this software and its documentation for any purpose, provided
|
||||
# that existing copyright notices are retained in all copies and that this
|
||||
# notice is included verbatim in any distributions. No written agreement,
|
||||
# license, or royalty fee is required for any of the authorized uses.
|
||||
# Modifications to this software may be copyrighted by their authors
|
||||
# and need not follow the licensing terms described here, provided that
|
||||
# the new terms are clearly indicated on the first page of each file where
|
||||
# they apply.
|
||||
|
||||
VPATH = @srcdir@
|
||||
srcdir = @srcdir@
|
||||
objdir = .
|
||||
srcroot = $(srcdir)/../..
|
||||
objroot = $(objdir)/../..
|
||||
|
||||
prefix = @prefix@
|
||||
exec_prefix = @exec_prefix@
|
||||
|
||||
host_alias = @host_alias@
|
||||
target_alias = @target_alias@
|
||||
program_transform_name = @program_transform_name@
|
||||
|
||||
bindir = @bindir@
|
||||
libdir = @libdir@
|
||||
tooldir = $(exec_prefix)/$(target_alias)
|
||||
|
||||
# Multilib support variables.
|
||||
# TOP is used instead of MULTI{BUILD,SRC}TOP.
|
||||
MULTIDIRS =
|
||||
MULTISUBDIR =
|
||||
MULTIDO = true
|
||||
MULTICLEAN = true
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
|
||||
SHELL = /bin/sh
|
||||
|
||||
CC = @CC@
|
||||
|
||||
#AS = @AS@
|
||||
AS = `if [ -f ${objroot}/../gas/as.new ] ; \
|
||||
then echo ${objroot}/../gas/as.new ; \
|
||||
else echo as ; fi`
|
||||
|
||||
AR = @AR@
|
||||
|
||||
#LD = @LD@
|
||||
LD = `if [ -f ${objroot}/../ld/ld.new ] ; \
|
||||
then echo ${objroot}/../ld/ld.new ; \
|
||||
else echo ld ; fi`
|
||||
|
||||
RANLIB = @RANLIB@
|
||||
|
||||
OBJDUMP = `if [ -f ${objroot}/../binutils/objdump ] ; \
|
||||
then echo ${objroot}/../binutils/objdump ; \
|
||||
else t='$(program_transform_name)'; echo objdump | sed -e $$t ; fi`
|
||||
OBJCOPY = `if [ -f ${objroot}/../binutils/objcopy ] ; \
|
||||
then echo ${objroot}/../binutils/objcopy ; \
|
||||
else t='$(program_transform_name)'; echo objcopy | sed -e $$t ; fi`
|
||||
|
||||
CRT0 = crt0.o
|
||||
|
||||
# Generic object files common to all targets.
|
||||
GENOBJS = _exit.o access.o chmod.o close.o crt1.o \
|
||||
fstat.o getpid.o gettime.o isatty.o \
|
||||
kill.o lseek.o open.o read.o \
|
||||
sbrk.o stat.o time.o trap.o unlink.o utime.o write.o
|
||||
|
||||
# Object files specific to particular targets.
|
||||
EVALOBJS = ${GENOBJS}
|
||||
|
||||
CFLAGS = -g
|
||||
|
||||
GCC_LDFLAGS = `if [ -d ${objroot}/../gcc ] ; \
|
||||
then echo -L${objroot}/../gcc ; fi`
|
||||
|
||||
SCRIPTS = sim
|
||||
BSP = libeval.a
|
||||
|
||||
# Host specific makefile fragment comes in here.
|
||||
@host_makefile_frag@
|
||||
|
||||
#
|
||||
# build a test program for each target board. Just trying to get
|
||||
# it to link is a good test, so we ignore all the errors for now.
|
||||
#
|
||||
|
||||
all: ${CRT0} test.o ${BSP}
|
||||
|
||||
#
|
||||
# here's where we build the board support packages for each target
|
||||
#
|
||||
|
||||
libeval.a: $(EVALOBJS)
|
||||
${AR} ${ARFLAGS} $@ $(EVALOBJS)
|
||||
${RANLIB} $@
|
||||
|
||||
|
||||
# compile a fully linked binary. The -Wl,-T*.ld is for the linker
|
||||
# script. By using -Wl, the linker script is put on the proper place
|
||||
# in the comand line for ld, and all the symbols will get fully
|
||||
# resolved.
|
||||
|
||||
test: $(CRT0) test.o
|
||||
${CC} $(CFLAGS_FOR_TARGET) -L${srcdir} -L${objdir} \
|
||||
test.o -o $@ $(NEWLIB_LDFLAGS)
|
||||
@echo Done...
|
||||
|
||||
doc:
|
||||
|
||||
clean mostlyclean:
|
||||
rm -f a.out core *.i *~ *.o *-test *.srec *.dis *.map *.x
|
||||
|
||||
distclean maintainer-clean realclean: clean
|
||||
rm -f Makefile config.status a.out
|
||||
|
||||
.PHONY: install info install-info clean-info
|
||||
install:
|
||||
$(INSTALL_PROGRAM) $(CRT0) $(tooldir)/lib${MULTISUBDIR}/$(CRT0)
|
||||
@for bsp in ${BSP}; do\
|
||||
$(INSTALL_PROGRAM) $${bsp} $(tooldir)/lib${MULTISUBDIR}; \
|
||||
done
|
||||
@for script in ${SCRIPTS}; do\
|
||||
$(INSTALL_DATA) $(srcdir)/$${script}.ld $(tooldir)/lib${MULTISUBDIR}/$${script}.ld; \
|
||||
done
|
||||
|
||||
info:
|
||||
install-info:
|
||||
clean-info:
|
||||
|
||||
test.o: ${srcdir}/test.c
|
||||
|
||||
# these are for the BSPs
|
||||
${CRT0}: ${srcdir}/crt0.S
|
||||
|
||||
# target specific makefile fragment comes in here.
|
||||
@target_makefile_frag@
|
||||
|
||||
Makefile: Makefile.in config.status @host_makefile_frag_path@ @target_makefile_frag_path@
|
||||
$(SHELL) config.status
|
||||
|
||||
config.status: configure
|
||||
$(SHELL) config.status --recheck
|
|
@ -0,0 +1,35 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
static void _do_dtors()
|
||||
{
|
||||
/* The loop variable is static so that if a destructor calls exit,
|
||||
and we return here, we simply continue with the next destructor. */
|
||||
typedef void (*pfunc) ();
|
||||
extern pfunc __dtors[];
|
||||
extern pfunc __dtors_end[];
|
||||
static pfunc *p = __dtors;
|
||||
|
||||
while (p < __dtors_end)
|
||||
(*p++) ();
|
||||
}
|
||||
|
||||
|
||||
void _exit (n)
|
||||
{
|
||||
extern unsigned char __eh_frame_begin[];
|
||||
extern void __deregister_frame_info (void *);
|
||||
|
||||
/* Destructors should be done earlier because they need to be done before the
|
||||
files are closed, but here is better than nowhere (and this balances the
|
||||
constructors done in crt1.c. */
|
||||
_do_dtors();
|
||||
|
||||
/* Deregister any eh frames. */
|
||||
__deregister_frame_info (__eh_frame_begin);
|
||||
|
||||
TRAP0 (SYS_exit, n, 0, 0);
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
/* This is file ACCESS.C */
|
||||
/*
|
||||
* Copyright (C) 1993 DJ Delorie
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms is permitted
|
||||
* provided that the above copyright notice and following paragraph are
|
||||
* duplicated in all such forms.
|
||||
*
|
||||
* This file is distributed WITHOUT ANY WARRANTY; without even the implied
|
||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int access(const char *fn, int flags)
|
||||
{
|
||||
struct stat s;
|
||||
if (stat(fn, &s))
|
||||
return -1;
|
||||
if (s.st_mode & S_IFDIR)
|
||||
return 0;
|
||||
if (flags & W_OK)
|
||||
{
|
||||
if (s.st_mode & S_IWRITE)
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
int
|
||||
chmod (const char *path, mode_t mode)
|
||||
{
|
||||
return TRAP0 (SYS_chmod, path, mode, 0);
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
|
||||
int
|
||||
chown (const char *path, short owner, short group)
|
||||
{
|
||||
return TRAP0 (SYS_chown, path, owner, group);
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
int
|
||||
_close (int file)
|
||||
{
|
||||
return TRAP0 (SYS_close, file, 0, 0);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,115 @@
|
|||
# Copyright (c) 2000, Cygnus Solutions, A Red Hat Company
|
||||
#
|
||||
# The authors hereby grant permission to use, copy, modify, distribute,
|
||||
# and license this software and its documentation for any purpose, provided
|
||||
# that existing copyright notices are retained in all copies and that this
|
||||
# notice is included verbatim in any distributions. No written agreement,
|
||||
# license, or royalty fee is required for any of the authorized uses.
|
||||
# Modifications to this software may be copyrighted by their authors
|
||||
# and need not follow the licensing terms described here, provided that
|
||||
# the new terms are clearly indicated on the first page of each file where
|
||||
# they apply.
|
||||
#
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
#
|
||||
AC_PREREQ(2.5)dnl
|
||||
AC_INIT(crt0.S)
|
||||
|
||||
if test "${enable_shared}" = "yes" ; then
|
||||
echo "Shared libraries not supported for cross compiling, ignored"
|
||||
fi
|
||||
|
||||
if test "$srcdir" = "." ; then
|
||||
if test "${with_target_subdir}" != "." ; then
|
||||
libgloss_topdir="${srcdir}/${with_multisrctop}../../.."
|
||||
else
|
||||
libgloss_topdir="${srcdir}/${with_multisrctop}../.."
|
||||
fi
|
||||
else
|
||||
libgloss_topdir="${srcdir}/../.."
|
||||
fi
|
||||
AC_CONFIG_AUX_DIR($libgloss_topdir)
|
||||
|
||||
AC_CANONICAL_SYSTEM
|
||||
AC_ARG_PROGRAM
|
||||
|
||||
AC_PROG_INSTALL
|
||||
|
||||
# FIXME: We temporarily define our own version of AC_PROG_CC. This is
|
||||
# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
|
||||
# are building a library that must be included in all links, so we
|
||||
# can't link an executable until this lib is built.
|
||||
# autoconf should provide a way to do this.
|
||||
|
||||
AC_DEFUN(LIB_AC_PROG_CC,
|
||||
[AC_BEFORE([$0], [AC_PROG_CPP])dnl
|
||||
AC_CHECK_PROG(CC, gcc, gcc)
|
||||
if test -z "$CC"; then
|
||||
AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
|
||||
test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
|
||||
fi
|
||||
|
||||
AC_PROG_CC_GNU
|
||||
|
||||
if test $ac_cv_prog_gcc = yes; then
|
||||
GCC=yes
|
||||
dnl Check whether -g works, even if CFLAGS is set, in case the package
|
||||
dnl plays around with CFLAGS (such as to build both debugging and
|
||||
dnl normal versions of a library), tasteless as that idea is.
|
||||
ac_test_CFLAGS="${CFLAGS+set}"
|
||||
ac_save_CFLAGS="$CFLAGS"
|
||||
CFLAGS=
|
||||
AC_PROG_CC_G
|
||||
if test "$ac_test_CFLAGS" = set; then
|
||||
CFLAGS="$ac_save_CFLAGS"
|
||||
elif test $ac_cv_prog_cc_g = yes; then
|
||||
CFLAGS="-g -O2"
|
||||
else
|
||||
CFLAGS="-O2"
|
||||
fi
|
||||
else
|
||||
GCC=
|
||||
test "${CFLAGS+set}" = set || CFLAGS="-g"
|
||||
fi
|
||||
])
|
||||
|
||||
LIB_AC_PROG_CC
|
||||
AS=${AS-as}
|
||||
AC_SUBST(AS)
|
||||
AR=${AR-ar}
|
||||
AC_SUBST(AR)
|
||||
LD=${LD-ld}
|
||||
AC_SUBST(LD)
|
||||
AC_PROG_RANLIB
|
||||
|
||||
host_makefile_frag=${srcdir}/../config/default.mh
|
||||
|
||||
if test "${with_multisubdir}" = "m32"; then
|
||||
LD_TYPE="m32"
|
||||
else
|
||||
LD_TYPE="m16"
|
||||
fi
|
||||
AC_SUBST(LD_TYPE)
|
||||
|
||||
dnl We have to assign the same value to other variables because autoconf
|
||||
dnl doesn't provide a mechanism to substitute a replacement keyword with
|
||||
dnl arbitrary data or pathnames.
|
||||
dnl
|
||||
host_makefile_frag_path=$host_makefile_frag
|
||||
AC_SUBST(host_makefile_frag_path)
|
||||
AC_SUBST_FILE(host_makefile_frag)
|
||||
target_makefile_frag_path=$target_makefile_frag
|
||||
AC_SUBST(target_makefile_frag_path)
|
||||
AC_SUBST_FILE(target_makefile_frag)
|
||||
AC_SUBST(part_specific_obj)
|
||||
|
||||
AC_OUTPUT(Makefile,
|
||||
. ${libgloss_topdir}/config-ml.in,
|
||||
srcdir=${srcdir}
|
||||
target=${target}
|
||||
ac_configure_args="${ac_configure_args} --enable-multilib"
|
||||
CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
|
||||
libgloss_topdir=${libgloss_topdir}
|
||||
)
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
int
|
||||
creat (const char *path,
|
||||
int mode)
|
||||
{
|
||||
return TRAP0 (SYS_creat, path, mode, 0);
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
##==============================================================================
|
||||
##
|
||||
## crt0.S
|
||||
##
|
||||
## IQ2000 startup code
|
||||
##
|
||||
##==============================================================================
|
||||
##
|
||||
## Copyright (c) 2000, Cygnus Solutions, A Red Hat Company
|
||||
##
|
||||
## The authors hereby grant permission to use, copy, modify, distribute,
|
||||
## and license this software and its documentation for any purpose, provided
|
||||
## that existing copyright notices are retained in all copies and that this
|
||||
## notice is included verbatim in any distributions. No written agreement,
|
||||
## license, or royalty fee is required for any of the authorized uses.
|
||||
## Modifications to this software may be copyrighted by their authors
|
||||
## and need not follow the licensing terms described here, provided that
|
||||
## the new terms are clearly indicated on the first page of each file where
|
||||
## they apply.
|
||||
##
|
||||
|
||||
##------------------------------------------------------------------------------
|
||||
|
||||
.file "crt0.S"
|
||||
|
||||
##------------------------------------------------------------------------------
|
||||
## Startup code
|
||||
.section .text
|
||||
.global _start
|
||||
_start:
|
||||
lui %29,%hi(__stack)
|
||||
ori %29,%29,%lo(__stack)
|
||||
|
||||
lui %24,%hi(_edata) # get start of bss
|
||||
ori %24,%24,%lo(_edata)
|
||||
|
||||
lui %25,%hi(_end) # get end of bss
|
||||
ori %25,%25,%lo(_end)
|
||||
|
||||
beq %24,%25,.L0 # check if end and start are the same
|
||||
# do nothing if no bss
|
||||
|
||||
.L1:
|
||||
sb %0,0(%24) # clear a byte and bump pointer
|
||||
addi %24,%24,1
|
||||
bne %24,%25,.L1
|
||||
nop
|
||||
|
||||
.L0:
|
||||
jal _main # call _main to run ctors/dtors
|
||||
nop
|
||||
xor %4,%4,%4
|
||||
jal main # call main program
|
||||
xor %5,%5,%5
|
||||
jal exit # all done, no need to return or
|
||||
or %4,%0,%2 # exit with main's return value
|
|
@ -0,0 +1,31 @@
|
|||
|
||||
|
||||
/* This object reserves enough space for an EH frame initialization
|
||||
object. */
|
||||
|
||||
struct object {
|
||||
void *reserve[7];
|
||||
};
|
||||
|
||||
|
||||
void _main ()
|
||||
{
|
||||
static int initialized;
|
||||
static struct object object;
|
||||
if (! initialized)
|
||||
{
|
||||
typedef void (*pfunc) ();
|
||||
extern pfunc __ctors[];
|
||||
extern pfunc __ctors_end[];
|
||||
extern unsigned char __eh_frame_begin[];
|
||||
extern void __register_frame_info (void *, struct object *);
|
||||
|
||||
pfunc *p;
|
||||
|
||||
initialized = 1;
|
||||
for (p = __ctors_end; p > __ctors; )
|
||||
(*--p) ();
|
||||
|
||||
__register_frame_info (__eh_frame_begin, &object);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
int
|
||||
execv (const char *path, char *const argv[])
|
||||
{
|
||||
return TRAP0 (SYS_execv, path, argv, 0);
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
int
|
||||
_execve (const char *path, char *const argv[], char *const envp[])
|
||||
{
|
||||
return TRAP0 (SYS_execve, path, argv, envp);
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
int
|
||||
_fork ()
|
||||
{
|
||||
return TRAP0 (SYS_fork, 0, 0, 0);
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
int
|
||||
_fstat (int file,
|
||||
struct stat *st)
|
||||
{
|
||||
st->st_mode = S_IFCHR;
|
||||
st->st_blksize = 4096;
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
_getpid (n)
|
||||
{
|
||||
return 1;
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
#include "sys/time.h"
|
||||
|
||||
|
||||
int
|
||||
_gettimeofday (struct timeval *tp, void *tzp)
|
||||
{
|
||||
return TRAP0 (SYS_gettimeofday, tp, tzp, 0);
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
isatty (fd)
|
||||
int fd;
|
||||
{
|
||||
return 1;
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
_kill (n, m)
|
||||
{
|
||||
return TRAP0 (SYS_exit, 0xdead, 0, 0);
|
||||
}
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/unistd.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
off_t
|
||||
_lseek (int file,
|
||||
off_t ptr,
|
||||
int dir)
|
||||
{
|
||||
return TRAP0 (SYS_lseek, file, ptr, dir);
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
int
|
||||
_open (const char *path,
|
||||
int flags)
|
||||
{
|
||||
return TRAP0 (SYS_open, path, flags, 0);
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
int
|
||||
pipe (int fd)
|
||||
{
|
||||
return TRAP0 (SYS_pipe, fd, 0, 0);
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
_read (int file,
|
||||
char *ptr,
|
||||
size_t len)
|
||||
{
|
||||
return TRAP0 (SYS_read, file, ptr, len);
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
#include <_ansi.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
caddr_t
|
||||
_sbrk (size_t incr)
|
||||
{
|
||||
extern char __stack; /* Defined by the linker */
|
||||
extern char _end; /* Defined by the linker */
|
||||
static char *heap_end;
|
||||
char *prev_heap_end;
|
||||
char *sp = (char *)&sp;
|
||||
|
||||
if (heap_end == 0)
|
||||
{
|
||||
heap_end = &_end;
|
||||
}
|
||||
prev_heap_end = heap_end;
|
||||
heap_end += incr;
|
||||
if (heap_end > sp)
|
||||
{
|
||||
_write (1, "Heap and stack collision\n", 25);
|
||||
errno = ENOMEM;
|
||||
return (caddr_t)-1;
|
||||
}
|
||||
return (caddr_t) prev_heap_end;
|
||||
}
|
|
@ -0,0 +1,278 @@
|
|||
/* Special linker script for running C executables on simulator */
|
||||
OUTPUT_FORMAT("elf32-iq2000", "elf32-iq2000",
|
||||
"elf32-iq2000")
|
||||
OUTPUT_ARCH(iq2000)
|
||||
ENTRY(_start)
|
||||
/* Do we need any of these for elf?
|
||||
__DYNAMIC = 0; */
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x80000000;
|
||||
.interp : { *(.interp) }
|
||||
.rel.init : { *(.rel.init) }
|
||||
.rela.init : { *(.rela.init) }
|
||||
.rel.text :
|
||||
{
|
||||
*(.rel.text)
|
||||
*(.rel.text.*)
|
||||
*(.rel.gnu.linkonce.t.*)
|
||||
}
|
||||
.rela.text :
|
||||
{
|
||||
*(.rela.text)
|
||||
*(.rela.text.*)
|
||||
*(.rela.gnu.linkonce.t.*)
|
||||
}
|
||||
.rel.fini : { *(.rel.fini) }
|
||||
.rela.fini : { *(.rela.fini) }
|
||||
.rel.rodata :
|
||||
{
|
||||
*(.rel.rodata)
|
||||
*(.rel.rodata.*)
|
||||
*(.rel.gnu.linkonce.r.*)
|
||||
}
|
||||
.rela.rodata :
|
||||
{
|
||||
*(.rela.rodata)
|
||||
*(.rela.rodata.*)
|
||||
*(.rela.gnu.linkonce.r.*)
|
||||
}
|
||||
.rel.data :
|
||||
{
|
||||
*(.rel.data)
|
||||
*(.rel.data.*)
|
||||
*(.rel.gnu.linkonce.d.*)
|
||||
}
|
||||
.rela.data :
|
||||
{
|
||||
*(.rela.data)
|
||||
*(.rela.data.*)
|
||||
*(.rela.gnu.linkonce.d.*)
|
||||
}
|
||||
.rel.ctors : { *(.rel.ctors) }
|
||||
.rela.ctors : { *(.rela.ctors) }
|
||||
.rel.dtors : { *(.rel.dtors) }
|
||||
.rela.dtors : { *(.rela.dtors) }
|
||||
.rel.got : { *(.rel.got) }
|
||||
.rela.got : { *(.rela.got) }
|
||||
.rel.sdata :
|
||||
{
|
||||
*(.rel.sdata)
|
||||
*(.rel.sdata.*)
|
||||
*(.rel.gnu.linkonce.s.*)
|
||||
}
|
||||
.rela.sdata :
|
||||
{
|
||||
*(.rela.sdata)
|
||||
*(.rela.sdata.*)
|
||||
*(.rela.gnu.linkonce.s.*)
|
||||
}
|
||||
.rel.sbss :
|
||||
{
|
||||
*(.rel.sbss)
|
||||
*(.rel.sbss.*)
|
||||
*(.rel.gnu.linkonce.sb.*)
|
||||
}
|
||||
.rela.sbss :
|
||||
{
|
||||
*(.rela.sbss)
|
||||
*(.rela.sbss.*)
|
||||
*(.rela.gnu.linkonce.sb.*)
|
||||
}
|
||||
.rel.sdata2 :
|
||||
{
|
||||
*(.rel.sdata2)
|
||||
*(.rel.sdata2.*)
|
||||
*(.rel.gnu.linkonce.s2.*)
|
||||
}
|
||||
.rela.sdata2 :
|
||||
{
|
||||
*(.rela.sdata2)
|
||||
*(.rela.sdata2.*)
|
||||
*(.rela.gnu.linkonce.s2.*)
|
||||
}
|
||||
.rel.sbss2 :
|
||||
{
|
||||
*(.rel.sbss2)
|
||||
*(.rel.sbss2.*)
|
||||
*(.rel.gnu.linkonce.sb2.*)
|
||||
}
|
||||
.rela.sbss2 :
|
||||
{
|
||||
*(.rela.sbss2)
|
||||
*(.rela.sbss2.*)
|
||||
*(.rela.gnu.linkonce.sb2.*)
|
||||
}
|
||||
.rel.bss :
|
||||
{
|
||||
*(.rel.bss)
|
||||
*(.rel.bss.*)
|
||||
*(.rel.gnu.linkonce.b.*)
|
||||
}
|
||||
.rela.bss :
|
||||
{
|
||||
*(.rela.bss)
|
||||
*(.rela.bss.*)
|
||||
*(.rela.gnu.linkonce.b.*)
|
||||
}
|
||||
.rel.plt : { *(.rel.plt) }
|
||||
.rela.plt : { *(.rela.plt) }
|
||||
.init :
|
||||
{
|
||||
KEEP (*(.init))
|
||||
} =0
|
||||
.plt : { *(.plt) }
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.stub)
|
||||
/* .gnu.warning sections are handled specially by elf32.em. */
|
||||
*(.gnu.warning)
|
||||
*(.gnu.linkonce.t.*)
|
||||
} =0
|
||||
.fini :
|
||||
{
|
||||
KEEP (*(.fini))
|
||||
} =0
|
||||
PROVIDE (__etext = .);
|
||||
PROVIDE (_etext = .);
|
||||
PROVIDE (etext = .);
|
||||
/* Adjust the address for the data segment. We want to adjust up to
|
||||
the same address within the page on the next page up. */
|
||||
. = 0x1000;
|
||||
.data :
|
||||
{
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
*(.gnu.linkonce.d.*)
|
||||
SORT(CONSTRUCTORS)
|
||||
}
|
||||
.data1 : { *(.data1) }
|
||||
.eh_frame :
|
||||
{
|
||||
PROVIDE (__eh_frame_begin = .);
|
||||
*(.eh_frame)
|
||||
LONG (0);
|
||||
PROVIDE (__eh_frame_end = .);
|
||||
}
|
||||
.gcc_except_table : { *(.gcc_except_table) }
|
||||
.hash : { *(.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.gnu.version : { *(.gnu.version) }
|
||||
.gnu.version_d : { *(.gnu.version_d) }
|
||||
.gnu.version_r : { *(.gnu.version_r) }
|
||||
.rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r.*) }
|
||||
.rodata1 : { *(.rodata1) }
|
||||
.sdata2 : { *(.sdata2) *(.sdata2.*) *(.gnu.linkonce.s2.*) }
|
||||
.sbss2 : { *(.sbss2) *(.sbss2.*) *(.gnu.linkonce.sb2.*) }
|
||||
.dynamic : { *(.dynamic) }
|
||||
.ctors :
|
||||
{
|
||||
__ctors = .;
|
||||
/* gcc uses crtbegin.o to find the start of
|
||||
the constructors, so we make sure it is
|
||||
first. Because this is a wildcard, it
|
||||
doesn't matter if the user does not
|
||||
actually link against crtbegin.o; the
|
||||
linker won't look for a file to match a
|
||||
wildcard. The wildcard also means that it
|
||||
doesn't matter which directory crtbegin.o
|
||||
is in. */
|
||||
KEEP (*crtbegin.o(.ctors))
|
||||
/* We don't want to include the .ctor section from
|
||||
from the crtend.o file until after the sorted ctors.
|
||||
The .ctor section from the crtend file contains the
|
||||
end of ctors marker and it must be last */
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors))
|
||||
KEEP (*(SORT(.ctors.*)))
|
||||
KEEP (*(.ctors))
|
||||
__ctors_end = .;
|
||||
}
|
||||
.dtors :
|
||||
{
|
||||
__dtors = .;
|
||||
KEEP (*crtbegin.o(.dtors))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors))
|
||||
KEEP (*(SORT(.dtors.*)))
|
||||
KEEP (*(.dtors))
|
||||
__dtors_end = .;
|
||||
}
|
||||
.jcr : { KEEP (*(.jcr)) }
|
||||
.got : { *(.got.plt) *(.got) }
|
||||
/* We want the small data sections together, so single-instruction offsets
|
||||
can access them all, and initialized data all before uninitialized, so
|
||||
we can shorten the on-disk segment size. */
|
||||
.sdata :
|
||||
{
|
||||
*(.sdata)
|
||||
*(.sdata.*)
|
||||
*(.gnu.linkonce.s.*)
|
||||
}
|
||||
_edata = .;
|
||||
PROVIDE (edata = .);
|
||||
__bss_start = .;
|
||||
.sbss :
|
||||
{
|
||||
PROVIDE (__sbss_start = .);
|
||||
PROVIDE (___sbss_start = .);
|
||||
*(.dynsbss)
|
||||
*(.sbss)
|
||||
*(.sbss.*)
|
||||
*(.gnu.linkonce.sb.*)
|
||||
*(.scommon)
|
||||
PROVIDE (__sbss_end = .);
|
||||
PROVIDE (___sbss_end = .);
|
||||
}
|
||||
.bss :
|
||||
{
|
||||
*(.dynbss)
|
||||
*(.bss)
|
||||
*(.bss.*)
|
||||
*(.gnu.linkonce.b.*)
|
||||
*(COMMON)
|
||||
/* Align here to ensure that the .bss section occupies space up to
|
||||
_end. Align after .bss to ensure correct alignment even if the
|
||||
.bss section disappears because there are no input sections. */
|
||||
. = ALIGN(32 / 8);
|
||||
}
|
||||
. = ALIGN(32 / 8);
|
||||
_end = .;
|
||||
PROVIDE (end = .);
|
||||
/* Stabs debugging sections. */
|
||||
.stab 0 : { *(.stab) }
|
||||
.stabstr 0 : { *(.stabstr) }
|
||||
.stab.excl 0 : { *(.stab.excl) }
|
||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
||||
.stab.index 0 : { *(.stab.index) }
|
||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
||||
.comment 0 : { *(.comment) }
|
||||
/* DWARF debug sections.
|
||||
Symbols in the DWARF debugging sections are relative to the beginning
|
||||
of the section so we begin them at 0. */
|
||||
/* DWARF 1 */
|
||||
.debug 0 : { *(.debug) }
|
||||
.line 0 : { *(.line) }
|
||||
/* GNU DWARF 1 extensions */
|
||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||
/* DWARF 1.1 and DWARF 2 */
|
||||
.debug_aranges 0 : { *(.debug_aranges) }
|
||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||
/* DWARF 2 */
|
||||
.debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) }
|
||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||
.debug_line 0 : { *(.debug_line) }
|
||||
.debug_frame 0 : { *(.debug_frame) }
|
||||
.debug_str 0 : { *(.debug_str) }
|
||||
.debug_loc 0 : { *(.debug_loc) }
|
||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
||||
/* SGI/MIPS DWARF 2 extensions */
|
||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
||||
.debug_typenames 0 : { *(.debug_typenames) }
|
||||
.debug_varnames 0 : { *(.debug_varnames) }
|
||||
PROVIDE (__stack = 0x80000);
|
||||
/* These must appear regardless of . */
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
int
|
||||
_stat (const char *path, struct stat *st)
|
||||
|
||||
{
|
||||
return TRAP0 (SYS_stat, path, st, 0);
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
#include <stdio.h>
|
||||
|
||||
static void
|
||||
send_msg1 (void)
|
||||
{
|
||||
static char msg[] = "Hello World\r\n";
|
||||
write(1, msg, strlen (msg));
|
||||
}
|
||||
|
||||
static void
|
||||
send_msg2 (void)
|
||||
{
|
||||
static char msg[] = "Goodnight Irene\r\n";
|
||||
write(1, msg, strlen (msg));
|
||||
}
|
||||
|
||||
static void
|
||||
delay (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 1000000; i++)
|
||||
;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int i, j;
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
send_msg1 ();
|
||||
delay ();
|
||||
send_msg2 ();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
time_t
|
||||
time (time_t *tloc)
|
||||
{
|
||||
return TRAP0 (SYS_time, tloc, 0, 0);
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
#include "sys/times.h"
|
||||
|
||||
|
||||
clock_t
|
||||
times (struct tms *buffer)
|
||||
{
|
||||
return TRAP0 (SYS_times, buffer, 0, 0);
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
// Perform a system call.
|
||||
// Unused parameters should be set to 0.
|
||||
int __trap0(unsigned long func, unsigned long p1, unsigned long p2, unsigned long p3)
|
||||
{
|
||||
int ret = 0;
|
||||
asm volatile ("nop\n\tor %%4,%%0,%0" : : "r"(func));
|
||||
asm volatile ("nop\n\tor %%5,%%0,%0" : : "r"(p1));
|
||||
asm volatile ("nop\n\tor %%6,%%0,%0" : : "r"(p2));
|
||||
asm volatile ("nop\n\tor %%7,%%0,%0" : : "r"(p3));
|
||||
asm volatile ("nop\n\tor %%11,%%0,%0" : : "r"(func));
|
||||
asm volatile ("syscall\n\tnop\n\tor %0,%%0,%%2" : "=r"(ret));
|
||||
return ret;
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
#include "syscall.h"
|
||||
|
||||
int __trap0 ();
|
||||
|
||||
#define TRAP0(f, p1, p2, p3) __trap0(f, (p1), (p2), (p3))
|
|
@ -0,0 +1,11 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
int
|
||||
_unlink ()
|
||||
{
|
||||
return -1;
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
int
|
||||
utime (path, times)
|
||||
const char *path;
|
||||
char *times;
|
||||
{
|
||||
return TRAP0 (SYS_utime, path, times, 0);
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
int
|
||||
_wait (statusp)
|
||||
int *statusp;
|
||||
{
|
||||
return TRAP0 (SYS_wait, 0, 0, 0);
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
#include <_ansi.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "trap.h"
|
||||
|
||||
|
||||
int
|
||||
_write ( int file,
|
||||
char *ptr,
|
||||
size_t len)
|
||||
{
|
||||
return TRAP0 (SYS_write, file, ptr, len);
|
||||
}
|
Loading…
Reference in New Issue