# HG changeset patch
# User enevill
# Date 1521985117 -3600
#      Sun Mar 25 14:38:37 2018 +0100
# Node ID 7d1ae835ef5194e7ae5b56b51f944029fe602d11
# Parent  1b1de4b263c81853719f6bb0385fe23bc4e35f6c
8199138: Add RISC-V support to Zero
Reviewed-by: aph, erikj, ehelin, ihse

--- a/make/autoconf/build-aux/config.guess
+++ b/make/autoconf/build-aux/config.guess
@@ -27,6 +27,13 @@
 # autoconf system (which might easily get lost in a future update), we wrap it
 # and fix the broken property, if needed.
 
+machine=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+if test $machine = riscv64; then
+  # This is all we need to know for riscv64
+  echo riscv64-unknown-linux-gnu
+  exit
+fi
+
 DIR=`dirname $0`
 OUT=`. $DIR/autoconf-config.guess`
 
--- a/make/autoconf/build-aux/config.sub
+++ b/make/autoconf/build-aux/config.sub
@@ -29,8 +29,8 @@
 
 DIR=`dirname $0`
 
-# First, filter out everything that doesn't begin with "aarch64-"
-if ! echo $* | grep '^aarch64-' >/dev/null ; then
+# First, filter out everything that doesn't begin with "aarch64-" or "riscv64-"
+if ! echo $* | grep '^aarch64-\|^riscv64-' >/dev/null ; then
     . $DIR/autoconf-config.sub "$@"
     # autoconf-config.sub exits, so we never reach here, but just in
     # case we do:
@@ -45,6 +45,10 @@ while test $# -gt 0 ; do
             config=`echo $1 | sed 's/^aarch64-/arm-/'`
             sub_args="$sub_args $config"
             shift; ;;
+        riscv64-* )
+            config=`echo $1 | sed 's/^riscv64-/x86-/'`
+            sub_args="$sub_args $config"
+            shift; ;;
         - )    # Use stdin as input.
             sub_args="$sub_args $1"
             shift; break ;;
@@ -57,7 +61,7 @@ done
 result=`. $DIR/autoconf-config.sub $sub_args "$@"`
 exitcode=$?
 
-result=`echo $result | sed "s/^arm-/aarch64-/"`
+result=`echo $result | sed "s/^arm-/aarch64-/" | sed "s/^x86-/riscv64-/"`
 
 echo $result
 exit $exitcode
--- a/make/autoconf/platform.m4
+++ b/make/autoconf/platform.m4
@@ -118,6 +118,12 @@ AC_DEFUN([PLATFORM_EXTRACT_VARS_FROM_CPU
       VAR_CPU_BITS=64
       VAR_CPU_ENDIAN=little
       ;;
+    riscv64)
+      VAR_CPU=riscv64
+      VAR_CPU_ARCH=riscv64
+      VAR_CPU_BITS=64
+      VAR_CPU_ENDIAN=little
+      ;;
     s390)
       VAR_CPU=s390
       VAR_CPU_ARCH=s390
@@ -475,6 +481,8 @@ AC_DEFUN([PLATFORM_SETUP_LEGACY_VARS_HEL
     HOTSPOT_$1_CPU_DEFINE=SPARC
   elif test "x$OPENJDK_$1_CPU" = xppc; then
     HOTSPOT_$1_CPU_DEFINE=PPC32
+  elif test "x$OPENJDK_$1_CPU" = xriscv64; then
+    HOTSPOT_$1_CPU_DEFINE=RISCV64
   elif test "x$OPENJDK_$1_CPU" = xs390; then
     HOTSPOT_$1_CPU_DEFINE=S390
   elif test "x$OPENJDK_$1_CPU" = xs390x; then
--- a/src/hotspot/os/linux/os_linux.cpp
+++ b/src/hotspot/os/linux/os_linux.cpp
@@ -1829,6 +1829,9 @@ void * os::dll_load(const char *filename
 #ifndef EM_AARCH64
   #define EM_AARCH64    183               /* ARM AARCH64 */
 #endif
+#ifndef EM_RISCV                          /* RISCV */
+  #define EM_RISCV      243
+#endif
 
   static const arch_t arch_array[]={
     {EM_386,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
@@ -1854,6 +1857,7 @@ void * os::dll_load(const char *filename
     {EM_PARISC,      EM_PARISC,  ELFCLASS32, ELFDATA2MSB, (char*)"PARISC"},
     {EM_68K,         EM_68K,     ELFCLASS32, ELFDATA2MSB, (char*)"M68k"},
     {EM_AARCH64,     EM_AARCH64, ELFCLASS64, ELFDATA2LSB, (char*)"AARCH64"},
+    {EM_RISCV,       EM_RISCV,   ELFCLASS64, ELFDATA2LSB, (char*)"RISCV"},
   };
 
 #if  (defined IA32)
@@ -1870,6 +1874,8 @@ void * os::dll_load(const char *filename
   static  Elf32_Half running_arch_code=EM_PPC64;
 #elif  (defined __powerpc__)
   static  Elf32_Half running_arch_code=EM_PPC;
+#elif  (defined RISCV)
+  static  Elf32_Half running_arch_code=EM_RISCV;
 #elif  (defined AARCH64)
   static  Elf32_Half running_arch_code=EM_AARCH64;
 #elif  (defined ARM)
@@ -1890,7 +1896,7 @@ void * os::dll_load(const char *filename
   static  Elf32_Half running_arch_code=EM_SH;
 #else
     #error Method os::dll_load requires that one of following is defined:\
-        AARCH64, ALPHA, ARM, AMD64, IA32, IA64, M68K, MIPS, MIPSEL, PARISC, __powerpc__, __powerpc64__, S390, SH, __sparc
+        AARCH64, ALPHA, ARM, AMD64, IA32, IA64, M68K, MIPS, MIPSEL, PARISC, __powerpc__, __powerpc64__, S390, SH, __sparc, RISCV
 #endif
 
   // Identify compatability class for VM's architecture and library's architecture
@@ -2600,6 +2606,8 @@ void os::get_summary_cpu_info(char* cpui
   strncpy(cpuinfo, "IA64", length);
 #elif defined(PPC)
   strncpy(cpuinfo, "PPC64", length);
+#elif defined(RISCV)
+  strncpy(cpuinfo, "RISCV", length);
 #elif defined(S390)
   strncpy(cpuinfo, "S390", length);
 #elif defined(SPARC)