# HG changeset patch # User goetz # Date 1474561395 -7200 # Node ID 7489d199c52bcc3fcf3127200448dea37f5a6a1c # Parent fefc408b07784f262bee3e9c3abb0aff185b2ec0 8166560: [s390] Basic enablement of s390 port. diff --git a/src/jdk.hotspot.agent/linux/native/libsaproc/libproc.h b/src/jdk.hotspot.agent/linux/native/libsaproc/libproc.h --- a/src/jdk.hotspot.agent/linux/native/libsaproc/libproc.h +++ b/src/jdk.hotspot.agent/linux/native/libsaproc/libproc.h @@ -76,6 +76,9 @@ #include #define user_regs_struct user_pt_regs #endif +#if defined(s390x) +#include +#endif // This C bool type must be int for compatibility with Linux calls and // it would be a mistake to equivalence it to C++ bool on many platforms diff --git a/src/os/linux/vm/os_linux.cpp b/src/os/linux/vm/os_linux.cpp --- a/src/os/linux/vm/os_linux.cpp +++ b/src/os/linux/vm/os_linux.cpp @@ -291,7 +291,7 @@ // 1: ... // ... // 7: The default directories, normally /lib and /usr/lib. -#if defined(AMD64) || defined(_LP64) && (defined(SPARC) || defined(PPC) || defined(S390)) +#if defined(AMD64) || (defined(_LP64) && defined(SPARC)) || defined(PPC64) || defined(S390) #define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib" #else #define DEFAULT_LIBPATH "/lib:/usr/lib" @@ -1212,8 +1212,8 @@ } #ifndef SYS_clock_getres - #if defined(IA32) || defined(AMD64) - #define SYS_clock_getres IA32_ONLY(266) AMD64_ONLY(229) + #if defined(X86) || defined(PPC64) || defined(S390) + #define SYS_clock_getres AMD64_ONLY(229) IA32_ONLY(266) PPC64_ONLY(247) S390_ONLY(261) #define sys_clock_getres(x,y) ::syscall(SYS_clock_getres, x, y) #else #warning "SYS_clock_getres not defined for this platform, disabling fast_thread_cpu_time" @@ -1729,62 +1729,62 @@ #endif static const arch_t arch_array[]={ - {EM_386, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"}, - {EM_486, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"}, - {EM_IA_64, EM_IA_64, ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"}, - {EM_X86_64, EM_X86_64, ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"}, - {EM_SPARC, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"}, - {EM_SPARC32PLUS, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"}, - {EM_SPARCV9, EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"}, - {EM_PPC, EM_PPC, ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"}, + {EM_386, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"}, + {EM_486, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"}, + {EM_68K, EM_68K, ELFCLASS32, ELFDATA2MSB, (char*)"M68k"}, + {EM_AARCH64, EM_AARCH64, ELFCLASS64, ELFDATA2LSB, (char*)"AARCH64"}, + {EM_ALPHA, EM_ALPHA, ELFCLASS64, ELFDATA2LSB, (char*)"Alpha"}, + {EM_ARM, EM_ARM, ELFCLASS32, ELFDATA2LSB, (char*)"ARM"}, + {EM_IA_64, EM_IA_64, ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"}, + {EM_MIPS, EM_MIPS, ELFCLASS32, ELFDATA2MSB, (char*)"MIPS"}, + {EM_MIPS_RS3_LE, EM_MIPS_RS3_LE, ELFCLASS32, ELFDATA2LSB, (char*)"MIPSel"}, + {EM_PARISC, EM_PARISC, ELFCLASS32, ELFDATA2MSB, (char*)"PARISC"}, + {EM_PPC, EM_PPC, ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"}, #if defined(VM_LITTLE_ENDIAN) - {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2LSB, (char*)"Power PC 64"}, + {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2LSB, (char*)"Power PC 64"}, #else - {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64 LE"}, + {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64 LE"}, #endif - {EM_ARM, EM_ARM, ELFCLASS32, ELFDATA2LSB, (char*)"ARM"}, - {EM_S390, EM_S390, ELFCLASSNONE, ELFDATA2MSB, (char*)"IBM System/390"}, - {EM_ALPHA, EM_ALPHA, ELFCLASS64, ELFDATA2LSB, (char*)"Alpha"}, - {EM_MIPS_RS3_LE, EM_MIPS_RS3_LE, ELFCLASS32, ELFDATA2LSB, (char*)"MIPSel"}, - {EM_MIPS, EM_MIPS, ELFCLASS32, ELFDATA2MSB, (char*)"MIPS"}, - {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_S390, EM_S390, ELFCLASS64, ELFDATA2MSB, (char*)"S390"}, + {EM_SPARC, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"}, + {EM_SPARC32PLUS, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"}, + {EM_SPARCV9, EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"}, + {EM_X86_64, EM_X86_64, ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"}, }; -#if (defined IA32) +#if (defined AARCH64) + static Elf32_Half running_arch_code=EM_AARCH64; +#elif (defined ALPHA) + static Elf32_Half running_arch_code=EM_ALPHA; +#elif (defined ARM32) + static Elf32_Half running_arch_code=EM_ARM; +#elif (defined AMD64) + static Elf32_Half running_arch_code=EM_X86_64; +#elif (defined IA32) static Elf32_Half running_arch_code=EM_386; -#elif (defined AMD64) - static Elf32_Half running_arch_code=EM_X86_64; #elif (defined IA64) static Elf32_Half running_arch_code=EM_IA_64; +#elif (defined M68K) + static Elf32_Half running_arch_code=EM_68K; +#elif (defined MIPS) + static Elf32_Half running_arch_code=EM_MIPS; +#elif (defined MIPSEL) + static Elf32_Half running_arch_code=EM_MIPS_RS3_LE; +#elif (defined PARISC) + static Elf32_Half running_arch_code=EM_PARISC; +#elif (defined __powerpc64__) + static Elf32_Half running_arch_code=EM_PPC64; +#elif (defined __powerpc__) + static Elf32_Half running_arch_code=EM_PPC; +#elif (defined S390) + static Elf32_Half running_arch_code=EM_S390; #elif (defined __sparc) && (defined _LP64) static Elf32_Half running_arch_code=EM_SPARCV9; #elif (defined __sparc) && (!defined _LP64) static Elf32_Half running_arch_code=EM_SPARC; -#elif (defined __powerpc64__) - static Elf32_Half running_arch_code=EM_PPC64; -#elif (defined __powerpc__) - static Elf32_Half running_arch_code=EM_PPC; -#elif (defined ARM) - static Elf32_Half running_arch_code=EM_ARM; -#elif (defined S390) - static Elf32_Half running_arch_code=EM_S390; -#elif (defined ALPHA) - static Elf32_Half running_arch_code=EM_ALPHA; -#elif (defined MIPSEL) - static Elf32_Half running_arch_code=EM_MIPS_RS3_LE; -#elif (defined PARISC) - static Elf32_Half running_arch_code=EM_PARISC; -#elif (defined MIPS) - static Elf32_Half running_arch_code=EM_MIPS; -#elif (defined M68K) - static Elf32_Half running_arch_code=EM_68K; -#elif (defined AARCH64) - static Elf32_Half running_arch_code=EM_AARCH64; #else #error Method os::dll_load requires that one of following is defined:\ - IA32, AMD64, IA64, __sparc, __powerpc__, ARM, S390, ALPHA, MIPS, MIPSEL, PARISC, M68K, AARCH64 + AARCH64, ALPHA, ARM, AMD64, IA32, IA64, MIPS, MIPSEL, M68K, PARISC, __powerpc__, __powerpc64__, S390, __sparc #endif // Identify compatability class for VM's architecture and library's architecture @@ -2192,10 +2192,12 @@ #if defined(AMD64) || defined(IA32) || defined(X32) const char* search_string = "model name"; +#elif defined(PPC64) +const char* search_string = "cpu"; +#elif defined(S390) +const char* search_string = "processor"; #elif defined(SPARC) const char* search_string = "cpu"; -#elif defined(PPC64) -const char* search_string = "cpu"; #else const char* search_string = "Processor"; #endif @@ -2233,20 +2235,22 @@ } // cpuinfo not found or parsing failed, just print generic string. The entire // /proc/cpuinfo file will be printed later in the file (or enough of it for x86) -#if defined(AMD64) +#if defined(AARCH64) + strncpy(cpuinfo, "AArch64", length); +#elif defined(AMD64) strncpy(cpuinfo, "x86_64", length); +#elif defined(ARM32) + strncpy(cpuinfo, "ARM", length); #elif defined(IA32) strncpy(cpuinfo, "x86_32", length); #elif defined(IA64) strncpy(cpuinfo, "IA64", length); +#elif defined(PPC) + strncpy(cpuinfo, "PPC64", length); +#elif defined(S390) + strncpy(cpuinfo, "S390", length); #elif defined(SPARC) strncpy(cpuinfo, "sparcv9", length); -#elif defined(AARCH64) - strncpy(cpuinfo, "AArch64", length); -#elif defined(ARM) - strncpy(cpuinfo, "ARM", length); -#elif defined(PPC) - strncpy(cpuinfo, "PPC64", length); #elif defined(ZERO_LIBARCH) strncpy(cpuinfo, ZERO_LIBARCH, length); #else @@ -3242,8 +3246,15 @@ // the processor. #ifndef ZERO - large_page_size = IA32_ONLY(4 * M) AMD64_ONLY(2 * M) IA64_ONLY(256 * M) SPARC_ONLY(4 * M) - ARM32_ONLY(2 * M) PPC_ONLY(4 * M) AARCH64_ONLY(2 * M); + large_page_size = + AARCH64_ONLY(2 * M) + AMD64_ONLY(2 * M) + ARM32_ONLY(2 * M) + IA32_ONLY(4 * M) + IA64_ONLY(256 * M) + PPC_ONLY(4 * M) + S390_ONLY(1 * M) + SPARC_ONLY(4 * M); #endif // ZERO FILE *fp = fopen("/proc/meminfo", "r"); diff --git a/src/share/tools/hsdis/hsdis.c b/src/share/tools/hsdis/hsdis.c --- a/src/share/tools/hsdis/hsdis.c +++ b/src/share/tools/hsdis/hsdis.c @@ -468,6 +468,9 @@ #ifdef LIBARCH_aarch64 res = "aarch64"; #endif +#ifdef LIBARCH_s390x + res = "s390:64-bit"; +#endif if (res == NULL) res = "architecture not set in Makefile!"; return res; diff --git a/src/share/vm/code/codeCache.cpp b/src/share/vm/code/codeCache.cpp --- a/src/share/vm/code/codeCache.cpp +++ b/src/share/vm/code/codeCache.cpp @@ -547,7 +547,10 @@ } bool CodeCache::contains(void *p) { - // It should be ok to call contains without holding a lock + // S390 uses contains() in current_frame(), which is used before + // code cache initialization if NativeMemoryTracking=detail is set. + if (_heaps == NULL) return false; + // It should be ok to call contains without holding a lock. FOR_ALL_HEAPS(heap) { if ((*heap)->contains(p)) { return true; diff --git a/src/share/vm/interpreter/abstractInterpreter.hpp b/src/share/vm/interpreter/abstractInterpreter.hpp --- a/src/share/vm/interpreter/abstractInterpreter.hpp +++ b/src/share/vm/interpreter/abstractInterpreter.hpp @@ -219,7 +219,7 @@ } static int expr_offset_in_bytes(int i) { -#if !defined(ZERO) && (defined(PPC) || defined(SPARC)) +#if !defined(ZERO) && (defined(PPC) || defined(S390) || defined(SPARC)) return stackElementSize * i + wordSize; // both point to one word past TOS #else return stackElementSize * i; diff --git a/src/share/vm/runtime/globals.hpp b/src/share/vm/runtime/globals.hpp --- a/src/share/vm/runtime/globals.hpp +++ b/src/share/vm/runtime/globals.hpp @@ -3325,9 +3325,11 @@ "Stack space (bytes) required for JVM_InvokeMethod to complete") \ \ /* code cache parameters */ \ - /* ppc64/tiered compilation has large code-entry alignment. */ \ + /* ppc64/s390/tiered compilation has large code-entry alignment. */ \ develop(uintx, CodeCacheSegmentSize, \ - 64 PPC64_ONLY(+64) NOT_PPC64(TIERED_ONLY(+64)), \ + 64 \ + PPC64_ONLY(+64) S390_ONLY(+192) \ + NOT_PPC64(NOT_S390(TIERED_ONLY(+64))), \ "Code cache segment size (in bytes) - smallest unit of " \ "allocation") \ range(1, 1024) \ diff --git a/src/share/vm/runtime/mutex.hpp b/src/share/vm/runtime/mutex.hpp --- a/src/share/vm/runtime/mutex.hpp +++ b/src/share/vm/runtime/mutex.hpp @@ -82,7 +82,7 @@ // assumptions are violated, a whole lot of code will break. // The default length of monitor name is chosen to be 64 to avoid false sharing. -static const int MONITOR_NAME_LEN = 64; +static const int MONITOR_NAME_LEN = 64 S390_ONLY(+192); class Monitor : public CHeapObj { diff --git a/src/share/vm/runtime/vm_version.cpp b/src/share/vm/runtime/vm_version.cpp --- a/src/share/vm/runtime/vm_version.cpp +++ b/src/share/vm/runtime/vm_version.cpp @@ -170,15 +170,16 @@ #define CPU "ppc64le" #else #define CPU "ppc64" -#endif +#endif // PPC64 #else -#define CPU IA32_ONLY("x86") \ +#define CPU AARCH64_ONLY("aarch64") \ + AMD64_ONLY("amd64") \ + IA32_ONLY("x86") \ IA64_ONLY("ia64") \ - AMD64_ONLY("amd64") \ - AARCH64_ONLY("aarch64") \ + S390_ONLY("s390") \ SPARC_ONLY("sparc") -#endif // -#endif +#endif // !ZERO +#endif // !CPU const char *Abstract_VM_Version::vm_platform_string() { return OS "-" CPU; diff --git a/src/share/vm/utilities/macros.hpp b/src/share/vm/utilities/macros.hpp --- a/src/share/vm/utilities/macros.hpp +++ b/src/share/vm/utilities/macros.hpp @@ -332,44 +332,46 @@ #define NOT_WIN64(code) code #endif -#if defined(ZERO) -#define ZERO_ONLY(code) code -#define NOT_ZERO(code) +// Note: There are three ARM ports. They set the following in the makefiles: +// 1. Closed 32-bit port: -DARM -DARM32 -DTARGET_ARCH_arm +// 2. Closed 64-bit port: -DARM -DAARCH64 -D_LP64 -DTARGET_ARCH_arm +// 3. Open 64-bit port: -DAARCH64 -D_LP64 -DTARGET_ARCH_aaarch64 +#ifdef AARCH64 +#define AARCH64_ONLY(code) code +#define NOT_AARCH64(code) #else -#define ZERO_ONLY(code) -#define NOT_ZERO(code) code +#define AARCH64_ONLY(code) +#define NOT_AARCH64(code) code #endif -#if defined(SHARK) -#define SHARK_ONLY(code) code -#define NOT_SHARK(code) +#ifdef ARM +#define ARM_ONLY(code) code +#define NOT_ARM(code) #else -#define SHARK_ONLY(code) -#define NOT_SHARK(code) code +#define ARM_ONLY(code) +#define NOT_ARM(code) code #endif -#if defined(IA32) || defined(AMD64) -#define X86 -#define X86_ONLY(code) code -#define NOT_X86(code) +#ifdef ARM32 +#define ARM32_ONLY(code) code +#define NOT_ARM32(code) #else -#undef X86 -#define X86_ONLY(code) -#define NOT_X86(code) code +#define ARM32_ONLY(code) +#define NOT_ARM32(code) code #endif -#ifdef IA32 -#define IA32_ONLY(code) code -#define NOT_IA32(code) +#ifdef E500V2 +#define E500V2_ONLY(code) code +#define NOT_E500V2(code) #else -#define IA32_ONLY(code) -#define NOT_IA32(code) code +#define E500V2_ONLY(code) +#define NOT_E500V2(code) code #endif -// This is a REALLY BIG HACK, but on AIX unconditionally defines IA64. -// At least on AIX 7.1 this is a real problem because 'systemcfg.h' is indirectly included -// by 'pthread.h' and other common system headers. - +// This is a REALLY BIG HACK, but on AIX +// unconditionally defines IA64. At least on AIX 7.1 this is a real +// problem because 'systemcfg.h' is indirectly included by 'pthread.h' +// and other common system headers. #if defined(IA64) && !defined(AIX) #define IA64_ONLY(code) code #define NOT_IA64(code) @@ -378,22 +380,6 @@ #define NOT_IA64(code) code #endif -#ifdef AMD64 -#define AMD64_ONLY(code) code -#define NOT_AMD64(code) -#else -#define AMD64_ONLY(code) -#define NOT_AMD64(code) code -#endif - -#ifdef SPARC -#define SPARC_ONLY(code) code -#define NOT_SPARC(code) -#else -#define SPARC_ONLY(code) -#define NOT_SPARC(code) code -#endif - #if defined(PPC32) || defined(PPC64) #ifndef PPC #define PPC @@ -422,42 +408,67 @@ #define NOT_PPC64(code) code #endif -#ifdef E500V2 -#define E500V2_ONLY(code) code -#define NOT_E500V2(code) +#ifdef S390 +#define S390_ONLY(code) code +#define NOT_S390(code) #else -#define E500V2_ONLY(code) -#define NOT_E500V2(code) code +#define S390_ONLY(code) +#define NOT_S390(code) code #endif -// Note: There are three ARM ports. They set the following in the makefiles: -// 1. Closed 32-bit port: -DARM -DARM32 -DTARGET_ARCH_arm -// 2. Closed 64-bit port: -DARM -DAARCH64 -D_LP64 -DTARGET_ARCH_arm -// 3. Open 64-bit port: -DAARCH64 -D_LP64 -DTARGET_ARCH_aaarch64 -#ifdef ARM -#define ARM_ONLY(code) code -#define NOT_ARM(code) +#ifdef SHARK +#define SHARK_ONLY(code) code +#define NOT_SHARK(code) #else -#define ARM_ONLY(code) -#define NOT_ARM(code) code +#define SHARK_ONLY(code) +#define NOT_SHARK(code) code #endif -#ifdef ARM32 -#define ARM32_ONLY(code) code -#define NOT_ARM32(code) +#ifdef SPARC +#define SPARC_ONLY(code) code +#define NOT_SPARC(code) #else -#define ARM32_ONLY(code) -#define NOT_ARM32(code) code +#define SPARC_ONLY(code) +#define NOT_SPARC(code) code #endif -#ifdef AARCH64 -#define AARCH64_ONLY(code) code -#define NOT_AARCH64(code) +#if defined(IA32) || defined(AMD64) +#define X86 +#define X86_ONLY(code) code +#define NOT_X86(code) #else -#define AARCH64_ONLY(code) -#define NOT_AARCH64(code) code +#undef X86 +#define X86_ONLY(code) +#define NOT_X86(code) code #endif +// Synonym for X86_32. +#ifdef IA32 +#define IA32_ONLY(code) code +#define NOT_IA32(code) +#else +#define IA32_ONLY(code) +#define NOT_IA32(code) code +#endif + +// Synonym for X86_64. +#ifdef AMD64 +#define AMD64_ONLY(code) code +#define NOT_AMD64(code) +#else +#define AMD64_ONLY(code) +#define NOT_AMD64(code) code +#endif + +#if defined(ZERO) +#define ZERO_ONLY(code) code +#define NOT_ZERO(code) +#else +#define ZERO_ONLY(code) +#define NOT_ZERO(code) code +#endif + + #define define_pd_global(type, name, value) const type pd_##name = value; // Helper macros for constructing file names for includes.