From bdc9068a259b5247dfca292951c3c90c5e408aa6 Mon Sep 17 00:00:00 2001 From: sjohanss Date: Thu, 11 Dec 2014 09:56:57 +0100 Subject: [PATCH] 8062672: JVM crashes during GC on various asserts which checks that HeapWord ptr is an oop Summary: Crashes were caused by not disabling UseMemSetInBOT as should be done on sparc. Added support for picking up blkinit as a platform feature if available on Linux sparc. This is needed to avoid enabling UseMemSetInBOT when running on this platform. Reviewed-by: jmasa, brutisso --- .../linux_sparc/vm/vm_version_linux_sparc.cpp | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp b/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp index 4af6c5236..fe9c6f9d7 100644 --- a/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp +++ b/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp @@ -26,8 +26,8 @@ #include "runtime/os.hpp" #include "vm_version_sparc.hpp" -static bool detect_niagara() { - char cpu[128]; +static bool cpuinfo_field_contains(const char* field, const char* value) { + char line[1024]; bool rv = false; FILE* fp = fopen("/proc/cpuinfo", "r"); @@ -35,9 +35,10 @@ static bool detect_niagara() { return rv; } - while (!feof(fp)) { - if (fscanf(fp, "cpu\t\t: %100[^\n]", &cpu) == 1) { - if (strstr(cpu, "Niagara") != NULL) { + while (fgets(line, sizeof(line), fp) != NULL) { + assert(strlen(line) < sizeof(line) - 1, "buffer line[1024] is too small."); + if (strncmp(line, field, strlen(field)) == 0) { + if (strstr(line, value) != NULL) { rv = true; } break; @@ -45,10 +46,17 @@ static bool detect_niagara() { } fclose(fp); - return rv; } +static bool detect_niagara() { + return cpuinfo_field_contains("cpu", "Niagara"); +} + +static bool detect_blkinit() { + return cpuinfo_field_contains("cpucaps", "blkinit"); +} + int VM_Version::platform_features(int features) { // Default to generic v9 features = generic_v9_m; @@ -58,5 +66,9 @@ int VM_Version::platform_features(int features) { features = niagara1_m | T_family_m; } + if (detect_blkinit()) { + features |= blk_init_instructions_m; + } + return features; } -- GitLab