8187547: PPC64: icache invalidation is incorrect in some places
Reviewed-by: mdoerr, goetz
--- a/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp Fri Sep 22 14:06:11 2017 +0200
+++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp Mon Sep 25 08:43:43 2017 +0200
@@ -129,7 +129,7 @@
}
}
-int MacroAssembler::patch_calculate_address_from_global_toc_at(address a, address bound, address addr) {
+address MacroAssembler::patch_calculate_address_from_global_toc_at(address a, address bound, address addr) {
const int offset = MacroAssembler::offset_to_global_toc(addr);
const address inst2_addr = a;
@@ -155,7 +155,7 @@
assert(is_addis(inst1) && inv_ra_field(inst1) == 29 /* R29 */, "source must be global TOC");
set_imm((int *)inst1_addr, MacroAssembler::largeoffset_si16_si16_hi(offset));
set_imm((int *)inst2_addr, MacroAssembler::largeoffset_si16_si16_lo(offset));
- return (int)((intptr_t)addr - (intptr_t)inst1_addr);
+ return inst1_addr;
}
address MacroAssembler::get_address_of_calculate_address_from_global_toc_at(address a, address bound) {
@@ -201,7 +201,7 @@
// clrldi rx = rx & 0xFFFFffff // clearMS32b, optional
// ori rx = rx | const.lo
// Clrldi will be passed by.
-int MacroAssembler::patch_set_narrow_oop(address a, address bound, narrowOop data) {
+address MacroAssembler::patch_set_narrow_oop(address a, address bound, narrowOop data) {
assert(UseCompressedOops, "Should only patch compressed oops");
const address inst2_addr = a;
@@ -227,7 +227,7 @@
set_imm((int *)inst1_addr, (short)(xc)); // see enc_load_con_narrow_hi/_lo
set_imm((int *)inst2_addr, (xd)); // unsigned int
- return (int)((intptr_t)inst2_addr - (intptr_t)inst1_addr);
+ return inst1_addr;
}
// Get compressed oop or klass constant.
--- a/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp Fri Sep 22 14:06:11 2017 +0200
+++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp Mon Sep 25 08:43:43 2017 +0200
@@ -105,13 +105,15 @@
};
inline static bool is_calculate_address_from_global_toc_at(address a, address bound);
- static int patch_calculate_address_from_global_toc_at(address a, address addr, address bound);
+ // Returns address of first instruction in sequence.
+ static address patch_calculate_address_from_global_toc_at(address a, address bound, address addr);
static address get_address_of_calculate_address_from_global_toc_at(address a, address addr);
#ifdef _LP64
// Patch narrow oop constant.
inline static bool is_set_narrow_oop(address a, address bound);
- static int patch_set_narrow_oop(address a, address bound, narrowOop data);
+ // Returns address of first instruction in sequence.
+ static address patch_set_narrow_oop(address a, address bound, narrowOop data);
static narrowOop get_narrow_oop(address a, address bound);
#endif
--- a/src/hotspot/cpu/ppc/nativeInst_ppc.cpp Fri Sep 22 14:06:11 2017 +0200
+++ b/src/hotspot/cpu/ppc/nativeInst_ppc.cpp Mon Sep 25 08:43:43 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2015 SAP SE. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -221,13 +221,13 @@
// A calculation relative to the global TOC.
if (MacroAssembler::get_address_of_calculate_address_from_global_toc_at(addr, cb->content_begin()) !=
(address)data) {
- const int invalidated_range =
- MacroAssembler::patch_calculate_address_from_global_toc_at(addr, cb->content_begin(),
+ const address inst2_addr = addr;
+ const address inst1_addr =
+ MacroAssembler::patch_calculate_address_from_global_toc_at(inst2_addr, cb->content_begin(),
(address)data);
- const address start = invalidated_range < 0 ? addr + invalidated_range : addr;
- // FIXME:
- const int range = invalidated_range < 0 ? 4 - invalidated_range : 8;
- ICache::ppc64_flush_icache_bytes(start, range);
+ assert(inst1_addr != NULL && inst1_addr < inst2_addr, "first instruction must be found");
+ const int range = inst2_addr - inst1_addr + BytesPerInstWord;
+ ICache::ppc64_flush_icache_bytes(inst1_addr, range);
}
next_address = addr + 1 * BytesPerInstWord;
} else if (MacroAssembler::is_load_const_at(addr)) {
@@ -288,15 +288,15 @@
}
void NativeMovConstReg::set_narrow_oop(narrowOop data, CodeBlob *code /* = NULL */) {
- address addr = addr_at(0);
+ address inst2_addr = addr_at(0);
CodeBlob* cb = (code) ? code : CodeCache::find_blob(instruction_address());
- if (MacroAssembler::get_narrow_oop(addr, cb->content_begin()) == (long)data) return;
- const int invalidated_range =
- MacroAssembler::patch_set_narrow_oop(addr, cb->content_begin(), (long)data);
- const address start = invalidated_range < 0 ? addr + invalidated_range : addr;
- // FIXME:
- const int range = invalidated_range < 0 ? 4 - invalidated_range : 8;
- ICache::ppc64_flush_icache_bytes(start, range);
+ if (MacroAssembler::get_narrow_oop(inst2_addr, cb->content_begin()) == (long)data)
+ return;
+ const address inst1_addr =
+ MacroAssembler::patch_set_narrow_oop(inst2_addr, cb->content_begin(), (long)data);
+ assert(inst1_addr != NULL && inst1_addr < inst2_addr, "first instruction must be found");
+ const int range = inst2_addr - inst1_addr + BytesPerInstWord;
+ ICache::ppc64_flush_icache_bytes(inst1_addr, range);
}
// Do not use an assertion here. Let clients decide whether they only