RISC-V cross compiler now builds (XCC)
authorAndrew Waterman <waterman@s144.Millennium.Berkeley.EDU>
Thu, 3 Nov 2011 01:29:43 +0000 (18:29 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 01:28:05 +0000 (18:28 -0700)
15 files changed:
GNUmakefile
tools/compilers/gcc-glibc/Makefile
tools/compilers/gcc-glibc/binutils-2.21.1-riscv.patch
tools/compilers/gcc-glibc/glibc-2.14.1-riscv.patch
tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/bits/libc-lock.h
tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/glob64.c [new file with mode: 0644]
tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/malloc-machine.h
tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/readlink.c
tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/riscv/sysdep.h [new file with mode: 0644]
tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/riscv/tls.h [new file with mode: 0644]
tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/start.c
user/parlib/include/riscv/arch.h [new file with mode: 0644]
user/parlib/include/riscv/atomic.h [new file with mode: 0644]
user/parlib/include/riscv/bitmask.h [new file with mode: 0644]
user/parlib/include/riscv/vcore.h [new file with mode: 0644]

index 2939ab2..404497e 100644 (file)
@@ -183,6 +183,7 @@ install-libs:
 fill-kfs: install-libs
        @rm -rf $(FIRST_INITRAMFS_PATH)/lib
        @cp -R $(GCC_ROOT)/$(TARGET_ARCH)-ros/lib $(FIRST_INITRAMFS_PATH)
+endif
 
 userclean:
        @for i in $(USER_LIBS) ; do \
@@ -192,7 +193,6 @@ userclean:
        done
        @rm -rf $(OBJDIR)/$(TESTS_DIR)
 .PHONY: tests
-endif
 
 # Eliminate default suffix rules
 .SUFFIXES:
index cddf99a..c7989cc 100644 (file)
@@ -71,7 +71,6 @@ riscv:
        $(MAKE) make-all
 
 x86:
-       $(MAKE) .glibc-patch
        export LD_LIBRARY_PATH=; \
        export DESTDIR=$(DESTDIR);\
        export INSTDIR=$(X86_INSTDIR);\
@@ -84,11 +83,9 @@ x86:
        $(MAKE) make-all
 
 make-all: 
-       $(MAKE) .glibc-patch
        $(MAKE) .$(BINARY_PREFIX)binutils-make
        $(MAKE) .$(BINARY_PREFIX)binutils-install
        $(MAKE) .$(BINARY_PREFIX)ros-headers-install
-       $(MAKE) .$(BINARY_PREFIX)glibc-headers-install
        $(MAKE) .$(BINARY_PREFIX)gcc-stage1-make
        $(MAKE) .$(BINARY_PREFIX)gcc-stage1-install
        $(MAKE) .$(BINARY_PREFIX)glibc-make
@@ -130,7 +127,6 @@ gcc-clean:
        make clean
 
 glibc-clean:
-       cd $(BINARY_PREFIX)glibc-headers-builddir; \
        cd $(BINARY_PREFIX)glibc-builddir; \
        make clean
 
@@ -152,15 +148,17 @@ gcc-$(GCC_VERSION): gcc-$(GCC_VERSION).tar.bz2
 glibc-$(GLIBC_VERSION): glibc-$(GLIBC_VERSION).tar.bz2
        rm -rf glibc-$(GLIBC_VERSION)
        tar -jxf glibc-$(GLIBC_VERSION).tar.bz2
+       $(MAKE) .glibc-patch
+       patch --no-backup-if-mismatch -p0 < glibc-$(GLIBC_VERSION)-riscv.patch
        rm glibc-$(GLIBC_VERSION)/sysdeps/sparc/sparc32/elf/start.S
+       rm glibc-$(GLIBC_VERSION)/sysdeps/riscv/elf/start.S
+       rm glibc-$(GLIBC_VERSION)/sysdeps/riscv/init-first.c
        rm glibc-$(GLIBC_VERSION)/sysdeps/i386/elf/start.S
        rm glibc-$(GLIBC_VERSION)/sysdeps/i386/____longjmp_chk.S
        rm glibc-$(GLIBC_VERSION)/sysdeps/i386/init-first.c
        rm glibc-$(GLIBC_VERSION)/sysdeps/i386/sysdep.h
-       $(MAKE) .glibc-patch
-       patch --no-backup-if-mismatch -p0 < glibc-$(GLIBC_VERSION)-riscv.patch
 
-.glibc-patch: glibc-$(GLIBC_VERSION)
+.glibc-patch:
        -cd glibc-$(GLIBC_VERSION); \
        diff -ruB --unidirectional-new-file \
             ../glibc-$(GLIBC_VERSION) \
@@ -172,10 +170,6 @@ $(BINARY_PREFIX)binutils-builddir: binutils-$(BINUTILS_VERSION)
        rm -rf $@
        cp -R binutils-$(BINUTILS_VERSION) $@
 
-$(BINARY_PREFIX)glibc-headers-builddir: glibc-$(GLIBC_VERSION)
-       rm -rf $@
-       mkdir -p $@
-
 $(BINARY_PREFIX)gcc-stage1-builddir: gcc-$(GCC_VERSION)
        rm -rf $@
        mkdir -p $@
@@ -208,30 +202,6 @@ $(BINARY_PREFIX)gcc-stage2-builddir: gcc-$(GCC_VERSION)
        cd $(BINARY_PREFIX)binutils-builddir; \
        make -j $(MAKE_JOBS) install
 
-.$(BINARY_PREFIX)glibc-headers-configure:
-       $(MAKE) $(BINARY_PREFIX)glibc-headers-builddir
-       cd $(BINARY_PREFIX)glibc-headers-builddir; \
-       ../glibc-$(GLIBC_VERSION)/configure \
-                 --host=$(ARCH)-ros \
-                 --enable-hacker-mode \
-                 --enable-shared \
-                 --disable-nls \
-                 --with-elf \
-                 --with-tls \
-                 --with-__thread \
-                 --prefix=$(INSTDIR)/$(ARCH)-ros \
-                 --with-headers=$(INSTDIR)/$(ARCH)-ros/sys-include \
-                 libc_cv_forced_unwind=yes \
-                 libc_cv_c_cleanup=yes;
-       touch $@
-
-.$(BINARY_PREFIX)glibc-headers-install: .$(BINARY_PREFIX)glibc-headers-configure
-       cd $(BINARY_PREFIX)glibc-headers-builddir; \
-       make -j $(MAKE_JOBS) install-headers; \
-       mkdir -p $(INSTDIR)/$(ARCH)-ros/include/gnu; \
-       echo > $(INSTDIR)/$(ARCH)-ros/include/gnu/stubs.h; \
-       cp bits/stdio_lim.h $(INSTDIR)/$(ARCH)-ros/include/bits/
-
 .$(BINARY_PREFIX)ros-headers-install: $(ROSDIR)
        rm -rf $(INSTDIR)/$(ARCH)-ros/sys-include/*
        mkdir -p $(INSTDIR)/$(ARCH)-ros/sys-include
@@ -254,6 +224,7 @@ $(BINARY_PREFIX)gcc-stage2-builddir: gcc-$(GCC_VERSION)
        ../gcc-$(GCC_VERSION)/configure \
                --enable-languages=c \
                --enable-shared \
+               --enable-tls \
                --disable-checking \
                --disable-werror \
                --disable-multilib \
@@ -314,6 +285,7 @@ $(BINARY_PREFIX)gcc-stage2-builddir: gcc-$(GCC_VERSION)
        cd $(BINARY_PREFIX)gcc-stage2-builddir; \
        ../gcc-$(GCC_VERSION)/configure \
                  --enable-shared \
+                 --enable-tls \
                  --disable-multilib \
                  --disable-nls \
                  --program-prefix=$(BINARY_PREFIX) \
@@ -321,7 +293,6 @@ $(BINARY_PREFIX)gcc-stage2-builddir: gcc-$(GCC_VERSION)
                  --prefix=$(INSTDIR) \
                  --enable-languages=c,c++ \
                  $(GCC_BUILD_FLAGS) \
-                 --with-tls \
                  --with-__thread \
                  --with-headers=$(INSTDIR)/$(ARCH)-ros/include \
                  --disable-werror;
index f486e85..09324f4 100644 (file)
@@ -5799,8 +5799,8 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elf64-riscv.c binutils-2
 +#include "elf64-target.h"
 diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elfxx-riscv.c binutils-2.21.1/bfd/elfxx-riscv.c
 --- ../binutils-2.21.1-orig/bfd/elfxx-riscv.c  1969-12-31 16:00:00.000000000 -0800
-+++ binutils-2.21.1/bfd/elfxx-riscv.c  2011-10-22 18:50:03.000000000 -0700
-@@ -0,0 +1,9383 @@
++++ binutils-2.21.1/bfd/elfxx-riscv.c  2011-10-28 05:18:11.000000000 -0700
+@@ -0,0 +1,9385 @@
 +/* vim: set ts=8 */
 +/* MIPS-specific support for ELF
 +   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@@ -10151,9 +10151,11 @@ diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elfxx-riscv.c binutils-2
 +  /* Obtain the current value.  */
 +  x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
 +
-+  /* Fix up dst_mask and value for R_MIPS_LO16 relocs on stores. */
-+  if(ELF_R_TYPE (input_bfd, relocation->r_info) == R_MIPS_LO16 &&
-+     ((x & MASK_SD)  == MATCH_SD  ||
++  /* Fix up dst_mask and value for R_RISCV_LO16 relocs on stores. */
++  if((ELF_R_TYPE (input_bfd, relocation->r_info) == R_RISCV_LO16 ||
++      ELF_R_TYPE (input_bfd, relocation->r_info) == R_RISCV_TLS_TPREL_LO16 ||
++      ELF_R_TYPE (input_bfd, relocation->r_info) == R_RISCV_TLS_DTPREL_LO16) &&
++       ((x & MASK_SD)  == MATCH_SD  ||
 +      (x & MASK_SW)  == MATCH_SW  ||
 +      (x & MASK_SH)  == MATCH_SH  ||
 +      (x & MASK_SB)  == MATCH_SB  ||
index 1757e82..e991f9a 100644 (file)
@@ -269,7 +269,7 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/b
 +#endif
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/bits/endian.h glibc-2.14.1/sysdeps/riscv/bits/endian.h
 --- ../glibc-2.14.1-orig/sysdeps/riscv/bits/endian.h   1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/riscv/bits/endian.h   2011-10-25 02:48:44.000000000 -0700
++++ glibc-2.14.1/sysdeps/riscv/bits/endian.h   2011-10-27 21:55:31.000000000 -0700
 @@ -0,0 +1,13 @@
 +/* The MIPS architecture has selectable endianness.
 +   This file is for a machine using big-endian mode.  */
@@ -278,10 +278,10 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/b
 +# error "Never use <bits/endian.h> directly; include <endian.h> instead."
 +#endif
 +
-+#if __MIPSEB
++#if __RISCVEB
 +# define __BYTE_ORDER __BIG_ENDIAN
 +#endif
-+#if __MIPSEL
++#if __RISCVEL
 +# define __BYTE_ORDER __LITTLE_ENDIAN
 +#endif
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/bits/fenv.h glibc-2.14.1/sysdeps/riscv/bits/fenv.h
@@ -3090,34 +3090,6 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/e
 +      .long 0
 +      .weak data_start
 +      data_start = __data_start
-diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/fpregdef.h glibc-2.14.1/sysdeps/riscv/fpregdef.h
---- ../glibc-2.14.1-orig/sysdeps/riscv/fpregdef.h      1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/riscv/fpregdef.h      2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,24 @@
-+/* Copyright (C) 1991, 92, 94, 95, 96 Free Software Foundation, Inc.
-+   This file is part of the GNU C Library.
-+
-+   The GNU C Library is free software; you can redistribute it and/or
-+   modify it under the terms of the GNU Lesser General Public
-+   License as published by the Free Software Foundation; either
-+   version 2.1 of the License, or (at your option) any later version.
-+
-+   The GNU C Library is distributed in the hope that it will be useful,
-+   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+   Lesser General Public License for more details.
-+
-+   You should have received a copy of the GNU Lesser General Public
-+   License along with the GNU C Library; if not, write to the Free
-+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-+   02111-1307 USA.  */
-+
-+#ifndef _FPREGDEF_H
-+#define _FPREGDEF_H
-+
-+#include <sys/fpregdef.h>
-+
-+#endif /* _FPREGDEF_H */
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/fpu/bits/mathinline.h glibc-2.14.1/sysdeps/riscv/fpu/bits/mathinline.h
 --- ../glibc-2.14.1-orig/sysdeps/riscv/fpu/bits/mathinline.h   1969-12-31 16:00:00.000000000 -0800
 +++ glibc-2.14.1/sysdeps/riscv/fpu/bits/mathinline.h   2011-10-25 02:48:44.000000000 -0700
@@ -3176,8 +3148,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/f
 +#endif /* __GNUC__ */
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/fpu/e_sqrt.c glibc-2.14.1/sysdeps/riscv/fpu/e_sqrt.c
 --- ../glibc-2.14.1-orig/sysdeps/riscv/fpu/e_sqrt.c    1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/riscv/fpu/e_sqrt.c    2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,38 @@
++++ glibc-2.14.1/sysdeps/riscv/fpu/e_sqrt.c    2011-10-27 22:20:54.000000000 -0700
+@@ -0,0 +1,26 @@
 +/* Copyright (C) 2002 Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
 +   Contributed by Hartvig Ekner <hartvige@mips.com>, 2002.
@@ -3197,29 +3169,17 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/f
 +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 +   02111-1307 USA.  */
 +
-+
-+#include <sgidefs.h>
-+
-+
-+#if (_MIPS_ISA >= _MIPS_ISA_MIPS2)
-+
 +double
 +__ieee754_sqrt (double x)
 +{
 +  double z;
-+  __asm__ ("sqrt.d %0,%1" : "=f" (z) : "f" (x));
++  __asm__ ("fsqrt.d %0,%1" : "=f" (z) : "f" (x));
 +  return z;
 +}
-+
-+#else
-+
-+#include <sysdeps/ieee754/dbl-64/e_sqrt.c>
-+
-+#endif
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/fpu/e_sqrtf.c glibc-2.14.1/sysdeps/riscv/fpu/e_sqrtf.c
 --- ../glibc-2.14.1-orig/sysdeps/riscv/fpu/e_sqrtf.c   1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/riscv/fpu/e_sqrtf.c   2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,39 @@
++++ glibc-2.14.1/sysdeps/riscv/fpu/e_sqrtf.c   2011-10-27 22:21:11.000000000 -0700
+@@ -0,0 +1,26 @@
 +/* Copyright (C) 2002 Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
 +   Contributed by Hartvig Ekner <hartvige@mips.com>, 2002.
@@ -3239,26 +3199,13 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/f
 +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 +   02111-1307 USA.  */
 +
-+
-+#include <sgidefs.h>
-+
-+
-+#if (_MIPS_ISA >= _MIPS_ISA_MIPS2)
-+
 +float
 +__ieee754_sqrtf (float x)
 +{
 +  float z;
-+  __asm__ ("sqrt.s %0,%1" : "=f" (z) : "f" (x));
++  __asm__ ("fsqrt.s %0,%1" : "=f" (z) : "f" (x));
 +  return z;
 +}
-+
-+#else
-+
-+#include <sysdeps/ieee754/flt-32/e_sqrtf.c>
-+
-+#endif
-+
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/fpu/fclrexcpt.c glibc-2.14.1/sysdeps/riscv/fpu/fclrexcpt.c
 --- ../glibc-2.14.1-orig/sysdeps/riscv/fpu/fclrexcpt.c 1969-12-31 16:00:00.000000000 -0800
 +++ glibc-2.14.1/sysdeps/riscv/fpu/fclrexcpt.c 2011-10-25 02:48:44.000000000 -0700
@@ -5669,11 +5616,10 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/_
 +END(__longjmp)
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/Makefile glibc-2.14.1/sysdeps/riscv/Makefile
 --- ../glibc-2.14.1-orig/sysdeps/riscv/Makefile        1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/riscv/Makefile        2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,10 @@
++++ glibc-2.14.1/sysdeps/riscv/Makefile        2011-10-27 22:23:23.000000000 -0700
+@@ -0,0 +1,9 @@
 +ifeq ($(subdir),misc)
-+sysdep_headers += regdef.h fpregdef.h sys/regdef.h sys/fpregdef.h \
-+                sys/asm.h sgidefs.h
++sysdep_headers += sys/asm.h sgidefs.h
 +endif
 +
 +ifeq ($(subdir),rt)
@@ -5981,8 +5927,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/n
 +TID_OFFSET                    thread_offsetof (tid)
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/nptl/tls.h glibc-2.14.1/sysdeps/riscv/nptl/tls.h
 --- ../glibc-2.14.1-orig/sysdeps/riscv/nptl/tls.h      1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/riscv/nptl/tls.h      2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,173 @@
++++ glibc-2.14.1/sysdeps/riscv/nptl/tls.h      2011-10-27 22:17:29.000000000 -0700
+@@ -0,0 +1,165 @@
 +/* Definition for thread-local data handling.  NPTL/MIPS version.
 +   Copyright (C) 2005, 2007 Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
@@ -6023,9 +5969,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/n
 +  } pointer;
 +} dtv_t;
 +
-+# define READ_THREAD_POINTER() \
-+    ({ register void* __result asm("tp");      \
-+       __result; })
++register void* __thread_self asm("tp");
++# define READ_THREAD_POINTER() ({ __thread_self; })
 +
 +#endif /* __ASSEMBLER__ */
 +
@@ -6092,16 +6037,9 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/n
 +# define GET_DTV(tcbp) \
 +  (((tcbhead_t *) (tcbp))[-1].dtv)
 +
-+/* Code to initially initialize the thread pointer.  This might need
-+   special attention since 'errno' is not yet available and if the
-+   operation can cause a failure 'errno' must not be touched.  */
++/* Code to initially initialize the thread pointer. */
 +# define TLS_INIT_TP(tcbp, secondcall) \
-+  ({ INTERNAL_SYSCALL_DECL (err);                                     \
-+     long result_var;                                                 \
-+     result_var = INTERNAL_SYSCALL (set_thread_area, err, 1,          \
-+                                  (char *) (tcbp) + TLS_TCB_OFFSET);  \
-+     INTERNAL_SYSCALL_ERROR_P (result_var, err)                               \
-+       ? "unknown error" : NULL; })
++  ({ __thread_self = (char*)tcbp + TLS_TCB_OFFSET; NULL; })
 +
 +/* Return the address of the dtv for the current thread.  */
 +# define THREAD_DTV() \
@@ -6181,37 +6119,6 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/p
 +  CPPFLAGS="$CPPFLAGS -mabi=$mips_config_abi"
 +fi
 +;;
-diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/regdef.h glibc-2.14.1/sysdeps/riscv/regdef.h
---- ../glibc-2.14.1-orig/sysdeps/riscv/regdef.h        1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/riscv/regdef.h        2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,27 @@
-+/* Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
-+   This file is part of the GNU C Library.
-+   Contributed by Ralf Baechle <ralf@gnu.org>.
-+
-+   The GNU C Library is free software; you can redistribute it and/or
-+   modify it under the terms of the GNU Lesser General Public
-+   License as published by the Free Software Foundation; either
-+   version 2.1 of the License, or (at your option) any later version.
-+
-+   The GNU C Library is distributed in the hope that it will be useful,
-+   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+   Lesser General Public License for more details.
-+
-+   You should have received a copy of the GNU Lesser General Public
-+   License along with the GNU C Library; if not, write to the Free
-+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-+   02111-1307 USA.  */
-+
-+#ifndef _REGDEF_H
-+#define _REGDEF_H
-+
-+#include <sys/regdef.h>
-+#include <sys/fpregdef.h>
-+
-+#endif /* _REGDEF_H */
-+
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/rv32/Implies glibc-2.14.1/sysdeps/riscv/rv32/Implies
 --- ../glibc-2.14.1-orig/sysdeps/riscv/rv32/Implies    1969-12-31 16:00:00.000000000 -0800
 +++ glibc-2.14.1/sysdeps/riscv/rv32/Implies    2011-10-25 02:48:44.000000000 -0700
@@ -7744,8 +7651,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/s
 +weak_alias(_setjmp, __GI__setjmp)
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/sgidefs.h glibc-2.14.1/sysdeps/riscv/sgidefs.h
 --- ../glibc-2.14.1-orig/sysdeps/riscv/sgidefs.h       1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/riscv/sgidefs.h       2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,73 @@
++++ glibc-2.14.1/sysdeps/riscv/sgidefs.h       2011-10-27 22:22:09.000000000 -0700
+@@ -0,0 +1,41 @@
 +/* Copyright (C) 1996, 1997, 1998, 2003, 2004 Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
 +   Contributed by Ralf Baechle <ralf@gnu.org>.
@@ -7769,38 +7676,6 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/s
 +#define _SGIDEFS_H    1
 +
 +/*
-+ * A crude hack to stop <asm/sgidefs.h>
-+ */
-+#undef __ASM_SGIDEFS_H
-+#define __ASM_SGIDEFS_H
-+
-+/*
-+ * And remove any damage it might have already done
-+ */
-+#undef _MIPS_ISA_MIPS1
-+#undef _MIPS_ISA_MIPS2
-+#undef _MIPS_ISA_MIPS3
-+#undef _MIPS_ISA_MIPS4
-+#undef _MIPS_ISA_MIPS5
-+#undef _MIPS_ISA_MIPS32
-+#undef _MIPS_ISA_MIPS64
-+
-+#undef _RISCV_SIM_ABI32
-+#undef _RISCV_SIM_NABI32
-+#undef _RISCV_SIM_ABI64
-+
-+/*
-+ * Definitions for the ISA level
-+ */
-+#define _MIPS_ISA_MIPS1 1
-+#define _MIPS_ISA_MIPS2 2
-+#define _MIPS_ISA_MIPS3 3
-+#define _MIPS_ISA_MIPS4 4
-+#define _MIPS_ISA_MIPS5 5
-+#define _MIPS_ISA_MIPS32 6
-+#define _MIPS_ISA_MIPS64 7
-+
-+/*
 + * Subprogram calling convention
 + */
 +#ifndef _ABIO32
@@ -8143,34 +8018,6 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/s
 +#endif
 +
 +#endif /* sys/asm.h */
-diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/sys/fpregdef.h glibc-2.14.1/sysdeps/riscv/sys/fpregdef.h
---- ../glibc-2.14.1-orig/sysdeps/riscv/sys/fpregdef.h  1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/riscv/sys/fpregdef.h  2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,24 @@
-+/* Copyright (C) 1991,92,94,95,96,97,98,2009 Free Software Foundation, Inc.
-+   This file is part of the GNU C Library.
-+
-+   The GNU C Library is free software; you can redistribute it and/or
-+   modify it under the terms of the GNU Lesser General Public
-+   License as published by the Free Software Foundation; either
-+   version 2.1 of the License, or (at your option) any later version.
-+
-+   The GNU C Library is distributed in the hope that it will be useful,
-+   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+   Lesser General Public License for more details.
-+
-+   You should have received a copy of the GNU Lesser General Public
-+   License along with the GNU C Library; if not, write to the Free
-+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-+   02111-1307 USA.  */
-+
-+#ifndef _SYS_FPREGDEF_H
-+#define _SYS_FPREGDEF_H
-+
-+#include <sgidefs.h>
-+
-+#endif /* sys/fpregdef.h */
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/riscv/sys/ucontext.h glibc-2.14.1/sysdeps/riscv/sys/ucontext.h
 --- ../glibc-2.14.1-orig/sysdeps/riscv/sys/ucontext.h  1969-12-31 16:00:00.000000000 -0800
 +++ glibc-2.14.1/sysdeps/riscv/sys/ucontext.h  2011-10-25 02:48:44.000000000 -0700
@@ -8539,8 +8386,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/ri
 +}
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/riscv/sysdep.h glibc-2.14.1/sysdeps/unix/riscv/sysdep.h
 --- ../glibc-2.14.1-orig/sysdeps/unix/riscv/sysdep.h   1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/unix/riscv/sysdep.h   2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,74 @@
++++ glibc-2.14.1/sysdeps/unix/riscv/sysdep.h   2011-10-27 22:23:40.000000000 -0700
+@@ -0,0 +1,73 @@
 +/* Copyright (C) 1992, 1995, 1997, 1999, 2000, 2002, 2003, 2004
 +   Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
@@ -8565,7 +8412,6 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/ri
 +
 +#ifdef __ASSEMBLER__
 +
-+#include <regdef.h>
 +#include <sys/asm.h>
 +
 +#define ENTRY(name) LEAF(name)
@@ -11598,8 +11444,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +#endif
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/getcontext.S glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/getcontext.S
 --- ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/getcontext.S    1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/getcontext.S    2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,83 @@
++++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/getcontext.S    2011-10-27 22:24:14.000000000 -0700
+@@ -0,0 +1,81 @@
 +/* Save current context.
 +   Copyright (C) 2009 Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
@@ -11622,8 +11468,6 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +
 +#include <sysdep.h>
 +#include <sys/asm.h>
-+#include <sys/fpregdef.h>
-+#include <sys/regdef.h>
 +
 +#include "ucontext_i.h"
 +
@@ -12023,12 +11867,10 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +#include <__longjmp.S>
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/makecontext.c glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/makecontext.c
 --- ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/makecontext.c   1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/makecontext.c   2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,36 @@
++++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/makecontext.c   2011-10-27 22:23:54.000000000 -0700
+@@ -0,0 +1,34 @@
 +#include <sysdep.h>
 +#include <sys/asm.h>
-+#include <sys/fpregdef.h>
-+#include <sys/regdef.h>
 +#include <sys/ucontext.h>
 +#include <stdarg.h>
 +
@@ -14388,8 +14230,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +weak_alias (__umount, umount);
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/setcontext.S glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/setcontext.S
 --- ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/setcontext.S    1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/setcontext.S    2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,131 @@
++++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/setcontext.S    2011-10-27 22:24:24.000000000 -0700
+@@ -0,0 +1,129 @@
 +/* Set current context.
 +   Copyright (C) 2009 Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
@@ -14412,8 +14254,6 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +
 +#include <sysdep.h>
 +#include <sys/asm.h>
-+#include <sys/fpregdef.h>
-+#include <sys/regdef.h>
 +
 +#include "ucontext_i.h"
 +
@@ -14861,8 +14701,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +#endif
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/__start_context.S glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/__start_context.S
 --- ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/__start_context.S       1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/__start_context.S       2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,41 @@
++++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/__start_context.S       2011-10-27 22:24:01.000000000 -0700
+@@ -0,0 +1,39 @@
 +/* Modify saved context.
 +   Copyright (C) 2009 Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
@@ -14885,8 +14725,6 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +
 +#include <sysdep.h>
 +#include <sys/asm.h>
-+#include <sys/fpregdef.h>
-+#include <sys/regdef.h>
 +
 +#include "ucontext_i.h"
 +
@@ -14906,8 +14744,8 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +PSEUDO_END (__start_context)
 diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/swapcontext.S glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/swapcontext.S
 --- ../glibc-2.14.1-orig/sysdeps/unix/sysv/linux/riscv/swapcontext.S   1969-12-31 16:00:00.000000000 -0800
-+++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/swapcontext.S   2011-10-25 02:48:44.000000000 -0700
-@@ -0,0 +1,129 @@
++++ glibc-2.14.1/sysdeps/unix/sysv/linux/riscv/swapcontext.S   2011-10-27 22:24:08.000000000 -0700
+@@ -0,0 +1,127 @@
 +/* Save and set current context.
 +   Copyright (C) 2009 Free Software Foundation, Inc.
 +   This file is part of the GNU C Library.
@@ -14930,8 +14768,6 @@ diff -x manual -x po -x autom4te.cache -ruN ../glibc-2.14.1-orig/sysdeps/unix/sy
 +
 +#include <sysdep.h>
 +#include <sys/asm.h>
-+#include <sys/fpregdef.h>
-+#include <sys/regdef.h>
 +
 +#include "ucontext_i.h"
 +
index 286a793..a77da81 100644 (file)
@@ -35,7 +35,7 @@ typedef int __libc_lock_t;
 typedef struct __libc_lock_recursive { 
        __libc_lock_t lock; 
        int count; 
-       int owner; 
+       void* owner; 
 } __libc_lock_recursive_t;
 #define _LIBC_LOCK_RECURSIVE_INITIALIZER {_LIBC_LOCK_INITIALIZER,0,0}
 
diff --git a/tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/glob64.c b/tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/glob64.c
new file mode 100644 (file)
index 0000000..36e42cc
--- /dev/null
@@ -0,0 +1,5 @@
+#include <limits.h>
+
+#if __WORDSIZE != 64
+# include <posix/glob64.c>
+#endif
index 61febf6..c3da381 100644 (file)
@@ -35,7 +35,7 @@ __libc_lock_define (typedef, mutex_t)
 
 #include <bits/libc-tsd.h>
 
-typedef int tsd_key_t[1];      /* no key data structure, libc magic does it */
+typedef void* tsd_key_t;       /* no key data structure, libc magic does it */
 __libc_tsd_define (static, void *, MALLOC)     /* declaration/common definition */
 #define tsd_key_create(key, destr)     ((void) (key))
 #define tsd_setspecific(key, data)     __libc_tsd_set (void *, MALLOC, (data))
index c9cf9da..851395d 100644 (file)
 /* Read the contents of the symbolic link PATH into no more than
    LEN bytes of BUF.  The contents are not null-terminated.
    Returns the number of characters read, or -1 for errors.  */
+
 ssize_t
-__readlink (path, buf, len)
-     const char *path;
-     char *buf;
-     size_t len;
+readlink (const char* path, char* buf, size_t len)
 {
   return ros_syscall(SYS_readlink, path, strlen(path), buf, len, 0, 0);
 }
-weak_alias (__readlink, readlink)
+
+/* __readlink has a different signature, so we can't just weak_alias it. */
+
+int
+__readlink (const char* path, char* buf, size_t len)
+{
+  return (int) readlink (path, buf, len);
+}
diff --git a/tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/riscv/sysdep.h b/tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/riscv/sysdep.h
new file mode 100644 (file)
index 0000000..3aef3da
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef _ROS_RISCV_SYSDEP_H
+#define _ROS_RISCV_SYSDEP_H
+
+#include <sysdeps/unix/riscv/sysdep.h>
+
+#define PTR_MANGLE(a) (a)
+#define PTR_DEMANGLE(a) (a)
+
+#endif
diff --git a/tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/riscv/tls.h b/tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/riscv/tls.h
new file mode 100644 (file)
index 0000000..4544769
--- /dev/null
@@ -0,0 +1,175 @@
+/* Definition for thread-local data handling.  NPTL/MIPS version.
+   Copyright (C) 2005, 2007 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef _TLS_H
+#define _TLS_H 1
+
+#include <dl-sysdep.h>
+
+#ifndef __ASSEMBLER__
+# include <stdbool.h>
+# include <stddef.h>
+# include <stdint.h>
+
+/* Type for the dtv.  */
+typedef union dtv
+{
+  size_t counter;
+  struct
+  {
+    void *val;
+    bool is_static;
+  } pointer;
+} dtv_t;
+
+register void* __thread_self asm("tp");
+# define READ_THREAD_POINTER() ({ __thread_self; })
+
+#endif /* __ASSEMBLER__ */
+
+
+/* We require TLS support in the tools.  */
+#ifndef HAVE_TLS_SUPPORT
+# error "TLS support is required."
+#endif
+
+/* Signal that TLS support is available.  */
+#define USE_TLS        1
+
+#ifndef __ASSEMBLER__
+
+/* Get system call information.  */
+# include <sysdep.h>
+
+/* The TP points to the start of the thread blocks.  */
+# define TLS_DTV_AT_TP 1
+
+typedef struct
+{
+  dtv_t *dtv;
+  void *private;
+} tcbhead_t;
+
+typedef struct rthread {
+    struct
+    {
+      int multiple_threads;
+      int gscope_flag;
+# ifndef __ASSUME_PRIVATE_FUTEX
+      int private_futex;
+# endif
+    } header;
+
+       void* __padding[1];
+} rthread_t;
+
+/* This is the size of the initial TCB.  Because our TCB is before the thread
+   pointer, we don't need this.  */
+# define TLS_INIT_TCB_SIZE     0
+
+/* Alignment requirements for the initial TCB.  */
+# define TLS_INIT_TCB_ALIGN    __alignof__ (struct rthread)
+
+/* This is the size of the TCB.  Because our TCB is before the thread
+   pointer, we don't need this.  */
+# define TLS_TCB_SIZE          0
+
+/* Alignment requirements for the TCB.  */
+# define TLS_TCB_ALIGN         __alignof__ (struct rthread)
+
+/* This is the size we need before TCB - actually, it includes the TCB.  */
+# define TLS_PRE_TCB_SIZE \
+  (sizeof (struct rthread)                                                   \
+   + ((sizeof (tcbhead_t) + TLS_TCB_ALIGN - 1) & ~(TLS_TCB_ALIGN - 1)))
+
+/* The thread pointer (in hardware register $29) points to the end of
+   the TCB + 0x7000, as for PowerPC.  The rthread_descr structure is
+   immediately in front of the TCB.  */
+# define TLS_TCB_OFFSET        0x7000
+
+/* Install the dtv pointer.  The pointer passed is to the element with
+   index -1 which contain the length.  */
+# define INSTALL_DTV(tcbp, dtvp) \
+  (((tcbhead_t *) (tcbp))[-1].dtv = (dtvp) + 1)
+
+/* Install new dtv for current thread.  */
+# define INSTALL_NEW_DTV(dtv) \
+  (THREAD_DTV() = (dtv))
+
+/* Return dtv of given thread descriptor.  */
+# define GET_DTV(tcbp) \
+  (((tcbhead_t *) (tcbp))[-1].dtv)
+
+/* Code to initially initialize the thread pointer. */
+# define TLS_INIT_TP(tcbp, secondcall) \
+  ({ __thread_self = (char*)tcbp + TLS_TCB_OFFSET; NULL; })
+
+/* Return the address of the dtv for the current thread.  */
+# define THREAD_DTV() \
+  (((tcbhead_t *) (READ_THREAD_POINTER () - TLS_TCB_OFFSET))[-1].dtv)
+
+/* Return the thread descriptor for the current thread.  */
+# define THREAD_SELF \
+ ((struct rthread *) (READ_THREAD_POINTER ()                        \
+                     - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE))
+
+/* Magic for libthread_db to know how to do THREAD_SELF.  */
+# define DB_THREAD_SELF \
+  CONST_THREAD_AREA (32, TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE)
+
+/* Access to data in the thread descriptor is easy.  */
+# define THREAD_GETMEM(descr, member) \
+  descr->member
+# define THREAD_GETMEM_NC(descr, member, idx) \
+  descr->member[idx]
+# define THREAD_SETMEM(descr, member, value) \
+  descr->member = (value)
+# define THREAD_SETMEM_NC(descr, member, idx, value) \
+  descr->member[idx] = (value)
+
+/* l_tls_offset == 0 is perfectly valid on MIPS, so we have to use some
+   different value to mean unset l_tls_offset.  */
+# define NO_TLS_OFFSET         -1
+
+/* Get and set the global scope generation counter in struct rthread.  */
+#define THREAD_GSCOPE_FLAG_UNUSED 0
+#define THREAD_GSCOPE_FLAG_USED   1
+#define THREAD_GSCOPE_FLAG_WAIT   2
+#define THREAD_GSCOPE_RESET_FLAG() \
+  do                                                                        \
+    { int __res                                                                     \
+       = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag,             \
+                              THREAD_GSCOPE_FLAG_UNUSED);                   \
+      if (__res == THREAD_GSCOPE_FLAG_WAIT)                                 \
+       lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE);   \
+    }                                                                       \
+  while (0)
+#define THREAD_GSCOPE_SET_FLAG() \
+  do                                                                        \
+    {                                                                       \
+      THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED;            \
+      atomic_write_barrier ();                                              \
+    }                                                                       \
+  while (0)
+#define THREAD_GSCOPE_WAIT() \
+  GL(dl_wait_lookup_done) ()
+
+#endif /* __ASSEMBLER__ */
+
+#endif /* tls.h */
diff --git a/user/parlib/include/riscv/arch.h b/user/parlib/include/riscv/arch.h
new file mode 100644 (file)
index 0000000..7f9f88c
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef PARLIB_ARCH_H
+#define PARLIB_ARCH_H
+
+#include <ros/common.h>
+
+#define internal_function
+
+#define ARCH_CL_SIZE 64
+
+static __inline void
+set_stack_pointer(void* sp)
+{
+       asm volatile ("move sp, %0" : : "r"(sp));
+}
+
+static __inline void
+breakpoint(void)
+{
+       asm volatile ("break");
+}
+
+static __inline uint64_t
+read_tsc(void)
+{
+       unsigned long cycles;
+       asm ("rdcycle %0" : "=r"(cycles));
+       return (uint64_t)cycles;
+}
+
+static __inline void
+cpu_relax(void)
+{
+       long ctr = 8;
+       asm volatile("1: addi %0, %0, -1; bnez %0, 1b" : "=&r"(ctr) : : "memory");
+}
+
+#endif /* PARLIB_ARCH_H */
diff --git a/user/parlib/include/riscv/atomic.h b/user/parlib/include/riscv/atomic.h
new file mode 100644 (file)
index 0000000..7422ef6
--- /dev/null
@@ -0,0 +1,161 @@
+#ifndef PARLIB_ARCH_ATOMIC_H
+#define PARLIB_ARCH_ATOMIC_H
+
+/* Unlike in x86, we need to include spinlocks in the user atomic ops file.
+ * Since compare and swap isn't truely non-blocking, and we can't disable
+ * interrupts in userspace, there is a slight chance of deadlock. */
+
+#include <ros/common.h>
+#include <ros/atomic.h>
+#include <ros/arch/membar.h>
+
+typedef struct
+{
+       volatile uint32_t rlock;
+} spinlock_t;
+
+#define SPINLOCK_INITIALIZER {0}
+
+static inline void atomic_init(atomic_t *number, long val);
+static inline long atomic_read(atomic_t *number);
+static inline void atomic_set(atomic_t *number, long val);
+static inline void atomic_inc(atomic_t *number);
+static inline void atomic_dec(atomic_t *number);
+static inline long atomic_fetch_and_add(atomic_t *number, long val);
+static inline long atomic_swap(atomic_t *addr, long val);
+static inline void *atomic_swap_ptr(void **addr, void *val);
+static inline uint32_t atomic_swap_u32(uint32_t *addr, uint32_t val);
+static inline bool atomic_cas(atomic_t *addr, long exp_val, long new_val);
+static inline bool atomic_cas_ptr(void **addr, void *exp_val, void *new_val);
+static inline bool atomic_cas_u32(uint32_t *addr, uint32_t exp_val,
+                                  uint32_t new_val);
+static inline void atomic_or_int(volatile int *number, int mask);
+static inline uint32_t spin_trylock(spinlock_t* lock);
+static inline uint32_t spin_locked(spinlock_t* lock);
+static inline void spin_lock(spinlock_t* lock);
+static inline void spin_unlock(spinlock_t* lock);
+
+/* Inlined functions declared above */
+
+static inline void atomic_init(atomic_t *number, long val)
+{
+       *(volatile long*)number = val;
+}
+
+static inline long atomic_read(atomic_t *number)
+{
+       return *(volatile long*)number;
+}
+
+/* Sparc needs atomic add, but the regular ROS atomic add conflicts with
+ * glibc's internal one. */
+static inline void ros_atomic_add(atomic_t *number, long inc)
+{
+       atomic_fetch_and_add(number, inc);
+}
+
+static inline void atomic_set(atomic_t *number, long val)
+{
+       atomic_init(number, val);
+}
+
+static inline void atomic_inc(atomic_t *number)
+{
+       ros_atomic_add(number, 1);
+}
+
+static inline void atomic_dec(atomic_t *number)
+{
+       ros_atomic_add(number, -1);
+}
+
+/* Adds val to number, returning number's original value */
+static inline long atomic_fetch_and_add(atomic_t *number, long val)
+{
+       return __sync_fetch_and_add((long*)number, val);
+}
+
+static inline long atomic_swap(atomic_t *addr, long val)
+{
+       return __sync_lock_test_and_set((long*)addr, val);
+}
+
+static inline void *atomic_swap_ptr(void **addr, void *val)
+{
+       return __sync_lock_test_and_set(addr, val);
+}
+
+static inline uint32_t atomic_swap_u32(uint32_t *addr, uint32_t val)
+{
+       return __sync_lock_test_and_set(addr, val);
+}
+
+asm (".section .gnu.linkonce.b.__riscv_ros_atomic_lock, \"aw\", %nobits\n"
+     "\t.previous");
+
+spinlock_t __riscv_ros_atomic_lock
+  __attribute__ ((nocommon, section (".gnu.linkonce.b.__riscv_ros_atomic_lock"
+                                     __sec_comment),
+                  visibility ("hidden")));
+
+static inline bool atomic_cas(atomic_t *addr, long exp_val, long new_val)
+{
+       bool retval = 0;
+       long temp;
+
+       if ((long)*addr != exp_val)
+               return 0;
+       spin_lock(&__riscv_ros_atomic_lock);
+       if ((long)*addr == exp_val) {
+               atomic_swap(addr, new_val);
+               retval = 1;
+       }
+       spin_unlock(&__riscv_ros_atomic_lock);
+       return retval;
+}
+
+static inline bool atomic_cas_ptr(void **addr, void *exp_val, void *new_val)
+{
+       return atomic_cas((atomic_t*)addr, (long)exp_val, (long)new_val);
+}
+
+static inline bool atomic_cas_u32(uint32_t *addr, uint32_t exp_val,
+                                  uint32_t new_val)
+{
+       return atomic_cas((atomic_t*)addr, (long)exp_val, (long)new_val);
+}
+
+static inline void atomic_or_int(volatile int *number, int mask)
+{
+       return __sync_fetch_and_or(number, mask);
+}
+
+static inline uint32_t spin_trylock(spinlock_t* lock)
+{
+       return __sync_fetch_and_or(&lock->rlock, 1) & 1;
+}
+
+static inline uint32_t spin_locked(spinlock_t* lock)
+{
+       return lock->rlock & 1;
+}
+
+static inline void spin_lock(spinlock_t* lock)
+{
+       while(spin_trylock(lock))
+               while(spin_locked(lock));
+       mb();
+}
+
+static inline void spin_unlock(spinlock_t* lock)
+{
+       mb();
+       lock->rlock = 0;
+}
+
+static inline void spinlock_init(spinlock_t* lock)
+{
+       lock->rlock = 0;
+}
+
+#endif /* !PARLIB_ARCH_ATOMIC_H */
diff --git a/user/parlib/include/riscv/bitmask.h b/user/parlib/include/riscv/bitmask.h
new file mode 100644 (file)
index 0000000..1765e3b
--- /dev/null
@@ -0,0 +1,94 @@
+#ifndef PARLIB_ARCH_BITMASK_H
+#define PARLIB_ARCH_BITMASK_H
+
+#include <string.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <arch/atomic.h>
+#include <stdio.h>
+
+#define DECL_BITMASK(name, size) \
+       unsigned long (name)[WORDS_FOR_BITMASK((size))]
+
+#define BPW (CHAR_BIT*sizeof(long))
+#define WORDS_FOR_BITMASK(size) (((size)-1) / BPW + 1)
+#define BYTES_FOR_BITMASK(size) (WORDS_FOR_BITMASK * sizeof(long))
+
+#define BYTES_FOR_BITMASK_WITH_CHECK(size) \
+       ((size) ? BYTES_FOR_BITMASK(size) : (0))
+
+static bool GET_BITMASK_BIT(unsigned long* name, size_t bit) 
+{
+       return (((name)[(bit)/BPW] & (1 << ((bit) % BPW))) ? 1 : 0);
+}
+
+#define SET_BITMASK_BIT(name, bit) \
+       ((name)[(bit)/BPW] |= (1 << ((bit) % BPW)));
+
+#define CLR_BITMASK_BIT(name, bit) \
+       ((name)[(bit)/BPW] &= ~(1 << ((bit) % BPW)));
+
+static void SET_BITMASK_BIT_ATOMIC(unsigned long* name, size_t bit) 
+{
+       __sync_fetch_and_or(&name[bit/BPW], bit % BPW);
+}
+
+#define CLR_BITMASK_BIT_ATOMIC(name, bit) \
+       (__sync_fetch_and_and(&(name)[(bit)/BPW], ~(1UL << ((bit) % BPW))))
+
+#define CLR_BITMASK(name, size) \
+({ \
+       {TRUSTEDBLOCK \
+       memset((void*)((uintptr_t)(name)), 0, BYTES_FOR_BITMASK((size))); \
+       } \
+})
+
+#define FILL_BITMASK(name, size) \
+({ \
+       {TRUSTEDBLOCK \
+       memset((void*)((uintptr_t)(name)), 255, BYTES_FOR_BITMASK((size))); \
+       } \
+       if ((size) % BPW) \
+         (name)[WORDS_FOR_BITMASK((size))-1] >>= BPW - ((size) % BPW); \
+}) 
+
+#define COPY_BITMASK(newmask, oldmask, size) \
+({ \
+       {TRUSTEDBLOCK \
+       memcpy((void*)((uintptr_t)(newmask)), \
+           (void*)((uintptr_t)(oldmask)), \
+           BYTES_FOR_BITMASK((size))); \
+       } \
+})
+
+// this checks the entire last byte, so keep it 0 in the other macros
+#define BITMASK_IS_CLEAR(name, size) ({ \
+       size_t __n = WORDS_FOR_BITMASK(size); \
+       unsigned long clear = 1; \
+       while (clear != 0 && __n-- > 0) \
+               clear = (name)[__n]; \
+       clear != 0; })
+
+static inline bool BITMASK_IS_FULL(unsigned long* map, size_t size)
+{
+       size_t extra = size % BPW;
+       for (size_t i = 0; i < WORDS_FOR_BITMASK(size) - (extra != 0); i++)
+         if (map[i] != ~0UL)
+               return FALSE;
+       
+       return !extra || map[WORDS_FOR_BITMASK(size)-1] == ((1UL << extra) - 1);
+}
+
+#define PRINT_BITMASK(name, size) { \
+       int i;  \
+       int _size = size; \
+       for (i = 0; i < WORDS_FOR_BITMASK(size); i++) { \
+               int j;  \
+               for (j = 0; j < MIN(BPW,_size); j++) \
+                       printf("%x", ((name)[i] >> j) & 1);     \
+                       _size--; \
+       } \
+       printf("\n"); \
+}
+
+#endif /* PARLIB_ARCH_BITMASK_H */
diff --git a/user/parlib/include/riscv/vcore.h b/user/parlib/include/riscv/vcore.h
new file mode 100644 (file)
index 0000000..ad2a49e
--- /dev/null
@@ -0,0 +1,119 @@
+#ifndef PARLIB_ARCH_VCORE_H
+#define PARLIB_ARCH_VCORE_H
+
+#include <ros/common.h>
+#include <ros/arch/trapframe.h>
+#include <arch/arch.h>
+#include <ros/syscall.h>
+#include <ros/procdata.h>
+#include <assert.h>
+
+extern __thread int __vcoreid;
+
+/* Feel free to ignore vcoreid.  It helps x86 to avoid a call to
+ * sys_getvcoreid() if we pass it in. */
+static inline void *get_tls_desc(uint32_t vcoreid)
+{
+       register void* tp asm("tp");
+       return tp;
+}
+
+#ifdef __riscv64
+# define REG_L "ld"
+# define REG_S "sd"
+#else
+# define REG_L "lw"
+# define REG_S "sw"
+#endif
+
+static inline void set_tls_desc(void *tls_desc, uint32_t vcoreid)
+{
+       asm volatile ("move tp, %0" : : "r"(tls_desc) : "memory");
+       __vcoreid = vcoreid;
+}
+
+extern void __pop_ros_tf(struct user_trapframe *tf, bool* notif_enabled_p,
+                         bool* notif_pending_p, uint32_t vcoreid);
+extern void __save_ros_tf(struct user_trapframe *tf);
+
+/* Pops an ROS kernel-provided TF, reanabling notifications at the same time.
+ * A Userspace scheduler can call this when transitioning off the transition
+ * stack.
+ *
+ * Make sure you clear the notif_pending flag, and then check the queue before
+ * calling this.  If notif_pending is not clear, this will self_notify this
+ * core, since it should be because we missed a notification message while
+ * notifs were disabled. 
+ *
+ * The important thing is that it can a notification after it enables
+ * notifications, and when it gets resumed it can ultimately run the new
+ * context.  Enough state is saved in the running context and stack to continue
+ * running. */
+static inline void pop_ros_tf(struct user_trapframe *tf, uint32_t vcoreid)
+{
+       // since we're changing the stack, move stuff into regs for now
+       register uint32_t _vcoreid = vcoreid;
+       register struct user_trapframe* _tf = tf;
+
+       set_stack_pointer((void*)tf->gpr[30]);
+
+       tf = _tf;
+       vcoreid = _vcoreid;
+       struct preempt_data* vcpd = &__procdata.vcore_preempt_data[vcoreid];
+
+       // if this is a trap frame we just init'ed, we need to set up TLS
+       if(tf->gpr[31] == 0)
+               tf->gpr[31] = (long)get_tls_desc(vcoreid);
+       else
+               assert(tf->gpr[31] == (long)get_tls_desc(vcoreid));
+
+       __pop_ros_tf(tf, &vcpd->notif_enabled, &vcpd->notif_pending, vcoreid);
+}
+
+/* Like the regular pop_ros_tf, but this one doesn't check or clear
+ * notif_pending.  TODO: someone from sparc should look at this. */
+static inline void pop_ros_tf_raw(struct user_trapframe *tf, uint32_t vcoreid)
+{
+       // since we're changing the stack, move stuff into regs for now
+       register uint32_t _vcoreid = vcoreid;
+       register struct user_trapframe* _tf = tf;
+
+       set_stack_pointer((void*)tf->gpr[30]);
+
+       tf = _tf;
+       vcoreid = _vcoreid;
+       struct preempt_data* vcpd = &__procdata.vcore_preempt_data[vcoreid];
+
+       // if this is a trap frame we just init'ed, we need to set up TLS
+       if(tf->gpr[31] == 0)
+               tf->gpr[31] = (long)get_tls_desc(vcoreid);
+       else
+               assert(tf->gpr[31] == (long)get_tls_desc(vcoreid));
+
+       __pop_ros_tf(tf, &vcpd->notif_enabled, 0, 0);
+}
+
+/* Save the current context/registers into the given tf, setting the pc of the
+ * tf to the end of this function.  You only need to save that which you later
+ * restore with pop_ros_tf(). */
+static inline void save_ros_tf(struct user_trapframe *tf)
+{
+       __save_ros_tf(tf);
+}
+
+/* This assumes a user_tf looks like a regular kernel trapframe */
+static __inline void
+init_user_tf(struct user_trapframe *u_tf, uint32_t entry_pt, uint32_t stack_top)
+{
+       memset(u_tf, 0, sizeof(*u_tf));
+       u_tf->gpr[30] = stack_top;
+       u_tf->epc = entry_pt;
+}
+
+#define __vcore_id_on_entry \
+({ \
+       register int temp asm ("a0"); \
+       temp; \
+})
+
+#endif /* PARLIB_ARCH_VCORE_H */