diff --git a/binutils.patch b/binutils.patch index 680d25a..cdb3711 100644 --- a/binutils.patch +++ b/binutils.patch @@ -4,7 +4,7 @@ | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ -+ | -{{OSNAME}}* \ ++ | -xomb* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ @@ -14,7 +14,7 @@ targ64_extra_emuls="elf_x86_64 elf_l1om" targ64_extra_libpath=elf_x86_64 tdir_i386linux=${targ_alias}aout ;; -+x86_64-*-{{OSNAME}}*) targ_emul={{OSNAME}}_x86_64 ;; ++x86_64-*-xomb*) targ_emul=xomb_x86_64 ;; + x86_64-*-linux-*) targ_emul=elf_x86_64 targ_extra_emuls="elf_i386 i386linux elf_l1om" @@ -25,9 +25,9 @@ eelf_i386.c: $(srcdir)/emulparams/elf_i386.sh \ $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf_i386 "$(tdir_elf_i386)" -+e{{OSNAME}}_x86_64.c: $(srcdir)/emulparams/{{OSNAME}}_x86_64.sh \ ++exomb_x86_64.c: $(srcdir)/emulparams/xomb_x86_64.sh \ + $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} -+ ${GENSCRIPTS} {{OSNAME}}_x86_64 "$(tdir_{{OSNAME}}_x86_64)" ++ ${GENSCRIPTS} xomb_x86_64 "$(tdir_xomb_x86_64)" eelf_x86_64.c: $(srcdir)/emulparams/elf_x86_64.sh \ $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf_x86_64 "$(tdir_elf_x86_64)" @@ -37,7 +37,7 @@ targ_selvecs="bfd_elf32_i386_vec bfd_elf64_l1om_vec" want64=true ;; -+ x86_64-*-{{OSNAME}}*) ++ x86_64-*-xomb*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs=bfd_elf32_i386_vec + want64=true @@ -52,7 +52,7 @@ i386-*-chaos) fmt=elf ;; i386-*-rdos*) fmt=elf ;; i386-*-darwin*) fmt=macho ;; -+ i386-*-{{OSNAME}}*) fmt=elf ;; ++ i386-*-xomb*) fmt=elf ;; i860-*-*) fmt=elf endian=little ;; diff --git a/build.sh b/build.sh index c5073f2..9ab093c 100755 --- a/build.sh +++ b/build.sh @@ -1,18 +1,19 @@ OSNAME=xomb BINUTILS_VER=2.20 -GCC_VER=4.4.3 +GCC_VER=4.5.0 GMP_VER=5.0.1 MPFR_VER=2.4.2 NEWLIB_VER=1.18.0 +MPC_VER=0.8.1 export TARGET=x86_64-pc-${OSNAME} export PREFIX=`pwd`/local # Fix patches with osname -PERLCMD="s/{{OSNAME}}/${OSNAME}/g" -perl -pi -e $PERLCMD *.patch -perl -pi -e $PERLCMD gcc-files/gcc/config/os.h +#PERLCMD="s/{{OSNAME}}/${OSNAME}/g" +#perl -pi -e $PERLCMD *.patch +#perl -pi -e $PERLCMD gcc-files/gcc/config/os.h mkdir -p build mkdir -p local @@ -44,6 +45,10 @@ echo "FETCH MPFR" wget $WFLAGS http://ftp.gnu.org/gnu/mpfr/mpfr-${MPFR_VER}.tar.gz tar -xf mpfr-${MPFR_VER}.tar.gz +echo "FETCH MPC" +wget $WFLAGS http://www.multiprecision.org/mpc/download/mpc-${MPC_VER}.tar.gz +tar -xf mpc-${MPC_VER}.tar.gz + echo "FETCH NEWLIB" wget $WFLAGS ftp://sources.redhat.com/pub/newlib/newlib-${NEWLIB_VER}.tar.gz tar -xf newlib-${NEWLIB_VER}.tar.gz @@ -62,6 +67,7 @@ echo "PATCH NEWLIB" patch -p0 -d newlib-${NEWLIB_VER} < ../newlib.patch || exit mkdir -p newlib-${NEWLIB_VER}/newlib/libc/sys/${OSNAME} cp -r ../newlib-files/* newlib-${NEWLIB_VER}/newlib/libc/sys/${OSNAME}/. +cp ../newlib-files/vanilla-syscalls.c newlib-${NEWLIB_VER}/newlib/libc/sys/${OSNAME}/syscalls.c echo "MAKE OBJECT DIRECTORIES" mkdir -p binutils-obj @@ -69,6 +75,7 @@ mkdir -p gcc-obj mkdir -p newlib-obj mkdir -p gmp-obj mkdir -p mpfr-obj +mkdir -p mpc-obj # Compile all packages @@ -95,6 +102,15 @@ make check || exit make install || exit cd .. +echo "COMPILE MPC" +cd mpc-obj +../mpc-${MPC_VER}/configure --target=$TARGET --prefix=$PREFIX --with-gmp=$PREFIX --with-mpfr=$PREFIX --disable-shared || exit +make || exit +make check || exit +make install || exit +cd .. + + echo "AUTOCONF GCC" cd gcc-${GCC_VER}/libstdc++-v3 #autoconf || exit @@ -102,8 +118,7 @@ cd ../.. echo "COMPILE GCC" cd gcc-obj -../gcc-${GCC_VER}/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++ --disable-libssp --with-gmp=$PREFIX --with-mpfr=$PREFIX --disable-nls --with-newlib || exit -#../gcc-${GCC_VER}/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++,fortran --disable-libssp --with-gmp=$PREFIX --with-mpfr=$PREFIX --disable-nls --with-newlib || exit +../gcc-${GCC_VER}/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++,fortran --disable-libssp --with-gmp=$PREFIX --with-mpfr=$PREFIX --with-mpc=$PREFIX --disable-nls --with-newlib || exit make all-gcc || exit make install-gcc || exit cd .. @@ -133,3 +148,12 @@ make install-target-libstdc++-v3 || exit make || exit make install || exit cd .. + +echo "PASS-2 COMPILE NEWLIB" +cp ../newlib-files/syscalls.c newlib-${NEWLIB_VER}/newlib/libc/sys/${OSNAME}/syscalls.c + +cd newlib-obj +#../newlib-${NEWLIB_VER}/configure --target=$TARGET --prefix=$PREFIX --with-gmp=$PREFIX --with-mpfr=$PREFIX || exit +make || exit +make install || exit +cd .. diff --git a/gcc-files/gcc/config/os.h b/gcc-files/gcc/config/os.h index 0644abd..6f6efb9 100644 --- a/gcc-files/gcc/config/os.h +++ b/gcc-files/gcc/config/os.h @@ -1,11 +1,11 @@ #undef TARGET_OS_CPP_BUILTINS #define TARGET_OS_CPP_BUILTINS() \ do { \ - builtin_define_std ("{{OSNAME}}"); \ + builtin_define_std ("xomb"); \ builtin_define_std ("unix"); \ - builtin_assert ("system={{OSNAME}}"); \ + builtin_assert ("system=xomb"); \ builtin_assert ("system=unix"); \ } while(0); #undef TARGET_VERSION -#define TARGET_VERSION fprintf(stderr, " (x86_64 {{OSNAME}})"); +#define TARGET_VERSION fprintf(stderr, " (x86_64 xomb)"); diff --git a/gcc.patch b/gcc.patch index ee7929a..b07f18e 100644 --- a/gcc.patch +++ b/gcc.patch @@ -4,7 +4,7 @@ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ -+ | -{{OSNAME}}* \ ++ | -xomb* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ @@ -14,7 +14,7 @@ AC_DEFINE(HAVE_ISNANL) fi ;; -+ *-{{OSNAME}}*) ++ *-xomb*) + AC_CHECK_HEADERS([sys/types.h locale.h float.h]) + GLIBCXX_CHECK_BUILTIN_MATH_SUPPORT + GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT @@ -29,7 +29,7 @@ *) echo 'Unknown thread configuration for VxWorks'; exit 1 ;; esac ;; -+*-*-{{OSNAME}}*) ++*-*-xomb*) + extra_parts="crtbegin.o crtend.o" + gas=yes + gnu_ld=yes @@ -43,8 +43,8 @@ use_collect2=yes gas=yes ;; -+x86_64-*-{{OSNAME}}*) -+ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h i386/i386elf.h i386/x86-64.h {{OSNAME}}.h" ++x86_64-*-xomb*) ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h i386/i386elf.h i386/x86-64.h xomb.h" + tmake_file="${tmake_file} i386/t-i386elf t-svr4" + use_fixproto=yes + ;; @@ -57,7 +57,7 @@ ;; xscale-*-coff) ;; -+x86_64-*-{{OSNAME}}*) ++x86_64-*-xomb*) + ;; xstormy16-*-elf) ;; diff --git a/newlib-files/syscalls.c b/newlib-files/syscalls.c index ad50d93..1919990 100644 --- a/newlib-files/syscalls.c +++ b/newlib-files/syscalls.c @@ -1,6 +1,13 @@ + #include #include -#include <_ansi.h> +#include +#include +#include +#include +#include + +//#include <_ansi.h> #include // --- Process Control --- @@ -89,7 +96,7 @@ lseek(int file, int ptr, int dir) { } int -open(const char *name, int flags, int mode) { +open(const char *name, int flags, ...) { return -1; } @@ -101,7 +108,13 @@ read(int file, char *ptr, int len) { } int -_stat(int file, struct stat *st) { +fstat(int file, struct stat *st) { + st->st_mode = S_IFCHR; + return 0; +} + +int +stat(const char *file, struct stat *st){ st->st_mode = S_IFCHR; return 0; } @@ -116,6 +129,9 @@ unlink(char *name) { int write(int file, char *ptr, int len) { //XXX: write to stdout + if(file == 1){ + wconsole(ptr, len); + } return -1; } @@ -136,19 +152,27 @@ extern caddr_t _end; */ caddr_t sbrk(int nbytes){ - static caddr_t heap_ptr = NULL; + static unsigned long long heap_ptr = 0; caddr_t base; int temp; - if(heap_ptr == NULL){ - heap_ptr = (caddr_t)HEAP_ADDR; + if(heap_ptr == 0){ + heap_ptr = HEAP_ADDR; } - base = heap_ptr; + base = (caddr_t)heap_ptr; - if(((unsigned long long)heap_ptr & ~PAGE_MASK) != 0ULL){ - temp = (PAGE_SIZE - ((unsigned long long)heap_ptr & ~PAGE_MASK)); + if(nbytes < 0){ + heap_ptr -= nbytes; + + //XXX: freePage() + + return base; + } + + if( (heap_ptr & ~PAGE_MASK) != 0ULL){ + temp = (PAGE_SIZE - (heap_ptr & ~PAGE_MASK)); if( nbytes < temp ){ heap_ptr += nbytes; @@ -161,6 +185,7 @@ sbrk(int nbytes){ while(nbytes > PAGE_SIZE){ allocPage(heap_ptr); + nbytes -= (int) PAGE_SIZE; heap_ptr = heap_ptr + PAGE_SIZE; } @@ -193,7 +218,7 @@ sbrk(int nbytes){ // --- Other --- + int gettimeofday(struct timeval *p, void *z){ + return -1; + } -int times(struct tms *buf) { - return -1; -} diff --git a/newlib-files/vanilla-syscalls.c b/newlib-files/vanilla-syscalls.c new file mode 100644 index 0000000..aa0c31c --- /dev/null +++ b/newlib-files/vanilla-syscalls.c @@ -0,0 +1,210 @@ +#include +#include +#include +#include +#include +#include +#include + +//#include <_ansi.h> +#include + +// --- Process Control --- + +int +_exit(int val){ + exit(val); + return (-1); +} + +int +execve(char *name, char **argv, char **env) { + errno = ENOMEM; + return -1; +} + +/* + * getpid -- only one process, so just return 1. + */ +#define __MYPID 1 +int +getpid() +{ + return __MYPID; +} + + +int +fork(void) { + errno = ENOTSUP; + return -1; +} + + +/* + * kill -- go out via exit... + */ +int +kill(pid, sig) + int pid; + int sig; +{ + if(pid == __MYPID) + _exit(sig); + + + errno = EINVAL; + return -1; +} + +int +wait(int *status) { + errno = ECHILD; + return -1; +} + +// --- I/O --- + +/* + * isatty -- returns 1 if connected to a terminal device, + * returns 0 if not. Since we're hooked up to a + * serial port, we'll say yes and return a 1. + */ +int +isatty(fd) + int fd; +{ + return (1); +} + + +int +close(int file) { + return -1; +} + +int +link(char *old, char *new) { + errno = EMLINK; + return -1; +} + +int +lseek(int file, int ptr, int dir) { + return 0; +} + +int +open(const char *name, int flags, ...) { + return -1; +} + +int +read(int file, char *ptr, int len) { + // XXX: keyboard support + + return 0; +} + +int +fstat(int file, struct stat *st) { + st->st_mode = S_IFCHR; + return 0; +} + +int +stat(const char *file, struct stat *st){ + st->st_mode = S_IFCHR; + return 0; +} + +int +unlink(char *name) { + errno = ENOENT; + return -1; +} + + +int +write(int file, char *ptr, int len) { + return -1; +} + +// --- Memory --- + +/* _end is set in the linker command file */ +extern caddr_t _end; + +#define PAGE_SIZE 4096ULL +#define PAGE_MASK 0xFFFFFFFFFFFFF000ULL +#define HEAP_ADDR (((unsigned long long)&_end + PAGE_SIZE) & PAGE_MASK) + +/* + * sbrk -- changes heap size size. Get nbytes more + * RAM. We just increment a pointer in what's + * left of memory on the board. + */ +caddr_t +sbrk(int nbytes){ + static caddr_t heap_ptr = NULL; + caddr_t base; + + int temp; + + if(heap_ptr == NULL){ + heap_ptr = (caddr_t)HEAP_ADDR; + } + + base = heap_ptr; + + if(((unsigned long long)heap_ptr & ~PAGE_MASK) != 0ULL){ + temp = (PAGE_SIZE - ((unsigned long long)heap_ptr & ~PAGE_MASK)); + + if( nbytes < temp ){ + heap_ptr += nbytes; + nbytes = 0; + }else{ + heap_ptr += temp; + nbytes -= temp; + } + } + + while(nbytes > PAGE_SIZE){ + //allocPage(heap_ptr); + + nbytes -= (int) PAGE_SIZE; + heap_ptr = heap_ptr + PAGE_SIZE; + } + + if( nbytes > 0){ + //allocPage(heap_ptr); + + heap_ptr += nbytes; + } + + + return base; + /* + static caddr_t heap_ptr = NULL; + caddr_t base; + + if (heap_ptr == NULL) { + heap_ptr = (caddr_t)&_end; + } + + if ((RAMSIZE - heap_ptr) >= 0) { + base = heap_ptr; + heap_ptr += nbytes; + return (base); + } else { + errno = ENOMEM; + return ((caddr_t)-1); + }*/ +} + + +// --- Other --- + int gettimeofday(struct timeval *p, void *z){ + return -1; + } + diff --git a/newlib.patch b/newlib.patch index 55ce6e3..7fd679c 100644 --- a/newlib.patch +++ b/newlib.patch @@ -4,7 +4,7 @@ | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ -+ | -{{OSNAME}}* \ ++ | -xomb* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ @@ -14,7 +14,7 @@ sysvnecv70) AC_CONFIG_SUBDIRS(sysvnecv70) ;; tic80) AC_CONFIG_SUBDIRS(tic80) ;; w65) AC_CONFIG_SUBDIRS(w65) ;; -+ {{OSNAME}}) AC_CONFIG_SUBDIRS({{OSNAME}}) ;; ++ xomb) AC_CONFIG_SUBDIRS(xomb) ;; z8ksim) AC_CONFIG_SUBDIRS(z8ksim) ;; esac; fi @@ -24,8 +24,8 @@ w65-*-*) sys_dir=w65 ;; -+ x86_64-*-{{OSNAME}}*) -+ sys_dir={{OSNAME}} ++ x86_64-*-xomb*) ++ sys_dir=xomb + ;; xscale-*-*) sys_dir=arm