--- a/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp Thu Oct 17 20:27:44 2019 +0100
+++ b/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp Thu Oct 17 20:53:35 2019 +0100
@@ -1,6 +1,6 @@
/*
- * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2015, Red Hat Inc. All rights reserved.
+ * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2019, Red Hat Inc. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -28,18 +28,15 @@
#include "asm/macroAssembler.inline.hpp"
#include "memory/resourceArea.hpp"
#include "runtime/java.hpp"
+#include "runtime/os.hpp"
#include "runtime/stubCodeGenerator.hpp"
#include "utilities/macros.hpp"
#include "vm_version_aarch64.hpp"
#include OS_HEADER_INLINE(os)
-#ifndef BUILTIN_SIM
#include <sys/auxv.h>
#include <asm/hwcap.h>
-#else
-#define getauxval(hwcap) 0
-#endif
#ifndef HWCAP_AES
#define HWCAP_AES (1<<3)
@@ -71,6 +68,7 @@
int VM_Version::_variant;
int VM_Version::_revision;
int VM_Version::_stepping;
+bool VM_Version::_dcpop;
VM_Version::PsrInfo VM_Version::_psr_info = { 0, };
static BufferBlob* stub_blob;
@@ -92,10 +90,6 @@
# define __ _masm->
address start = __ pc();
-#ifdef BUILTIN_SIM
- __ c_stub_prolog(1, 0, MacroAssembler::ret_type_void);
-#endif
-
// void getPsrInfo(VM_Version::PsrInfo* psr_info);
address entry = __ pc();
@@ -175,9 +169,10 @@
int cpu_lines = 0;
if (FILE *f = fopen("/proc/cpuinfo", "r")) {
- char buf[128], *p;
+ // need a large buffer as the flags line may include lots of text
+ char buf[1024], *p;
while (fgets(buf, sizeof (buf), f) != NULL) {
- if (p = strchr(buf, ':')) {
+ if ((p = strchr(buf, ':')) != NULL) {
long v = strtol(p+1, NULL, 0);
if (strncmp(buf, "CPU implementer", sizeof "CPU implementer" - 1) == 0) {
_cpu = v;
@@ -189,12 +184,25 @@
_model = v;
} else if (strncmp(buf, "CPU revision", sizeof "CPU revision" - 1) == 0) {
_revision = v;
+ } else if (strncmp(buf, "flags", sizeof("flags") - 1) == 0) {
+ if (strstr(p+1, "dcpop")) {
+ _dcpop = true;
+ }
}
}
}
fclose(f);
}
+ if (os::supports_map_sync()) {
+ // if dcpop is available publish data cache line flush size via
+ // generic field, otherwise let if default to zero thereby
+ // disabling writeback
+ if (_dcpop) {
+ _data_cache_line_flush_size = dcache_line;
+ }
+ }
+
// Enable vendor specific features
// Ampere eMAG