From be4035c60a4551e5a51ecca973b3dc42664cdee8 Mon Sep 17 00:00:00 2001 From: Erik Helin Date: Mon, 26 Jan 2015 10:32:35 +0100 Subject: [PATCH 01/82] 8030646: track collection set membership in one place Reviewed-by: tschatzl, jwilhelm --- .../vm/gc_implementation/g1/g1CollectedHeap.cpp | 10 +++++----- .../vm/gc_implementation/g1/g1CollectedHeap.hpp | 17 ++++++++--------- .../g1/g1CollectedHeap.inline.hpp | 6 +++++- .../gc_implementation/g1/g1CollectorPolicy.cpp | 9 +++------ .../vm/gc_implementation/g1/g1InCSetState.hpp | 3 +++ .../vm/gc_implementation/g1/heapRegion.cpp | 3 +-- .../vm/gc_implementation/g1/heapRegion.hpp | 11 ++--------- .../gc_implementation/g1/heapRegion.inline.hpp | 4 ++++ 8 files changed, 31 insertions(+), 32 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp index f694d18a7f2..18deaa19b1b 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @@ -3538,7 +3538,7 @@ class RegisterHumongousWithInCSetFastTestClosure : public HeapRegionClosure { r->rem_set()->clear_locked(); } assert(r->rem_set()->is_empty(), "At this point any humongous candidate remembered set must be empty."); - g1h->register_humongous_region_with_in_cset_fast_test(region_idx); + g1h->register_humongous_region_with_cset(region_idx); _candidate_humongous++; } _total_humongous++; @@ -3552,7 +3552,7 @@ class RegisterHumongousWithInCSetFastTestClosure : public HeapRegionClosure { void flush_rem_set_entries() { _dcq.flush(); } }; -void G1CollectedHeap::register_humongous_regions_with_in_cset_fast_test() { +void G1CollectedHeap::register_humongous_regions_with_cset() { if (!G1EagerReclaimHumongousObjects) { g1_policy()->phase_times()->record_fast_reclaim_humongous_stats(0.0, 0, 0); return; @@ -3859,7 +3859,7 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) { g1_policy()->finalize_cset(target_pause_time_ms, evacuation_info); - register_humongous_regions_with_in_cset_fast_test(); + register_humongous_regions_with_cset(); assert(check_cset_fast_test(), "Inconsistency in the InCSetState table."); @@ -6077,7 +6077,7 @@ void G1CollectedHeap::free_collection_set(HeapRegion* cs_head, EvacuationInfo& e HeapRegion* next = cur->next_in_collection_set(); assert(cur->in_collection_set(), "bad CS"); cur->set_next_in_collection_set(NULL); - cur->set_in_collection_set(false); + clear_in_cset(cur); if (cur->is_young()) { int index = cur->young_index_in_cset(); @@ -6303,7 +6303,7 @@ void G1CollectedHeap::abandon_collection_set(HeapRegion* cs_head) { HeapRegion* next = cur->next_in_collection_set(); assert(cur->in_collection_set(), "bad CS"); cur->set_next_in_collection_set(NULL); - cur->set_in_collection_set(false); + clear_in_cset(cur); cur->set_young_index_in_cset(-1); cur = next; } diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp index 42a7229a9e0..edf78a141b7 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp @@ -645,23 +645,21 @@ public: // is considered a candidate for eager reclamation. bool humongous_region_is_candidate(uint index); // Register the given region to be part of the collection set. - inline void register_humongous_region_with_in_cset_fast_test(uint index); + inline void register_humongous_region_with_cset(uint index); // Register regions with humongous objects (actually on the start region) in // the in_cset_fast_test table. - void register_humongous_regions_with_in_cset_fast_test(); + void register_humongous_regions_with_cset(); // We register a region with the fast "in collection set" test. We // simply set to true the array slot corresponding to this region. - void register_young_region_with_in_cset_fast_test(HeapRegion* r) { + void register_young_region_with_cset(HeapRegion* r) { _in_cset_fast_test.set_in_young(r->hrm_index()); } - void register_old_region_with_in_cset_fast_test(HeapRegion* r) { + void register_old_region_with_cset(HeapRegion* r) { _in_cset_fast_test.set_in_old(r->hrm_index()); } - - // This is a fast test on whether a reference points into the - // collection set or not. Assume that the reference - // points into the heap. - inline bool in_cset_fast_test(oop obj); + void clear_in_cset(const HeapRegion* hr) { + _in_cset_fast_test.clear(hr); + } void clear_cset_fast_test() { _in_cset_fast_test.clear(); @@ -1246,6 +1244,7 @@ public: // set. Slow implementation. inline bool obj_in_cs(oop obj); + inline bool is_in_cset(const HeapRegion *hr); inline bool is_in_cset(oop obj); inline bool is_in_cset_or_humongous(const oop obj); diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp index 1ca08b98851..d029e08a854 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp @@ -234,6 +234,10 @@ inline bool G1CollectedHeap::is_in_cset(oop obj) { return ret; } +bool G1CollectedHeap::is_in_cset(const HeapRegion* hr) { + return _in_cset_fast_test.is_in_cset(hr); +} + bool G1CollectedHeap::is_in_cset_or_humongous(const oop obj) { return _in_cset_fast_test.is_in_cset_or_humongous((HeapWord*)obj); } @@ -242,7 +246,7 @@ InCSetState G1CollectedHeap::in_cset_state(const oop obj) { return _in_cset_fast_test.at((HeapWord*)obj); } -void G1CollectedHeap::register_humongous_region_with_in_cset_fast_test(uint index) { +void G1CollectedHeap::register_humongous_region_with_cset(uint index) { _in_cset_fast_test.set_humongous(index); } diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp index 21cbf9fb57e..fbb52ad85e4 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp @@ -1607,11 +1607,10 @@ void G1CollectorPolicy::add_old_region_to_cset(HeapRegion* hr) { assert(hr->is_old(), "the region should be old"); assert(!hr->in_collection_set(), "should not already be in the CSet"); - hr->set_in_collection_set(true); + _g1->register_old_region_with_cset(hr); hr->set_next_in_collection_set(_collection_set); _collection_set = hr; _collection_set_bytes_used_before += hr->used(); - _g1->register_old_region_with_in_cset_fast_test(hr); size_t rs_length = hr->rem_set()->occupied(); _recorded_rs_lengths += rs_length; _old_cset_region_length += 1; @@ -1741,10 +1740,8 @@ void G1CollectorPolicy::add_region_to_incremental_cset_common(HeapRegion* hr) { _inc_cset_max_finger = MAX2(_inc_cset_max_finger, hr_end); assert(!hr->in_collection_set(), "invariant"); - hr->set_in_collection_set(true); - assert( hr->next_in_collection_set() == NULL, "invariant"); - - _g1->register_young_region_with_in_cset_fast_test(hr); + _g1->register_young_region_with_cset(hr); + assert(hr->next_in_collection_set() == NULL, "invariant"); } // Add the region at the RHS of the incremental cset diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1InCSetState.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1InCSetState.hpp index f13eaa0ae82..8cc45ad15e5 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1InCSetState.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1InCSetState.hpp @@ -25,6 +25,7 @@ #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1INCSETSTATE_HPP #define SHARE_VM_GC_IMPLEMENTATION_G1_G1INCSETSTATE_HPP +#include "gc_implementation/g1/heapRegion.hpp" #include "gc_implementation/g1/g1BiasedArray.hpp" #include "memory/allocation.hpp" @@ -125,8 +126,10 @@ class G1InCSetStateFastTestBiasedMappedArray : public G1BiasedMappedArrayhrm_index()).is_in_cset(); } InCSetState at(HeapWord* addr) const { return get_by_address(addr); } void clear() { G1BiasedMappedArray::clear(); } + void clear(const HeapRegion* hr) { return set_by_index(hr->hrm_index(), InCSetState::NotInCSet); } }; #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1INCSETSTATE_HPP diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp index 3ad7f190563..2eb23388ef5 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp @@ -162,7 +162,7 @@ void HeapRegion::hr_clear(bool par, bool clear_space, bool locked) { "we should have already filtered out humongous regions"); assert(_end == orig_end(), "we should have already filtered out humongous regions"); - assert(!_in_collection_set, + assert(!in_collection_set(), err_msg("Should not clear heap region %u in the collection set", hrm_index())); set_allocation_context(AllocationContext::system()); @@ -262,7 +262,6 @@ HeapRegion::HeapRegion(uint hrm_index, _hrm_index(hrm_index), _allocation_context(AllocationContext::system()), _humongous_start_region(NULL), - _in_collection_set(false), _next_in_special_set(NULL), _evacuation_failed(false), _prev_marked_bytes(0), _next_marked_bytes(0), _gc_efficiency(0.0), diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp index e7342cdacf4..1d78eae7adf 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp @@ -236,8 +236,6 @@ class HeapRegion: public G1OffsetTableContigSpace { // For a humongous region, region in which it starts. HeapRegion* _humongous_start_region; - // True iff the region is in current collection_set. - bool _in_collection_set; // True iff an attempt to evacuate an object in the region failed. bool _evacuation_failed; @@ -487,13 +485,8 @@ class HeapRegion: public G1OffsetTableContigSpace { return _rem_set; } - // True iff the region is in current collection_set. - bool in_collection_set() const { - return _in_collection_set; - } - void set_in_collection_set(bool b) { - _in_collection_set = b; - } + bool in_collection_set() const; + HeapRegion* next_in_collection_set() { assert(in_collection_set(), "should only invoke on member of CS."); assert(_next_in_special_set == NULL || diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.inline.hpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.inline.hpp index 8dc6a417371..955b8489cc0 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.inline.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.inline.hpp @@ -196,4 +196,8 @@ inline void HeapRegion::note_end_of_copying(bool during_initial_mark) { } } +inline bool HeapRegion::in_collection_set() const { + return G1CollectedHeap::heap()->is_in_cset(this); +} + #endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGION_INLINE_HPP From aa21fdd0c03ba465113a450b24b69d07cf9dbb39 Mon Sep 17 00:00:00 2001 From: Dean Long Date: Tue, 24 Feb 2015 17:23:53 -0500 Subject: [PATCH 02/82] 8072383: resolve conflicts between open and closed ports Refactor close to remove references to closed ports Reviewed-by: kvn, simonis, dholmes --- hotspot/agent/src/os/linux/libproc.h | 4 +-- hotspot/make/defs.make | 11 +++--- hotspot/make/linux/makefiles/arm.make | 31 ---------------- hotspot/make/linux/makefiles/buildtree.make | 6 ++-- hotspot/make/linux/makefiles/defs.make | 14 +------- hotspot/make/linux/makefiles/gcc.make | 12 ++----- hotspot/make/linux/makefiles/ppc.make | 33 ----------------- hotspot/make/linux/makefiles/saproc.make | 8 +++-- hotspot/make/linux/makefiles/vm.make | 5 +-- hotspot/make/linux/platform_arm | 17 --------- hotspot/make/linux/platform_ppc | 17 --------- hotspot/src/os/linux/vm/os_linux.cpp | 28 ++------------- hotspot/src/share/vm/c1/c1_LIR.cpp | 7 +--- hotspot/src/share/vm/c1/c1_LIR.hpp | 11 ++++-- hotspot/src/share/vm/c1/c1_LIRGenerator.cpp | 35 ++++++------------- hotspot/src/share/vm/c1/c1_LIRGenerator.hpp | 7 ++++ hotspot/src/share/vm/c1/c1_LinearScan.cpp | 6 ++-- hotspot/src/share/vm/c1/c1_Runtime1.cpp | 4 +-- .../src/share/vm/interpreter/interp_masm.hpp | 24 +++++-------- .../share/vm/interpreter/templateTable.hpp | 27 +++++--------- hotspot/src/share/vm/memory/generation.hpp | 4 +-- hotspot/src/share/vm/opto/ad.hpp | 27 +++++--------- hotspot/src/share/vm/opto/chaitin.cpp | 4 +-- hotspot/src/share/vm/opto/optoreg.hpp | 27 +++++--------- hotspot/src/share/vm/runtime/stubRoutines.hpp | 28 +++++---------- hotspot/src/share/vm/runtime/vm_version.cpp | 12 ++----- .../vm/utilities/globalDefinitions_gcc.hpp | 4 +-- hotspot/src/share/vm/utilities/macros.hpp | 11 ++++-- 28 files changed, 119 insertions(+), 305 deletions(-) delete mode 100644 hotspot/make/linux/makefiles/arm.make delete mode 100644 hotspot/make/linux/makefiles/ppc.make delete mode 100644 hotspot/make/linux/platform_arm delete mode 100644 hotspot/make/linux/platform_ppc diff --git a/hotspot/agent/src/os/linux/libproc.h b/hotspot/agent/src/os/linux/libproc.h index f220e9df556..882169a3cee 100644 --- a/hotspot/agent/src/os/linux/libproc.h +++ b/hotspot/agent/src/os/linux/libproc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, Oracle and/or its affiliates. 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 @@ -30,7 +30,7 @@ #include #include "proc_service.h" -#if defined(arm) || defined(ppc) +#ifdef ALT_SASRCDIR #include "libproc_md.h" #endif diff --git a/hotspot/make/defs.make b/hotspot/make/defs.make index 5c4f00dc1d8..a1321d46e43 100644 --- a/hotspot/make/defs.make +++ b/hotspot/make/defs.make @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2015, Oracle and/or its affiliates. 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 @@ -286,7 +286,7 @@ ifneq ($(OSNAME),windows) # Use uname output for SRCARCH, but deal with platform differences. If ARCH # is not explicitly listed below, it is treated as x86. - SRCARCH = $(ARCH/$(filter sparc sparc64 ia64 amd64 x86_64 arm ppc ppc64 aarch64 zero,$(ARCH))) + SRCARCH ?= $(ARCH/$(filter sparc sparc64 ia64 amd64 x86_64 ppc ppc64 aarch64 zero,$(ARCH))) ARCH/ = x86 ARCH/sparc = sparc ARCH/sparc64= sparc @@ -295,12 +295,11 @@ ifneq ($(OSNAME),windows) ARCH/x86_64 = x86 ARCH/ppc64 = ppc ARCH/ppc = ppc - ARCH/arm = arm ARCH/aarch64= aarch64 ARCH/zero = zero # BUILDARCH is usually the same as SRCARCH, except for sparcv9 - BUILDARCH = $(SRCARCH) + BUILDARCH ?= $(SRCARCH) ifeq ($(BUILDARCH), x86) ifdef LP64 BUILDARCH = amd64 @@ -320,7 +319,7 @@ ifneq ($(OSNAME),windows) endif # LIBARCH is 1:1 mapping from BUILDARCH - LIBARCH = $(LIBARCH/$(BUILDARCH)) + LIBARCH ?= $(LIBARCH/$(BUILDARCH)) LIBARCH/i486 = i386 LIBARCH/amd64 = amd64 LIBARCH/sparc = sparc @@ -328,8 +327,6 @@ ifneq ($(OSNAME),windows) LIBARCH/ia64 = ia64 LIBARCH/ppc64 = ppc64 LIBARCH/aarch64 = aarch64 - LIBARCH/ppc = ppc - LIBARCH/arm = arm LIBARCH/zero = $(ZERO_LIBARCH) LP64_ARCH = sparcv9 amd64 ia64 ppc64 aarch64 zero diff --git a/hotspot/make/linux/makefiles/arm.make b/hotspot/make/linux/makefiles/arm.make deleted file mode 100644 index ff8e3c519f9..00000000000 --- a/hotspot/make/linux/makefiles/arm.make +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright (c) 2008, 2013, Oracle and/or its affiliates. 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 -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# -# - -Obj_Files += linux_arm.o - -ifneq ($(EXT_LIBS_PATH),) - LIBS += $(EXT_LIBS_PATH)/sflt_glibc.a -endif - -CFLAGS += -DVM_LITTLE_ENDIAN diff --git a/hotspot/make/linux/makefiles/buildtree.make b/hotspot/make/linux/makefiles/buildtree.make index 6c03da02a0d..a5de1398e9b 100644 --- a/hotspot/make/linux/makefiles/buildtree.make +++ b/hotspot/make/linux/makefiles/buildtree.make @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2015, Oracle and/or its affiliates. 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 @@ -70,6 +70,8 @@ else PLATFORM_FILE = $(GAMMADIR)/make/$(OS_FAMILY)/platform_$(BUILDARCH).suncc else PLATFORM_FILE = $(GAMMADIR)/make/$(OS_FAMILY)/platform_$(BUILDARCH) + ALT_PLATFORM_FILE = $(HS_ALT_MAKE)/$(OS_FAMILY)/platform_$(BUILDARCH) + PLATFORM_FILE := $(if $(wildcard $(ALT_PLATFORM_FILE)),$(ALT_PLATFORM_FILE),$(PLATFORM_FILE)) endif endif @@ -203,7 +205,7 @@ flags.make: $(BUILDTREE_MAKE) ../shared_dirs.lst $(QUIETLY) ( \ $(BUILDTREE_COMMENT); \ echo; \ - echo "Platform_file = $(PLATFORM_FILE)" | sed 's|$(GAMMADIR)|$$(GAMMADIR)|'; \ + echo "Platform_file = $(PLATFORM_FILE)" | sed -e 's|$(HS_ALT_MAKE)|$$(HS_ALT_MAKE)|' -e 's|$(GAMMADIR)|$$(GAMMADIR)|'; \ sed -n '/=/s/^ */Platform_/p' < $(PLATFORM_FILE); \ echo; \ echo "GAMMADIR = $(GAMMADIR)"; \ diff --git a/hotspot/make/linux/makefiles/defs.make b/hotspot/make/linux/makefiles/defs.make index b46db737434..c85f1ed5522 100644 --- a/hotspot/make/linux/makefiles/defs.make +++ b/hotspot/make/linux/makefiles/defs.make @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2015, Oracle and/or its affiliates. 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 @@ -105,14 +105,6 @@ ifneq (,$(findstring $(ARCH), amd64 x86_64 i686 i586)) HS_ARCH = x86 endif -# ARM -ifeq ($(ARCH), arm) - ARCH_DATA_MODEL = 32 - PLATFORM = linux-arm - VM_PLATFORM = linux_arm - HS_ARCH = arm -endif - # PPC # Notice: after 8046471 ARCH will be 'ppc' for top-level ppc64 builds but # 'ppc64' for HotSpot-only ppc64 builds. Need to detect both variants here! @@ -121,10 +113,6 @@ ifneq (,$(findstring $(ARCH), ppc ppc64)) MAKE_ARGS += LP64=1 PLATFORM = linux-ppc64 VM_PLATFORM = linux_ppc64 - else - ARCH_DATA_MODEL = 32 - PLATFORM = linux-ppc - VM_PLATFORM = linux_ppc endif HS_ARCH = ppc diff --git a/hotspot/make/linux/makefiles/gcc.make b/hotspot/make/linux/makefiles/gcc.make index 41421f25443..d9007afe655 100644 --- a/hotspot/make/linux/makefiles/gcc.make +++ b/hotspot/make/linux/makefiles/gcc.make @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2015, Oracle and/or its affiliates. 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 @@ -176,11 +176,7 @@ ARCHFLAG/aarch64 = ARCHFLAG/ia64 = ARCHFLAG/sparc = -m32 -mcpu=v9 ARCHFLAG/sparcv9 = -m64 -mcpu=v9 -ARCHFLAG/arm = -fsigned-char ARCHFLAG/zero = $(ZERO_ARCHFLAG) -ifndef E500V2 -ARCHFLAG/ppc = -mcpu=powerpc -endif ARCHFLAG/ppc64 = -m64 CFLAGS += $(ARCHFLAG) @@ -188,10 +184,6 @@ AOUT_FLAGS += $(ARCHFLAG) LFLAGS += $(ARCHFLAG) ASFLAGS += $(ARCHFLAG) -ifdef E500V2 -CFLAGS += -DE500V2 -endif - # Use C++ Interpreter ifdef CC_INTERP CFLAGS += -DCC_INTERP @@ -391,3 +383,5 @@ endif ifndef USE_SUNCC CFLAGS += -fno-omit-frame-pointer endif + +-include $(HS_ALT_MAKE)/linux/makefiles/gcc.make diff --git a/hotspot/make/linux/makefiles/ppc.make b/hotspot/make/linux/makefiles/ppc.make deleted file mode 100644 index 3364bd743b8..00000000000 --- a/hotspot/make/linux/makefiles/ppc.make +++ /dev/null @@ -1,33 +0,0 @@ -# -# Copyright (c) 2004, 2012, Oracle and/or its affiliates. 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 -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# -# - -# The copied fdlibm routines in sharedRuntimeTrig.o must not be optimized -OPT_CFLAGS/sharedRuntimeTrig.o = $(OPT_CFLAGS/NOOPT) - -# Must also specify if CPU is big endian -CFLAGS += -DVM_BIG_ENDIAN - -ifdef E500V2 -ASFLAGS += -Wa,-mspe -Wa,--defsym -Wa,E500V2=1 -endif diff --git a/hotspot/make/linux/makefiles/saproc.make b/hotspot/make/linux/makefiles/saproc.make index 6c31c7bb4a2..15bdba1d396 100644 --- a/hotspot/make/linux/makefiles/saproc.make +++ b/hotspot/make/linux/makefiles/saproc.make @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2015, Oracle and/or its affiliates. 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 @@ -69,19 +69,21 @@ endif endif ifneq ($(ALT_SASRCDIR),) -ALT_SAINCDIR=-I$(ALT_SASRCDIR) +ALT_SAINCDIR=-I$(ALT_SASRCDIR) -DALT_SASRCDIR else ALT_SAINCDIR= endif SA_LFLAGS = $(MAPFLAG:FILENAME=$(SAMAPFILE)) $(LDFLAGS_HASH_STYLE) +SAARCH ?= $(BUILDARCH) + $(LIBSAPROC): $(SASRCFILES) $(SAMAPFILE) $(QUIETLY) if [ "$(BOOT_JAVA_HOME)" = "" ]; then \ echo "ALT_BOOTDIR, BOOTDIR or JAVA_HOME needs to be defined to build SA"; \ exit 1; \ fi @echo $(LOG_INFO) Making SA debugger back-end... - $(QUIETLY) $(CC) -D$(BUILDARCH) -D_GNU_SOURCE \ + $(QUIETLY) $(CC) -D$(SAARCH) -D_GNU_SOURCE \ -D_FILE_OFFSET_BITS=64 \ $(SYMFLAG) $(ARCHFLAG) $(SHARED_FLAG) $(PICFLAG) \ -I$(SASRCDIR) \ diff --git a/hotspot/make/linux/makefiles/vm.make b/hotspot/make/linux/makefiles/vm.make index d0c31ca125c..25679bffff0 100644 --- a/hotspot/make/linux/makefiles/vm.make +++ b/hotspot/make/linux/makefiles/vm.make @@ -45,8 +45,9 @@ DEP_DIR = $(GENERATED)/dependencies ifeq ($(findstring true, $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK)), true) include $(MAKEFILES_DIR)/zeroshark.make else - include $(MAKEFILES_DIR)/$(BUILDARCH).make - -include $(HS_ALT_MAKE)/$(Platform_os_family)/makefiles/$(BUILDARCH).make + BUILDARCH_MAKE = $(MAKEFILES_DIR)/$(BUILDARCH).make + ALT_BUILDARCH_MAKE = $(HS_ALT_MAKE)/$(Platform_os_family)/makefiles/$(BUILDARCH).make + include $(if $(wildcard $(ALT_BUILDARCH_MAKE)),$(ALT_BUILDARCH_MAKE),$(BUILDARCH_MAKE)) endif # set VPATH so make knows where to look for source files diff --git a/hotspot/make/linux/platform_arm b/hotspot/make/linux/platform_arm deleted file mode 100644 index 13206d63738..00000000000 --- a/hotspot/make/linux/platform_arm +++ /dev/null @@ -1,17 +0,0 @@ -os_family = linux - -arch = arm - -arch_model = arm - -os_arch = linux_arm - -os_arch_model = linux_arm - -lib_arch = arm - -compiler = gcc - -gnu_dis_arch = arm - -sysdefs = -DLINUX -D_GNU_SOURCE -DARM diff --git a/hotspot/make/linux/platform_ppc b/hotspot/make/linux/platform_ppc deleted file mode 100644 index 809456b526b..00000000000 --- a/hotspot/make/linux/platform_ppc +++ /dev/null @@ -1,17 +0,0 @@ -os_family = linux - -arch = ppc - -arch_model = ppc_32 - -os_arch = linux_ppc - -os_arch_model = linux_ppc_32 - -lib_arch = ppc - -compiler = gcc - -gnu_dis_arch = ppc - -sysdefs = -DLINUX -D_GNU_SOURCE -DPPC32 diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp index 3993178469f..a2a807aa003 100644 --- a/hotspot/src/os/linux/vm/os_linux.cpp +++ b/hotspot/src/os/linux/vm/os_linux.cpp @@ -227,31 +227,7 @@ bool os::have_special_privileges() { #endif // Cpu architecture string -#if defined(ZERO) -static char cpu_arch[] = ZERO_LIBARCH; -#elif defined(IA64) -static char cpu_arch[] = "ia64"; -#elif defined(IA32) -static char cpu_arch[] = "i386"; -#elif defined(AMD64) -static char cpu_arch[] = "amd64"; -#elif defined(ARM) -static char cpu_arch[] = "arm"; -#elif defined(PPC32) -static char cpu_arch[] = "ppc"; -#elif defined(PPC64) -static char cpu_arch[] = "ppc64"; -#elif defined(SPARC) - #ifdef _LP64 -static char cpu_arch[] = "sparcv9"; - #else -static char cpu_arch[] = "sparc"; - #endif -#elif defined(AARCH64) -static char cpu_arch[] = "aarch64"; -#else - #error Add appropriate cpu_arch setting -#endif +static char cpu_arch[] = HOTSPOT_LIB_ARCH; // pid_t gettid() @@ -3296,7 +3272,7 @@ size_t os::Linux::find_large_page_size() { #ifndef ZERO large_page_size = IA32_ONLY(4 * M) AMD64_ONLY(2 * M) IA64_ONLY(256 * M) SPARC_ONLY(4 * M) - ARM_ONLY(2 * M) PPC_ONLY(4 * M) AARCH64_ONLY(2 * M); + ARM32_ONLY(2 * M) PPC_ONLY(4 * M) AARCH64_ONLY(2 * M); #endif // ZERO FILE *fp = fopen("/proc/meminfo", "r"); diff --git a/hotspot/src/share/vm/c1/c1_LIR.cpp b/hotspot/src/share/vm/c1/c1_LIR.cpp index 92640ccc7ea..d58e3c85b42 100644 --- a/hotspot/src/share/vm/c1/c1_LIR.cpp +++ b/hotspot/src/share/vm/c1/c1_LIR.cpp @@ -142,16 +142,11 @@ LIR_Address::Scale LIR_Address::scale(BasicType type) { #ifndef PRODUCT -void LIR_Address::verify() const { +void LIR_Address::verify0() const { #if defined(SPARC) || defined(PPC) assert(scale() == times_1, "Scaled addressing mode not available on SPARC/PPC and should not be used"); assert(disp() == 0 || index()->is_illegal(), "can't have both"); #endif -#ifdef ARM - assert(disp() == 0 || index()->is_illegal(), "can't have both"); - // Note: offsets higher than 4096 must not be rejected here. They can - // be handled by the back-end or will be rejected if not. -#endif #ifdef _LP64 assert(base()->is_cpu_register(), "wrong base operand"); #ifndef AARCH64 diff --git a/hotspot/src/share/vm/c1/c1_LIR.hpp b/hotspot/src/share/vm/c1/c1_LIR.hpp index 1b997a3f954..90a47c8b47e 100644 --- a/hotspot/src/share/vm/c1/c1_LIR.hpp +++ b/hotspot/src/share/vm/c1/c1_LIR.hpp @@ -25,6 +25,7 @@ #ifndef SHARE_VM_C1_C1_LIR_HPP #define SHARE_VM_C1_C1_LIR_HPP +#include "c1/c1_Defs.hpp" #include "c1/c1_ValueType.hpp" #include "oops/method.hpp" @@ -561,7 +562,13 @@ class LIR_Address: public LIR_OprPtr { virtual BasicType type() const { return _type; } virtual void print_value_on(outputStream* out) const PRODUCT_RETURN; - void verify() const PRODUCT_RETURN; + void verify0() const PRODUCT_RETURN; +#if defined(LIR_ADDRESS_PD_VERIFY) && !defined(PRODUCT) + void pd_verify() const; + void verify() const { pd_verify(); } +#else + void verify() const { verify0(); } +#endif static Scale scale(BasicType type); }; @@ -610,7 +617,7 @@ class LIR_OprFact: public AllStatic { LIR_OprDesc::float_type | LIR_OprDesc::fpu_register | LIR_OprDesc::single_size); } -#if defined(ARM) +#if defined(ARM32) static LIR_Opr double_fpu(int reg1, int reg2) { return (LIR_Opr)((reg1 << LIR_OprDesc::reg1_shift) | (reg2 << LIR_OprDesc::reg2_shift) | LIR_OprDesc::double_type | LIR_OprDesc::fpu_register | LIR_OprDesc::double_size); } static LIR_Opr single_softfp(int reg) { return (LIR_Opr)((reg << LIR_OprDesc::reg1_shift) | LIR_OprDesc::float_type | LIR_OprDesc::cpu_register | LIR_OprDesc::single_size); } static LIR_Opr double_softfp(int reg1, int reg2) { return (LIR_Opr)((reg1 << LIR_OprDesc::reg1_shift) | (reg2 << LIR_OprDesc::reg2_shift) | LIR_OprDesc::double_type | LIR_OprDesc::cpu_register | LIR_OprDesc::double_size); } diff --git a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp index a606b7bf843..ea745dd60f1 100644 --- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp +++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "c1/c1_Defs.hpp" #include "c1/c1_Compilation.hpp" #include "c1/c1_FrameMap.hpp" #include "c1/c1_Instruction.hpp" @@ -49,10 +50,7 @@ #define __ gen()->lir()-> #endif -// TODO: ARM - Use some recognizable constant which still fits architectural constraints -#ifdef ARM -#define PATCHED_ADDR (204) -#else +#ifndef PATCHED_ADDR #define PATCHED_ADDR (max_jint) #endif @@ -1600,24 +1598,9 @@ void LIRGenerator::CardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_OprDesc* } assert(addr->is_register(), "must be a register at this point"); -#ifdef ARM - // TODO: ARM - move to platform-dependent code - LIR_Opr tmp = FrameMap::R14_opr; - if (VM_Version::supports_movw()) { - __ move((LIR_Opr)card_table_base, tmp); - } else { - __ move(new LIR_Address(FrameMap::Rthread_opr, in_bytes(JavaThread::card_table_base_offset()), T_ADDRESS), tmp); - } - - LIR_Address *card_addr = new LIR_Address(tmp, addr, (LIR_Address::Scale) -CardTableModRefBS::card_shift, 0, T_BYTE); - if(((int)ct->byte_map_base & 0xff) == 0) { - __ move(tmp, card_addr); - } else { - LIR_Opr tmp_zero = new_register(T_INT); - __ move(LIR_OprFact::intConst(0), tmp_zero); - __ move(tmp_zero, card_addr); - } -#else // ARM +#ifdef CARDTABLEMODREF_POST_BARRIER_HELPER + CardTableModRef_post_barrier_helper(addr, card_table_base); +#else LIR_Opr tmp = new_pointer_register(); if (TwoOperandLIRForm) { __ move(addr, tmp); @@ -1633,7 +1616,7 @@ void LIRGenerator::CardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_OprDesc* new LIR_Address(tmp, load_constant(card_table_base), T_BYTE)); } -#endif // ARM +#endif } @@ -2123,7 +2106,7 @@ void LIRGenerator::do_UnsafeGetRaw(UnsafeGetRaw* x) { } else { #ifdef X86 addr = new LIR_Address(base_op, index_op, LIR_Address::Scale(log2_scale), 0, dst_type); -#elif defined(ARM) +#elif defined(GENERATE_ADDRESS_IS_PREFERRED) addr = generate_address(base_op, index_op, log2_scale, 0, dst_type); #else if (index_op->is_illegal() || log2_scale == 0) { @@ -2177,6 +2160,9 @@ void LIRGenerator::do_UnsafePutRaw(UnsafePutRaw* x) { LIR_Opr base_op = base.result(); LIR_Opr index_op = idx.result(); +#ifdef GENERATE_ADDRESS_IS_PREFERRED + LIR_Address* addr = generate_address(base_op, index_op, log2_scale, 0, x->basic_type()); +#else #ifndef _LP64 if (base_op->type() == T_LONG) { base_op = new_register(T_INT); @@ -2210,6 +2196,7 @@ void LIRGenerator::do_UnsafePutRaw(UnsafePutRaw* x) { } LIR_Address* addr = new LIR_Address(base_op, index_op, x->basic_type()); +#endif // !GENERATE_ADDRESS_IS_PREFERRED __ move(value.result(), addr); } diff --git a/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp b/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp index 5095af782c9..7f8d45f81da 100644 --- a/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp +++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp @@ -275,6 +275,9 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure { void G1SATBCardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_OprDesc* new_val); void CardTableModRef_post_barrier(LIR_OprDesc* addr, LIR_OprDesc* new_val); +#ifdef CARDTABLEMODREF_POST_BARRIER_HELPER + void CardTableModRef_post_barrier_helper(LIR_OprDesc* addr, LIR_Const* card_table_base); +#endif static LIR_Opr result_register_for(ValueType* type, bool callee = false); @@ -546,6 +549,10 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure { #ifdef ASSERT virtual void do_Assert (Assert* x); #endif + +#ifdef C1_LIRGENERATOR_MD_HPP +#include C1_LIRGENERATOR_MD_HPP +#endif }; diff --git a/hotspot/src/share/vm/c1/c1_LinearScan.cpp b/hotspot/src/share/vm/c1/c1_LinearScan.cpp index 833b357d2e4..9ed4a551a45 100644 --- a/hotspot/src/share/vm/c1/c1_LinearScan.cpp +++ b/hotspot/src/share/vm/c1/c1_LinearScan.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2015, Oracle and/or its affiliates. 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 @@ -2123,7 +2123,7 @@ LIR_Opr LinearScan::calc_operand_for_interval(const Interval* interval) { assert(interval->assigned_regHi() >= pd_first_fpu_reg && interval->assigned_regHi() <= pd_last_fpu_reg, "no fpu register"); assert(assigned_reg % 2 == 0 && assigned_reg + 1 == interval->assigned_regHi(), "must be sequential and even"); LIR_Opr result = LIR_OprFact::double_fpu(interval->assigned_regHi() - pd_first_fpu_reg, assigned_reg - pd_first_fpu_reg); -#elif defined(ARM) +#elif defined(ARM32) assert(assigned_reg >= pd_first_fpu_reg && assigned_reg <= pd_last_fpu_reg, "no fpu register"); assert(interval->assigned_regHi() >= pd_first_fpu_reg && interval->assigned_regHi() <= pd_last_fpu_reg, "no fpu register"); assert(assigned_reg % 2 == 0 && assigned_reg + 1 == interval->assigned_regHi(), "must be sequential and even"); @@ -2712,7 +2712,7 @@ int LinearScan::append_scope_value_for_operand(LIR_Opr opr, GrowableArrayfpu_regnrLo() == opr->fpu_regnrHi() + 1, "assumed in calculation (only fpu_regnrHi is used)"); #endif -#ifdef ARM +#ifdef ARM32 assert(opr->fpu_regnrHi() == opr->fpu_regnrLo() + 1, "assumed in calculation (only fpu_regnrLo is used)"); #endif #ifdef PPC diff --git a/hotspot/src/share/vm/c1/c1_Runtime1.cpp b/hotspot/src/share/vm/c1/c1_Runtime1.cpp index 7e3ab821025..1775d5baff2 100644 --- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp +++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2015, Oracle and/or its affiliates. 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 @@ -1120,7 +1120,7 @@ JRT_ENTRY(void, Runtime1::patch_code(JavaThread* thread, Runtime1::StubID stub_i #ifdef ARM if((load_klass_or_mirror_patch_id || stub_id == Runtime1::load_appendix_patching_id) && - !VM_Version::supports_movw()) { + nativeMovConstReg_at(copy_buff)->is_pc_relative()) { nmethod* nm = CodeCache::find_nmethod(instr_pc); address addr = NULL; assert(nm != NULL, "invalid nmethod_pc"); diff --git a/hotspot/src/share/vm/interpreter/interp_masm.hpp b/hotspot/src/share/vm/interpreter/interp_masm.hpp index f2599106465..dddbbe5d6ac 100644 --- a/hotspot/src/share/vm/interpreter/interp_masm.hpp +++ b/hotspot/src/share/vm/interpreter/interp_masm.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, Oracle and/or its affiliates. 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 @@ -27,25 +27,17 @@ #include "asm/macroAssembler.hpp" -#ifdef TARGET_ARCH_x86 +#if defined INTERP_MASM_MD_HPP +# include INTERP_MASM_MD_HPP +#elif defined TARGET_ARCH_x86 # include "interp_masm_x86.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_sparc +#elif defined TARGET_ARCH_MODEL_sparc # include "interp_masm_sparc.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_zero +#elif defined TARGET_ARCH_MODEL_zero # include "interp_masm_zero.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_arm -# include "interp_masm_arm.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_ppc_32 -# include "interp_masm_ppc_32.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_ppc_64 +#elif defined TARGET_ARCH_MODEL_ppc_64 # include "interp_masm_ppc_64.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_aarch64 +#elif defined TARGET_ARCH_MODEL_aarch64 # include "interp_masm_aarch64.hpp" #endif diff --git a/hotspot/src/share/vm/interpreter/templateTable.hpp b/hotspot/src/share/vm/interpreter/templateTable.hpp index 4b1541806a0..6ead5074082 100644 --- a/hotspot/src/share/vm/interpreter/templateTable.hpp +++ b/hotspot/src/share/vm/interpreter/templateTable.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -341,28 +341,19 @@ class TemplateTable: AllStatic { static Template* template_for_wide(Bytecodes::Code code) { Bytecodes::wide_check(code); return &_template_table_wide[code]; } // Platform specifics -#ifdef TARGET_ARCH_MODEL_x86_32 +#if defined TEMPLATETABLE_MD_HPP +# include TEMPLATETABLE_MD_HPP +#elif defined TARGET_ARCH_MODEL_x86_32 # include "templateTable_x86_32.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_x86_64 +#elif defined TARGET_ARCH_MODEL_x86_64 # include "templateTable_x86_64.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_sparc +#elif defined TARGET_ARCH_MODEL_sparc # include "templateTable_sparc.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_zero +#elif defined TARGET_ARCH_MODEL_zero # include "templateTable_zero.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_arm -# include "templateTable_arm.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_ppc_32 -# include "templateTable_ppc_32.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_ppc_64 +#elif defined TARGET_ARCH_MODEL_ppc_64 # include "templateTable_ppc_64.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_aarch64 +#elif defined TARGET_ARCH_MODEL_aarch64 # include "templateTable_aarch64.hpp" #endif diff --git a/hotspot/src/share/vm/memory/generation.hpp b/hotspot/src/share/vm/memory/generation.hpp index 058f757de01..a2e15a08895 100644 --- a/hotspot/src/share/vm/memory/generation.hpp +++ b/hotspot/src/share/vm/memory/generation.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -139,7 +139,7 @@ class Generation: public CHeapObj { // GenGrain. // Note: on ARM we add 1 bit for card_table_base to be properly aligned // (we expect its low byte to be zero - see implementation of post_barrier) - LogOfGenGrain = 16 ARM_ONLY(+1), + LogOfGenGrain = 16 ARM32_ONLY(+1), GenGrain = 1 << LogOfGenGrain }; diff --git a/hotspot/src/share/vm/opto/ad.hpp b/hotspot/src/share/vm/opto/ad.hpp index c307b80c930..7bd84ebeb1c 100644 --- a/hotspot/src/share/vm/opto/ad.hpp +++ b/hotspot/src/share/vm/opto/ad.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, Oracle and/or its affiliates. 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 @@ -25,28 +25,19 @@ #ifndef SHARE_VM_OPTO_AD_HPP #define SHARE_VM_OPTO_AD_HPP -#ifdef TARGET_ARCH_MODEL_x86_32 +#if defined AD_MD_HPP +# include AD_MD_HPP +#elif defined TARGET_ARCH_MODEL_x86_32 # include "adfiles/ad_x86_32.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_x86_64 +#elif defined TARGET_ARCH_MODEL_x86_64 # include "adfiles/ad_x86_64.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_sparc +#elif defined TARGET_ARCH_MODEL_sparc # include "adfiles/ad_sparc.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_zero +#elif defined TARGET_ARCH_MODEL_zero # include "adfiles/ad_zero.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_arm -# include "adfiles/ad_arm.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_ppc_32 -# include "adfiles/ad_ppc_32.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_ppc_64 +#elif defined TARGET_ARCH_MODEL_ppc_64 # include "adfiles/ad_ppc_64.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_aarch64 +#elif defined TARGET_ARCH_MODEL_aarch64 # include "adfiles/ad_aarch64.hpp" #endif diff --git a/hotspot/src/share/vm/opto/chaitin.cpp b/hotspot/src/share/vm/opto/chaitin.cpp index 106e22879b7..7b1290dd36a 100644 --- a/hotspot/src/share/vm/opto/chaitin.cpp +++ b/hotspot/src/share/vm/opto/chaitin.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2015, Oracle and/or its affiliates. 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 @@ -847,7 +847,7 @@ void PhaseChaitin::gather_lrg_masks( bool after_aggressive ) { case Op_RegD: lrg.set_num_regs(2); // Define platform specific register pressure -#if defined(SPARC) || defined(ARM) +#if defined(SPARC) || defined(ARM32) lrg.set_reg_pressure(2); #elif defined(IA32) if( ireg == Op_RegL ) { diff --git a/hotspot/src/share/vm/opto/optoreg.hpp b/hotspot/src/share/vm/opto/optoreg.hpp index 5657a9b48c0..28c74f5f548 100644 --- a/hotspot/src/share/vm/opto/optoreg.hpp +++ b/hotspot/src/share/vm/opto/optoreg.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2015, Oracle and/or its affiliates. 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 @@ -27,28 +27,19 @@ // AdGlobals contains c2 specific register handling code as specified // in the .ad files. -#ifdef TARGET_ARCH_MODEL_x86_32 +#if defined ADGLOBALS_MD_HPP +# include ADGLOBALS_MD_HPP +#elif defined TARGET_ARCH_MODEL_x86_32 # include "adfiles/adGlobals_x86_32.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_x86_64 +#elif defined TARGET_ARCH_MODEL_x86_64 # include "adfiles/adGlobals_x86_64.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_sparc +#elif defined TARGET_ARCH_MODEL_sparc # include "adfiles/adGlobals_sparc.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_zero +#elif defined TARGET_ARCH_MODEL_zero # include "adfiles/adGlobals_zero.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_arm -# include "adfiles/adGlobals_arm.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_ppc_32 -# include "adfiles/adGlobals_ppc_32.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_ppc_64 +#elif defined TARGET_ARCH_MODEL_ppc_64 # include "adfiles/adGlobals_ppc_64.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_aarch64 +#elif defined TARGET_ARCH_MODEL_aarch64 # include "adfiles/adGlobals_aarch64.hpp" #endif diff --git a/hotspot/src/share/vm/runtime/stubRoutines.hpp b/hotspot/src/share/vm/runtime/stubRoutines.hpp index a040396a74c..88865661908 100644 --- a/hotspot/src/share/vm/runtime/stubRoutines.hpp +++ b/hotspot/src/share/vm/runtime/stubRoutines.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -84,32 +84,22 @@ class StubRoutines: AllStatic { // Dependencies friend class StubGenerator; -#ifdef TARGET_ARCH_MODEL_x86_32 +#if defined STUBROUTINES_MD_HPP +# include STUBROUTINES_MD_HPP +#elif defined TARGET_ARCH_MODEL_x86_32 # include "stubRoutines_x86_32.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_x86_64 +#elif defined TARGET_ARCH_MODEL_x86_64 # include "stubRoutines_x86_64.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_sparc +#elif defined TARGET_ARCH_MODEL_sparc # include "stubRoutines_sparc.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_zero +#elif defined TARGET_ARCH_MODEL_zero # include "stubRoutines_zero.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_arm -# include "stubRoutines_arm.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_ppc_32 -# include "stubRoutines_ppc_32.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_ppc_64 +#elif defined TARGET_ARCH_MODEL_ppc_64 # include "stubRoutines_ppc_64.hpp" -#endif -#ifdef TARGET_ARCH_MODEL_aarch64 +#elif defined TARGET_ARCH_MODEL_aarch64 # include "stubRoutines_aarch64.hpp" #endif - static jint _verify_oop_count; static address _verify_oop_subroutine_entry; diff --git a/hotspot/src/share/vm/runtime/vm_version.cpp b/hotspot/src/share/vm/runtime/vm_version.cpp index 46a8628a3c5..4c3189424be 100644 --- a/hotspot/src/share/vm/runtime/vm_version.cpp +++ b/hotspot/src/share/vm/runtime/vm_version.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2015, Oracle and/or its affiliates. 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 @@ -187,18 +187,18 @@ const char* Abstract_VM_Version::jre_release_version() { AIX_ONLY("aix") \ BSD_ONLY("bsd") +#ifndef CPU #ifdef ZERO #define CPU ZERO_LIBARCH #else #define CPU IA32_ONLY("x86") \ IA64_ONLY("ia64") \ AMD64_ONLY("amd64") \ - ARM_ONLY("arm") \ - PPC32_ONLY("ppc") \ PPC64_ONLY("ppc64") \ AARCH64_ONLY("aarch64") \ SPARC_ONLY("sparc") #endif // ZERO +#endif const char *Abstract_VM_Version::vm_platform_string() { return OS "-" CPU; @@ -251,12 +251,6 @@ const char* Abstract_VM_Version::internal_vm_info_string() { #ifndef FLOAT_ARCH #if defined(__SOFTFP__) #define FLOAT_ARCH_STR "-sflt" - #elif defined(E500V2) - #define FLOAT_ARCH_STR "-e500v2" - #elif defined(ARM) - #define FLOAT_ARCH_STR "-vfp" - #elif defined(PPC32) - #define FLOAT_ARCH_STR "-hflt" #else #define FLOAT_ARCH_STR "" #endif diff --git a/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp b/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp index 9a00b912048..8d78eef4f9b 100644 --- a/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp +++ b/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2015, Oracle and/or its affiliates. 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 @@ -220,7 +220,7 @@ extern "C" { #define DEBUG_EXCEPTION ::abort(); -#ifdef ARM +#ifdef ARM32 #ifdef SOLARIS #define BREAKPOINT __asm__ volatile (".long 0xe1200070") #else diff --git a/hotspot/src/share/vm/utilities/macros.hpp b/hotspot/src/share/vm/utilities/macros.hpp index cb147277a6f..b44b2ccf418 100644 --- a/hotspot/src/share/vm/utilities/macros.hpp +++ b/hotspot/src/share/vm/utilities/macros.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -392,7 +392,6 @@ #define NOT_E500V2(code) code #endif - #ifdef ARM #define ARM_ONLY(code) code #define NOT_ARM(code) @@ -401,6 +400,14 @@ #define NOT_ARM(code) code #endif +#ifdef ARM32 +#define ARM32_ONLY(code) code +#define NOT_ARM32(code) +#else +#define ARM32_ONLY(code) +#define NOT_ARM32(code) code +#endif + #ifdef AARCH64 #define AARCH64_ONLY(code) code #define NOT_AARCH64(code) From a8da73929a3d1cbcc69c5592f18b8226ab4800a5 Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Wed, 25 Feb 2015 14:01:27 +0300 Subject: [PATCH 03/82] 8043393: NullPointerException and no event received when clipboard data flavor changes Reviewed-by: ant, azvegint --- .../sun/awt/datatransfer/SunClipboard.java | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/jdk/src/java.desktop/share/classes/sun/awt/datatransfer/SunClipboard.java b/jdk/src/java.desktop/share/classes/sun/awt/datatransfer/SunClipboard.java index 258a298adbe..7e73f3fb284 100644 --- a/jdk/src/java.desktop/share/classes/sun/awt/datatransfer/SunClipboard.java +++ b/jdk/src/java.desktop/share/classes/sun/awt/datatransfer/SunClipboard.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2015, Oracle and/or its affiliates. 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 @@ -40,7 +40,7 @@ import java.awt.datatransfer.UnsupportedFlavorException; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.Objects; +import java.util.Arrays; import java.util.Set; import java.util.HashSet; @@ -74,12 +74,11 @@ public abstract class SunClipboard extends Clipboard private volatile int numberOfFlavorListeners = 0; /** - * A set of DataFlavors that is available on - * this clipboard. It is used for tracking changes - * of DataFlavors available on this clipboard. + * A set of {@code DataFlavor}s that is available on this clipboard. It is + * used for tracking changes of {@code DataFlavor}s available on this + * clipboard. Can be {@code null}. */ - private volatile Set currentDataFlavors; - + private volatile long[] currentFormats; public SunClipboard(String name) { super(name); @@ -362,11 +361,11 @@ public abstract class SunClipboard extends Clipboard try { openClipboard(null); currentFormats = getClipboardFormats(); - } catch (IllegalStateException exc) { + } catch (final IllegalStateException ignored) { } finally { closeClipboard(); } - currentDataFlavors = formatArrayAsDataFlavorSet(currentFormats); + this.currentFormats = currentFormats; registerClipboardViewerChecked(); } @@ -383,7 +382,7 @@ public abstract class SunClipboard extends Clipboard } if (flavorListeners.remove(listener) && --numberOfFlavorListeners == 0) { unregisterClipboardViewerChecked(); - currentDataFlavors = null; + currentFormats = null; } } @@ -416,18 +415,16 @@ public abstract class SunClipboard extends Clipboard * @param formats data formats that have just been retrieved from * this clipboard */ - public void checkChange(long[] formats) { - Set prevDataFlavors = currentDataFlavors; - currentDataFlavors = formatArrayAsDataFlavorSet(formats); - - if (Objects.equals(prevDataFlavors, currentDataFlavors)) { + public final void checkChange(final long[] formats) { + if (Arrays.equals(formats, currentFormats)) { // we've been able to successfully get available on the clipboard // DataFlavors this and previous time and they are coincident; // don't notify return; } + currentFormats = formats; - for (AppContext appContext : AppContext.getAppContexts()) { + for (final AppContext appContext : AppContext.getAppContexts()) { if (appContext == null || appContext.isDisposed()) { continue; } From f2de6b3408244b0e94b042decbfbd855e911f853 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Wed, 25 Feb 2015 13:45:09 -0800 Subject: [PATCH 04/82] 8073699: Memory leak in jdk/src/java/desktop/share/native/libjavajpeg/imageioJPEG.c Reviewed-by: bae, serb --- .../java.desktop/share/native/libjavajpeg/imageioJPEG.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/jdk/src/java.desktop/share/native/libjavajpeg/imageioJPEG.c b/jdk/src/java.desktop/share/native/libjavajpeg/imageioJPEG.c index 2fb507c0f66..f0d5c019a8d 100644 --- a/jdk/src/java.desktop/share/native/libjavajpeg/imageioJPEG.c +++ b/jdk/src/java.desktop/share/native/libjavajpeg/imageioJPEG.c @@ -2778,6 +2778,14 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage pb = &data->pixelBuf; if (setPixelBuffer(env, pb, buffer) == NOT_OK) { + if (scale != NULL) { + for (i = 0; i < numBands; i++) { + if (scale[i] != NULL) { + free(scale[i]); + } + } + free(scale); + } return data->abortFlag; // We already threw an out of memory exception } From b15e27a0b282ae2b7021850064d75613daa32cbb Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Thu, 26 Feb 2015 16:41:39 +0300 Subject: [PATCH 05/82] 8073795: JMenuBar looks bad under retina Reviewed-by: alexsch, azvegint --- .../com/apple/laf/AquaMenuBarBorder.java | 45 +++--- .../javax/swing/plaf/basic/BasicBorders.java | 10 +- .../javax/swing/plaf/metal/MetalBorders.java | 26 ++-- .../MisplacedBorder/MisplacedBorder.java | 135 ++++++++++++++++++ 4 files changed, 169 insertions(+), 47 deletions(-) create mode 100644 jdk/test/javax/swing/JMenuBar/MisplacedBorder/MisplacedBorder.java diff --git a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuBarBorder.java b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuBarBorder.java index 389eb4cfeec..bd5ab2b6a8a 100644 --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuBarBorder.java +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuBarBorder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2015, Oracle and/or its affiliates. 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 @@ -25,46 +25,33 @@ package com.apple.laf; -import java.awt.*; +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Insets; import javax.swing.border.Border; +import sun.swing.SwingUtilities2; + +/** + * The class represents the border of a {@code JMenuBar}. + */ public class AquaMenuBarBorder implements Border { - public AquaMenuBarBorder() { - super(); - } - /** - * Paints the border for the specified component with the specified - * position and size. - * @param c the component for which this border is being painted - * @param g the paint graphics - * @param x the x position of the painted border - * @param y the y position of the painted border - * @param width the width of the painted border - * @param height the height of the painted border - */ - public void paintBorder(final Component c, final Graphics g, final int x, final int y, final int width, final int height) { - // for now we don't paint a border. We let the button paint it since there - // needs to be a strict ordering for aqua components. - //paintButton(c, g, x, y, width, height); + @Override + public void paintBorder(final Component c, final Graphics g, final int x, + final int y, final int width, final int height) { g.setColor(Color.gray); - g.drawLine(x, y + height - 1, x + width, y + height - 1); + SwingUtilities2.drawHLine(g, x, x + width - 1, y + height - 1); } - /** - * Returns the insets of the border. - * @param c the component for which this border insets value applies - */ + @Override public Insets getBorderInsets(final Component c) { return new Insets(0, 0, 1, 0); } - /** - * Returns whether or not the border is opaque. If the border - * is opaque, it is responsible for filling in it's own - * background when painting. - */ + @Override public boolean isBorderOpaque() { return false; } diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicBorders.java b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicBorders.java index 633b2f91ee4..949c3e35f4a 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicBorders.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicBorders.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -37,6 +37,8 @@ import java.awt.Rectangle; import java.awt.Color; import java.awt.Graphics; +import sun.swing.SwingUtilities2; + /** * Factory object that can vend Borders appropriate for the basic L & F. * @author Georges Saab @@ -453,10 +455,10 @@ public class BasicBorders { Color oldColor = g.getColor(); g.translate(x, y); g.setColor(shadow); - g.drawLine(0, height-2, width, height-2); + SwingUtilities2.drawHLine(g, 0, width - 1, height - 2); g.setColor(highlight); - g.drawLine(0, height-1, width, height-1); - g.translate(-x,-y); + SwingUtilities2.drawHLine(g, 0, width - 1, height - 1); + g.translate(-x, -y); g.setColor(oldColor); } diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalBorders.java b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalBorders.java index a49a4a8bb48..edbd02bbbad 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalBorders.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalBorders.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2015, Oracle and/or its affiliates. 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 @@ -40,6 +40,7 @@ import java.awt.Graphics; import java.awt.Window; import sun.swing.StringUIClientPropertyKey; +import sun.swing.SwingUtilities2; /** @@ -559,25 +560,22 @@ public class MetalBorders { protected static Insets borderInsets = new Insets( 1, 0, 1, 0 ); public void paintBorder( Component c, Graphics g, int x, int y, int w, int h ) { - g.translate( x, y ); + g.translate(x, y); if (MetalLookAndFeel.usingOcean()) { - // Only paint a border if we're not next to a horizontal - // toolbar - if ((c instanceof JMenuBar) && !MetalToolBarUI.doesMenuBarBorderToolBar((JMenuBar)c)) { + // Only paint a border if we're not next to a horizontal toolbar + if (c instanceof JMenuBar + && !MetalToolBarUI.doesMenuBarBorderToolBar((JMenuBar)c)) { g.setColor(MetalLookAndFeel.getControl()); - g.drawLine(0, h - 2, w, h - 2); + SwingUtilities2.drawHLine(g, 0, w - 1, h - 2); g.setColor(UIManager.getColor("MenuBar.borderColor")); - g.drawLine(0, h - 1, w, h - 1); + SwingUtilities2.drawHLine(g, 0, w - 1, h - 1); } + } else { + g.setColor(MetalLookAndFeel.getControlShadow()); + SwingUtilities2.drawHLine(g, 0, w - 1, h - 1); } - else { - g.setColor( MetalLookAndFeel.getControlShadow() ); - g.drawLine( 0, h-1, w, h-1 ); - } - - g.translate( -x, -y ); - + g.translate(-x, -y); } public Insets getBorderInsets(Component c, Insets newInsets) { diff --git a/jdk/test/javax/swing/JMenuBar/MisplacedBorder/MisplacedBorder.java b/jdk/test/javax/swing/JMenuBar/MisplacedBorder/MisplacedBorder.java new file mode 100644 index 00000000000..43a7dc31533 --- /dev/null +++ b/jdk/test/javax/swing/JMenuBar/MisplacedBorder/MisplacedBorder.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +import javax.imageio.ImageIO; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import static java.awt.image.BufferedImage.TYPE_INT_ARGB_PRE; +import static javax.swing.UIManager.getInstalledLookAndFeels; + +/** + * @test + * @bug 8073795 + * @summary JMenuBar has incorrect border when the window is on retina display. + * @author Sergey Bylokhov + * @run main/othervm MisplacedBorder + * @run main/othervm -Dswing.metalTheme=steel MisplacedBorder + */ +public final class MisplacedBorder implements Runnable { + + public static final int W = 400; + public static final int H = 400; + + public static void main(final String[] args) throws Exception { + for (final UIManager.LookAndFeelInfo laf : getInstalledLookAndFeels()) { + SwingUtilities.invokeAndWait(() -> setLookAndFeel(laf)); + SwingUtilities.invokeAndWait(new MisplacedBorder()); + } + System.out.println("Test passed"); + } + + @Override + public void run() { + final JMenuBar menubar = new JMenuBar(); + menubar.add(new JMenu("")); + menubar.add(new JMenu("")); + final JFrame frame = new JFrame(); + frame.setUndecorated(true); + frame.setJMenuBar(menubar); + frame.setSize(W / 3, H / 3); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + + // draw menu bar using standard order. + final BufferedImage bi1 = step1(menubar); + + // draw menu border on top of the menu bar, nothing should be changed. + final BufferedImage bi2 = step2(menubar); + frame.dispose(); + + for (int x = 0; x < W; ++x) { + for (int y = 0; y < H; ++y) { + if (bi1.getRGB(x, y) != bi2.getRGB(x, y)) { + try { + ImageIO.write(bi1, "png", new File("image1.png")); + ImageIO.write(bi2, "png", new File("image2.png")); + } catch (IOException e) { + e.printStackTrace(); + } + throw new RuntimeException("Failed: wrong color"); + } + } + } + } + + /** + * Draws standard JMenuBar. + */ + private BufferedImage step1(final JMenuBar menubar) { + final BufferedImage bi1 = new BufferedImage(W, H, TYPE_INT_ARGB_PRE); + final Graphics2D g2d = bi1.createGraphics(); + g2d.scale(2, 2); + g2d.setColor(Color.RED); + g2d.fillRect(0, 0, W, H); + menubar.paintAll(g2d); + g2d.dispose(); + return bi1; + } + + /** + * Draws standard JMenuBar and border on top of it. + */ + private BufferedImage step2(final JMenuBar menubar) { + final BufferedImage bi2 = new BufferedImage(W, H, TYPE_INT_ARGB_PRE); + final Graphics2D g2d2 = bi2.createGraphics(); + g2d2.scale(2, 2); + g2d2.setColor(Color.RED); + g2d2.fillRect(0, 0, W, H); + menubar.paintAll(g2d2); + menubar.getBorder().paintBorder(menubar, g2d2, menubar.getX(), menubar + .getX(), menubar.getWidth(), menubar.getHeight()); + g2d2.dispose(); + return bi2; + } + + private static void setLookAndFeel(final UIManager.LookAndFeelInfo laf) { + try { + UIManager.setLookAndFeel(laf.getClassName()); + System.out.println("LookAndFeel: " + laf.getClassName()); + } catch (ClassNotFoundException | InstantiationException | + UnsupportedLookAndFeelException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file From 104db62ecafd761dea22b3b625ca044a51911058 Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Fri, 27 Feb 2015 01:06:39 +0300 Subject: [PATCH 06/82] 4958064: JPGWriter does not throw UnsupportedException when canWriteSequence retuns false Reviewed-by: prr, bae --- .../imageio/plugins/jpeg/JPEGImageWriter.java | 5 ++ .../plugins/shared/CanWriteSequence.java | 78 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 jdk/test/javax/imageio/plugins/shared/CanWriteSequence.java diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java index 0daa7d38b79..bc24343f9ba 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java +++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java @@ -1104,6 +1104,11 @@ public class JPEGImageWriter extends ImageWriter { currentImage++; // After a successful write } + @Override + public boolean canWriteSequence() { + return true; + } + public void prepareWriteSequence(IIOMetadata streamMetadata) throws IOException { setThreadLock(); diff --git a/jdk/test/javax/imageio/plugins/shared/CanWriteSequence.java b/jdk/test/javax/imageio/plugins/shared/CanWriteSequence.java new file mode 100644 index 00000000000..54da1b77cb7 --- /dev/null +++ b/jdk/test/javax/imageio/plugins/shared/CanWriteSequence.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.File; +import java.io.FileOutputStream; +import java.util.Iterator; + +import javax.imageio.ImageIO; +import javax.imageio.ImageWriter; +import javax.imageio.metadata.IIOMetadata; +import javax.imageio.spi.IIORegistry; +import javax.imageio.spi.ImageWriterSpi; +import javax.imageio.stream.ImageOutputStream; + +/** + * @test + * @bug 4958064 + * @author Sergey Bylokhov + */ +public final class CanWriteSequence { + + public static void main(final String[] args) throws Exception { + final IIORegistry registry = IIORegistry.getDefaultInstance(); + final Iterator iter = + registry.getServiceProviders(ImageWriterSpi.class, + provider -> true, true); + // Validates all supported ImageWriters + while (iter.hasNext()) { + final ImageWriter writer = iter.next().createWriterInstance(); + System.out.println("ImageWriter = " + writer); + test(writer); + } + System.out.println("Test passed"); + } + + private static void test(final ImageWriter writer) throws Exception { + final File file = File.createTempFile("temp", ".img"); + file.deleteOnExit(); + final FileOutputStream fos = new FileOutputStream(file); + final ImageOutputStream ios = ImageIO.createImageOutputStream(fos); + writer.setOutput(ios); + final IIOMetadata data = writer.getDefaultStreamMetadata(null); + + if (writer.canWriteSequence()) { + writer.prepareWriteSequence(data); + } else { + try { + writer.prepareWriteSequence(data); + throw new RuntimeException( + "UnsupportedOperationException was not thrown"); + } catch (final UnsupportedOperationException ignored) { + // expected + } + } + writer.dispose(); + ios.close(); + } +} \ No newline at end of file From 307da40f99977566768d582aa2193e7882b17eec Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan Date: Mon, 2 Mar 2015 16:34:44 +0300 Subject: [PATCH 07/82] 8048782: OpenJDK: PiscesCache : xmax/ymax rounding up can cause RasterFormatException Reviewed-by: prr, flar --- .../sun/java2d/pisces/PiscesCache.java | 9 + .../java2d/pisces/PiscesTileGenerator.java | 5 +- .../sun/java2d/pisces/OpenJDKFillBug.java | 173 ++++++++++++++++++ 3 files changed, 183 insertions(+), 4 deletions(-) create mode 100644 jdk/test/sun/java2d/pisces/OpenJDKFillBug.java diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/pisces/PiscesCache.java b/jdk/src/java.desktop/share/classes/sun/java2d/pisces/PiscesCache.java index fd8cfa7917f..a26e7aa05f3 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/pisces/PiscesCache.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/pisces/PiscesCache.java @@ -167,6 +167,15 @@ final class PiscesCache { rowAARLE[row][1] = end; } + void getBBox(int bbox[]) { + // Since we add +1 to bboxX1,bboxY1 so when PTG asks for bbox, + // we will give after -1 + bbox[0] = bboxX0; + bbox[1] = bboxY0; + bbox[2] = bboxX1 - 1; + bbox[3] = bboxY1 - 1; + } + @Override public String toString() { String ret = "bbox = ["+ diff --git a/jdk/src/java.desktop/share/classes/sun/java2d/pisces/PiscesTileGenerator.java b/jdk/src/java.desktop/share/classes/sun/java2d/pisces/PiscesTileGenerator.java index 2fc2e9c7e7c..7f1b49eca54 100644 --- a/jdk/src/java.desktop/share/classes/sun/java2d/pisces/PiscesTileGenerator.java +++ b/jdk/src/java.desktop/share/classes/sun/java2d/pisces/PiscesTileGenerator.java @@ -76,10 +76,7 @@ final class PiscesTileGenerator implements AATileGenerator { } public void getBbox(int bbox[]) { - bbox[0] = cache.bboxX0; - bbox[1] = cache.bboxY0; - bbox[2] = cache.bboxX1; - bbox[3] = cache.bboxY1; + cache.getBBox(bbox); //System.out.println("bbox["+bbox[0]+", "+bbox[1]+" => "+bbox[2]+", "+bbox[3]+"]"); } diff --git a/jdk/test/sun/java2d/pisces/OpenJDKFillBug.java b/jdk/test/sun/java2d/pisces/OpenJDKFillBug.java new file mode 100644 index 00000000000..1c39583d922 --- /dev/null +++ b/jdk/test/sun/java2d/pisces/OpenJDKFillBug.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +import java.awt.Color; +import java.awt.Composite; +import java.awt.CompositeContext; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.geom.AffineTransform; +import java.awt.geom.GeneralPath; +import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.awt.image.Raster; +import java.awt.image.WritableRaster; +import java.awt.image.RasterFormatException; + +/** + * @test + * @bug 8048782 + * @summary Test program that demonstrates PiscesRendering bug in + * OpenJDK 1.7.0.60 (and probably in all other OpenJDK versions, too). + */ + +public class OpenJDKFillBug +{ + /** + * Test program that demonstrates a bug in OpenJDK 1.7.0.60 (and + * probably in all other OpenJDK versions, too). To see the bug, simply run + * the 'main' program with OpenJDK. The bug makes the 'g2d.fill' + * method fail with the following exception: + * + * This bug is found in OpenJDK but also is present in OracleJDK + * if run with + * -Dsun.java2d.renderer=sun.java2d.pisces.PiscesRenderingEngine + * + * The bug is related to sun.java2d.pisces.PiscesCache constructor + * that accepts '(int minx,int miny,int maxx,int maxy)' arguments: + * the internal 'bboxX1' and 'bboxY1' are set to values one greater + * than given maximum X and Y values. Those maximum values are then + * later used in AAShapePipe' class 'renderTiles' method, where a + * Y/X loop eventually calls 'GeneralCompositePipe' class + * 'renderPathTile' method. In that method, the operation will + * eventually call 'IntegerInterleavedRaster' class + * 'createWritableChild' method with arguments: + * + *
    + *
  • x=800 + *
  • y=0 + *
  • width=2 (this value is too high: should be 1) + *
  • height=32 + *
  • x0=0 + *
  • y0=0 + *
  • bandList[]=null + *
+ * + * This calls for a sub-raster with bounds that fall outside the + * original raster, and therefore the 'createWritableChild' method + * correctly throws 'RasterFormatException'. + * + * The bug is closely related to the use of a custom Composite + * implementation, which are quite rare. The application where this + * bug was first detected implements a high-quality PDF rendering + * engine that needs custom Composite operations to properly + * implement PDF advanced color blending and masking operators. + */ + + public static void main(String args[]) + { + BufferedImage bi = new BufferedImage(801,1202, + BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = bi.createGraphics(); + GeneralPath gp = new GeneralPath(); + AffineTransform m = new AffineTransform(2.483489907915543, + 0.0, + 0.0, + -2.4844977263331955, + 0.0, + 1202.0); + Composite c = new CustomComposite(); + + gp.moveTo(-4.511, -14.349); + gp.lineTo(327.489, -14.349); + gp.lineTo(327.489, 494.15); + gp.lineTo(-4.511, 494.15); + gp.closePath(); + + g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, + RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); + g2d.setRenderingHint(RenderingHints.KEY_RENDERING, + RenderingHints.VALUE_RENDER_QUALITY); + g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, + RenderingHints.VALUE_COLOR_RENDER_QUALITY); + g2d.setRenderingHint(RenderingHints.KEY_TEXT_LCD_CONTRAST, + Integer.valueOf(140)); + g2d.setRenderingHint(RenderingHints.KEY_DITHERING, + RenderingHints.VALUE_DITHER_ENABLE); + g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, + RenderingHints.VALUE_STROKE_NORMALIZE); + g2d.setPaint(Color.red); + g2d.setComposite(c); + g2d.setTransform(m); + try { + g2d.fill(gp); + } catch (RasterFormatException rfe) { + System.out.println("Test failed"); + throw new RuntimeException("xmax/ymax rounding cause RasterFormatException: " + rfe); + } + g2d.dispose(); + System.out.println("Test passed"); + } + + // === CustomComposite === + + /** + * Dummy custom Composite implementation. + */ + + public static class CustomComposite implements Composite + { + @Override + public CompositeContext createContext(ColorModel srcColorModel, + ColorModel dstColorModel, + RenderingHints hints) + { + return new CustomCompositeContext(); + } + + // === CustomCompositeContext === + + /** + * Dummy custom CompositeContext implementation. + */ + + public static class CustomCompositeContext implements CompositeContext + { + + @Override + public void dispose() + { + // NOP + } + + @Override + public void compose(Raster src,Raster dstIn,WritableRaster dstOut) + { + // NOP + } + } + } +} From 3ca192f3b3652902833530120d454ed76f0e9cf0 Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan Date: Tue, 3 Mar 2015 17:50:01 +0300 Subject: [PATCH 08/82] 8039345: Strange behaviour of per-pixel translucency on linux Reviewed-by: prr, azvegint --- .../classes/sun/java2d/xr/XRSurfaceData.java | 14 ++- .../XRSurfaceData/ComponentResizeTest.java | 100 ++++++++++++++++++ 2 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 jdk/test/sun/java2d/XRSurfaceData/ComponentResizeTest.java diff --git a/jdk/src/java.desktop/unix/classes/sun/java2d/xr/XRSurfaceData.java b/jdk/src/java.desktop/unix/classes/sun/java2d/xr/XRSurfaceData.java index 296bf4b62f2..dcfd6325b35 100644 --- a/jdk/src/java.desktop/unix/classes/sun/java2d/xr/XRSurfaceData.java +++ b/jdk/src/java.desktop/unix/classes/sun/java2d/xr/XRSurfaceData.java @@ -548,8 +548,18 @@ public abstract class XRSurfaceData extends XSurfaceData { peer.getColorModel().getPixelSize(), Transparency.OPAQUE); if (isXRDrawableValid()) { - initXRender(XRUtils. - getPictureFormatForTransparency(Transparency.OPAQUE)); + // If we have a 32 bit color model for the window it needs + // alpha to support translucency of the window so we need + // to get the ARGB32 XRender picture format else for + // 24 bit colormodel we need RGB24 or OPAQUE pictureformat. + if (peer.getColorModel().getPixelSize() == 32) { + initXRender(XRUtils. + getPictureFormatForTransparency(Transparency.TRANSLUCENT)); + } + else { + initXRender(XRUtils. + getPictureFormatForTransparency(Transparency.OPAQUE)); + } makePipes(); } } diff --git a/jdk/test/sun/java2d/XRSurfaceData/ComponentResizeTest.java b/jdk/test/sun/java2d/XRSurfaceData/ComponentResizeTest.java new file mode 100644 index 00000000000..db9e1e57147 --- /dev/null +++ b/jdk/test/sun/java2d/XRSurfaceData/ComponentResizeTest.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.Color; +import java.awt.FlowLayout; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JFrame; +import javax.swing.SwingUtilities; +import java.awt.Component; +import javax.swing.JOptionPane; + +/** + * @test + * @bug 8039345 + * @author Prasanta Sadhukhan + * @run main/manual ComponentResizeTest + * @summary Resizes JFrame so that component drawn inside it gets repainted + * without leaving any trails + */ +public class ComponentResizeTest { + + private static JFrame demoFrame; + + public static void testresize() throws Exception { + Thread.sleep(5000); + for (int i = 0; i < 20; i++) { + SwingUtilities.invokeLater(() -> { + demoFrame.setSize(demoFrame.getWidth() + 5, demoFrame.getHeight() + 5); + }); + Thread.sleep(1000); + } + } + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(() -> { + JOptionPane.showMessageDialog( + (Component) null, + "The test creates a transparent JFrame and resizes the JFrame. Please verify JFrame is transparent and components (like JButton, checkbox) move without leaving any trails", + "information", JOptionPane.INFORMATION_MESSAGE); + createAndShowGUI(); + }); + + try { + testresize(); + } finally { + SwingUtilities.invokeLater(() -> { + demoFrame.dispose(); + }); + } + + SwingUtilities.invokeAndWait(() -> { + int confirm = JOptionPane.showConfirmDialog( + (Component) null, + "Did the component resize work without leaving any trails?", + "alert", JOptionPane.YES_NO_OPTION); + if (confirm == JOptionPane.YES_OPTION) { + System.out.println("Test passed"); + } else { + System.out.println("Test failed"); + throw new RuntimeException("Component resize leaves trail"); + } + }); + } + + private static void createAndShowGUI() { + demoFrame = new JFrame(); + demoFrame.setSize(300, 300); + demoFrame.setLayout(new FlowLayout()); + demoFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + demoFrame.setUndecorated(true); + demoFrame.setBackground(new Color(0f, 0, 0, 0.1f)); + JCheckBox b = new JCheckBox("Whatever"); + demoFrame.paintAll(null); + b.setOpaque(true); + demoFrame.add(b); + demoFrame.add(new JButton()); + demoFrame.setVisible(true); + } +} From 8def2a3e453b99e6e51609a40f927f41d0b44587 Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Tue, 3 Mar 2015 20:23:34 +0300 Subject: [PATCH 09/82] 8073420: JFrame.EXIT_ON_CLOSE can be removed in favour of WindowConstants.EXIT_ON_CLOSE Reviewed-by: art, azvegint, alexsch --- .../J2DBench/src/j2dbench/J2DBench.java | 5 +++-- .../demo/share/jfc/SampleTree/SampleTree.java | 4 ++-- jdk/src/demo/share/management/JTop/JTop.java | 4 ++-- .../share/classes/javax/swing/JFrame.java | 20 ++++++------------- .../share/classes/javax/swing/JLayer.java | 4 ++-- 5 files changed, 15 insertions(+), 22 deletions(-) diff --git a/jdk/src/demo/share/java2d/J2DBench/src/j2dbench/J2DBench.java b/jdk/src/demo/share/java2d/J2DBench/src/j2dbench/J2DBench.java index 2294e7f01be..053908ca8d8 100644 --- a/jdk/src/demo/share/java2d/J2DBench/src/j2dbench/J2DBench.java +++ b/jdk/src/demo/share/java2d/J2DBench/src/j2dbench/J2DBench.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -61,6 +61,7 @@ import javax.swing.BoxLayout; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; +import javax.swing.WindowConstants; import java.text.SimpleDateFormat; import java.util.Date; @@ -698,7 +699,7 @@ public class J2DBench { } }; guiFrame = f; - f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); f.getContentPane().setLayout(new BorderLayout()); f.getContentPane().add(Group.root.getJComponent(), BorderLayout.CENTER); JPanel p = new JPanel(); diff --git a/jdk/src/demo/share/jfc/SampleTree/SampleTree.java b/jdk/src/demo/share/jfc/SampleTree/SampleTree.java index efde28fd6f0..c7093a157ae 100644 --- a/jdk/src/demo/share/jfc/SampleTree/SampleTree.java +++ b/jdk/src/demo/share/jfc/SampleTree/SampleTree.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -135,7 +135,7 @@ public final class SampleTree { panel.add("Center", sp); panel.add("South", constructOptionsPanel()); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } diff --git a/jdk/src/demo/share/management/JTop/JTop.java b/jdk/src/demo/share/management/JTop/JTop.java index ab0cd94e33d..c1d48cc3716 100644 --- a/jdk/src/demo/share/management/JTop/JTop.java +++ b/jdk/src/demo/share/management/JTop/JTop.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -410,7 +410,7 @@ public class JTop extends JPanel { private static void createAndShowGUI(JPanel jtop) { // Create and set up the window. JFrame frame = new JFrame("JTop"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // Create and set up the content pane. JComponent contentPane = (JComponent) frame.getContentPane(); diff --git a/jdk/src/java.desktop/share/classes/javax/swing/JFrame.java b/jdk/src/java.desktop/share/classes/javax/swing/JFrame.java index 68d81f602a4..be6b5ba96ba 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/JFrame.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/JFrame.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -127,16 +127,6 @@ public class JFrame extends Frame implements WindowConstants, RootPaneContainer, TransferHandler.HasGetTransferHandler { - /** - * The exit application default window close operation. If a window - * has this set as the close operation and is closed in an applet, - * a SecurityException may be thrown. - * It is recommended you only use this in an application. - * - * @since 1.3 - */ - public static final int EXIT_ON_CLOSE = 3; - /** * Key into the AppContext, used to check if should provide decorations * by default. @@ -352,7 +342,7 @@ public class JFrame extends Frame implements WindowConstants, * objects. * *
  • EXIT_ON_CLOSE - * (defined in JFrame): + * (defined in WindowConstants): * Exit the application using the System * exit method. Use this only in applications. * @@ -393,7 +383,9 @@ public class JFrame extends Frame implements WindowConstants, operation != HIDE_ON_CLOSE && operation != DISPOSE_ON_CLOSE && operation != EXIT_ON_CLOSE) { - throw new IllegalArgumentException("defaultCloseOperation must be one of: DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, DISPOSE_ON_CLOSE, or EXIT_ON_CLOSE"); + throw new IllegalArgumentException("defaultCloseOperation must be" + + " one of: DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE," + + " DISPOSE_ON_CLOSE, or EXIT_ON_CLOSE"); } if (operation == EXIT_ON_CLOSE) { @@ -861,7 +853,7 @@ public class JFrame extends Frame implements WindowConstants, defaultCloseOperationString = "DISPOSE_ON_CLOSE"; } else if (defaultCloseOperation == DO_NOTHING_ON_CLOSE) { defaultCloseOperationString = "DO_NOTHING_ON_CLOSE"; - } else if (defaultCloseOperation == 3) { + } else if (defaultCloseOperation == EXIT_ON_CLOSE) { defaultCloseOperationString = "EXIT_ON_CLOSE"; } else defaultCloseOperationString = ""; String rootPaneString = (rootPane != null ? diff --git a/jdk/src/java.desktop/share/classes/javax/swing/JLayer.java b/jdk/src/java.desktop/share/classes/javax/swing/JLayer.java index 9c22489f5b6..833b09e6e73 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/JLayer.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/JLayer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2015, Oracle and/or its affiliates. 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 @@ -103,7 +103,7 @@ import java.security.PrivilegedAction; * * private static void createAndShowGUI() { * final JFrame frame = new JFrame(); - * frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + * frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); * * // work with the layer as with any other Swing component * frame.add(createLayer()); From c2a4574760cb93bb4e46dca8eb15b72ef39ad5b7 Mon Sep 17 00:00:00 2001 From: Erik Osterlund Date: Tue, 3 Mar 2015 19:20:26 -0500 Subject: [PATCH 10/82] 7143664: Clean up OrderAccess implementations and usage Clarify and correct the abstract model for memory barriers provided by the orderAccess class. Refactor the implementations using template specialization to allow the bulk of the code to be shared, with platform specific customizations applied as needed. Reviewed-by: acorn, dcubed, dholmes, dlong, goetz, kbarrett, sgehwolf --- .../src/cpu/x86/vm/c1_LIRAssembler_x86.cpp | 2 - .../aix_ppc/vm/orderAccess_aix_ppc.inline.hpp | 87 ++---- .../bsd_x86/vm/orderAccess_bsd_x86.inline.hpp | 182 +++--------- .../vm/orderAccess_bsd_zero.inline.hpp | 126 +-------- .../vm/orderAccess_linux_ppc.inline.hpp | 88 ++---- .../vm/orderAccess_linux_sparc.inline.hpp | 84 +----- .../vm/orderAccess_linux_x86.inline.hpp | 171 ++---------- .../vm/orderAccess_linux_zero.inline.hpp | 124 +------- .../vm/orderAccess_solaris_sparc.inline.hpp | 109 ++------ .../os_cpu/solaris_sparc/vm/solaris_sparc.il | 41 +-- .../vm/orderAccess_solaris_x86.inline.hpp | 111 ++------ .../os_cpu/solaris_x86/vm/solaris_x86_32.il | 29 +- .../os_cpu/solaris_x86/vm/solaris_x86_64.il | 29 +- .../vm/orderAccess_windows_x86.inline.hpp | 188 +++---------- hotspot/src/share/vm/runtime/orderAccess.hpp | 264 ++++++++++-------- .../share/vm/runtime/orderAccess.inline.hpp | 91 +++++- 16 files changed, 494 insertions(+), 1232 deletions(-) diff --git a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp index 7c90c1decda..c76408f6af7 100644 --- a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp @@ -3947,12 +3947,10 @@ void LIR_Assembler::membar() { void LIR_Assembler::membar_acquire() { // No x86 machines currently require load fences - // __ load_fence(); } void LIR_Assembler::membar_release() { // No x86 machines currently require store fences - // __ store_fence(); } void LIR_Assembler::membar_loadload() { diff --git a/hotspot/src/os_cpu/aix_ppc/vm/orderAccess_aix_ppc.inline.hpp b/hotspot/src/os_cpu/aix_ppc/vm/orderAccess_aix_ppc.inline.hpp index 36ca820a6bd..71eb6ac9536 100644 --- a/hotspot/src/os_cpu/aix_ppc/vm/orderAccess_aix_ppc.inline.hpp +++ b/hotspot/src/os_cpu/aix_ppc/vm/orderAccess_aix_ppc.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2014, SAP AG. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -28,6 +28,9 @@ #include "runtime/orderAccess.hpp" +// Compiler version last used for testing: xlc 12 +// Please update this information when this file changes + // Implementation of class OrderAccess. // @@ -61,86 +64,30 @@ #define inlasm_lwsync() __asm__ __volatile__ ("lwsync" : : : "memory"); #define inlasm_eieio() __asm__ __volatile__ ("eieio" : : : "memory"); #define inlasm_isync() __asm__ __volatile__ ("isync" : : : "memory"); -#define inlasm_release() inlasm_lwsync(); -#define inlasm_acquire() inlasm_lwsync(); // Use twi-isync for load_acquire (faster than lwsync). // ATTENTION: seems like xlC 10.1 has problems with this inline assembler macro (VerifyMethodHandles found "bad vminfo in AMH.conv"): // #define inlasm_acquire_reg(X) __asm__ __volatile__ ("twi 0,%0,0\n isync\n" : : "r" (X) : "memory"); #define inlasm_acquire_reg(X) inlasm_lwsync(); -#define inlasm_fence() inlasm_sync(); -inline void OrderAccess::loadload() { inlasm_lwsync(); } -inline void OrderAccess::storestore() { inlasm_lwsync(); } -inline void OrderAccess::loadstore() { inlasm_lwsync(); } -inline void OrderAccess::storeload() { inlasm_fence(); } +inline void OrderAccess::loadload() { inlasm_lwsync(); } +inline void OrderAccess::storestore() { inlasm_lwsync(); } +inline void OrderAccess::loadstore() { inlasm_lwsync(); } +inline void OrderAccess::storeload() { inlasm_sync(); } -inline void OrderAccess::acquire() { inlasm_acquire(); } -inline void OrderAccess::release() { inlasm_release(); } -inline void OrderAccess::fence() { inlasm_fence(); } +inline void OrderAccess::acquire() { inlasm_lwsync(); } +inline void OrderAccess::release() { inlasm_lwsync(); } +inline void OrderAccess::fence() { inlasm_sync(); } -inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { register jbyte t = *p; inlasm_acquire_reg(t); return t; } -inline jshort OrderAccess::load_acquire(volatile jshort* p) { register jshort t = *p; inlasm_acquire_reg(t); return t; } -inline jint OrderAccess::load_acquire(volatile jint* p) { register jint t = *p; inlasm_acquire_reg(t); return t; } -inline jlong OrderAccess::load_acquire(volatile jlong* p) { register jlong t = *p; inlasm_acquire_reg(t); return t; } -inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { register jubyte t = *p; inlasm_acquire_reg(t); return t; } -inline jushort OrderAccess::load_acquire(volatile jushort* p) { register jushort t = *p; inlasm_acquire_reg(t); return t; } -inline juint OrderAccess::load_acquire(volatile juint* p) { register juint t = *p; inlasm_acquire_reg(t); return t; } -inline julong OrderAccess::load_acquire(volatile julong* p) { return (julong)load_acquire((volatile jlong*)p); } -inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { register jfloat t = *p; inlasm_acquire(); return t; } -inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { register jdouble t = *p; inlasm_acquire(); return t; } - -inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { return (intptr_t)load_acquire((volatile jlong*)p); } -inline void* OrderAccess::load_ptr_acquire(volatile void* p) { return (void*) load_acquire((volatile jlong*)p); } -inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { return (void*) load_acquire((volatile jlong*)p); } - -inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile jshort* p, jshort v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile jint* p, jint v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile jlong* p, jlong v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile jushort* p, jushort v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile juint* p, juint v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile julong* p, julong v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { inlasm_release(); *p = v; } - -inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { inlasm_release(); *(void* volatile *)p = v; } - -inline void OrderAccess::store_fence(jbyte* p, jbyte v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(jshort* p, jshort v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(jint* p, jint v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(jlong* p, jlong v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(jubyte* p, jubyte v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(jushort* p, jushort v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(juint* p, juint v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(julong* p, julong v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(jfloat* p, jfloat v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(jdouble* p, jdouble v) { *p = v; inlasm_fence(); } - -inline void OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_ptr_fence(void** p, void* v) { *p = v; inlasm_fence(); } - -inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { inlasm_release(); *p = v; inlasm_fence(); } - -inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_ptr_fence(volatile void* p, void* v) { inlasm_release(); *(void* volatile *)p = v; inlasm_fence(); } +template<> inline jbyte OrderAccess::specialized_load_acquire (volatile jbyte* p) { register jbyte t = load(p); inlasm_acquire_reg(t); return t; } +template<> inline jshort OrderAccess::specialized_load_acquire(volatile jshort* p) { register jshort t = load(p); inlasm_acquire_reg(t); return t; } +template<> inline jint OrderAccess::specialized_load_acquire (volatile jint* p) { register jint t = load(p); inlasm_acquire_reg(t); return t; } +template<> inline jlong OrderAccess::specialized_load_acquire (volatile jlong* p) { register jlong t = load(p); inlasm_acquire_reg(t); return t; } #undef inlasm_sync #undef inlasm_lwsync #undef inlasm_eieio #undef inlasm_isync -#undef inlasm_release -#undef inlasm_acquire -#undef inlasm_fence + +#define VM_HAS_GENERALIZED_ORDER_ACCESS 1 #endif // OS_CPU_AIX_OJDKPPC_VM_ORDERACCESS_AIX_PPC_INLINE_HPP diff --git a/hotspot/src/os_cpu/bsd_x86/vm/orderAccess_bsd_x86.inline.hpp b/hotspot/src/os_cpu/bsd_x86/vm/orderAccess_bsd_x86.inline.hpp index 834efd2bbf7..bc28eb2b2d4 100644 --- a/hotspot/src/os_cpu/bsd_x86/vm/orderAccess_bsd_x86.inline.hpp +++ b/hotspot/src/os_cpu/bsd_x86/vm/orderAccess_bsd_x86.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, Oracle and/or its affiliates. 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 @@ -29,27 +29,27 @@ #include "runtime/orderAccess.hpp" #include "runtime/os.hpp" +// Compiler version last used for testing: clang 5.1 +// Please update this information when this file changes + +// A compiler barrier, forcing the C++ compiler to invalidate all memory assumptions +static inline void compiler_barrier() { + __asm__ volatile ("" : : : "memory"); +} + +// x86 is TSO and hence only needs a fence for storeload +// However, a compiler barrier is still needed to prevent reordering +// between volatile and non-volatile memory accesses. + // Implementation of class OrderAccess. -inline void OrderAccess::loadload() { acquire(); } -inline void OrderAccess::storestore() { release(); } -inline void OrderAccess::loadstore() { acquire(); } -inline void OrderAccess::storeload() { fence(); } +inline void OrderAccess::loadload() { compiler_barrier(); } +inline void OrderAccess::storestore() { compiler_barrier(); } +inline void OrderAccess::loadstore() { compiler_barrier(); } +inline void OrderAccess::storeload() { fence(); } -inline void OrderAccess::acquire() { - volatile intptr_t local_dummy; -#ifdef AMD64 - __asm__ volatile ("movq 0(%%rsp), %0" : "=r" (local_dummy) : : "memory"); -#else - __asm__ volatile ("movl 0(%%esp),%0" : "=r" (local_dummy) : : "memory"); -#endif // AMD64 -} - -inline void OrderAccess::release() { - // Avoid hitting the same cache-line from - // different threads. - volatile jint local_dummy = 0; -} +inline void OrderAccess::acquire() { compiler_barrier(); } +inline void OrderAccess::release() { compiler_barrier(); } inline void OrderAccess::fence() { if (os::is_MP()) { @@ -60,156 +60,50 @@ inline void OrderAccess::fence() { __asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory"); #endif } + compiler_barrier(); } -inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { return *p; } -inline jshort OrderAccess::load_acquire(volatile jshort* p) { return *p; } -inline jint OrderAccess::load_acquire(volatile jint* p) { return *p; } -inline jlong OrderAccess::load_acquire(volatile jlong* p) { return Atomic::load(p); } -inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { return *p; } -inline jushort OrderAccess::load_acquire(volatile jushort* p) { return *p; } -inline juint OrderAccess::load_acquire(volatile juint* p) { return *p; } -inline julong OrderAccess::load_acquire(volatile julong* p) { return Atomic::load((volatile jlong*)p); } -inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { return *p; } -inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return jdouble_cast(Atomic::load((volatile jlong*)p)); } - -inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { return *p; } -inline void* OrderAccess::load_ptr_acquire(volatile void* p) { return *(void* volatile *)p; } -inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { return *(void* const volatile *)p; } - -inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { *p = v; } -inline void OrderAccess::release_store(volatile jshort* p, jshort v) { *p = v; } -inline void OrderAccess::release_store(volatile jint* p, jint v) { *p = v; } -inline void OrderAccess::release_store(volatile jlong* p, jlong v) { Atomic::store(v, p); } -inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { *p = v; } -inline void OrderAccess::release_store(volatile jushort* p, jushort v) { *p = v; } -inline void OrderAccess::release_store(volatile juint* p, juint v) { *p = v; } -inline void OrderAccess::release_store(volatile julong* p, julong v) { Atomic::store((jlong)v, (volatile jlong*)p); } -inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { *p = v; } -inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { release_store((volatile jlong*)p, jlong_cast(v)); } - -inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { *p = v; } -inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { *(void* volatile *)p = v; } - -inline void OrderAccess::store_fence(jbyte* p, jbyte v) { +template<> +inline void OrderAccess::specialized_release_store_fence (volatile jbyte* p, jbyte v) { __asm__ volatile ( "xchgb (%2),%0" : "=q" (v) : "0" (v), "r" (p) : "memory"); } -inline void OrderAccess::store_fence(jshort* p, jshort v) { +template<> +inline void OrderAccess::specialized_release_store_fence(volatile jshort* p, jshort v) { __asm__ volatile ( "xchgw (%2),%0" : "=r" (v) : "0" (v), "r" (p) : "memory"); } -inline void OrderAccess::store_fence(jint* p, jint v) { +template<> +inline void OrderAccess::specialized_release_store_fence (volatile jint* p, jint v) { __asm__ volatile ( "xchgl (%2),%0" : "=r" (v) : "0" (v), "r" (p) : "memory"); } -inline void OrderAccess::store_fence(jlong* p, jlong v) { #ifdef AMD64 - __asm__ __volatile__ ("xchgq (%2), %0" - : "=r" (v) - : "0" (v), "r" (p) - : "memory"); -#else - *p = v; fence(); -#endif // AMD64 -} - -// AMD64 copied the bodies for the the signed version. 32bit did this. As long as the -// compiler does the inlining this is simpler. -inline void OrderAccess::store_fence(jubyte* p, jubyte v) { store_fence((jbyte*)p, (jbyte)v); } -inline void OrderAccess::store_fence(jushort* p, jushort v) { store_fence((jshort*)p, (jshort)v); } -inline void OrderAccess::store_fence(juint* p, juint v) { store_fence((jint*)p, (jint)v); } -inline void OrderAccess::store_fence(julong* p, julong v) { store_fence((jlong*)p, (jlong)v); } -inline void OrderAccess::store_fence(jfloat* p, jfloat v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jdouble* p, jdouble v) { *p = v; fence(); } - -inline void OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v) { -#ifdef AMD64 - __asm__ __volatile__ ("xchgq (%2), %0" - : "=r" (v) - : "0" (v), "r" (p) - : "memory"); -#else - store_fence((jint*)p, (jint)v); -#endif // AMD64 -} - -inline void OrderAccess::store_ptr_fence(void** p, void* v) { -#ifdef AMD64 - __asm__ __volatile__ ("xchgq (%2), %0" - : "=r" (v) - : "0" (v), "r" (p) - : "memory"); -#else - store_fence((jint*)p, (jint)v); -#endif // AMD64 -} - -// Must duplicate definitions instead of calling store_fence because we don't want to cast away volatile. -inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { - __asm__ volatile ( "xchgb (%2),%0" - : "=q" (v) - : "0" (v), "r" (p) - : "memory"); -} -inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { - __asm__ volatile ( "xchgw (%2),%0" +template<> +inline void OrderAccess::specialized_release_store_fence (volatile jlong* p, jlong v) { + __asm__ volatile ( "xchgq (%2), %0" : "=r" (v) : "0" (v), "r" (p) : "memory"); } -inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { - __asm__ volatile ( "xchgl (%2),%0" - : "=r" (v) - : "0" (v), "r" (p) - : "memory"); -} - -inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { -#ifdef AMD64 - __asm__ __volatile__ ( "xchgq (%2), %0" - : "=r" (v) - : "0" (v), "r" (p) - : "memory"); -#else - release_store(p, v); fence(); #endif // AMD64 + +template<> +inline void OrderAccess::specialized_release_store_fence (volatile jfloat* p, jfloat v) { + release_store_fence((volatile jint*)p, jint_cast(v)); +} +template<> +inline void OrderAccess::specialized_release_store_fence(volatile jdouble* p, jdouble v) { + release_store_fence((volatile jlong*)p, jlong_cast(v)); } -inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { release_store_fence((volatile jbyte*)p, (jbyte)v); } -inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { release_store_fence((volatile jshort*)p, (jshort)v); } -inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { release_store_fence((volatile jint*)p, (jint)v); } -inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store_fence((volatile jlong*)p, (jlong)v); } - -inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { release_store_fence((volatile jlong*)p, jlong_cast(v)); } - -inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { -#ifdef AMD64 - __asm__ __volatile__ ( "xchgq (%2), %0" - : "=r" (v) - : "0" (v), "r" (p) - : "memory"); -#else - release_store_fence((volatile jint*)p, (jint)v); -#endif // AMD64 -} -inline void OrderAccess::release_store_ptr_fence(volatile void* p, void* v) { -#ifdef AMD64 - __asm__ __volatile__ ( "xchgq (%2), %0" - : "=r" (v) - : "0" (v), "r" (p) - : "memory"); -#else - release_store_fence((volatile jint*)p, (jint)v); -#endif // AMD64 -} +#define VM_HAS_GENERALIZED_ORDER_ACCESS 1 #endif // OS_CPU_BSD_X86_VM_ORDERACCESS_BSD_X86_INLINE_HPP diff --git a/hotspot/src/os_cpu/bsd_zero/vm/orderAccess_bsd_zero.inline.hpp b/hotspot/src/os_cpu/bsd_zero/vm/orderAccess_bsd_zero.inline.hpp index ecc4c752777..fb3017ce9d1 100644 --- a/hotspot/src/os_cpu/bsd_zero/vm/orderAccess_bsd_zero.inline.hpp +++ b/hotspot/src/os_cpu/bsd_zero/vm/orderAccess_bsd_zero.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright 2007, 2008, 2009 Red Hat, Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -40,8 +40,7 @@ typedef void (__kernel_dmb_t) (void); #define __kernel_dmb (*(__kernel_dmb_t *) 0xffff0fa0) #define FULL_MEM_BARRIER __kernel_dmb() -#define READ_MEM_BARRIER __kernel_dmb() -#define WRITE_MEM_BARRIER __kernel_dmb() +#define LIGHT_MEM_BARRIER __kernel_dmb() #else // ARM @@ -50,126 +49,31 @@ typedef void (__kernel_dmb_t) (void); #ifdef PPC #ifdef __NO_LWSYNC__ -#define READ_MEM_BARRIER __asm __volatile ("sync":::"memory") -#define WRITE_MEM_BARRIER __asm __volatile ("sync":::"memory") +#define LIGHT_MEM_BARRIER __asm __volatile ("sync":::"memory") #else -#define READ_MEM_BARRIER __asm __volatile ("lwsync":::"memory") -#define WRITE_MEM_BARRIER __asm __volatile ("lwsync":::"memory") +#define LIGHT_MEM_BARRIER __asm __volatile ("lwsync":::"memory") #endif #else // PPC -#define READ_MEM_BARRIER __asm __volatile ("":::"memory") -#define WRITE_MEM_BARRIER __asm __volatile ("":::"memory") +#define LIGHT_MEM_BARRIER __asm __volatile ("":::"memory") #endif // PPC #endif // ARM +// Note: What is meant by LIGHT_MEM_BARRIER is a barrier which is sufficient +// to provide TSO semantics, i.e. StoreStore | LoadLoad | LoadStore. -inline void OrderAccess::loadload() { acquire(); } -inline void OrderAccess::storestore() { release(); } -inline void OrderAccess::loadstore() { acquire(); } -inline void OrderAccess::storeload() { fence(); } +inline void OrderAccess::loadload() { LIGHT_MEM_BARRIER; } +inline void OrderAccess::storestore() { LIGHT_MEM_BARRIER; } +inline void OrderAccess::loadstore() { LIGHT_MEM_BARRIER; } +inline void OrderAccess::storeload() { FULL_MEM_BARRIER; } -inline void OrderAccess::acquire() { - READ_MEM_BARRIER; -} +inline void OrderAccess::acquire() { LIGHT_MEM_BARRIER; } +inline void OrderAccess::release() { LIGHT_MEM_BARRIER; } +inline void OrderAccess::fence() { FULL_MEM_BARRIER; } -inline void OrderAccess::release() { - WRITE_MEM_BARRIER; -} - -inline void OrderAccess::fence() { - FULL_MEM_BARRIER; -} - -inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { jbyte data = *p; acquire(); return data; } -inline jshort OrderAccess::load_acquire(volatile jshort* p) { jshort data = *p; acquire(); return data; } -inline jint OrderAccess::load_acquire(volatile jint* p) { jint data = *p; acquire(); return data; } -inline jlong OrderAccess::load_acquire(volatile jlong* p) { - jlong tmp; - os::atomic_copy64(p, &tmp); - acquire(); - return tmp; -} -inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { jubyte data = *p; acquire(); return data; } -inline jushort OrderAccess::load_acquire(volatile jushort* p) { jushort data = *p; acquire(); return data; } -inline juint OrderAccess::load_acquire(volatile juint* p) { juint data = *p; acquire(); return data; } -inline julong OrderAccess::load_acquire(volatile julong* p) { - julong tmp; - os::atomic_copy64(p, &tmp); - acquire(); - return tmp; -} -inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { jfloat data = *p; acquire(); return data; } -inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { - jdouble tmp; - os::atomic_copy64(p, &tmp); - acquire(); - return tmp; -} - -inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { - intptr_t data = *p; - acquire(); - return data; -} -inline void* OrderAccess::load_ptr_acquire(volatile void* p) { - void *data = *(void* volatile *)p; - acquire(); - return data; -} -inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { - void *data = *(void* const volatile *)p; - acquire(); - return data; -} - -inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { release(); *p = v; } -inline void OrderAccess::release_store(volatile jshort* p, jshort v) { release(); *p = v; } -inline void OrderAccess::release_store(volatile jint* p, jint v) { release(); *p = v; } -inline void OrderAccess::release_store(volatile jlong* p, jlong v) -{ release(); os::atomic_copy64(&v, p); } -inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { release(); *p = v; } -inline void OrderAccess::release_store(volatile jushort* p, jushort v) { release(); *p = v; } -inline void OrderAccess::release_store(volatile juint* p, juint v) { release(); *p = v; } -inline void OrderAccess::release_store(volatile julong* p, julong v) -{ release(); os::atomic_copy64(&v, p); } -inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { release(); *p = v; } -inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) -{ release(); os::atomic_copy64(&v, p); } - -inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { release(); *p = v; } -inline void OrderAccess::release_store_ptr(volatile void* p, void* v) -{ release(); *(void* volatile *)p = v; } - -inline void OrderAccess::store_fence(jbyte* p, jbyte v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jshort* p, jshort v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jint* p, jint v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jlong* p, jlong v) { os::atomic_copy64(&v, p); fence(); } -inline void OrderAccess::store_fence(jubyte* p, jubyte v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jushort* p, jushort v) { *p = v; fence(); } -inline void OrderAccess::store_fence(juint* p, juint v) { *p = v; fence(); } -inline void OrderAccess::store_fence(julong* p, julong v) { os::atomic_copy64(&v, p); fence(); } -inline void OrderAccess::store_fence(jfloat* p, jfloat v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jdouble* p, jdouble v) { os::atomic_copy64(&v, p); fence(); } - -inline void OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v) { *p = v; fence(); } -inline void OrderAccess::store_ptr_fence(void** p, void* v) { *p = v; fence(); } - -inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { release_store(p, v); fence(); } - -inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { release_store_ptr(p, v); fence(); } -inline void OrderAccess::release_store_ptr_fence(volatile void* p, void* v) { release_store_ptr(p, v); fence(); } +#define VM_HAS_GENERALIZED_ORDER_ACCESS 1 #endif // OS_CPU_BSD_ZERO_VM_ORDERACCESS_BSD_ZERO_INLINE_HPP diff --git a/hotspot/src/os_cpu/linux_ppc/vm/orderAccess_linux_ppc.inline.hpp b/hotspot/src/os_cpu/linux_ppc/vm/orderAccess_linux_ppc.inline.hpp index dff21c6bf6a..9e414dcd805 100644 --- a/hotspot/src/os_cpu/linux_ppc/vm/orderAccess_linux_ppc.inline.hpp +++ b/hotspot/src/os_cpu/linux_ppc/vm/orderAccess_linux_ppc.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2014, SAP AG. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -32,6 +32,9 @@ #error "OrderAccess currently only implemented for PPC64" #endif +// Compiler version last used for testing: gcc 4.1.2 +// Please update this information when this file changes + // Implementation of class OrderAccess. // @@ -65,84 +68,29 @@ #define inlasm_lwsync() __asm__ __volatile__ ("lwsync" : : : "memory"); #define inlasm_eieio() __asm__ __volatile__ ("eieio" : : : "memory"); #define inlasm_isync() __asm__ __volatile__ ("isync" : : : "memory"); -#define inlasm_release() inlasm_lwsync(); -#define inlasm_acquire() inlasm_lwsync(); // Use twi-isync for load_acquire (faster than lwsync). #define inlasm_acquire_reg(X) __asm__ __volatile__ ("twi 0,%0,0\n isync\n" : : "r" (X) : "memory"); -#define inlasm_fence() inlasm_sync(); -inline void OrderAccess::loadload() { inlasm_lwsync(); } -inline void OrderAccess::storestore() { inlasm_lwsync(); } -inline void OrderAccess::loadstore() { inlasm_lwsync(); } -inline void OrderAccess::storeload() { inlasm_fence(); } +inline void OrderAccess::loadload() { inlasm_lwsync(); } +inline void OrderAccess::storestore() { inlasm_lwsync(); } +inline void OrderAccess::loadstore() { inlasm_lwsync(); } +inline void OrderAccess::storeload() { inlasm_sync(); } -inline void OrderAccess::acquire() { inlasm_acquire(); } -inline void OrderAccess::release() { inlasm_release(); } -inline void OrderAccess::fence() { inlasm_fence(); } +inline void OrderAccess::acquire() { inlasm_lwsync(); } +inline void OrderAccess::release() { inlasm_lwsync(); } +inline void OrderAccess::fence() { inlasm_sync(); } -inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { register jbyte t = *p; inlasm_acquire_reg(t); return t; } -inline jshort OrderAccess::load_acquire(volatile jshort* p) { register jshort t = *p; inlasm_acquire_reg(t); return t; } -inline jint OrderAccess::load_acquire(volatile jint* p) { register jint t = *p; inlasm_acquire_reg(t); return t; } -inline jlong OrderAccess::load_acquire(volatile jlong* p) { register jlong t = *p; inlasm_acquire_reg(t); return t; } -inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { register jubyte t = *p; inlasm_acquire_reg(t); return t; } -inline jushort OrderAccess::load_acquire(volatile jushort* p) { register jushort t = *p; inlasm_acquire_reg(t); return t; } -inline juint OrderAccess::load_acquire(volatile juint* p) { register juint t = *p; inlasm_acquire_reg(t); return t; } -inline julong OrderAccess::load_acquire(volatile julong* p) { return (julong)load_acquire((volatile jlong*)p); } -inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { register jfloat t = *p; inlasm_acquire(); return t; } -inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { register jdouble t = *p; inlasm_acquire(); return t; } - -inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { return (intptr_t)load_acquire((volatile jlong*)p); } -inline void* OrderAccess::load_ptr_acquire(volatile void* p) { return (void*) load_acquire((volatile jlong*)p); } -inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { return (void*) load_acquire((volatile jlong*)p); } - -inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile jshort* p, jshort v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile jint* p, jint v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile jlong* p, jlong v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile jushort* p, jushort v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile juint* p, juint v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile julong* p, julong v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { inlasm_release(); *p = v; } - -inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { inlasm_release(); *p = v; } -inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { inlasm_release(); *(void* volatile *)p = v; } - -inline void OrderAccess::store_fence(jbyte* p, jbyte v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(jshort* p, jshort v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(jint* p, jint v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(jlong* p, jlong v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(jubyte* p, jubyte v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(jushort* p, jushort v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(juint* p, juint v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(julong* p, julong v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(jfloat* p, jfloat v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_fence(jdouble* p, jdouble v) { *p = v; inlasm_fence(); } - -inline void OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v) { *p = v; inlasm_fence(); } -inline void OrderAccess::store_ptr_fence(void** p, void* v) { *p = v; inlasm_fence(); } - -inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { inlasm_release(); *p = v; inlasm_fence(); } - -inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { inlasm_release(); *p = v; inlasm_fence(); } -inline void OrderAccess::release_store_ptr_fence(volatile void* p, void* v) { inlasm_release(); *(void* volatile *)p = v; inlasm_fence(); } +template<> inline jbyte OrderAccess::specialized_load_acquire (volatile jbyte* p) { register jbyte t = load(p); inlasm_acquire_reg(t); return t; } +template<> inline jshort OrderAccess::specialized_load_acquire(volatile jshort* p) { register jshort t = load(p); inlasm_acquire_reg(t); return t; } +template<> inline jint OrderAccess::specialized_load_acquire (volatile jint* p) { register jint t = load(p); inlasm_acquire_reg(t); return t; } +template<> inline jlong OrderAccess::specialized_load_acquire (volatile jlong* p) { register jlong t = load(p); inlasm_acquire_reg(t); return t; } #undef inlasm_sync #undef inlasm_lwsync #undef inlasm_eieio #undef inlasm_isync -#undef inlasm_release -#undef inlasm_acquire -#undef inlasm_fence +#undef inlasm_acquire_reg + +#define VM_HAS_GENERALIZED_ORDER_ACCESS 1 #endif // OS_CPU_LINUX_PPC_VM_ORDERACCESS_LINUX_PPC_INLINE_HPP diff --git a/hotspot/src/os_cpu/linux_sparc/vm/orderAccess_linux_sparc.inline.hpp b/hotspot/src/os_cpu/linux_sparc/vm/orderAccess_linux_sparc.inline.hpp index f5215f187e8..fd6078fcd31 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/orderAccess_linux_sparc.inline.hpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/orderAccess_linux_sparc.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, Oracle and/or its affiliates. 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 @@ -29,81 +29,25 @@ // Implementation of class OrderAccess. +// A compiler barrier, forcing the C++ compiler to invalidate all memory assumptions +static inline void compiler_barrier() { + __asm__ volatile ("" : : : "memory"); +} + // Assume TSO. -inline void OrderAccess::loadload() { acquire(); } -inline void OrderAccess::storestore() { release(); } -inline void OrderAccess::loadstore() { acquire(); } -inline void OrderAccess::storeload() { fence(); } +inline void OrderAccess::loadload() { compiler_barrier(); } +inline void OrderAccess::storestore() { compiler_barrier(); } +inline void OrderAccess::loadstore() { compiler_barrier(); } +inline void OrderAccess::storeload() { fence(); } -inline void OrderAccess::acquire() { - __asm__ volatile ("nop" : : :); -} - -inline void OrderAccess::release() { - jint* local_dummy = (jint*)&local_dummy; - __asm__ volatile("stw %%g0, [%0]" : : "r" (local_dummy) : "memory"); -} +inline void OrderAccess::acquire() { compiler_barrier(); } +inline void OrderAccess::release() { compiler_barrier(); } inline void OrderAccess::fence() { - __asm__ volatile ("membar #StoreLoad" : : :); + __asm__ volatile ("membar #StoreLoad" : : : "memory"); } -inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { return *p; } -inline jshort OrderAccess::load_acquire(volatile jshort* p) { return *p; } -inline jint OrderAccess::load_acquire(volatile jint* p) { return *p; } -inline jlong OrderAccess::load_acquire(volatile jlong* p) { return *p; } -inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { return *p; } -inline jushort OrderAccess::load_acquire(volatile jushort* p) { return *p; } -inline juint OrderAccess::load_acquire(volatile juint* p) { return *p; } -inline julong OrderAccess::load_acquire(volatile julong* p) { return *p; } -inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { return *p; } -inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return *p; } - -inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { return *p; } -inline void* OrderAccess::load_ptr_acquire(volatile void* p) { return *(void* volatile *)p; } -inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { return *(void* const volatile *)p; } - -inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { *p = v; } -inline void OrderAccess::release_store(volatile jshort* p, jshort v) { *p = v; } -inline void OrderAccess::release_store(volatile jint* p, jint v) { *p = v; } -inline void OrderAccess::release_store(volatile jlong* p, jlong v) { *p = v; } -inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { *p = v; } -inline void OrderAccess::release_store(volatile jushort* p, jushort v) { *p = v; } -inline void OrderAccess::release_store(volatile juint* p, juint v) { *p = v; } -inline void OrderAccess::release_store(volatile julong* p, julong v) { *p = v; } -inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { *p = v; } -inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { *p = v; } - -inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { *p = v; } -inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { *(void* volatile *)p = v; } - -inline void OrderAccess::store_fence(jbyte* p, jbyte v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jshort* p, jshort v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jint* p, jint v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jlong* p, jlong v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jubyte* p, jubyte v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jushort* p, jushort v) { *p = v; fence(); } -inline void OrderAccess::store_fence(juint* p, juint v) { *p = v; fence(); } -inline void OrderAccess::store_fence(julong* p, julong v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jfloat* p, jfloat v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jdouble* p, jdouble v) { *p = v; fence(); } - -inline void OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v) { *p = v; fence(); } -inline void OrderAccess::store_ptr_fence(void** p, void* v) { *p = v; fence(); } - -inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { *p = v; fence(); } - -inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { *p = v; fence(); } -inline void OrderAccess::release_store_ptr_fence(volatile void* p, void* v) { *(void* volatile *)p = v; fence(); } +#define VM_HAS_GENERALIZED_ORDER_ACCESS 1 #endif // OS_CPU_LINUX_SPARC_VM_ORDERACCESS_LINUX_SPARC_INLINE_HPP diff --git a/hotspot/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp b/hotspot/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp index d391baf8095..b4aceaf5a91 100644 --- a/hotspot/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp +++ b/hotspot/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, Oracle and/or its affiliates. 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 @@ -29,6 +29,9 @@ #include "runtime/orderAccess.hpp" #include "runtime/os.hpp" +// Compiler version last used for testing: gcc 4.8.2 +// Please update this information when this file changes + // Implementation of class OrderAccess. // A compiler barrier, forcing the C++ compiler to invalidate all memory assumptions @@ -36,23 +39,13 @@ static inline void compiler_barrier() { __asm__ volatile ("" : : : "memory"); } -inline void OrderAccess::loadload() { acquire(); } -inline void OrderAccess::storestore() { release(); } -inline void OrderAccess::loadstore() { acquire(); } -inline void OrderAccess::storeload() { fence(); } +inline void OrderAccess::loadload() { compiler_barrier(); } +inline void OrderAccess::storestore() { compiler_barrier(); } +inline void OrderAccess::loadstore() { compiler_barrier(); } +inline void OrderAccess::storeload() { fence(); } -inline void OrderAccess::acquire() { - volatile intptr_t local_dummy; -#ifdef AMD64 - __asm__ volatile ("movq 0(%%rsp), %0" : "=r" (local_dummy) : : "memory"); -#else - __asm__ volatile ("movl 0(%%esp),%0" : "=r" (local_dummy) : : "memory"); -#endif // AMD64 -} - -inline void OrderAccess::release() { - compiler_barrier(); -} +inline void OrderAccess::acquire() { compiler_barrier(); } +inline void OrderAccess::release() { compiler_barrier(); } inline void OrderAccess::fence() { if (os::is_MP()) { @@ -63,156 +56,50 @@ inline void OrderAccess::fence() { __asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory"); #endif } + compiler_barrier(); } -inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { jbyte v = *p; compiler_barrier(); return v; } -inline jshort OrderAccess::load_acquire(volatile jshort* p) { jshort v = *p; compiler_barrier(); return v; } -inline jint OrderAccess::load_acquire(volatile jint* p) { jint v = *p; compiler_barrier(); return v; } -inline jlong OrderAccess::load_acquire(volatile jlong* p) { jlong v = Atomic::load(p); compiler_barrier(); return v; } -inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { jubyte v = *p; compiler_barrier(); return v; } -inline jushort OrderAccess::load_acquire(volatile jushort* p) { jushort v = *p; compiler_barrier(); return v; } -inline juint OrderAccess::load_acquire(volatile juint* p) { juint v = *p; compiler_barrier(); return v; } -inline julong OrderAccess::load_acquire(volatile julong* p) { julong v = Atomic::load((volatile jlong*)p); compiler_barrier(); return v; } -inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { jfloat v = *p; compiler_barrier(); return v; } -inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { jdouble v = jdouble_cast(Atomic::load((volatile jlong*)p)); compiler_barrier(); return v; } - -inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { intptr_t v = *p; compiler_barrier(); return v; } -inline void* OrderAccess::load_ptr_acquire(volatile void* p) { void* v = *(void* volatile *)p; compiler_barrier(); return v; } -inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { void* v = *(void* const volatile *)p; compiler_barrier(); return v; } - -inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { compiler_barrier(); *p = v; } -inline void OrderAccess::release_store(volatile jshort* p, jshort v) { compiler_barrier(); *p = v; } -inline void OrderAccess::release_store(volatile jint* p, jint v) { compiler_barrier(); *p = v; } -inline void OrderAccess::release_store(volatile jlong* p, jlong v) { compiler_barrier(); Atomic::store(v, p); } -inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { compiler_barrier(); *p = v; } -inline void OrderAccess::release_store(volatile jushort* p, jushort v) { compiler_barrier(); *p = v; } -inline void OrderAccess::release_store(volatile juint* p, juint v) { compiler_barrier(); *p = v; } -inline void OrderAccess::release_store(volatile julong* p, julong v) { compiler_barrier(); Atomic::store((jlong)v, (volatile jlong*)p); } -inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { compiler_barrier(); *p = v; } -inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { release_store((volatile jlong *)p, jlong_cast(v)); } - -inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { compiler_barrier(); *p = v; } -inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { compiler_barrier(); *(void* volatile *)p = v; } - -inline void OrderAccess::store_fence(jbyte* p, jbyte v) { +template<> +inline void OrderAccess::specialized_release_store_fence (volatile jbyte* p, jbyte v) { __asm__ volatile ( "xchgb (%2),%0" : "=q" (v) : "0" (v), "r" (p) : "memory"); } -inline void OrderAccess::store_fence(jshort* p, jshort v) { +template<> +inline void OrderAccess::specialized_release_store_fence(volatile jshort* p, jshort v) { __asm__ volatile ( "xchgw (%2),%0" : "=r" (v) : "0" (v), "r" (p) : "memory"); } -inline void OrderAccess::store_fence(jint* p, jint v) { +template<> +inline void OrderAccess::specialized_release_store_fence (volatile jint* p, jint v) { __asm__ volatile ( "xchgl (%2),%0" : "=r" (v) : "0" (v), "r" (p) : "memory"); } -inline void OrderAccess::store_fence(jlong* p, jlong v) { #ifdef AMD64 - __asm__ __volatile__ ("xchgq (%2), %0" - : "=r" (v) - : "0" (v), "r" (p) - : "memory"); -#else - *p = v; fence(); -#endif // AMD64 -} - -// AMD64 copied the bodies for the the signed version. 32bit did this. As long as the -// compiler does the inlining this is simpler. -inline void OrderAccess::store_fence(jubyte* p, jubyte v) { store_fence((jbyte*)p, (jbyte)v); } -inline void OrderAccess::store_fence(jushort* p, jushort v) { store_fence((jshort*)p, (jshort)v); } -inline void OrderAccess::store_fence(juint* p, juint v) { store_fence((jint*)p, (jint)v); } -inline void OrderAccess::store_fence(julong* p, julong v) { store_fence((jlong*)p, (jlong)v); } -inline void OrderAccess::store_fence(jfloat* p, jfloat v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jdouble* p, jdouble v) { store_fence((jlong*)p, jlong_cast(v)); } - -inline void OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v) { -#ifdef AMD64 - __asm__ __volatile__ ("xchgq (%2), %0" - : "=r" (v) - : "0" (v), "r" (p) - : "memory"); -#else - store_fence((jint*)p, (jint)v); -#endif // AMD64 -} - -inline void OrderAccess::store_ptr_fence(void** p, void* v) { -#ifdef AMD64 - __asm__ __volatile__ ("xchgq (%2), %0" - : "=r" (v) - : "0" (v), "r" (p) - : "memory"); -#else - store_fence((jint*)p, (jint)v); -#endif // AMD64 -} - -// Must duplicate definitions instead of calling store_fence because we don't want to cast away volatile. -inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { - __asm__ volatile ( "xchgb (%2),%0" - : "=q" (v) - : "0" (v), "r" (p) - : "memory"); -} -inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { - __asm__ volatile ( "xchgw (%2),%0" +template<> +inline void OrderAccess::specialized_release_store_fence (volatile jlong* p, jlong v) { + __asm__ volatile ( "xchgq (%2), %0" : "=r" (v) : "0" (v), "r" (p) : "memory"); } -inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { - __asm__ volatile ( "xchgl (%2),%0" - : "=r" (v) - : "0" (v), "r" (p) - : "memory"); -} - -inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { -#ifdef AMD64 - __asm__ __volatile__ ( "xchgq (%2), %0" - : "=r" (v) - : "0" (v), "r" (p) - : "memory"); -#else - release_store(p, v); fence(); #endif // AMD64 + +template<> +inline void OrderAccess::specialized_release_store_fence (volatile jfloat* p, jfloat v) { + release_store_fence((volatile jint*)p, jint_cast(v)); +} +template<> +inline void OrderAccess::specialized_release_store_fence(volatile jdouble* p, jdouble v) { + release_store_fence((volatile jlong*)p, jlong_cast(v)); } -inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { release_store_fence((volatile jbyte*)p, (jbyte)v); } -inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { release_store_fence((volatile jshort*)p, (jshort)v); } -inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { release_store_fence((volatile jint*)p, (jint)v); } -inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store_fence((volatile jlong*)p, (jlong)v); } - -inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { release_store_fence((volatile jlong*)p, jlong_cast(v)); } - -inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { -#ifdef AMD64 - __asm__ __volatile__ ( "xchgq (%2), %0" - : "=r" (v) - : "0" (v), "r" (p) - : "memory"); -#else - release_store_fence((volatile jint*)p, (jint)v); -#endif // AMD64 -} -inline void OrderAccess::release_store_ptr_fence(volatile void* p, void* v) { -#ifdef AMD64 - __asm__ __volatile__ ( "xchgq (%2), %0" - : "=r" (v) - : "0" (v), "r" (p) - : "memory"); -#else - release_store_fence((volatile jint*)p, (jint)v); -#endif // AMD64 -} +#define VM_HAS_GENERALIZED_ORDER_ACCESS 1 #endif // OS_CPU_LINUX_X86_VM_ORDERACCESS_LINUX_X86_INLINE_HPP diff --git a/hotspot/src/os_cpu/linux_zero/vm/orderAccess_linux_zero.inline.hpp b/hotspot/src/os_cpu/linux_zero/vm/orderAccess_linux_zero.inline.hpp index e15041e76a7..20d851c9234 100644 --- a/hotspot/src/os_cpu/linux_zero/vm/orderAccess_linux_zero.inline.hpp +++ b/hotspot/src/os_cpu/linux_zero/vm/orderAccess_linux_zero.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright 2007, 2008, 2009 Red Hat, Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -40,8 +40,7 @@ typedef void (__kernel_dmb_t) (void); #define __kernel_dmb (*(__kernel_dmb_t *) 0xffff0fa0) #define FULL_MEM_BARRIER __kernel_dmb() -#define READ_MEM_BARRIER __kernel_dmb() -#define WRITE_MEM_BARRIER __kernel_dmb() +#define LIGHT_MEM_BARRIER __kernel_dmb() #else // ARM @@ -49,126 +48,33 @@ typedef void (__kernel_dmb_t) (void); #ifdef PPC -#define READ_MEM_BARRIER __asm __volatile ("isync":::"memory") #ifdef __NO_LWSYNC__ -#define WRITE_MEM_BARRIER __asm __volatile ("sync":::"memory") +#define LIGHT_MEM_BARRIER __asm __volatile ("sync":::"memory") #else -#define WRITE_MEM_BARRIER __asm __volatile ("lwsync":::"memory") +#define LIGHT_MEM_BARRIER __asm __volatile ("lwsync":::"memory") #endif #else // PPC -#define READ_MEM_BARRIER __asm __volatile ("":::"memory") -#define WRITE_MEM_BARRIER __asm __volatile ("":::"memory") +#define LIGHT_MEM_BARRIER __asm __volatile ("":::"memory") #endif // PPC #endif // ARM +// Note: What is meant by LIGHT_MEM_BARRIER is a barrier which is sufficient +// to provide TSO semantics, i.e. StoreStore | LoadLoad | LoadStore. -inline void OrderAccess::loadload() { acquire(); } -inline void OrderAccess::storestore() { release(); } -inline void OrderAccess::loadstore() { acquire(); } -inline void OrderAccess::storeload() { fence(); } +inline void OrderAccess::loadload() { LIGHT_MEM_BARRIER; } +inline void OrderAccess::storestore() { LIGHT_MEM_BARRIER; } +inline void OrderAccess::loadstore() { LIGHT_MEM_BARRIER; } +inline void OrderAccess::storeload() { FULL_MEM_BARRIER; } -inline void OrderAccess::acquire() { - READ_MEM_BARRIER; -} +inline void OrderAccess::acquire() { LIGHT_MEM_BARRIER; } +inline void OrderAccess::release() { LIGHT_MEM_BARRIER; } -inline void OrderAccess::release() { - WRITE_MEM_BARRIER; -} +inline void OrderAccess::fence() { FULL_MEM_BARRIER; } -inline void OrderAccess::fence() { - FULL_MEM_BARRIER; -} - -inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { jbyte data = *p; acquire(); return data; } -inline jshort OrderAccess::load_acquire(volatile jshort* p) { jshort data = *p; acquire(); return data; } -inline jint OrderAccess::load_acquire(volatile jint* p) { jint data = *p; acquire(); return data; } -inline jlong OrderAccess::load_acquire(volatile jlong* p) { - jlong tmp; - os::atomic_copy64(p, &tmp); - acquire(); - return tmp; -} -inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { jubyte data = *p; acquire(); return data; } -inline jushort OrderAccess::load_acquire(volatile jushort* p) { jushort data = *p; acquire(); return data; } -inline juint OrderAccess::load_acquire(volatile juint* p) { juint data = *p; acquire(); return data; } -inline julong OrderAccess::load_acquire(volatile julong* p) { - julong tmp; - os::atomic_copy64(p, &tmp); - acquire(); - return tmp; -} -inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { jfloat data = *p; acquire(); return data; } -inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { - jdouble tmp; - os::atomic_copy64(p, &tmp); - acquire(); - return tmp; -} - -inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { - intptr_t data = *p; - acquire(); - return data; -} -inline void* OrderAccess::load_ptr_acquire(volatile void* p) { - void *data = *(void* volatile *)p; - acquire(); - return data; -} -inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { - void *data = *(void* const volatile *)p; - acquire(); - return data; -} - -inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { release(); *p = v; } -inline void OrderAccess::release_store(volatile jshort* p, jshort v) { release(); *p = v; } -inline void OrderAccess::release_store(volatile jint* p, jint v) { release(); *p = v; } -inline void OrderAccess::release_store(volatile jlong* p, jlong v) -{ release(); os::atomic_copy64(&v, p); } -inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { release(); *p = v; } -inline void OrderAccess::release_store(volatile jushort* p, jushort v) { release(); *p = v; } -inline void OrderAccess::release_store(volatile juint* p, juint v) { release(); *p = v; } -inline void OrderAccess::release_store(volatile julong* p, julong v) -{ release(); os::atomic_copy64(&v, p); } -inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { release(); *p = v; } -inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) -{ release(); os::atomic_copy64(&v, p); } - -inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { release(); *p = v; } -inline void OrderAccess::release_store_ptr(volatile void* p, void* v) -{ release(); *(void* volatile *)p = v; } - -inline void OrderAccess::store_fence(jbyte* p, jbyte v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jshort* p, jshort v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jint* p, jint v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jlong* p, jlong v) { os::atomic_copy64(&v, p); fence(); } -inline void OrderAccess::store_fence(jubyte* p, jubyte v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jushort* p, jushort v) { *p = v; fence(); } -inline void OrderAccess::store_fence(juint* p, juint v) { *p = v; fence(); } -inline void OrderAccess::store_fence(julong* p, julong v) { os::atomic_copy64(&v, p); fence(); } -inline void OrderAccess::store_fence(jfloat* p, jfloat v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jdouble* p, jdouble v) { os::atomic_copy64(&v, p); fence(); } - -inline void OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v) { *p = v; fence(); } -inline void OrderAccess::store_ptr_fence(void** p, void* v) { *p = v; fence(); } - -inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { release_store(p, v); fence(); } - -inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { release_store_ptr(p, v); fence(); } -inline void OrderAccess::release_store_ptr_fence(volatile void* p, void* v) { release_store_ptr(p, v); fence(); } +#define VM_HAS_GENERALIZED_ORDER_ACCESS 1 #endif // OS_CPU_LINUX_ZERO_VM_ORDERACCESS_LINUX_ZERO_INLINE_HPP diff --git a/hotspot/src/os_cpu/solaris_sparc/vm/orderAccess_solaris_sparc.inline.hpp b/hotspot/src/os_cpu/solaris_sparc/vm/orderAccess_solaris_sparc.inline.hpp index f9321f2bac2..4bf5833a458 100644 --- a/hotspot/src/os_cpu/solaris_sparc/vm/orderAccess_solaris_sparc.inline.hpp +++ b/hotspot/src/os_cpu/solaris_sparc/vm/orderAccess_solaris_sparc.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, Oracle and/or its affiliates. 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,107 +28,30 @@ #include "runtime/atomic.inline.hpp" #include "runtime/orderAccess.hpp" +// Compiler version last used for testing: solaris studio 12u3 +// Please update this information when this file changes + // Implementation of class OrderAccess. // Assume TSO. -// In solaris_sparc.il -extern "C" void _OrderAccess_acquire(); -extern "C" void _OrderAccess_fence(); - -inline void OrderAccess::loadload() { acquire(); } -inline void OrderAccess::storestore() { release(); } -inline void OrderAccess::loadstore() { acquire(); } -inline void OrderAccess::storeload() { fence(); } - -#ifdef _GNU_SOURCE - -inline void OrderAccess::acquire() { - __asm__ volatile ("nop" : : :); +// A compiler barrier, forcing the C++ compiler to invalidate all memory assumptions +inline void compiler_barrier() { + __asm__ volatile ("" : : : "memory"); } -inline void OrderAccess::release() { - jint* local_dummy = (jint*)&local_dummy; - __asm__ volatile("stw %%g0, [%0]" : : "r" (local_dummy) : "memory"); -} +inline void OrderAccess::loadload() { compiler_barrier(); } +inline void OrderAccess::storestore() { compiler_barrier(); } +inline void OrderAccess::loadstore() { compiler_barrier(); } +inline void OrderAccess::storeload() { fence(); } + +inline void OrderAccess::acquire() { compiler_barrier(); } +inline void OrderAccess::release() { compiler_barrier(); } inline void OrderAccess::fence() { - __asm__ volatile ("membar #StoreLoad" : : :); + __asm__ volatile ("membar #StoreLoad" : : : "memory"); } -#else // _GNU_SOURCE - -inline void OrderAccess::acquire() { - _OrderAccess_acquire(); -} - -inline void OrderAccess::release() { - // Avoid hitting the same cache-line from - // different threads. - volatile jint local_dummy = 0; -} - -inline void OrderAccess::fence() { - _OrderAccess_fence(); -} - -#endif // _GNU_SOURCE - -inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { return *p; } -inline jshort OrderAccess::load_acquire(volatile jshort* p) { return *p; } -inline jint OrderAccess::load_acquire(volatile jint* p) { return *p; } -inline jlong OrderAccess::load_acquire(volatile jlong* p) { return Atomic::load(p); } -inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { return *p; } -inline jushort OrderAccess::load_acquire(volatile jushort* p) { return *p; } -inline juint OrderAccess::load_acquire(volatile juint* p) { return *p; } -inline julong OrderAccess::load_acquire(volatile julong* p) { return Atomic::load((volatile jlong*)p); } -inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { return *p; } -inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return *p; } - -inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { return *p; } -inline void* OrderAccess::load_ptr_acquire(volatile void* p) { return *(void* volatile *)p; } -inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { return *(void* const volatile *)p; } - -inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { *p = v; } -inline void OrderAccess::release_store(volatile jshort* p, jshort v) { *p = v; } -inline void OrderAccess::release_store(volatile jint* p, jint v) { *p = v; } -inline void OrderAccess::release_store(volatile jlong* p, jlong v) { Atomic::store(v, p); } -inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { *p = v; } -inline void OrderAccess::release_store(volatile jushort* p, jushort v) { *p = v; } -inline void OrderAccess::release_store(volatile juint* p, juint v) { *p = v; } -inline void OrderAccess::release_store(volatile julong* p, julong v) { Atomic::store((jlong)v, (volatile jlong*)p); } -inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { *p = v; } -inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { *p = v; } - -inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { *p = v; } -inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { *(void* volatile *)p = v; } - -inline void OrderAccess::store_fence(jbyte* p, jbyte v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jshort* p, jshort v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jint* p, jint v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jlong* p, jlong v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jubyte* p, jubyte v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jushort* p, jushort v) { *p = v; fence(); } -inline void OrderAccess::store_fence(juint* p, juint v) { *p = v; fence(); } -inline void OrderAccess::store_fence(julong* p, julong v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jfloat* p, jfloat v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jdouble* p, jdouble v) { *p = v; fence(); } - -inline void OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v) { *p = v; fence(); } -inline void OrderAccess::store_ptr_fence(void** p, void* v) { *p = v; fence(); } - -inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { *p = v; fence(); } - -inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { *p = v; fence(); } -inline void OrderAccess::release_store_ptr_fence(volatile void* p, void* v) { *(void* volatile *)p = v; fence(); } +#define VM_HAS_GENERALIZED_ORDER_ACCESS 1 #endif // OS_CPU_SOLARIS_SPARC_VM_ORDERACCESS_SOLARIS_SPARC_INLINE_HPP diff --git a/hotspot/src/os_cpu/solaris_sparc/vm/solaris_sparc.il b/hotspot/src/os_cpu/solaris_sparc/vm/solaris_sparc.il index 16bd6902a3e..3a93cec49ff 100644 --- a/hotspot/src/os_cpu/solaris_sparc/vm/solaris_sparc.il +++ b/hotspot/src/os_cpu/solaris_sparc/vm/solaris_sparc.il @@ -1,5 +1,5 @@ // -// Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. +// Copyright (c) 2002, 2015, Oracle and/or its affiliates. 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 @@ -19,7 +19,7 @@ // Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA // or visit www.oracle.com if you need additional information or have any // questions. -// +// // // Get the raw thread ID from %g7 @@ -35,11 +35,11 @@ // Clear SPARC fprs.FEF DU and DL bits -- // allows the kernel to avoid saving FPU state at context-switch time. // Use for state-transition points (into _thread_blocked) or when - // parking. - + // parking. + .inline _mark_fpu_nosave, 0 .volatile - wr %g0, 0, %fprs + wr %g0, 0, %fprs .nonvolatile .end @@ -85,7 +85,7 @@ // Support for jint Atomic::cmpxchg(jint exchange_value, - // volatile jint* dest, + // volatile jint* dest, // jint compare_value) // // Arguments: @@ -103,8 +103,8 @@ .end - // Support for intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, - // volatile intptr_t* dest, + // Support for intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, + // volatile intptr_t* dest, // intptr_t compare_value) // // 64-bit @@ -124,8 +124,8 @@ .end - // Support for jlong Atomic::cmpxchg(jlong exchange_value, - // volatile jlong* dest, + // Support for jlong Atomic::cmpxchg(jlong exchange_value, + // volatile jlong* dest, // jlong compare_value) // // 32-bit calling conventions @@ -221,27 +221,6 @@ .end - // Support for void OrderAccess::acquire() - // The method is intentionally empty. - // It exists for the sole purpose of generating - // a C/C++ sequence point over which the compiler won't - // reorder code. - - .inline _OrderAccess_acquire,0 - .volatile - .nonvolatile - .end - - - // Support for void OrderAccess::fence() - - .inline _OrderAccess_fence,0 - .volatile - membar #StoreLoad - .nonvolatile - .end - - // Support for void Prefetch::read(void *loc, intx interval) // // Prefetch for several reads. diff --git a/hotspot/src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp b/hotspot/src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp index e211c060552..af4e2e29337 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp +++ b/hotspot/src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, Oracle and/or its affiliates. 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 @@ -29,110 +29,35 @@ #include "runtime/orderAccess.hpp" #include "runtime/os.hpp" +// Compiler version last used for testing: solaris studio 12u3 +// Please update this information when this file changes + // Implementation of class OrderAccess. -// For Sun Studio - implementation is in solaris_i486.il. -// For gcc - implementation is just below. -extern "C" void _OrderAccess_acquire(); -extern "C" void _OrderAccess_fence(); - -inline void OrderAccess::loadload() { acquire(); } -inline void OrderAccess::storestore() { release(); } -inline void OrderAccess::loadstore() { acquire(); } -inline void OrderAccess::storeload() { fence(); } - -inline void OrderAccess::acquire() { - _OrderAccess_acquire(); - +// A compiler barrier, forcing the C++ compiler to invalidate all memory assumptions +inline void compiler_barrier() { + __asm__ volatile ("" : : : "memory"); } -inline void OrderAccess::release() { - // Avoid hitting the same cache-line from - // different threads. - volatile jint local_dummy = 0; -} +inline void OrderAccess::loadload() { compiler_barrier(); } +inline void OrderAccess::storestore() { compiler_barrier(); } +inline void OrderAccess::loadstore() { compiler_barrier(); } +inline void OrderAccess::storeload() { fence(); } + +inline void OrderAccess::acquire() { compiler_barrier(); } +inline void OrderAccess::release() { compiler_barrier(); } inline void OrderAccess::fence() { if (os::is_MP()) { - _OrderAccess_fence(); - } -} - -#ifdef _GNU_SOURCE - -extern "C" { - inline void _OrderAccess_acquire() { - volatile intptr_t local_dummy; #ifdef AMD64 - __asm__ volatile ("movq 0(%%rsp), %0" : "=r" (local_dummy) : : "memory"); + __asm__ volatile ("lock; addl $0,0(%%rsp)" : : : "cc", "memory"); #else - __asm__ volatile ("movl 0(%%esp),%0" : "=r" (local_dummy) : : "memory"); -#endif // AMD64 - } - inline void _OrderAccess_fence() { - // Always use locked addl since mfence is sometimes expensive __asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory"); +#endif } - + compiler_barrier(); } -#endif // GNU_SOURCE - -inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { return *p; } -inline jshort OrderAccess::load_acquire(volatile jshort* p) { return *p; } -inline jint OrderAccess::load_acquire(volatile jint* p) { return *p; } -inline jlong OrderAccess::load_acquire(volatile jlong* p) { return Atomic::load(p); } -inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { return *p; } -inline jushort OrderAccess::load_acquire(volatile jushort* p) { return *p; } -inline juint OrderAccess::load_acquire(volatile juint* p) { return *p; } -inline julong OrderAccess::load_acquire(volatile julong* p) { return Atomic::load((volatile jlong*)p); } -inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { return *p; } -inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return jdouble_cast(Atomic::load((volatile jlong*)p)); } - -inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { return *p; } -inline void* OrderAccess::load_ptr_acquire(volatile void* p) { return *(void* volatile *)p; } -inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { return *(void* const volatile *)p; } - -inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { *p = v; } -inline void OrderAccess::release_store(volatile jshort* p, jshort v) { *p = v; } -inline void OrderAccess::release_store(volatile jint* p, jint v) { *p = v; } -inline void OrderAccess::release_store(volatile jlong* p, jlong v) { Atomic::store(v, p); } -inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { *p = v; } -inline void OrderAccess::release_store(volatile jushort* p, jushort v) { *p = v; } -inline void OrderAccess::release_store(volatile juint* p, juint v) { *p = v; } -inline void OrderAccess::release_store(volatile julong* p, julong v) { Atomic::store((jlong)v, (volatile jlong*)p); } -inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { *p = v; } -inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { release_store((volatile jlong*)p, jlong_cast(v)); } - -inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { *p = v; } -inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { *(void* volatile *)p = v; } - -inline void OrderAccess::store_fence(jbyte* p, jbyte v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jshort* p, jshort v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jint* p, jint v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jlong* p, jlong v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jubyte* p, jubyte v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jushort* p, jushort v) { *p = v; fence(); } -inline void OrderAccess::store_fence(juint* p, juint v) { *p = v; fence(); } -inline void OrderAccess::store_fence(julong* p, julong v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jfloat* p, jfloat v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jdouble* p, jdouble v) { *p = v; fence(); } - -inline void OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v) { *p = v; fence(); } -inline void OrderAccess::store_ptr_fence(void** p, void* v) { *p = v; fence(); } - -inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { release_store(p, v); fence(); } -inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store((jlong *)p, (jlong)v); fence(); } -inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { release_store_fence((volatile jlong*)p, jlong_cast(v)); } - -inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { *p = v; fence(); } -inline void OrderAccess::release_store_ptr_fence(volatile void* p, void* v) { *(void* volatile *)p = v; fence(); } +#define VM_HAS_GENERALIZED_ORDER_ACCESS 1 #endif // OS_CPU_SOLARIS_X86_VM_ORDERACCESS_SOLARIS_X86_INLINE_HPP diff --git a/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_32.il b/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_32.il index f6d289e725c..c03dd64a91c 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_32.il +++ b/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_32.il @@ -1,5 +1,5 @@ // -// Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. +// Copyright (c) 2003, 2015, Oracle and/or its affiliates. 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 @@ -19,7 +19,7 @@ // Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA // or visit www.oracle.com if you need additional information or have any // questions. -// +// // @@ -34,19 +34,19 @@ // Get the raw thread ID from %gs:0 .inline _raw_thread_id,0 - movl %gs:0, %eax + movl %gs:0, %eax .end // Get current sp .inline _get_current_sp,0 .volatile - movl %esp, %eax + movl %esp, %eax .end // Get current fp .inline _get_current_fp,0 .volatile - movl %ebp, %eax + movl %ebp, %eax .end // Support for os::rdtsc() @@ -76,8 +76,8 @@ xchgl (%ecx), %eax .end - // Support for jbyte Atomic::cmpxchg(jbyte exchange_value, - // volatile jbyte *dest, + // Support for jbyte Atomic::cmpxchg(jbyte exchange_value, + // volatile jbyte *dest, // jbyte compare_value) // An additional bool (os::is_MP()) is passed as the last argument. .inline _Atomic_cmpxchg_byte,4 @@ -93,8 +93,8 @@ 2: .end - // Support for jint Atomic::cmpxchg(jint exchange_value, - // volatile jint *dest, + // Support for jint Atomic::cmpxchg(jint exchange_value, + // volatile jint *dest, // jint compare_value) // An additional bool (os::is_MP()) is passed as the last argument. .inline _Atomic_cmpxchg,4 @@ -141,17 +141,6 @@ fistpll (%eax) .end - // Support for OrderAccess::acquire() - .inline _OrderAccess_acquire,0 - movl 0(%esp), %eax - .end - - // Support for OrderAccess::fence() - .inline _OrderAccess_fence,0 - lock - addl $0, (%esp) - .end - // Support for u2 Bytes::swap_u2(u2 x) .inline _raw_swap_u2,1 movl 0(%esp), %eax diff --git a/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_64.il b/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_64.il index bf0335f7f17..ebee3109a6d 100644 --- a/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_64.il +++ b/hotspot/src/os_cpu/solaris_x86/vm/solaris_x86_64.il @@ -1,5 +1,5 @@ // -// Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. +// Copyright (c) 2004, 2015, Oracle and/or its affiliates. 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 @@ -19,7 +19,7 @@ // Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA // or visit www.oracle.com if you need additional information or have any // questions. -// +// // // The argument size of each inline directive is ignored by the compiler @@ -27,19 +27,19 @@ // Get the raw thread ID from %gs:0 .inline _raw_thread_id,0 - movq %fs:0, %rax + movq %fs:0, %rax .end // Get current sp .inline _get_current_sp,0 .volatile - movq %rsp, %rax + movq %rsp, %rax .end // Get current fp .inline _get_current_fp,0 .volatile - movq %rbp, %rax + movq %rbp, %rax .end // Support for os::rdtsc() @@ -77,8 +77,8 @@ movq %rdi, %rax .end - // Support for jbyte Atomic::cmpxchg(jbyte exchange_value, - // volatile jbyte *dest, + // Support for jbyte Atomic::cmpxchg(jbyte exchange_value, + // volatile jbyte *dest, // jbyte compare_value) .inline _Atomic_cmpxchg_byte,3 movb %dl, %al // compare_value @@ -86,8 +86,8 @@ cmpxchgb %dil, (%rsi) .end - // Support for jint Atomic::cmpxchg(jint exchange_value, - // volatile jint *dest, + // Support for jint Atomic::cmpxchg(jint exchange_value, + // volatile jint *dest, // jint compare_value) .inline _Atomic_cmpxchg,3 movl %edx, %eax // compare_value @@ -104,17 +104,6 @@ cmpxchgq %rdi, (%rsi) .end - // Support for OrderAccess::acquire() - .inline _OrderAccess_acquire,0 - movl 0(%rsp), %eax - .end - - // Support for OrderAccess::fence() - .inline _OrderAccess_fence,0 - lock - addl $0, (%rsp) - .end - // Support for u2 Bytes::swap_u2(u2 x) .inline _raw_swap_u2,1 movw %di, %ax diff --git a/hotspot/src/os_cpu/windows_x86/vm/orderAccess_windows_x86.inline.hpp b/hotspot/src/os_cpu/windows_x86/vm/orderAccess_windows_x86.inline.hpp index 37e5126e066..8481bd93f30 100644 --- a/hotspot/src/os_cpu/windows_x86/vm/orderAccess_windows_x86.inline.hpp +++ b/hotspot/src/os_cpu/windows_x86/vm/orderAccess_windows_x86.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, Oracle and/or its affiliates. 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 @@ -25,29 +25,39 @@ #ifndef OS_CPU_WINDOWS_X86_VM_ORDERACCESS_WINDOWS_X86_INLINE_HPP #define OS_CPU_WINDOWS_X86_VM_ORDERACCESS_WINDOWS_X86_INLINE_HPP +#include #include "runtime/atomic.inline.hpp" #include "runtime/orderAccess.hpp" #include "runtime/os.hpp" +// Compiler version last used for testing: Microsoft Visual Studio 2010 +// Please update this information when this file changes + // Implementation of class OrderAccess. -inline void OrderAccess::loadload() { acquire(); } -inline void OrderAccess::storestore() { release(); } -inline void OrderAccess::loadstore() { acquire(); } +// A compiler barrier, forcing the C++ compiler to invalidate all memory assumptions +inline void compiler_barrier() { + _ReadWriteBarrier(); +} + +// Note that in MSVC, volatile memory accesses are explicitly +// guaranteed to have acquire release semantics (w.r.t. compiler +// reordering) and therefore does not even need a compiler barrier +// for normal acquire release accesses. And all generalized +// bound calls like release_store go through OrderAccess::load +// and OrderAccess::store which do volatile memory accesses. +template<> inline void ScopedFence::postfix() { } +template<> inline void ScopedFence::prefix() { } +template<> inline void ScopedFence::prefix() { } +template<> inline void ScopedFence::postfix() { OrderAccess::fence(); } + +inline void OrderAccess::loadload() { compiler_barrier(); } +inline void OrderAccess::storestore() { compiler_barrier(); } +inline void OrderAccess::loadstore() { compiler_barrier(); } inline void OrderAccess::storeload() { fence(); } -inline void OrderAccess::acquire() { -#ifndef AMD64 - __asm { - mov eax, dword ptr [esp]; - } -#endif // !AMD64 -} - -inline void OrderAccess::release() { - // A volatile store has release semantics. - volatile jint local_dummy = 0; -} +inline void OrderAccess::acquire() { compiler_barrier(); } +inline void OrderAccess::release() { compiler_barrier(); } inline void OrderAccess::fence() { #ifdef AMD64 @@ -59,157 +69,47 @@ inline void OrderAccess::fence() { } } #endif // AMD64 + compiler_barrier(); } -inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { return *p; } -inline jshort OrderAccess::load_acquire(volatile jshort* p) { return *p; } -inline jint OrderAccess::load_acquire(volatile jint* p) { return *p; } -inline jlong OrderAccess::load_acquire(volatile jlong* p) { return Atomic::load(p); } -inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { return *p; } -inline jushort OrderAccess::load_acquire(volatile jushort* p) { return *p; } -inline juint OrderAccess::load_acquire(volatile juint* p) { return *p; } -inline julong OrderAccess::load_acquire(volatile julong* p) { return Atomic::load((volatile jlong*)p); } -inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { return *p; } -inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return jdouble_cast(Atomic::load((volatile jlong*)p)); } - -inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { return *p; } -inline void* OrderAccess::load_ptr_acquire(volatile void* p) { return *(void* volatile *)p; } -inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { return *(void* const volatile *)p; } - -inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { *p = v; } -inline void OrderAccess::release_store(volatile jshort* p, jshort v) { *p = v; } -inline void OrderAccess::release_store(volatile jint* p, jint v) { *p = v; } -inline void OrderAccess::release_store(volatile jlong* p, jlong v) { Atomic::store(v, p); } -inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { *p = v; } -inline void OrderAccess::release_store(volatile jushort* p, jushort v) { *p = v; } -inline void OrderAccess::release_store(volatile juint* p, juint v) { *p = v; } -inline void OrderAccess::release_store(volatile julong* p, julong v) { Atomic::store((jlong)v, (volatile jlong*)p); } -inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { *p = v; } -inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { release_store((volatile jlong*)p, jlong_cast(v)); } - -inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { *p = v; } -inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { *(void* volatile *)p = v; } - -inline void OrderAccess::store_fence(jbyte* p, jbyte v) { -#ifdef AMD64 - *p = v; fence(); -#else +#ifndef AMD64 +template<> +inline void OrderAccess::specialized_release_store_fence (volatile jbyte* p, jbyte v) { __asm { mov edx, p; mov al, v; xchg al, byte ptr [edx]; } -#endif // AMD64 } -inline void OrderAccess::store_fence(jshort* p, jshort v) { -#ifdef AMD64 - *p = v; fence(); -#else +template<> +inline void OrderAccess::specialized_release_store_fence(volatile jshort* p, jshort v) { __asm { mov edx, p; mov ax, v; xchg ax, word ptr [edx]; } -#endif // AMD64 } -inline void OrderAccess::store_fence(jint* p, jint v) { -#ifdef AMD64 - *p = v; fence(); -#else +template<> +inline void OrderAccess::specialized_release_store_fence (volatile jint* p, jint v) { __asm { mov edx, p; mov eax, v; xchg eax, dword ptr [edx]; } +} #endif // AMD64 + +template<> +inline void OrderAccess::specialized_release_store_fence(volatile jfloat* p, jfloat v) { + release_store_fence((volatile jint*)p, jint_cast(v)); +} +template<> +inline void OrderAccess::specialized_release_store_fence(volatile jdouble* p, jdouble v) { + release_store_fence((volatile jlong*)p, jlong_cast(v)); } -inline void OrderAccess::store_fence(jlong* p, jlong v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jubyte* p, jubyte v) { store_fence((jbyte*)p, (jbyte)v); } -inline void OrderAccess::store_fence(jushort* p, jushort v) { store_fence((jshort*)p, (jshort)v); } -inline void OrderAccess::store_fence(juint* p, juint v) { store_fence((jint*)p, (jint)v); } -inline void OrderAccess::store_fence(julong* p, julong v) { store_fence((jlong*)p, (jlong)v); } -inline void OrderAccess::store_fence(jfloat* p, jfloat v) { *p = v; fence(); } -inline void OrderAccess::store_fence(jdouble* p, jdouble v) { *p = v; fence(); } - -inline void OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v) { -#ifdef AMD64 - *p = v; fence(); -#else - store_fence((jint*)p, (jint)v); -#endif // AMD64 -} - -inline void OrderAccess::store_ptr_fence(void** p, void* v) { -#ifdef AMD64 - *p = v; fence(); -#else - store_fence((jint*)p, (jint)v); -#endif // AMD64 -} - -// Must duplicate definitions instead of calling store_fence because we don't want to cast away volatile. -inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { -#ifdef AMD64 - *p = v; fence(); -#else - __asm { - mov edx, p; - mov al, v; - xchg al, byte ptr [edx]; - } -#endif // AMD64 -} - -inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { -#ifdef AMD64 - *p = v; fence(); -#else - __asm { - mov edx, p; - mov ax, v; - xchg ax, word ptr [edx]; - } -#endif // AMD64 -} - -inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { -#ifdef AMD64 - *p = v; fence(); -#else - __asm { - mov edx, p; - mov eax, v; - xchg eax, dword ptr [edx]; - } -#endif // AMD64 -} - -inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { release_store(p, v); fence(); } - -inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { release_store_fence((volatile jbyte*)p, (jbyte)v); } -inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { release_store_fence((volatile jshort*)p, (jshort)v); } -inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { release_store_fence((volatile jint*)p, (jint)v); } -inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store_fence((volatile jlong*)p, (jlong)v); } -inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { *p = v; fence(); } -inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { release_store_fence((volatile jlong*)p, jlong_cast(v)); } - -inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { -#ifdef AMD64 - *p = v; fence(); -#else - release_store_fence((volatile jint*)p, (jint)v); -#endif // AMD64 -} - -inline void OrderAccess::release_store_ptr_fence(volatile void* p, void* v) { -#ifdef AMD64 - *(void* volatile *)p = v; fence(); -#else - release_store_fence((volatile jint*)p, (jint)v); -#endif // AMD64 -} +#define VM_HAS_GENERALIZED_ORDER_ACCESS 1 #endif // OS_CPU_WINDOWS_X86_VM_ORDERACCESS_WINDOWS_X86_INLINE_HPP diff --git a/hotspot/src/share/vm/runtime/orderAccess.hpp b/hotspot/src/share/vm/runtime/orderAccess.hpp index faf8d2a50c9..43a64ba4bb5 100644 --- a/hotspot/src/share/vm/runtime/orderAccess.hpp +++ b/hotspot/src/share/vm/runtime/orderAccess.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, Oracle and/or its affiliates. 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 @@ -29,11 +29,7 @@ // Memory Access Ordering Model // -// This interface is based on the JSR-133 Cookbook for Compiler Writers -// and on the IA64 memory model. It is the dynamic equivalent of the -// C/C++ volatile specifier. I.e., volatility restricts compile-time -// memory access reordering in a way similar to what we want to occur -// at runtime. +// This interface is based on the JSR-133 Cookbook for Compiler Writers. // // In the following, the terms 'previous', 'subsequent', 'before', // 'after', 'preceding' and 'succeeding' refer to program order. The @@ -41,7 +37,6 @@ // relative to program order, while 'up' and 'above' refer to backward // motion. // -// // We define four primitive memory barrier operations. // // LoadLoad: Load1(s); LoadLoad; Load2 @@ -69,86 +64,88 @@ // operations. Stores before Store1 may *not* float below Load2 and any // subsequent load operations. // +// We define two further barriers: acquire and release. // -// We define two further operations, 'release' and 'acquire'. They are -// mirror images of each other. +// Conceptually, acquire/release semantics form unidirectional and +// asynchronous barriers w.r.t. a synchronizing load(X) and store(X) pair. +// They should always be used in pairs to publish (release store) and +// access (load acquire) some implicitly understood shared data between +// threads in a relatively cheap fashion not requiring storeload. If not +// used in such a pair, it is advised to use a membar instead: +// acquire/release only make sense as pairs. // -// Execution by a processor of release makes the effect of all memory -// accesses issued by it previous to the release visible to all -// processors *before* the release completes. The effect of subsequent -// memory accesses issued by it *may* be made visible *before* the -// release. I.e., subsequent memory accesses may float above the -// release, but prior ones may not float below it. +// T1: access_shared_data +// T1: ]release +// T1: (...) +// T1: store(X) // -// Execution by a processor of acquire makes the effect of all memory -// accesses issued by it subsequent to the acquire visible to all -// processors *after* the acquire completes. The effect of prior memory -// accesses issued by it *may* be made visible *after* the acquire. -// I.e., prior memory accesses may float below the acquire, but -// subsequent ones may not float above it. +// T2: load(X) +// T2: (...) +// T2: acquire[ +// T2: access_shared_data // -// Finally, we define a 'fence' operation, which conceptually is a -// release combined with an acquire. In the real world these operations -// require one or more machine instructions which can float above and -// below the release or acquire, so we usually can't just issue the -// release-acquire back-to-back. All machines we know of implement some -// sort of memory fence instruction. +// It is guaranteed that if T2: load(X) synchronizes with (observes the +// value written by) T1: store(X), then the memory accesses before the T1: +// ]release happen before the memory accesses after the T2: acquire[. +// +// Total Store Order (TSO) machines can be seen as machines issuing a +// release store for each store and a load acquire for each load. Therefore +// there is an inherent resemblence between TSO and acquire/release +// semantics. TSO can be seen as an abstract machine where loads are +// executed immediately when encountered (hence loadload reordering not +// happening) but enqueues stores in a FIFO queue +// for asynchronous serialization (neither storestore or loadstore +// reordering happening). The only reordering happening is storeload due to +// the queue asynchronously serializing stores (yet in order). +// +// Acquire/release semantics essentially exploits this asynchronicity: when +// the load(X) acquire[ observes the store of ]release store(X), the +// accesses before the release must have happened before the accesses after +// acquire. +// +// The API offers both stand-alone acquire() and release() as well as bound +// load_acquire() and release_store(). It is guaranteed that these are +// semantically equivalent w.r.t. the defined model. However, since +// stand-alone acquire()/release() does not know which previous +// load/subsequent store is considered the synchronizing load/store, they +// may be more conservative in implementations. We advise using the bound +// variants whenever possible. +// +// Finally, we define a "fence" operation, as a bidirectional barrier. +// It guarantees that any memory access preceding the fence is not +// reordered w.r.t. any memory accesses subsequent to the fence in program +// order. This may be used to prevent sequences of loads from floating up +// above sequences of stores. +// +// The following table shows the implementations on some architectures: +// +// Constraint x86 sparc TSO ppc +// --------------------------------------------------------------------------- +// fence LoadStore | lock membar #StoreLoad sync +// StoreStore | addl 0,(sp) +// LoadLoad | +// StoreLoad +// +// release LoadStore | lwsync +// StoreStore +// +// acquire LoadLoad | lwsync +// LoadStore +// +// release_store lwsync +// +// +// release_store_fence xchg lwsync +// membar #StoreLoad +// sync // // -// The standalone implementations of release and acquire need an associated -// dummy volatile store or load respectively. To avoid redundant operations, -// we can define the composite operators: 'release_store', 'store_fence' and -// 'load_acquire'. Here's a summary of the machine instructions corresponding -// to each operation. +// load_acquire +// lwsync // -// sparc RMO ia64 x86 -// --------------------------------------------------------------------- -// fence membar #LoadStore | mf lock addl 0,(sp) -// #StoreStore | -// #LoadLoad | -// #StoreLoad -// -// release membar #LoadStore | st.rel [sp]=r0 movl $0, -// #StoreStore -// st %g0,[] -// -// acquire ld [%sp],%g0 ld.acq =[sp] movl (sp), -// membar #LoadLoad | -// #LoadStore -// -// release_store membar #LoadStore | st.rel -// #StoreStore -// st -// -// store_fence st st lock xchg -// fence mf -// -// load_acquire ld ld.acq -// membar #LoadLoad | -// #LoadStore -// -// Using only release_store and load_acquire, we can implement the -// following ordered sequences. -// -// 1. load, load == load_acquire, load -// or load_acquire, load_acquire -// 2. load, store == load, release_store -// or load_acquire, store -// or load_acquire, release_store -// 3. store, store == store, release_store -// or release_store, release_store -// -// These require no membar instructions for sparc-TSO and no extra -// instructions for ia64. -// -// Ordering a load relative to preceding stores requires a store_fence, +// Ordering a load relative to preceding stores requires a StoreLoad, // which implies a membar #StoreLoad between the store and load under -// sparc-TSO. A fence is required by ia64. On x86, we use locked xchg. -// -// 4. store, load == store_fence, load -// -// Use store_fence to make sure all stores done in an 'interesting' -// region are made visible prior to both subsequent loads and stores. +// sparc-TSO. On x86, we use explicitly locked add. // // Conventional usage is to issue a load_acquire for ordered loads. Use // release_store for ordered stores when you care only that prior stores @@ -157,27 +154,19 @@ // release_store_fence to update values like the thread state, where we // don't want the current thread to continue until all our prior memory // accesses (including the new thread state) are visible to other threads. +// This is equivalent to the volatile semantics of the Java Memory Model. // +// C++ Volatile Semantics // -// C++ Volatility -// -// C++ guarantees ordering at operations termed 'sequence points' (defined -// to be volatile accesses and calls to library I/O functions). 'Side -// effects' (defined as volatile accesses, calls to library I/O functions -// and object modification) previous to a sequence point must be visible -// at that sequence point. See the C++ standard, section 1.9, titled -// "Program Execution". This means that all barrier implementations, -// including standalone loadload, storestore, loadstore, storeload, acquire -// and release must include a sequence point, usually via a volatile memory -// access. Other ways to guarantee a sequence point are, e.g., use of -// indirect calls and linux's __asm__ volatile. -// Note: as of 6973570, we have replaced the originally static "dummy" field -// (see above) by a volatile store to the stack. All of the versions of the -// compilers that we currently use (SunStudio, gcc and VC++) respect the -// semantics of volatile here. If you build HotSpot using other -// compilers, you may need to verify that no compiler reordering occurs -// across the sequence point represented by the volatile access. -// +// C++ volatile semantics prevent compiler re-ordering between +// volatile memory accesses. However, reordering between non-volatile +// and volatile memory accesses is in general undefined. For compiler +// reordering constraints taking non-volatile memory accesses into +// consideration, a compiler barrier has to be used instead. Some +// compiler implementations may choose to enforce additional +// constraints beyond those required by the language. Note also that +// both volatile semantics and compiler barrier do not prevent +// hardware reordering. // // os::is_MP Considered Redundant // @@ -240,8 +229,32 @@ // order. If their implementations change such that these assumptions // are violated, a whole lot of code will break. +enum ScopedFenceType { + X_ACQUIRE + , RELEASE_X + , RELEASE_X_FENCE +}; + +template +class ScopedFenceGeneral: public StackObj { + public: + void prefix() {} + void postfix() {} +}; + +template +class ScopedFence : public ScopedFenceGeneral { + void *const _field; + public: + ScopedFence(void *const field) : _field(field) { prefix(); } + ~ScopedFence() { postfix(); } + void prefix() { ScopedFenceGeneral::prefix(); } + void postfix() { ScopedFenceGeneral::postfix(); } +}; + class OrderAccess : AllStatic { public: + // barriers static void loadload(); static void storestore(); static void loadstore(); @@ -280,20 +293,6 @@ class OrderAccess : AllStatic { static void release_store_ptr(volatile intptr_t* p, intptr_t v); static void release_store_ptr(volatile void* p, void* v); - static void store_fence(jbyte* p, jbyte v); - static void store_fence(jshort* p, jshort v); - static void store_fence(jint* p, jint v); - static void store_fence(jlong* p, jlong v); - static void store_fence(jubyte* p, jubyte v); - static void store_fence(jushort* p, jushort v); - static void store_fence(juint* p, juint v); - static void store_fence(julong* p, julong v); - static void store_fence(jfloat* p, jfloat v); - static void store_fence(jdouble* p, jdouble v); - - static void store_ptr_fence(intptr_t* p, intptr_t v); - static void store_ptr_fence(void** p, void* v); - static void release_store_fence(volatile jbyte* p, jbyte v); static void release_store_fence(volatile jshort* p, jshort v); static void release_store_fence(volatile jint* p, jint v); @@ -313,6 +312,47 @@ class OrderAccess : AllStatic { // routine if it exists, It should only be used by platforms that // don't have another way to do the inline assembly. static void StubRoutines_fence(); + + // Give platforms a variation point to specialize. + template static T specialized_load_acquire (volatile T* p ); + template static void specialized_release_store (volatile T* p, T v); + template static void specialized_release_store_fence(volatile T* p, T v); + + template + static void ordered_store(volatile FieldType* p, FieldType v); + + template + static FieldType ordered_load(volatile FieldType* p); + + static void store(volatile jbyte* p, jbyte v); + static void store(volatile jshort* p, jshort v); + static void store(volatile jint* p, jint v); + static void store(volatile jlong* p, jlong v); + static void store(volatile jdouble* p, jdouble v); + static void store(volatile jfloat* p, jfloat v); + + static jbyte load (volatile jbyte* p); + static jshort load (volatile jshort* p); + static jint load (volatile jint* p); + static jlong load (volatile jlong* p); + static jdouble load (volatile jdouble* p); + static jfloat load (volatile jfloat* p); + + // The following store_fence methods are deprecated and will be removed + // when all repos conform to the new generalized OrderAccess. + static void store_fence(jbyte* p, jbyte v); + static void store_fence(jshort* p, jshort v); + static void store_fence(jint* p, jint v); + static void store_fence(jlong* p, jlong v); + static void store_fence(jubyte* p, jubyte v); + static void store_fence(jushort* p, jushort v); + static void store_fence(juint* p, juint v); + static void store_fence(julong* p, julong v); + static void store_fence(jfloat* p, jfloat v); + static void store_fence(jdouble* p, jdouble v); + + static void store_ptr_fence(intptr_t* p, intptr_t v); + static void store_ptr_fence(void** p, void* v); }; #endif // SHARE_VM_RUNTIME_ORDERACCESS_HPP diff --git a/hotspot/src/share/vm/runtime/orderAccess.inline.hpp b/hotspot/src/share/vm/runtime/orderAccess.inline.hpp index 4fdd50d4fe8..bb17185cc02 100644 --- a/hotspot/src/share/vm/runtime/orderAccess.inline.hpp +++ b/hotspot/src/share/vm/runtime/orderAccess.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright 2014 SAP AG. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -26,6 +26,7 @@ #ifndef SHARE_VM_RUNTIME_ORDERACCESS_INLINE_HPP #define SHARE_VM_RUNTIME_ORDERACCESS_INLINE_HPP +#include "runtime/atomic.inline.hpp" #include "runtime/orderAccess.hpp" // Linux @@ -71,4 +72,92 @@ # include "orderAccess_bsd_zero.inline.hpp" #endif +#ifdef VM_HAS_GENERALIZED_ORDER_ACCESS + +template<> inline void ScopedFenceGeneral::postfix() { OrderAccess::acquire(); } +template<> inline void ScopedFenceGeneral::prefix() { OrderAccess::release(); } +template<> inline void ScopedFenceGeneral::prefix() { OrderAccess::release(); } +template<> inline void ScopedFenceGeneral::postfix() { OrderAccess::fence(); } + + +template +inline void OrderAccess::ordered_store(volatile FieldType* p, FieldType v) { + ScopedFence f((void*)p); + store(p, v); +} + +template +inline FieldType OrderAccess::ordered_load(volatile FieldType* p) { + ScopedFence f((void*)p); + return load(p); +} + +inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { return specialized_load_acquire(p); } +inline jshort OrderAccess::load_acquire(volatile jshort* p) { return specialized_load_acquire(p); } +inline jint OrderAccess::load_acquire(volatile jint* p) { return specialized_load_acquire(p); } +inline jlong OrderAccess::load_acquire(volatile jlong* p) { return specialized_load_acquire(p); } +inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { return specialized_load_acquire(p); } +inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return specialized_load_acquire(p); } +inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { return (jubyte) specialized_load_acquire((volatile jbyte*)p); } +inline jushort OrderAccess::load_acquire(volatile jushort* p) { return (jushort)specialized_load_acquire((volatile jshort*)p); } +inline juint OrderAccess::load_acquire(volatile juint* p) { return (juint) specialized_load_acquire((volatile jint*)p); } +inline julong OrderAccess::load_acquire(volatile julong* p) { return (julong) specialized_load_acquire((volatile jlong*)p); } + +inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { return (intptr_t)specialized_load_acquire(p); } +inline void* OrderAccess::load_ptr_acquire(volatile void* p) { return (void*)specialized_load_acquire((volatile intptr_t*)p); } +inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { return (void*)specialized_load_acquire((volatile intptr_t*)p); } + +inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { specialized_release_store(p, v); } +inline void OrderAccess::release_store(volatile jshort* p, jshort v) { specialized_release_store(p, v); } +inline void OrderAccess::release_store(volatile jint* p, jint v) { specialized_release_store(p, v); } +inline void OrderAccess::release_store(volatile jlong* p, jlong v) { specialized_release_store(p, v); } +inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { specialized_release_store(p, v); } +inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { specialized_release_store(p, v); } +inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { specialized_release_store((volatile jbyte*) p, (jbyte) v); } +inline void OrderAccess::release_store(volatile jushort* p, jushort v) { specialized_release_store((volatile jshort*)p, (jshort)v); } +inline void OrderAccess::release_store(volatile juint* p, juint v) { specialized_release_store((volatile jint*) p, (jint) v); } +inline void OrderAccess::release_store(volatile julong* p, julong v) { specialized_release_store((volatile jlong*) p, (jlong) v); } + +inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { specialized_release_store(p, v); } +inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { specialized_release_store((volatile intptr_t*)p, (intptr_t)v); } + +inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { specialized_release_store_fence(p, v); } +inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { specialized_release_store_fence(p, v); } +inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { specialized_release_store_fence(p, v); } +inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { specialized_release_store_fence(p, v); } +inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { specialized_release_store_fence(p, v); } +inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { specialized_release_store_fence(p, v); } +inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { specialized_release_store_fence((volatile jbyte*) p, (jbyte) v); } +inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { specialized_release_store_fence((volatile jshort*)p, (jshort)v); } +inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { specialized_release_store_fence((volatile jint*) p, (jint) v); } +inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { specialized_release_store_fence((volatile jlong*) p, (jlong) v); } + +inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { specialized_release_store_fence(p, v); } +inline void OrderAccess::release_store_ptr_fence(volatile void* p, void* v) { specialized_release_store_fence((volatile intptr_t*)p, (intptr_t)v); } + +// The following methods can be specialized using simple template specialization +// in the platform specific files for optimization purposes. Otherwise the +// generalized variant is used. +template inline T OrderAccess::specialized_load_acquire (volatile T* p) { return ordered_load(p); } +template inline void OrderAccess::specialized_release_store (volatile T* p, T v) { ordered_store(p, v); } +template inline void OrderAccess::specialized_release_store_fence(volatile T* p, T v) { ordered_store(p, v); } + +// Generalized atomic volatile accesses valid in OrderAccess +// All other types can be expressed in terms of these. +inline void OrderAccess::store(volatile jbyte* p, jbyte v) { *p = v; } +inline void OrderAccess::store(volatile jshort* p, jshort v) { *p = v; } +inline void OrderAccess::store(volatile jint* p, jint v) { *p = v; } +inline void OrderAccess::store(volatile jlong* p, jlong v) { Atomic::store(v, p); } +inline void OrderAccess::store(volatile jdouble* p, jdouble v) { Atomic::store(jlong_cast(v), (volatile jlong*)p); } +inline void OrderAccess::store(volatile jfloat* p, jfloat v) { *p = v; } + +inline jbyte OrderAccess::load(volatile jbyte* p) { return *p; } +inline jshort OrderAccess::load(volatile jshort* p) { return *p; } +inline jint OrderAccess::load(volatile jint* p) { return *p; } +inline jlong OrderAccess::load(volatile jlong* p) { return Atomic::load(p); } +inline jdouble OrderAccess::load(volatile jdouble* p) { return jdouble_cast(Atomic::load((volatile jlong*)p)); } +inline jfloat OrderAccess::load(volatile jfloat* p) { return *p; } + +#endif // VM_HAS_GENERALIZED_ORDER_ACCESS + #endif // SHARE_VM_RUNTIME_ORDERACCESS_INLINE_HPP From e616017fc8342b88504bc651e9be228ccb9b87cb Mon Sep 17 00:00:00 2001 From: Kevin Walls Date: Tue, 3 Mar 2015 19:42:09 +0000 Subject: [PATCH 11/82] 8073688: Infinite loop reading types during jmap attach Reviewed-by: dsamersoff, sla --- .../sun/jvm/hotspot/HotSpotTypeDataBase.java | 47 ++++++++++++++++--- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java index 2b9a7bc72ee..1097fb4dfcc 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java @@ -51,6 +51,9 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase { private static final int C_INT32_SIZE = 4; private static final int C_INT64_SIZE = 8; private static int pointerSize = UNINITIALIZED_SIZE; + // Counter to ensure read loops terminate: + private static final int MAX_DUPLICATE_DEFINITIONS = 100; + private int duplicateDefCount = 0; private static final boolean DEBUG; static { @@ -166,6 +169,10 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase { typeEntrySizeOffset = getLongValueFromProcess("gHotSpotVMTypeEntrySizeOffset"); typeEntryArrayStride = getLongValueFromProcess("gHotSpotVMTypeEntryArrayStride"); + if (typeEntryArrayStride == 0L) { + throw new RuntimeException("zero stride: cannot read types."); + } + // Start iterating down it until we find an entry with no name Address typeNameAddr = null; do { @@ -192,7 +199,11 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase { } entryAddr = entryAddr.addOffsetTo(typeEntryArrayStride); - } while (typeNameAddr != null); + } while (typeNameAddr != null && duplicateDefCount < MAX_DUPLICATE_DEFINITIONS); + + if (duplicateDefCount >= MAX_DUPLICATE_DEFINITIONS) { + throw new RuntimeException("too many duplicate definitions"); + } } private void initializePrimitiveTypes() { @@ -395,6 +406,10 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase { structEntryAddressOffset = getLongValueFromProcess("gHotSpotVMStructEntryAddressOffset"); structEntryArrayStride = getLongValueFromProcess("gHotSpotVMStructEntryArrayStride"); + if (structEntryArrayStride == 0L) { + throw new RuntimeException("zero stride: cannot read types."); + } + // Fetch the address of the VMStructEntry* Address entryAddr = lookupInProcess("gHotSpotVMStructs"); // Dereference this once to get the pointer to the first VMStructEntry @@ -472,6 +487,11 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase { intConstantEntryValueOffset = getLongValueFromProcess("gHotSpotVMIntConstantEntryValueOffset"); intConstantEntryArrayStride = getLongValueFromProcess("gHotSpotVMIntConstantEntryArrayStride"); + if (intConstantEntryArrayStride == 0L) { + throw new RuntimeException("zero stride: cannot read types."); + } + + // Fetch the address of the VMIntConstantEntry* Address entryAddr = lookupInProcess("gHotSpotVMIntConstants"); // Dereference this once to get the pointer to the first VMIntConstantEntry @@ -501,12 +521,17 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase { } else { System.err.println("Warning: the int constant \"" + name + "\" (declared in the remote VM in VMStructs::localHotSpotVMIntConstants) " + "had its value declared as " + value + " twice. Continuing."); + duplicateDefCount++; } } } entryAddr = entryAddr.addOffsetTo(intConstantEntryArrayStride); - } while (nameAddr != null); + } while (nameAddr != null && duplicateDefCount < MAX_DUPLICATE_DEFINITIONS); + + if (duplicateDefCount >= MAX_DUPLICATE_DEFINITIONS) { + throw new RuntimeException("too many duplicate definitions"); + } } private void readVMLongConstants() { @@ -519,6 +544,10 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase { longConstantEntryValueOffset = getLongValueFromProcess("gHotSpotVMLongConstantEntryValueOffset"); longConstantEntryArrayStride = getLongValueFromProcess("gHotSpotVMLongConstantEntryArrayStride"); + if (longConstantEntryArrayStride == 0L) { + throw new RuntimeException("zero stride: cannot read types."); + } + // Fetch the address of the VMLongConstantEntry* Address entryAddr = lookupInProcess("gHotSpotVMLongConstants"); // Dereference this once to get the pointer to the first VMLongConstantEntry @@ -548,12 +577,17 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase { } else { System.err.println("Warning: the long constant \"" + name + "\" (declared in the remote VM in VMStructs::localHotSpotVMLongConstants) " + "had its value declared as " + value + " twice. Continuing."); + duplicateDefCount++; } } } entryAddr = entryAddr.addOffsetTo(longConstantEntryArrayStride); - } while (nameAddr != null); + } while (nameAddr != null && duplicateDefCount < MAX_DUPLICATE_DEFINITIONS); + + if (duplicateDefCount >= MAX_DUPLICATE_DEFINITIONS) { + throw new RuntimeException("too many duplicate definitions."); + } } private BasicType lookupOrFail(String typeName) { @@ -740,9 +774,10 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase { } if (!typeNameIsPointerType(typeName)) { - System.err.println("Warning: the type \"" + typeName + "\" (declared in the remote VM in VMStructs::localHotSpotVMTypes) " + - "had its size declared as " + size + " twice. Continuing."); - } + System.err.println("Warning: the type \"" + typeName + "\" (declared in the remote VM in VMStructs::localHotSpotVMTypes) " + + "had its size declared as " + size + " twice. Continuing."); + duplicateDefCount++; + } } } From 08af89e08e2e00a0407b6d57cebb7ee20afc3c8d Mon Sep 17 00:00:00 2001 From: Roman Kennke Date: Wed, 4 Mar 2015 15:42:02 +0100 Subject: [PATCH 12/82] 8072436: Refactor X11FontManager Factor fontconfig related code out of X11FontManager into its own superclass FcFontManager. Reviewed-by: prr, serb --- jdk/make/mapfiles/libawt/mapfile-mawt-vers | 2 +- jdk/make/mapfiles/libawt/mapfile-vers-linux | 2 +- .../mapfiles/libawt_headless/mapfile-vers | 2 +- jdk/make/mapfiles/libawt_xawt/mapfile-vers | 2 +- .../unix/classes/sun/awt/FcFontManager.java | 108 ++++++++++++++++++ .../unix/classes/sun/awt/X11FontManager.java | 48 +------- .../classes/sun/font/FcFontConfiguration.java | 12 +- .../unix/native/common/awt/fontpath.c | 10 +- 8 files changed, 126 insertions(+), 60 deletions(-) create mode 100644 jdk/src/java.desktop/unix/classes/sun/awt/FcFontManager.java diff --git a/jdk/make/mapfiles/libawt/mapfile-mawt-vers b/jdk/make/mapfiles/libawt/mapfile-mawt-vers index 06d3ff802e1..195ba1cbc50 100644 --- a/jdk/make/mapfiles/libawt/mapfile-mawt-vers +++ b/jdk/make/mapfiles/libawt/mapfile-mawt-vers @@ -243,7 +243,7 @@ SUNWprivate_1.1 { getDefaultConfig; Java_sun_font_FontConfigManager_getFontConfig; Java_sun_font_FontConfigManager_getFontConfigAASettings; - Java_sun_awt_X11FontManager_getFontPathNative; + Java_sun_awt_FcFontManager_getFontPathNative; Java_sun_font_SunFontManager_populateFontFileNameMap; # CDE private entry point diff --git a/jdk/make/mapfiles/libawt/mapfile-vers-linux b/jdk/make/mapfiles/libawt/mapfile-vers-linux index 922b015c68c..5624693fcca 100644 --- a/jdk/make/mapfiles/libawt/mapfile-vers-linux +++ b/jdk/make/mapfiles/libawt/mapfile-vers-linux @@ -270,7 +270,7 @@ SUNWprivate_1.1 { getDefaultConfig; Java_sun_font_FontConfigManager_getFontConfig; Java_sun_font_FontConfigManager_getFontConfigAASettings; - Java_sun_awt_X11FontManager_getFontPathNative; + Java_sun_awt_FcFontManager_getFontPathNative; Java_sun_font_SunFontManager_populateFontFileNameMap; # CDE private entry point diff --git a/jdk/make/mapfiles/libawt_headless/mapfile-vers b/jdk/make/mapfiles/libawt_headless/mapfile-vers index df24e4505db..5ea1745e296 100644 --- a/jdk/make/mapfiles/libawt_headless/mapfile-vers +++ b/jdk/make/mapfiles/libawt_headless/mapfile-vers @@ -65,7 +65,7 @@ SUNWprivate_1.1 { Java_sun_font_FontConfigManager_getFontConfig; Java_sun_font_FontConfigManager_getFontConfigAASettings; Java_sun_font_FontConfigManager_getFontConfigVersion; - Java_sun_awt_X11FontManager_getFontPathNative; + Java_sun_awt_FcFontManager_getFontPathNative; Java_sun_awt_FontDescriptor_initIDs; Java_sun_awt_PlatformFont_initIDs; diff --git a/jdk/make/mapfiles/libawt_xawt/mapfile-vers b/jdk/make/mapfiles/libawt_xawt/mapfile-vers index 4a891077b76..a2f75efcd0b 100644 --- a/jdk/make/mapfiles/libawt_xawt/mapfile-vers +++ b/jdk/make/mapfiles/libawt_xawt/mapfile-vers @@ -188,7 +188,7 @@ SUNWprivate_1.1 { Java_sun_font_FontConfigManager_getFontConfig; Java_sun_font_FontConfigManager_getFontConfigAASettings; Java_sun_font_FontConfigManager_getFontConfigVersion; - Java_sun_awt_X11FontManager_getFontPathNative; + Java_sun_awt_FcFontManager_getFontPathNative; Java_sun_awt_X11GraphicsEnvironment_initDisplay; Java_sun_awt_X11GraphicsEnvironment_initGLX; Java_sun_awt_X11GraphicsEnvironment_initXRender; diff --git a/jdk/src/java.desktop/unix/classes/sun/awt/FcFontManager.java b/jdk/src/java.desktop/unix/classes/sun/awt/FcFontManager.java new file mode 100644 index 00000000000..5ffa3490db6 --- /dev/null +++ b/jdk/src/java.desktop/unix/classes/sun/awt/FcFontManager.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2015 Oracle and/or its affiliates. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.awt; + +import sun.font.FcFontConfiguration; +import sun.font.FontConfigManager; +import sun.font.SunFontManager; + +/** + * A {@link sun.font.FontManager} that uses fontconfig to find system fonts. + */ +public class FcFontManager extends SunFontManager { + + private FontConfigManager fcManager = null; + + public synchronized FontConfigManager getFontConfigManager() { + + if (fcManager == null) { + fcManager = new FontConfigManager(); + } + + return fcManager; + } + + @Override + protected FontConfiguration createFontConfiguration() { + FcFontConfiguration fcFontConfig = new FcFontConfiguration(this); + if (fcFontConfig.init()) { + return fcFontConfig; + } else { + throw new InternalError("failed to initialize fontconfig"); + } + } + + @Override + public FontConfiguration createFontConfiguration(boolean preferLocaleFonts, + boolean preferPropFonts) { + FcFontConfiguration fcFontConfig = + new FcFontConfiguration(this, preferLocaleFonts, preferPropFonts); + if (fcFontConfig.init()) { + return fcFontConfig; + } else { + throw new InternalError("failed to initialize fontconfig"); + } + } + + @Override + protected String[] getDefaultPlatformFont() { + final String[] info = new String[2]; + getFontConfigManager().initFontConfigFonts(false); + FontConfigManager.FcCompFont[] fontConfigFonts = + getFontConfigManager().getFontConfigFonts(); + for (int i=0; i 0 && + fontConfigFonts[0].firstFont.fontFile != null) { + info[0] = fontConfigFonts[0].firstFont.familyName; + info[1] = fontConfigFonts[0].firstFont.fontFile; + } else { + info[0] = "Dialog"; + info[1] = "/dialog.ttf"; + } + } + return info; + } + + protected native String getFontPathNative(boolean noType1Fonts, + boolean isX11GE); + + protected synchronized String getFontPath(boolean noType1Fonts) { + return getFontPathNative(noType1Fonts, false); + } + +} diff --git a/jdk/src/java.desktop/unix/classes/sun/awt/X11FontManager.java b/jdk/src/java.desktop/unix/classes/sun/awt/X11FontManager.java index 179adeb97eb..5a2771cd90b 100644 --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11FontManager.java +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11FontManager.java @@ -54,7 +54,7 @@ import sun.util.logging.PlatformLogger; /** * The X11 implementation of {@link FontManager}. */ -public final class X11FontManager extends SunFontManager { +public final class X11FontManager extends FcFontManager { // constants identifying XLFD and font ID fields private static final int FOUNDRY_FIELD = 1; @@ -154,8 +154,6 @@ public final class X11FontManager extends SunFontManager { */ private static String[] fontdirs = null; - private FontConfigManager fcManager = null; - public static X11FontManager getInstance() { return (X11FontManager) SunFontManager.getInstance(); } @@ -784,51 +782,9 @@ public final class X11FontManager extends SunFontManager { preferLocaleFonts, preferPropFonts); } - public synchronized native String getFontPathNative(boolean noType1Fonts); - protected synchronized String getFontPath(boolean noType1Fonts) { isHeadless(); // make sure GE is inited, as its the X11 lock. - return getFontPathNative(noType1Fonts); - } - - @Override - protected String[] getDefaultPlatformFont() { - final String[] info = new String[2]; - getFontConfigManager().initFontConfigFonts(false); - FontConfigManager.FcCompFont[] fontConfigFonts = - getFontConfigManager().getFontConfigFonts(); - for (int i=0; i 0 && - fontConfigFonts[0].firstFont.fontFile != null) { - info[0] = fontConfigFonts[0].firstFont.familyName; - info[1] = fontConfigFonts[0].firstFont.fontFile; - } else { - info[0] = "Dialog"; - info[1] = "/dialog.ttf"; - } - } - return info; - } - - public synchronized FontConfigManager getFontConfigManager() { - - if (fcManager == null) { - fcManager = new FontConfigManager(); - } - - return fcManager; + return getFontPathNative(noType1Fonts, true); } @Override diff --git a/jdk/src/java.desktop/unix/classes/sun/font/FcFontConfiguration.java b/jdk/src/java.desktop/unix/classes/sun/font/FcFontConfiguration.java index f5fd8cc996b..567e8bea83f 100644 --- a/jdk/src/java.desktop/unix/classes/sun/font/FcFontConfiguration.java +++ b/jdk/src/java.desktop/unix/classes/sun/font/FcFontConfiguration.java @@ -39,10 +39,10 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Properties; import java.util.Scanner; +import sun.awt.FcFontManager; import sun.awt.FontConfiguration; import sun.awt.FontDescriptor; import sun.awt.SunToolkit; -import sun.awt.X11FontManager; import sun.font.CompositeFontDescriptor; import sun.font.FontManager; import sun.font.FontConfigManager.FontConfigInfo; @@ -92,7 +92,7 @@ public class FcFontConfiguration extends FontConfiguration { setFontConfiguration(); readFcInfo(); - X11FontManager fm = (X11FontManager) fontManager; + FcFontManager fm = (FcFontManager) fontManager; FontConfigManager fcm = fm.getFontConfigManager(); if (fcCompFonts == null) { fcCompFonts = fcm.loadFontConfig(); @@ -194,7 +194,7 @@ public class FcFontConfiguration extends FontConfiguration { @Override public String[] getPlatformFontNames() { HashSet nameSet = new HashSet(); - X11FontManager fm = (X11FontManager) fontManager; + FcFontManager fm = (FcFontManager) fontManager; FontConfigManager fcm = fm.getFontConfigManager(); FcCompFont[] fcCompFonts = fcm.loadFontConfig(); for (int i=0; iNewStringUTF(env, ptr); return ret; From 9fae485daba05a89dc14c9c0e62dd69c3864e3c9 Mon Sep 17 00:00:00 2001 From: Dmitry Dmitriev Date: Wed, 4 Mar 2015 16:35:58 -0500 Subject: [PATCH 13/82] 8073861: Unused VM Options in JDK9 HotSpot Reviewed-by: dholmes, lfoltan --- hotspot/src/share/vm/runtime/arguments.cpp | 2 ++ hotspot/src/share/vm/runtime/globals.hpp | 15 --------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index b0e6f6357a9..9f0821181b9 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -321,6 +321,8 @@ static ObsoleteFlag obsolete_jvm_flags[] = { { "UseFastEmptyMethods", JDK_Version::jdk(9), JDK_Version::jdk(10) }, #endif // ZERO { "UseCompilerSafepoints", JDK_Version::jdk(9), JDK_Version::jdk(10) }, + { "AdaptiveSizePausePolicy", JDK_Version::jdk(9), JDK_Version::jdk(10) }, + { "ParallelGCRetainPLAB", JDK_Version::jdk(9), JDK_Version::jdk(10) }, { NULL, JDK_Version(0), JDK_Version(0) } }; diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index ca86916aaff..a3daefa87a9 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -1068,9 +1068,6 @@ class CommandLineFlags { notproduct(bool, ProfilerCheckIntervals, false, \ "Collect and print information on spacing of profiler ticks") \ \ - develop(bool, PrintJVMWarnings, false, \ - "Print warnings for unimplemented JVM functions") \ - \ product(bool, PrintWarnings, true, \ "Print JVM warnings to output stream") \ \ @@ -1195,10 +1192,6 @@ class CommandLineFlags { "Use pthread-based instead of libthread-based synchronization " \ "(SPARC only)") \ \ - product(bool, AdjustConcurrency, false, \ - "Call thr_setconcurrency at thread creation time to avoid " \ - "LWP starvation on MP systems (for Solaris Only)") \ - \ product(bool, ReduceSignalUsage, false, \ "Reduce the use of OS signals in Java and/or the VM") \ \ @@ -1545,11 +1538,6 @@ class CommandLineFlags { product(uintx, ParallelGCBufferWastePct, 10, \ "Wasted fraction of parallel allocation buffer") \ \ - diagnostic(bool, ParallelGCRetainPLAB, false, \ - "Retain parallel allocation buffers across scavenges; " \ - "it is disabled because this currently conflicts with " \ - "parallel card scanning under certain conditions.") \ - \ product(uintx, TargetPLABWastePct, 10, \ "Target wasted space in last buffer as percent of overall " \ "allocation") \ @@ -2089,9 +2077,6 @@ class CommandLineFlags { product(uintx, AdaptiveSizeThroughPutPolicy, 0, \ "Policy for changing generation size for throughput goals") \ \ - product(uintx, AdaptiveSizePausePolicy, 0, \ - "Policy for changing generation size for pause goals") \ - \ develop(bool, PSAdjustTenuredGenForMinorPause, false, \ "Adjust tenured generation to achieve a minor pause goal") \ \ From 0803af98c7f332e4a8e10239fe00b7dcf58a90e2 Mon Sep 17 00:00:00 2001 From: Yuri Nesterenko Date: Thu, 5 Mar 2015 11:07:48 +0300 Subject: [PATCH 14/82] 8074092: Newly introduced unnecessary dependencies on internal API in client regtests Reviewed-by: serb, azvegint --- .../Choice/ItemStateChangeTest/ItemStateChangeTest.java | 4 +++- jdk/test/java/awt/Desktop/8064934/bug8064934.java | 5 +++-- .../java/awt/Menu/OpensWithNoGrab/OpensWithNoGrab.java | 4 +++- .../FullscreenAfterSplash/FullScreenAfterSplash.java | 5 +++-- .../event/KeyEvent/SwallowKeyEvents/SwallowKeyEvents.java | 5 ++++- jdk/test/javax/swing/JButton/4796987/bug4796987.java | 8 ++++---- jdk/test/javax/swing/JFileChooser/8062561/bug8062561.java | 6 ++++-- jdk/test/javax/swing/JPopupMenu/6827786/bug6827786.java | 5 ++++- 8 files changed, 28 insertions(+), 14 deletions(-) diff --git a/jdk/test/java/awt/Choice/ItemStateChangeTest/ItemStateChangeTest.java b/jdk/test/java/awt/Choice/ItemStateChangeTest/ItemStateChangeTest.java index 45ccef0262b..9dd36dda9e3 100644 --- a/jdk/test/java/awt/Choice/ItemStateChangeTest/ItemStateChangeTest.java +++ b/jdk/test/java/awt/Choice/ItemStateChangeTest/ItemStateChangeTest.java @@ -27,15 +27,17 @@ @summary awt Choice doesn't fire ItemStateChange when selecting item after select() call @author Oleg Pekhovskiy: area=awt-choice @library ../../regtesthelpers + @library ../../../../lib/testlibrary @build Util + @build jdk.testlibrary.OSInfo @run main ItemStateChangeTest */ import test.java.awt.regtesthelpers.Util; +import jdk.testlibrary.OSInfo; import java.awt.*; import java.awt.event.*; -import sun.awt.OSInfo; public class ItemStateChangeTest extends Frame { diff --git a/jdk/test/java/awt/Desktop/8064934/bug8064934.java b/jdk/test/java/awt/Desktop/8064934/bug8064934.java index 8824f883cf5..ca1c451ccc1 100644 --- a/jdk/test/java/awt/Desktop/8064934/bug8064934.java +++ b/jdk/test/java/awt/Desktop/8064934/bug8064934.java @@ -25,10 +25,11 @@ * @bug 8064934 * @summary Incorrect Exception message from java.awt.Desktop.open() * @author Dmitry Markov + * @library ../../../../lib/testlibrary + * @build jdk.testlibrary.OSInfo * @run main bug8064934 */ -import sun.awt.OSInfo; - +import jdk.testlibrary.OSInfo; import java.awt.*; import java.io.File; import java.io.IOException; diff --git a/jdk/test/java/awt/Menu/OpensWithNoGrab/OpensWithNoGrab.java b/jdk/test/java/awt/Menu/OpensWithNoGrab/OpensWithNoGrab.java index c8b47366542..dcfb8ca16a9 100644 --- a/jdk/test/java/awt/Menu/OpensWithNoGrab/OpensWithNoGrab.java +++ b/jdk/test/java/awt/Menu/OpensWithNoGrab/OpensWithNoGrab.java @@ -27,6 +27,8 @@ @summary REG: Menu does not disappear when clicked, keeping Choice's drop-down open, XToolkit @author andrei.dmitriev: area=awt.menu @library ../../regtesthelpers + @library ../../../../lib/testlibrary + @build jdk.testlibrary.OSInfo @build Util @run main OpensWithNoGrab */ @@ -34,7 +36,7 @@ import java.awt.*; import java.awt.event.*; -import sun.awt.OSInfo; +import jdk.testlibrary.OSInfo; import test.java.awt.regtesthelpers.Util; public class OpensWithNoGrab diff --git a/jdk/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java b/jdk/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java index b5e019ec772..6cecf964a72 100644 --- a/jdk/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java +++ b/jdk/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java @@ -21,8 +21,7 @@ * questions. */ -import sun.awt.OSInfo; - +import jdk.testlibrary.OSInfo; import java.awt.*; import java.awt.Robot; import java.awt.event.InputEvent; @@ -38,6 +37,8 @@ import javax.swing.*; * @bug 8024185 * @summary Native Mac OS X full screen does not work after showing the splash * @library ../ + * @library ../../../../lib/testlibrary + * @build jdk.testlibrary.OSInfo * @build GenerateTestImage * @run main GenerateTestImage * @author Petr Pchelko area=awt.event diff --git a/jdk/test/java/awt/event/KeyEvent/SwallowKeyEvents/SwallowKeyEvents.java b/jdk/test/java/awt/event/KeyEvent/SwallowKeyEvents/SwallowKeyEvents.java index 310e78f9ff8..6878c3f42a8 100644 --- a/jdk/test/java/awt/event/KeyEvent/SwallowKeyEvents/SwallowKeyEvents.java +++ b/jdk/test/java/awt/event/KeyEvent/SwallowKeyEvents/SwallowKeyEvents.java @@ -27,10 +27,13 @@ @summary Tests that key events with modifiers are not swallowed. @author anton.tarasov: area=awt.focus @library ../../../regtesthelpers + @library ../../../../../lib/testlibrary + @build jdk.testlibrary.OSInfo @build Util @run main SwallowKeyEvents */ +import jdk.testlibrary.OSInfo; import java.awt.AWTException; import java.awt.Frame; import java.awt.Robot; @@ -49,7 +52,7 @@ public class SwallowKeyEvents { static Robot r; public static void main(String[] args) { - if (sun.awt.OSInfo.getOSType() == sun.awt.OSInfo.OSType.WINDOWS) { + if (OSInfo.getOSType() == OSInfo.OSType.WINDOWS) { System.out.println("Skipped. Test not for MS Windows."); return; } diff --git a/jdk/test/javax/swing/JButton/4796987/bug4796987.java b/jdk/test/javax/swing/JButton/4796987/bug4796987.java index ac41799da61..a206ff7b931 100644 --- a/jdk/test/javax/swing/JButton/4796987/bug4796987.java +++ b/jdk/test/javax/swing/JButton/4796987/bug4796987.java @@ -27,14 +27,15 @@ * @summary XP Only: JButton.setBorderPainted() does not work with XP L&F * @author Alexander Scherbatiy * @library ../../regtesthelpers + * @library ../../../../lib/testlibrary + * @build jdk.testlibrary.OSInfo * @build Util * @run main bug4796987 */ +import jdk.testlibrary.OSInfo; import java.awt.*; import javax.swing.*; -import sun.awt.OSInfo; -import sun.awt.SunToolkit; import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; public class bug4796987 { @@ -51,7 +52,6 @@ public class bug4796987 { } private static void testButtonBorder() throws Exception { - SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); Robot robot = new Robot(); robot.setAutoDelay(50); @@ -62,7 +62,7 @@ public class bug4796987 { } }); - toolkit.realSync(); + robot.waitForIdle(); Thread.sleep(500); Point p1 = Util.getCenterPoint(button1); diff --git a/jdk/test/javax/swing/JFileChooser/8062561/bug8062561.java b/jdk/test/javax/swing/JFileChooser/8062561/bug8062561.java index 3802de38b22..cf00665d61f 100644 --- a/jdk/test/javax/swing/JFileChooser/8062561/bug8062561.java +++ b/jdk/test/javax/swing/JFileChooser/8062561/bug8062561.java @@ -21,6 +21,7 @@ * questions. */ +import jdk.testlibrary.OSInfo; import java.awt.Robot; import java.awt.event.KeyEvent; import java.io.File; @@ -31,12 +32,13 @@ import java.util.concurrent.TimeUnit; import javax.swing.JFileChooser; import javax.swing.SwingUtilities; import javax.swing.filechooser.FileSystemView; -import sun.awt.OSInfo; /** * @test * @bug 8062561 * @summary File system view returns null default directory + * @library ../../../../lib/testlibrary + * @build jdk.testlibrary.OSInfo * @run main/othervm bug8062561 GENERATE_POLICY * @run main/othervm/policy=security.policy bug8062561 CHECK_DEFAULT_DIR run */ @@ -72,7 +74,7 @@ public class bug8062561 { File defaultDirectory = FileSystemView.getFileSystemView(). getDefaultDirectory(); if (defaultDirectory != null) { - throw new RuntimeException("File system default directory is null!"); + throw new RuntimeException("File system default directory must be null! (FilePermission has not been granted in our policy file)."); } } private static volatile JFileChooser fileChooser; diff --git a/jdk/test/javax/swing/JPopupMenu/6827786/bug6827786.java b/jdk/test/javax/swing/JPopupMenu/6827786/bug6827786.java index 77c05fe206e..1cacce868bf 100644 --- a/jdk/test/javax/swing/JPopupMenu/6827786/bug6827786.java +++ b/jdk/test/javax/swing/JPopupMenu/6827786/bug6827786.java @@ -27,9 +27,12 @@ * @summary Tests duplicate mnemonics * @author Peter Zhelezniakov * @library ../../regtesthelpers + * @library ../../../../lib/testlibrary + * @build jdk.testlibrary.OSInfo * @build Util * @run main bug6827786 */ +import jdk.testlibrary.OSInfo; import java.awt.*; import java.awt.event.KeyEvent; import javax.swing.*; @@ -63,7 +66,7 @@ public class bug6827786 { checkfocus(); // select menu - if (sun.awt.OSInfo.getOSType() == sun.awt.OSInfo.OSType.MACOSX) { + if (OSInfo.getOSType() == OSInfo.OSType.MACOSX) { Util.hitKeys(robot, KeyEvent.VK_CONTROL, KeyEvent.VK_ALT, KeyEvent.VK_F); } else { Util.hitKeys(robot, KeyEvent.VK_ALT, KeyEvent.VK_F); From c4df8e24bcef4bdd87e4b03e63ca9c6e618693fa Mon Sep 17 00:00:00 2001 From: Staffan Larsen Date: Thu, 5 Mar 2015 11:39:15 +0100 Subject: [PATCH 15/82] 8058470: [jconsole] VM Summary Tab is blank for JDK9's jconsole Reviewed-by: erikj --- make/common/JavaCompilation.gmk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make/common/JavaCompilation.gmk b/make/common/JavaCompilation.gmk index 41f1f0745da..d2bad5e88de 100644 --- a/make/common/JavaCompilation.gmk +++ b/make/common/JavaCompilation.gmk @@ -393,7 +393,7 @@ define add_file_to_clean $(MKDIR) -p $$(@D) export LC_ALL=C ; ( $(CAT) $$< && $(ECHO) "" ) \ | $(SED) -e 's/\([^\\]\):/\1\\:/g' -e 's/\([^\\]\)=/\1\\=/g' \ - -e 's/\([^\\]\)!/\1\\!/g' -e 's/#.*/#/g' \ + -e 's/\([^\\]\)!/\1\\!/g' -e 's/^[ ]*#.*/#/g' \ | $(SED) -f "$(SRC_ROOT)/make/common/support/unicode2x.sed" \ | $(SED) -e '/^#/d' -e '/^$$$$/d' \ -e :a -e '/\\$$$$/N; s/\\\n//; ta' \ From 8fe1e48f0c389d7d43621d94b226cdd479a03b61 Mon Sep 17 00:00:00 2001 From: David Lindholm Date: Thu, 5 Mar 2015 16:43:26 +0100 Subject: [PATCH 16/82] 8073545: Use shorter and more descriptive names for GC worker threads Reviewed-by: ehelin, jwilhelm --- .../concurrentMarkSweep/concurrentMarkSweepGeneration.cpp | 2 +- .../concurrentMarkSweep/concurrentMarkSweepThread.cpp | 2 +- .../vm/gc_implementation/g1/concurrentG1RefineThread.cpp | 2 +- hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp | 2 +- .../share/vm/gc_implementation/g1/concurrentMarkThread.cpp | 4 ++-- .../src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp | 4 ++-- .../vm/gc_implementation/parallelScavenge/gcTaskThread.cpp | 2 +- hotspot/src/share/vm/memory/sharedHeap.cpp | 4 ++-- hotspot/src/share/vm/utilities/workgroup.cpp | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp index c4a3ac44c48..c89cbedda29 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @@ -549,7 +549,7 @@ CMSCollector::CMSCollector(ConcurrentMarkSweepGeneration* cmsGen, FLAG_SET_DEFAULT(ConcGCThreads, (ParallelGCThreads + 3)/4); } if (ConcGCThreads > 1) { - _conc_workers = new YieldingFlexibleWorkGang("Parallel CMS Threads", + _conc_workers = new YieldingFlexibleWorkGang("CMS Thread", ConcGCThreads, true); if (_conc_workers == NULL) { warning("GC/CMS: _conc_workers allocation failure: " diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.cpp index 73f265a4028..41b9e377453 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.cpp @@ -65,7 +65,7 @@ ConcurrentMarkSweepThread::ConcurrentMarkSweepThread(CMSCollector* collector) assert(_collector == NULL, "Collector already set"); _collector = collector; - set_name("Concurrent Mark-Sweep GC Thread"); + set_name("CMS Main Thread"); if (os::create_thread(this, os::cgc_thread)) { // An old comment here said: "Priority should be just less diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp index 56ae3c2a7f2..092bd536456 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp @@ -61,7 +61,7 @@ ConcurrentG1RefineThread(ConcurrentG1Refine* cg1r, ConcurrentG1RefineThread *nex create_and_start(); // set name - set_name("G1 Concurrent Refinement Thread#%d", worker_id); + set_name("G1 Refine#%d", worker_id); } void ConcurrentG1RefineThread::initialize() { diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp index bdd5e551016..5b7239d6536 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp @@ -687,7 +687,7 @@ ConcurrentMark::ConcurrentMark(G1CollectedHeap* g1h, G1RegionToSpaceMapper* prev gclog_or_tty->print_cr("CL Sleep Factor %1.4lf", cleanup_sleep_factor()); #endif - _parallel_workers = new FlexibleWorkGang("G1 Parallel Marking Threads", + _parallel_workers = new FlexibleWorkGang("G1 Marker", _max_parallel_marking_threads, false, true); if (_parallel_workers == NULL) { vm_exit_during_initialization("Failed necessary allocation."); diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp index 5b51a6f4675..f67d8fe5635 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2015, Oracle and/or its affiliates. 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 @@ -48,7 +48,7 @@ ConcurrentMarkThread::ConcurrentMarkThread(ConcurrentMark* cm) : _vtime_accum(0.0), _vtime_mark_accum(0.0) { - set_name("G1 Main Concurrent Mark GC Thread"); + set_name("G1 Main Marker"); create_and_start(); } diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp index 3069770313e..905dda74815 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, Oracle and/or its affiliates. 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 @@ -34,7 +34,7 @@ G1StringDedupThread* G1StringDedupThread::_thread = NULL; G1StringDedupThread::G1StringDedupThread() : ConcurrentGCThread() { - set_name("String Deduplication Thread"); + set_name("G1 StrDedup"); create_and_start(); } diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp index ff58762c20e..91f23612a56 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp @@ -53,7 +53,7 @@ GCTaskThread::GCTaskThread(GCTaskManager* manager, guarantee(_time_stamps != NULL, "Sanity"); } set_id(which); - set_name("GC task thread#%d (ParallelGC)", which); + set_name("ParGC Thread#%d", which); } GCTaskThread::~GCTaskThread() { diff --git a/hotspot/src/share/vm/memory/sharedHeap.cpp b/hotspot/src/share/vm/memory/sharedHeap.cpp index 7450cc92879..d6617af237e 100644 --- a/hotspot/src/share/vm/memory/sharedHeap.cpp +++ b/hotspot/src/share/vm/memory/sharedHeap.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2015, Oracle and/or its affiliates. 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 @@ -68,7 +68,7 @@ SharedHeap::SharedHeap(CollectorPolicy* policy_) : } _sh = this; // ch is static, should be set only once. if (UseConcMarkSweepGC || UseG1GC) { - _workers = new FlexibleWorkGang("Parallel GC Threads", ParallelGCThreads, + _workers = new FlexibleWorkGang("GC Thread", ParallelGCThreads, /* are_GC_task_threads */true, /* are_ConcurrentGC_threads */false); if (_workers == NULL) { diff --git a/hotspot/src/share/vm/utilities/workgroup.cpp b/hotspot/src/share/vm/utilities/workgroup.cpp index 3f20f36ce7e..dc260422adf 100644 --- a/hotspot/src/share/vm/utilities/workgroup.cpp +++ b/hotspot/src/share/vm/utilities/workgroup.cpp @@ -236,7 +236,7 @@ void AbstractWorkGang::threads_do(ThreadClosure* tc) const { GangWorker::GangWorker(AbstractWorkGang* gang, uint id) { _gang = gang; set_id(id); - set_name("Gang worker#%d (%s)", id, gang->name()); + set_name("%s#%d", gang->name(), id); } void GangWorker::run() { From 67fddc10a68ac593ee45f846d3c032d8e7105e60 Mon Sep 17 00:00:00 2001 From: Staffan Friberg Date: Fri, 6 Mar 2015 09:07:33 +0100 Subject: [PATCH 17/82] 8031538: G1 eden usage is sometimes higher than target eden (printed Eden size) When recalculating the number of target eden size, correctly consider the amount of existing eden regions in the target calculation. Reviewed-by: tschatzl --- .../vm/gc_implementation/g1/g1CollectedHeap.hpp | 3 ++- .../gc_implementation/g1/g1CollectorPolicy.cpp | 17 +++++++---------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp index c47a8516a63..42a7229a9e0 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp @@ -110,6 +110,7 @@ public: void empty_list(); bool is_empty() { return _length == 0; } uint length() { return _length; } + uint eden_length() { return length() - survivor_length(); } uint survivor_length() { return _survivor_length; } // Currently we do not keep track of the used byte sum for the @@ -119,7 +120,7 @@ public: // we'll report the more accurate information then. size_t eden_used_bytes() { assert(length() >= survivor_length(), "invariant"); - return (size_t) (length() - survivor_length()) * HeapRegion::GrainBytes; + return (size_t) eden_length() * HeapRegion::GrainBytes; } size_t survivor_used_bytes() { return (size_t) survivor_length() * HeapRegion::GrainBytes; diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp index 2507d4e3e28..21cbf9fb57e 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp @@ -537,15 +537,12 @@ void G1CollectorPolicy::update_young_list_target_length(size_t rs_lengths) { // This is how many young regions we already have (currently: the survivors). uint base_min_length = recorded_survivor_regions(); - // This is the absolute minimum young length, which ensures that we - // can allocate one eden region in the worst-case. - uint absolute_min_length = base_min_length + 1; - uint desired_min_length = - calculate_young_list_desired_min_length(base_min_length); - if (desired_min_length < absolute_min_length) { - desired_min_length = absolute_min_length; - } - + uint desired_min_length = calculate_young_list_desired_min_length(base_min_length); + // This is the absolute minimum young length. Ensure that we + // will at least have one eden region available for allocation. + uint absolute_min_length = base_min_length + MAX2(_g1->young_list()->eden_length(), (uint)1); + // If we shrank the young list target it should not shrink below the current size. + desired_min_length = MAX2(desired_min_length, absolute_min_length); // Calculate the absolute and desired max bounds. // We will try our best not to "eat" into the reserve. @@ -1925,7 +1922,7 @@ void G1CollectorPolicy::finalize_cset(double target_pause_time_ms, EvacuationInf // [Newly Young Regions ++ Survivors from last pause]. uint survivor_region_length = young_list->survivor_length(); - uint eden_region_length = young_list->length() - survivor_region_length; + uint eden_region_length = young_list->eden_length(); init_cset_region_lengths(eden_region_length, survivor_region_length); HeapRegion* hr = young_list->first_survivor_region(); From 2bb83340149c470140985f2cf35f5f1a6234be20 Mon Sep 17 00:00:00 2001 From: Anton Nashatyrev Date: Fri, 6 Mar 2015 16:38:54 +0300 Subject: [PATCH 18/82] 8072900: Mouse events are captured by the wrong menu in OS X Reviewed-by: serb, alexp --- .../classes/com/apple/laf/AquaMenuUI.java | 14 +- .../8072900/WrongSelectionOnMouseOver.java | 198 ++++++++++++++++++ 2 files changed, 207 insertions(+), 5 deletions(-) create mode 100644 jdk/test/javax/swing/JMenu/8072900/WrongSelectionOnMouseOver.java diff --git a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuUI.java b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuUI.java index 450bf547644..f56a3c6f7f1 100644 --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuUI.java +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuUI.java @@ -148,11 +148,15 @@ public class AquaMenuUI extends BasicMenuUI implements AquaMenuPainter.Client { // In Aqua, we always have a menu delay, regardless of where the menu is. if (!(selectedPath.length > 0 && selectedPath[selectedPath.length - 1] == menu.getPopupMenu())) { - if (menu.getDelay() == 0) { - appendPath(getPath(), menu.getPopupMenu()); - } else { - manager.setSelectedPath(getPath()); - setupPostTimer(menu); + // the condition below prevents from activating menu in other frame + if (!menu.isTopLevelMenu() || (selectedPath.length > 0 && + selectedPath[0] == menu.getParent())) { + if (menu.getDelay() == 0) { + appendPath(getPath(), menu.getPopupMenu()); + } else { + manager.setSelectedPath(getPath()); + setupPostTimer(menu); + } } } } diff --git a/jdk/test/javax/swing/JMenu/8072900/WrongSelectionOnMouseOver.java b/jdk/test/javax/swing/JMenu/8072900/WrongSelectionOnMouseOver.java new file mode 100644 index 00000000000..cf02f6f2126 --- /dev/null +++ b/jdk/test/javax/swing/JMenu/8072900/WrongSelectionOnMouseOver.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* +@test +@bug 8072900 +@summary Mouse events are captured by the wrong menu in OS X +@author Anton Nashatyrev +@run main WrongSelectionOnMouseOver +*/ + +import javax.swing.*; +import javax.swing.event.MenuEvent; +import javax.swing.event.MenuListener; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import static javax.swing.UIManager.getInstalledLookAndFeels; + +public class WrongSelectionOnMouseOver implements Runnable { + + CountDownLatch firstMenuSelected = new CountDownLatch(1); + CountDownLatch secondMenuMouseEntered = new CountDownLatch(1); + CountDownLatch secondMenuSelected = new CountDownLatch(1); + + JMenu m1, m2; + + private UIManager.LookAndFeelInfo laf; + JFrame frame1; + JFrame frame2; + + public WrongSelectionOnMouseOver(UIManager.LookAndFeelInfo laf) throws Exception { + this.laf = laf; + } + + private void createUI() throws Exception { + System.out.println("Testing UI: " + laf); + UIManager.setLookAndFeel(laf.getClassName()); + + { + frame1 = new JFrame("Frame1"); + JMenuBar mb = new JMenuBar(); + m1 = new JMenu("File"); + JMenuItem i1 = new JMenuItem("Save"); + JMenuItem i2 = new JMenuItem("Load"); + + m1.addMenuListener(new MenuListener() { + @Override + public void menuSelected(MenuEvent e) { + firstMenuSelected.countDown(); + System.out.println("Menu1: menuSelected"); + } + + @Override + public void menuDeselected(MenuEvent e) { + System.out.println("Menu1: menuDeselected"); + } + + @Override + public void menuCanceled(MenuEvent e) { + System.out.println("Menu1: menuCanceled"); + } + }); + + frame1.setJMenuBar(mb); + mb.add(m1); + m1.add(i1); + m1.add(i2); + + frame1.setLayout(new FlowLayout()); + frame1.setBounds(200, 200, 200, 200); + + frame1.setVisible(true); + } + + { + frame2 = new JFrame("Frame2"); + JMenuBar mb = new JMenuBar(); + m2 = new JMenu("File"); + JMenuItem i1 = new JMenuItem("Save"); + JMenuItem i2 = new JMenuItem("Load"); + + m2.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + secondMenuMouseEntered.countDown(); + System.out.println("WrongSelectionOnMouseOver.mouseEntered"); + } + }); + + m2.addMenuListener(new MenuListener() { + @Override + public void menuSelected(MenuEvent e) { + secondMenuSelected.countDown(); + System.out.println("Menu2: menuSelected"); + } + + @Override + public void menuDeselected(MenuEvent e) { + System.out.println("Menu2: menuDeselected"); + } + + @Override + public void menuCanceled(MenuEvent e) { + System.out.println("Menu2: menuCanceled"); + } + }); + + frame2.setJMenuBar(mb); + mb.add(m2); + m2.add(i1); + m2.add(i2); + + frame2.setLayout(new FlowLayout()); + frame2.setBounds(400, 200, 200, 200); + + frame2.setVisible(true); + } + } + + public void disposeUI() { + frame1.dispose(); + frame2.dispose(); + } + + @Override + public void run() { + try { + if (frame1 == null) { + createUI(); + } else { + disposeUI(); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void test() throws Exception { + Robot robot = new Robot(); + robot.setAutoDelay(100); + + robot.waitForIdle(); + + robot.mouseMove((int) m1.getLocationOnScreen().getX() + 5, + (int) m1.getLocationOnScreen().getY() + 5); + robot.mousePress(MouseEvent.BUTTON1_MASK); + robot.mouseRelease(MouseEvent.BUTTON1_MASK); + + if (!firstMenuSelected.await(5, TimeUnit.SECONDS)) { + throw new RuntimeException("Menu has not been selected."); + }; + + robot.mouseMove((int) m2.getLocationOnScreen().getX() + 5, + (int) m2.getLocationOnScreen().getY() + 5); + + if (!secondMenuMouseEntered.await(5, TimeUnit.SECONDS)) { + throw new RuntimeException("MouseEntered event missed for the second menu"); + }; + + if (secondMenuSelected.await(1, TimeUnit.SECONDS)) { + throw new RuntimeException("The second menu has been selected"); + }; + } + + public static void main(final String[] args) throws Exception { + for (final UIManager.LookAndFeelInfo laf : getInstalledLookAndFeels()) { + WrongSelectionOnMouseOver test = new WrongSelectionOnMouseOver(laf); + SwingUtilities.invokeAndWait(test); + test.test(); + SwingUtilities.invokeAndWait(test); + } + System.out.println("Test passed"); + } +} \ No newline at end of file From d0650dcdae661507c6fb5413416a5525777d4d39 Mon Sep 17 00:00:00 2001 From: Magnus Ihse Bursie Date: Fri, 6 Mar 2015 14:53:00 +0100 Subject: [PATCH 19/82] 8074554: Create custom hook for running after AC_OUTPUT Reviewed-by: erikj --- common/autoconf/configure.ac | 2 ++ common/autoconf/generated-configure.sh | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/common/autoconf/configure.ac b/common/autoconf/configure.ac index 902ba475684..193b768437f 100644 --- a/common/autoconf/configure.ac +++ b/common/autoconf/configure.ac @@ -54,6 +54,7 @@ m4_include([toolchain_windows.m4]) AC_DEFUN_ONCE([CUSTOM_EARLY_HOOK]) AC_DEFUN_ONCE([CUSTOM_LATE_HOOK]) +AC_DEFUN_ONCE([CUSTOM_CONFIG_OUTPUT_GENERATED_HOOK]) AC_DEFUN_ONCE([CUSTOM_SUMMARY_AND_WARNINGS_HOOK]) # This line needs to be here, verbatim, after all includes and the dummy hook @@ -264,6 +265,7 @@ CONFIG_STATUS="$OUTPUT_ROOT/config.status" # Create the actual output files. Now the main work of configure is done. AC_OUTPUT +CUSTOM_CONFIG_OUTPUT_GENERATED_HOOK # Try to move the config.log file to the output directory. if test -e ./config.log; then diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh index 6029574b757..7ae33d1de08 100644 --- a/common/autoconf/generated-configure.sh +++ b/common/autoconf/generated-configure.sh @@ -4387,13 +4387,14 @@ VS_SDK_PLATFORM_NAME_2013= + # This line needs to be here, verbatim, after all includes and the dummy hook # definitions. It is replaced with custom functionality when building # custom sources. #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1424976950 +DATE_WHEN_GENERATED=1425649598 ############################################################################### # @@ -53396,6 +53397,7 @@ $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi + # Try to move the config.log file to the output directory. if test -e ./config.log; then $MV -f ./config.log "$OUTPUT_ROOT/config.log" 2> /dev/null From 179f7eb9ff9bda86314bd41e5c03c5015918f014 Mon Sep 17 00:00:00 2001 From: Andrey Zakharov Date: Fri, 6 Mar 2015 16:12:54 +0100 Subject: [PATCH 20/82] 8051984: @ignore should be placed after @test As ignore reason has been fixed (by adding @requires) @ignore removed Reviewed-by: kbarrett, brutisso --- hotspot/test/gc/parallelScavenge/TestDynShrinkHeap.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/hotspot/test/gc/parallelScavenge/TestDynShrinkHeap.java b/hotspot/test/gc/parallelScavenge/TestDynShrinkHeap.java index d029b45e0bb..4c9e8c53122 100644 --- a/hotspot/test/gc/parallelScavenge/TestDynShrinkHeap.java +++ b/hotspot/test/gc/parallelScavenge/TestDynShrinkHeap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, Oracle and/or its affiliates. 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 @@ -22,7 +22,6 @@ */ /** - * @ignore 8019361 * @test TestDynShrinkHeap * @bug 8016479 * @requires vm.gc=="Parallel" | vm.gc=="null" @@ -35,7 +34,7 @@ import java.lang.management.ManagementFactory; import java.lang.management.MemoryUsage; import java.util.ArrayList; import sun.management.ManagementFactoryHelper; -import static com.oracle.java.testlibrary.Asserts.*; +import static com.oracle.java.testlibrary.Asserts.assertLessThan; public class TestDynShrinkHeap { From d0d14d12cac04880d006cd40562eaeba17c064f5 Mon Sep 17 00:00:00 2001 From: Thomas Stuefe Date: Mon, 9 Mar 2015 08:22:34 +0100 Subject: [PATCH 21/82] 8074543: Missing symbol "objArrayOopDesc::obj_at" when buiding with CPP Interpreter Reviewed-by: stefank --- hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp index 5ec7ec89dbe..991aca1a357 100644 --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp @@ -34,6 +34,7 @@ #include "memory/resourceArea.hpp" #include "oops/methodCounters.hpp" #include "oops/objArrayKlass.hpp" +#include "oops/objArrayOop.inline.hpp" #include "oops/oop.inline.hpp" #include "prims/jvmtiExport.hpp" #include "prims/jvmtiThreadState.hpp" From 1a8c9118812c56f0044a4fa6b1e3c7082db4534b Mon Sep 17 00:00:00 2001 From: Axel Siebenborn Date: Fri, 6 Mar 2015 16:47:46 +0100 Subject: [PATCH 22/82] 8074561: Wrong volatile qualifier for field ClassLoaderDataGraphKlassIteratorAtomic::_next_klass Reviewed-by: mgerdin, stefank --- hotspot/src/share/vm/classfile/classLoaderData.cpp | 2 +- hotspot/src/share/vm/classfile/classLoaderData.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hotspot/src/share/vm/classfile/classLoaderData.cpp b/hotspot/src/share/vm/classfile/classLoaderData.cpp index cc201714142..f937cf381de 100644 --- a/hotspot/src/share/vm/classfile/classLoaderData.cpp +++ b/hotspot/src/share/vm/classfile/classLoaderData.cpp @@ -902,7 +902,7 @@ Klass* ClassLoaderDataGraphKlassIteratorAtomic::next_klass_in_cldg(Klass* klass) } Klass* ClassLoaderDataGraphKlassIteratorAtomic::next_klass() { - Klass* head = (Klass*)_next_klass; + Klass* head = _next_klass; while (head != NULL) { Klass* next = next_klass_in_cldg(head); diff --git a/hotspot/src/share/vm/classfile/classLoaderData.hpp b/hotspot/src/share/vm/classfile/classLoaderData.hpp index a9ccaf81fe2..450afb425d2 100644 --- a/hotspot/src/share/vm/classfile/classLoaderData.hpp +++ b/hotspot/src/share/vm/classfile/classLoaderData.hpp @@ -315,7 +315,7 @@ class ClassLoaderData : public CHeapObj { // An iterator that distributes Klasses to parallel worker threads. class ClassLoaderDataGraphKlassIteratorAtomic : public StackObj { - volatile Klass* _next_klass; + Klass* volatile _next_klass; public: ClassLoaderDataGraphKlassIteratorAtomic(); Klass* next_klass(); From 808f9cab051a0ed5681fd8d7d17967814b54d7b5 Mon Sep 17 00:00:00 2001 From: Gerald Thornbrugh Date: Fri, 6 Mar 2015 17:19:08 -0800 Subject: [PATCH 23/82] 8071501: perfMemory_solaris.cpp failing to compile with "Error: dd_fd is not a member of DIR." Force all Solaris builds to use the same version of the DIR structure. Reviewed-by: dcubed, dholmes, kvn --- hotspot/src/os/solaris/vm/jvm_solaris.h | 4 +++- .../src/share/vm/utilities/globalDefinitions_sparcWorks.hpp | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/hotspot/src/os/solaris/vm/jvm_solaris.h b/hotspot/src/os/solaris/vm/jvm_solaris.h index 57b32ac1658..f1fa075bc88 100644 --- a/hotspot/src/os/solaris/vm/jvm_solaris.h +++ b/hotspot/src/os/solaris/vm/jvm_solaris.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2015, Oracle and/or its affiliates. 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 @@ -41,7 +41,9 @@ * JNI conversion, which should be sorted out later. */ +#define __USE_LEGACY_PROTOTYPES__ #include /* For DIR */ +#undef __USE_LEGACY_PROTOTYPES__ #include /* For MAXPATHLEN */ #include /* For socklen_t */ #include /* For F_OK, R_OK, W_OK */ diff --git a/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp b/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp index 352d2c709f7..b42a22e7004 100644 --- a/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp +++ b/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -33,7 +33,9 @@ # include +#define __USE_LEGACY_PROTOTYPES__ # include +#undef __USE_LEGACY_PROTOTYPES__ # include # include // for bsd'isms # include From 71bacd69b022e98933ddb85aa0266979939e99e6 Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Mon, 9 Mar 2015 08:53:34 -0700 Subject: [PATCH 24/82] 4849595: Erroneous javadoc for TableColumn.addPropertyChangeListener Reviewed-by: azvegint, alexsch --- .../javax/swing/table/TableColumn.java | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/jdk/src/java.desktop/share/classes/javax/swing/table/TableColumn.java b/jdk/src/java.desktop/share/classes/javax/swing/table/TableColumn.java index a2d8f1eac20..8facbc82057 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/table/TableColumn.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/table/TableColumn.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -25,15 +25,14 @@ package javax.swing.table; -import javax.swing.*; -import javax.swing.border.*; -import javax.swing.event.SwingPropertyChangeSupport; -import java.lang.Integer; -import java.awt.Color; import java.awt.Component; -import java.io.Serializable; -import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.io.Serializable; + +import javax.swing.JLabel; +import javax.swing.JTable; +import javax.swing.UIManager; +import javax.swing.event.SwingPropertyChangeSupport; /** * A TableColumn represents all the attributes of a column in a @@ -744,19 +743,25 @@ public class TableColumn extends Object implements Serializable { // /** - * Adds a PropertyChangeListener to the listener list. - * The listener is registered for all properties. - *

    - * A PropertyChangeEvent will get fired in response to an - * explicit call to setFont, setBackground, - * or setForeground on the - * current component. Note that if the current component is - * inheriting its foreground, background, or font from its - * container, then no event will be fired in response to a - * change in the inherited property. - * - * @param listener the listener to be added + * Adds a {@code PropertyChangeListener} to the listener list. The listener + * is registered for all bound properties of this class, including the + * following: + *

      + *
    • this TableColumn's modelIndex ("modelIndex")
    • + *
    • this TableColumn's identifier ("identifier")
    • + *
    • this TableColumn's header value ("headerValue")
    • + *
    • this TableColumn's header renderer ("headerRenderer")
    • + *
    • this TableColumn's cell renderer ("cellRenderer")
    • + *
    • this TableColumn's cell editor ("cellEditor")
    • + *
    • this TableColumn's width ("width")
    • + *
    • this TableColumn's preferred width ("preferredWidth")
    • + *
    • this TableColumn's minimum width ("minWidth")
    • + *
    • this TableColumn's maximum width ("maxWidth")
    • + *
    • this TableColumn's resizable state ("isResizable")
    • + *
    * + * @param listener the listener to be added + * @see #removePropertyChangeListener(PropertyChangeListener) */ public synchronized void addPropertyChangeListener( PropertyChangeListener listener) { From 1a4c355bbcf3819a45a724297080b7dbc6852c6b Mon Sep 17 00:00:00 2001 From: Sangheon Kim Date: Mon, 9 Mar 2015 09:30:16 -0700 Subject: [PATCH 25/82] 8073654: Marking statistics should use size_t Change data type from int to size_t to avoid overflows Reviewed-by: jwilhelm, drwhite, tschatzl --- .../gc_implementation/g1/concurrentMark.cpp | 44 ++++++++--------- .../gc_implementation/g1/concurrentMark.hpp | 48 +++++++++---------- .../g1/concurrentMark.inline.hpp | 4 +- 3 files changed, 48 insertions(+), 48 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp index 5b7239d6536..6d7197c060a 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp @@ -3561,6 +3561,15 @@ void CMTask::reset(CMBitMap* nextMarkBitMap) { _termination_start_time_ms = 0.0; #if _MARKING_STATS_ + _aborted = 0; + _aborted_overflow = 0; + _aborted_cm_aborted = 0; + _aborted_yield = 0; + _aborted_timed_out = 0; + _aborted_satb = 0; + _aborted_termination = 0; + _steal_attempts = 0; + _steals = 0; _local_pushes = 0; _local_pops = 0; _local_max_size = 0; @@ -3573,15 +3582,6 @@ void CMTask::reset(CMBitMap* nextMarkBitMap) { _regions_claimed = 0; _objs_found_on_bitmap = 0; _satb_buffers_processed = 0; - _steal_attempts = 0; - _steals = 0; - _aborted = 0; - _aborted_overflow = 0; - _aborted_cm_aborted = 0; - _aborted_yield = 0; - _aborted_timed_out = 0; - _aborted_satb = 0; - _aborted_termination = 0; #endif // _MARKING_STATS_ } @@ -3742,7 +3742,7 @@ void CMTask::move_entries_to_global_stack() { gclog_or_tty->print_cr("[%u] pushed %d entries to the global stack", _worker_id, n); } - statsOnly( int tmp_size = _cm->mark_stack_size(); + statsOnly( size_t tmp_size = _cm->mark_stack_size(); if (tmp_size > _global_max_size) { _global_max_size = tmp_size; } @@ -3777,7 +3777,7 @@ void CMTask::get_entries_from_global_stack() { assert(success, "invariant"); } - statsOnly( int tmp_size = _task_queue->size(); + statsOnly( size_t tmp_size = (size_t)_task_queue->size(); if (tmp_size > _local_max_size) { _local_max_size = tmp_size; } @@ -3934,24 +3934,24 @@ void CMTask::print_stats() { gclog_or_tty->print_cr(" max = %1.2lfms, total = %1.2lfms", _all_clock_intervals_ms.maximum(), _all_clock_intervals_ms.sum()); - gclog_or_tty->print_cr(" Clock Causes (cum): scanning = %d, marking = %d", + gclog_or_tty->print_cr(" Clock Causes (cum): scanning = " SIZE_FORMAT ", marking = " SIZE_FORMAT, _clock_due_to_scanning, _clock_due_to_marking); - gclog_or_tty->print_cr(" Objects: scanned = %d, found on the bitmap = %d", + gclog_or_tty->print_cr(" Objects: scanned = " SIZE_FORMAT ", found on the bitmap = " SIZE_FORMAT, _objs_scanned, _objs_found_on_bitmap); - gclog_or_tty->print_cr(" Local Queue: pushes = %d, pops = %d, max size = %d", + gclog_or_tty->print_cr(" Local Queue: pushes = " SIZE_FORMAT ", pops = " SIZE_FORMAT ", max size = " SIZE_FORMAT, _local_pushes, _local_pops, _local_max_size); - gclog_or_tty->print_cr(" Global Stack: pushes = %d, pops = %d, max size = %d", + gclog_or_tty->print_cr(" Global Stack: pushes = " SIZE_FORMAT ", pops = " SIZE_FORMAT ", max size = " SIZE_FORMAT, _global_pushes, _global_pops, _global_max_size); - gclog_or_tty->print_cr(" transfers to = %d, transfers from = %d", + gclog_or_tty->print_cr(" transfers to = " SIZE_FORMAT ", transfers from = " SIZE_FORMAT, _global_transfers_to,_global_transfers_from); - gclog_or_tty->print_cr(" Regions: claimed = %d", _regions_claimed); - gclog_or_tty->print_cr(" SATB buffers: processed = %d", _satb_buffers_processed); - gclog_or_tty->print_cr(" Steals: attempts = %d, successes = %d", + gclog_or_tty->print_cr(" Regions: claimed = " SIZE_FORMAT, _regions_claimed); + gclog_or_tty->print_cr(" SATB buffers: processed = " SIZE_FORMAT, _satb_buffers_processed); + gclog_or_tty->print_cr(" Steals: attempts = " SIZE_FORMAT ", successes = " SIZE_FORMAT, _steal_attempts, _steals); - gclog_or_tty->print_cr(" Aborted: %d, due to", _aborted); - gclog_or_tty->print_cr(" overflow: %d, global abort: %d, yield: %d", + gclog_or_tty->print_cr(" Aborted: " SIZE_FORMAT ", due to", _aborted); + gclog_or_tty->print_cr(" overflow: " SIZE_FORMAT ", global abort: " SIZE_FORMAT ", yield: " SIZE_FORMAT, _aborted_overflow, _aborted_cm_aborted, _aborted_yield); - gclog_or_tty->print_cr(" time out: %d, SATB: %d, termination: %d", + gclog_or_tty->print_cr(" time out: " SIZE_FORMAT ", SATB: " SIZE_FORMAT ", termination: " SIZE_FORMAT, _aborted_timed_out, _aborted_satb, _aborted_termination); #endif // _MARKING_STATS_ } diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp index 6e18c011336..03b98366f36 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2015, Oracle and/or its affiliates. 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 @@ -1039,36 +1039,36 @@ private: NumberSeq _all_clock_intervals_ms; double _interval_start_time_ms; - int _aborted; - int _aborted_overflow; - int _aborted_cm_aborted; - int _aborted_yield; - int _aborted_timed_out; - int _aborted_satb; - int _aborted_termination; + size_t _aborted; + size_t _aborted_overflow; + size_t _aborted_cm_aborted; + size_t _aborted_yield; + size_t _aborted_timed_out; + size_t _aborted_satb; + size_t _aborted_termination; - int _steal_attempts; - int _steals; + size_t _steal_attempts; + size_t _steals; - int _clock_due_to_marking; - int _clock_due_to_scanning; + size_t _clock_due_to_marking; + size_t _clock_due_to_scanning; - int _local_pushes; - int _local_pops; - int _local_max_size; - int _objs_scanned; + size_t _local_pushes; + size_t _local_pops; + size_t _local_max_size; + size_t _objs_scanned; - int _global_pushes; - int _global_pops; - int _global_max_size; + size_t _global_pushes; + size_t _global_pops; + size_t _global_max_size; - int _global_transfers_to; - int _global_transfers_from; + size_t _global_transfers_to; + size_t _global_transfers_from; - int _regions_claimed; - int _objs_found_on_bitmap; + size_t _regions_claimed; + size_t _objs_found_on_bitmap; - int _satb_buffers_processed; + size_t _satb_buffers_processed; #endif // _MARKING_STATS_ // it updates the local fields after this task has claimed diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp index c705eaea33b..0b32d13a167 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2015, Oracle and/or its affiliates. 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 @@ -252,7 +252,7 @@ inline void CMTask::push(oop obj) { assert(success, "invariant"); } - statsOnly( int tmp_size = _task_queue->size(); + statsOnly( size_t tmp_size = (size_t)_task_queue->size(); if (tmp_size > _local_max_size) { _local_max_size = tmp_size; } From ca4b73ad278bafdf718a3237a88b60816d95b05b Mon Sep 17 00:00:00 2001 From: Max Ockner Date: Mon, 9 Mar 2015 13:39:24 -0400 Subject: [PATCH 26/82] 8013393: Merge template interpreter files for x86 _32 and _64 The 32 and 64 bit versions of templateTable_x86 have been merged. Reviewed-by: twisti, jrose, coleenp --- ...Table_x86_64.cpp => templateTable_x86.cpp} | 1434 ++++--- .../src/cpu/x86/vm/templateTable_x86_32.cpp | 3668 ----------------- 2 files changed, 964 insertions(+), 4138 deletions(-) rename hotspot/src/cpu/x86/vm/{templateTable_x86_64.cpp => templateTable_x86.cpp} (73%) delete mode 100644 hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp diff --git a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp b/hotspot/src/cpu/x86/vm/templateTable_x86.cpp similarity index 73% rename from hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp rename to hotspot/src/cpu/x86/vm/templateTable_x86.cpp index acb4e146415..7b6696efeed 100644 --- a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/templateTable_x86.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -42,22 +42,30 @@ #define __ _masm-> -// Platform-dependent initialization +// Global Register Names +Register rbcp = LP64_ONLY(r13) NOT_LP64(rsi); +Register rlocals = LP64_ONLY(r14) NOT_LP64(rdi); +// Platform-dependent initialization void TemplateTable::pd_initialize() { - // No amd64 specific initialization + // No x86 specific initialization } -// Address computation: local variables - +// Address Computation: local variables static inline Address iaddress(int n) { - return Address(r14, Interpreter::local_offset_in_bytes(n)); + return Address(rlocals, Interpreter::local_offset_in_bytes(n)); } static inline Address laddress(int n) { return iaddress(n + 1); } +#ifndef _LP64 +static inline Address haddress(int n) { + return iaddress(n + 0); +} +#endif + static inline Address faddress(int n) { return iaddress(n); } @@ -71,13 +79,19 @@ static inline Address aaddress(int n) { } static inline Address iaddress(Register r) { - return Address(r14, r, Address::times_8); + return Address(rlocals, r, Address::times_ptr); } static inline Address laddress(Register r) { - return Address(r14, r, Address::times_8, Interpreter::local_offset_in_bytes(1)); + return Address(rlocals, r, Address::times_ptr, Interpreter::local_offset_in_bytes(1)); } +#ifndef _LP64 +static inline Address haddress(Register r) { + return Address(rlocals, r, Interpreter::stackElementScale(), Interpreter::local_offset_in_bytes(0)); +} +#endif + static inline Address faddress(Register r) { return iaddress(r); } @@ -90,7 +104,12 @@ static inline Address aaddress(Register r) { return iaddress(r); } -static inline Address at_rsp() { + +// expression stack +// (Note: Must not use symmetric equivalents at_rsp_m1/2 since they store +// data beyond the rsp which is potentially unsafe in an MT environment; +// an interrupt may overwrite that data.) +static inline Address at_rsp () { return Address(rsp, 0); } @@ -123,10 +142,12 @@ static Assembler::Condition j_not(TemplateTable::Condition cc) { } + // Miscelaneous helper routines // Store an oop (or NULL) at the address described by obj. // If val == noreg this means store a NULL + static void do_oop_store(InterpreterMacroAssembler* _masm, Address obj, Register val, @@ -139,17 +160,25 @@ static void do_oop_store(InterpreterMacroAssembler* _masm, case BarrierSet::G1SATBCTLogging: { // flatten object address if needed + // We do it regardless of precise because we need the registers if (obj.index() == noreg && obj.disp() == 0) { if (obj.base() != rdx) { - __ movq(rdx, obj.base()); + __ movptr(rdx, obj.base()); } } else { - __ leaq(rdx, obj); + __ lea(rdx, obj); } + + Register rtmp = LP64_ONLY(r8) NOT_LP64(rsi); + Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx); + + NOT_LP64(__ get_thread(rcx)); + NOT_LP64(__ save_bcp()); + __ g1_write_barrier_pre(rdx /* obj */, rbx /* pre_val */, - r15_thread /* thread */, - r8 /* tmp */, + rthread /* thread */, + rtmp /* tmp */, val != noreg /* tosca_live */, false /* expand_call */); if (val == noreg) { @@ -164,10 +193,11 @@ static void do_oop_store(InterpreterMacroAssembler* _masm, __ store_heap_oop(Address(rdx, 0), val); __ g1_write_barrier_post(rdx /* store_adr */, new_val /* new_val */, - r15_thread /* thread */, - r8 /* tmp */, + rthread /* thread */, + rtmp /* tmp */, rbx /* tmp2 */); } + NOT_LP64( __ restore_bcp()); } break; #endif // INCLUDE_ALL_GCS @@ -182,7 +212,7 @@ static void do_oop_store(InterpreterMacroAssembler* _masm, if (!precise || (obj.index() == noreg && obj.disp() == 0)) { __ store_check(obj.base()); } else { - __ leaq(rdx, obj); + __ lea(rdx, obj); __ store_check(rdx); } } @@ -203,9 +233,10 @@ static void do_oop_store(InterpreterMacroAssembler* _masm, Address TemplateTable::at_bcp(int offset) { assert(_desc->uses_bcp(), "inconsistent uses_bcp information"); - return Address(r13, offset); + return Address(rbcp, offset); } + void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg, Register temp_reg, bool load_bc_into_bc_reg/*=true*/, int byte_no) { @@ -251,7 +282,7 @@ void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg, __ jcc(Assembler::notEqual, L_fast_patch); __ get_method(temp_reg); // Let breakpoint table handling rewrite to quicker bytecode - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::set_original_bytecode_at), temp_reg, r13, bc_reg); + __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::set_original_bytecode_at), temp_reg, rbcp, bc_reg); #ifndef ASSERT __ jmpb(L_patch_done); #else @@ -275,10 +306,9 @@ void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg, __ movb(at_bcp(0), bc_reg); __ bind(L_patch_done); } - - // Individual instructions + void TemplateTable::nop() { transition(vtos, vtos); // nothing to do @@ -310,10 +340,17 @@ void TemplateTable::lconst(int value) { } else { __ movl(rax, value); } +#ifndef _LP64 + assert(value >= 0, "check this code"); + __ xorptr(rdx, rdx); +#endif } + + void TemplateTable::fconst(int value) { transition(vtos, ftos); +#ifdef _LP64 static float one = 1.0f, two = 2.0f; switch (value) { case 0: @@ -329,10 +366,18 @@ void TemplateTable::fconst(int value) { ShouldNotReachHere(); break; } +#else + if (value == 0) { __ fldz(); + } else if (value == 1) { __ fld1(); + } else if (value == 2) { __ fld1(); __ fld1(); __ faddp(); // should do a better solution here + } else { ShouldNotReachHere(); + } +#endif } void TemplateTable::dconst(int value) { transition(vtos, dtos); +#ifdef _LP64 static double one = 1.0; switch (value) { case 0: @@ -345,6 +390,13 @@ void TemplateTable::dconst(int value) { ShouldNotReachHere(); break; } + +#else + if (value == 0) { __ fldz(); + } else if (value == 1) { __ fld1(); + } else { ShouldNotReachHere(); + } +#endif } void TemplateTable::bipush() { @@ -361,6 +413,7 @@ void TemplateTable::sipush() { void TemplateTable::ldc(bool wide) { transition(vtos, vtos); + Register rarg = NOT_LP64(rcx) LP64_ONLY(c_rarg1); Label call_ldc, notFloat, notClass, Done; if (wide) { @@ -390,18 +443,21 @@ void TemplateTable::ldc(bool wide) { __ jcc(Assembler::notEqual, notClass); __ bind(call_ldc); - __ movl(c_rarg1, wide); - call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::ldc), c_rarg1); - __ push_ptr(rax); - __ verify_oop(rax); + + __ movl(rarg, wide); + call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::ldc), rarg); + + __ push(atos); __ jmp(Done); __ bind(notClass); __ cmpl(rdx, JVM_CONSTANT_Float); __ jccb(Assembler::notEqual, notFloat); + // ftos - __ movflt(xmm0, Address(rcx, rbx, Address::times_8, base_offset)); - __ push_f(); + LP64_ONLY(__ movflt(xmm0, Address(rcx, rbx, Address::times_8, base_offset))); + NOT_LP64(__ fld_s( Address(rcx, rbx, Address::times_ptr, base_offset))); + __ push(ftos); __ jmp(Done); __ bind(notFloat); @@ -416,8 +472,8 @@ void TemplateTable::ldc(bool wide) { } #endif // itos JVM_CONSTANT_Integer only - __ movl(rax, Address(rcx, rbx, Address::times_8, base_offset)); - __ push_i(rax); + __ movl(rax, Address(rcx, rbx, Address::times_ptr, base_offset)); + __ push(itos); __ bind(Done); } @@ -465,15 +521,19 @@ void TemplateTable::ldc2_w() { __ cmpb(Address(rax, rbx, Address::times_1, tags_offset), JVM_CONSTANT_Double); __ jccb(Assembler::notEqual, Long); - // dtos - __ movdbl(xmm0, Address(rcx, rbx, Address::times_8, base_offset)); - __ push_d(); - __ jmpb(Done); + // dtos + LP64_ONLY(__ movdbl(xmm0, Address(rcx, rbx, Address::times_8, base_offset))); + NOT_LP64(__ fld_d( Address(rcx, rbx, Address::times_ptr, base_offset))); + __ push(dtos); + + __ jmpb(Done); __ bind(Long); + // ltos - __ movq(rax, Address(rcx, rbx, Address::times_8, base_offset)); - __ push_l(); + __ movptr(rax, Address(rcx, rbx, Address::times_ptr, base_offset + 0 * wordSize)); + NOT_LP64(__ movptr(rdx, Address(rcx, rbx, Address::times_ptr, base_offset + 1 * wordSize))); + __ push(ltos); __ bind(Done); } @@ -487,8 +547,8 @@ void TemplateTable::iload() { transition(vtos, itos); if (RewriteFrequentPairs) { Label rewrite, done; - const Register bc = c_rarg3; - assert(rbx != bc, "register damaged"); + const Register bc = LP64_ONLY(c_rarg3) NOT_LP64(rcx); + LP64_ONLY(assert(rbx != bc, "register damaged")); // get next byte __ load_unsigned_byte(rbx, @@ -502,6 +562,7 @@ void TemplateTable::iload() { __ cmpl(rbx, Bytecodes::_fast_iload); __ movl(bc, Bytecodes::_fast_iload2); + __ jccb(Assembler::equal, rewrite); // if _caload, rewrite to fast_icaload @@ -542,19 +603,22 @@ void TemplateTable::fast_iload() { void TemplateTable::lload() { transition(vtos, ltos); locals_index(rbx); - __ movq(rax, laddress(rbx)); + __ movptr(rax, laddress(rbx)); + NOT_LP64(__ movl(rdx, haddress(rbx))); } void TemplateTable::fload() { transition(vtos, ftos); locals_index(rbx); - __ movflt(xmm0, faddress(rbx)); + LP64_ONLY(__ movflt(xmm0, faddress(rbx))); + NOT_LP64(__ fld_s(faddress(rbx))); } void TemplateTable::dload() { transition(vtos, dtos); locals_index(rbx); - __ movdbl(xmm0, daddress(rbx)); + LP64_ONLY(__ movdbl(xmm0, daddress(rbx))); + NOT_LP64(__ fld_d(daddress(rbx))); } void TemplateTable::aload() { @@ -579,19 +643,22 @@ void TemplateTable::wide_iload() { void TemplateTable::wide_lload() { transition(vtos, ltos); locals_index_wide(rbx); - __ movq(rax, laddress(rbx)); + __ movptr(rax, laddress(rbx)); + NOT_LP64(__ movl(rdx, haddress(rbx))); } void TemplateTable::wide_fload() { transition(vtos, ftos); locals_index_wide(rbx); - __ movflt(xmm0, faddress(rbx)); + LP64_ONLY(__ movflt(xmm0, faddress(rbx))); + NOT_LP64(__ fld_s(faddress(rbx))); } void TemplateTable::wide_dload() { transition(vtos, dtos); locals_index_wide(rbx); - __ movdbl(xmm0, daddress(rbx)); + LP64_ONLY(__ movdbl(xmm0, daddress(rbx))); + NOT_LP64(__ fld_d(daddress(rbx))); } void TemplateTable::wide_aload() { @@ -601,6 +668,12 @@ void TemplateTable::wide_aload() { } void TemplateTable::index_check(Register array, Register index) { + // Pop ptr into array + __ pop_ptr(array); + index_check_without_pop(array, index); +} + +void TemplateTable::index_check_without_pop(Register array, Register index) { // destroys rbx // check array __ null_check(array, arrayOopDesc::length_offset_in_bytes()); @@ -609,7 +682,7 @@ void TemplateTable::index_check(Register array, Register index) { // check index __ cmpl(index, Address(array, arrayOopDesc::length_offset_in_bytes())); if (index != rbx) { - // ??? convention: move aberrant index into ebx for exception message + // ??? convention: move aberrant index into rbx for exception message assert(rbx != array, "different registers"); __ movl(rbx, index); } @@ -617,10 +690,10 @@ void TemplateTable::index_check(Register array, Register index) { ExternalAddress(Interpreter::_throw_ArrayIndexOutOfBoundsException_entry)); } + void TemplateTable::iaload() { transition(itos, itos); - __ pop_ptr(rdx); - // eax: index + // rax: index // rdx: array index_check(rdx, rax); // kills rbx __ movl(rax, Address(rdx, rax, @@ -630,70 +703,63 @@ void TemplateTable::iaload() { void TemplateTable::laload() { transition(itos, ltos); - __ pop_ptr(rdx); - // eax: index + // rax: index // rdx: array index_check(rdx, rax); // kills rbx - __ movq(rax, Address(rdx, rbx, - Address::times_8, - arrayOopDesc::base_offset_in_bytes(T_LONG))); + NOT_LP64(__ mov(rbx, rax)); + // rbx,: index + __ movptr(rax, Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize)); + NOT_LP64(__ movl(rdx, Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 1 * wordSize))); } + + void TemplateTable::faload() { transition(itos, ftos); - __ pop_ptr(rdx); - // eax: index + // rax: index // rdx: array index_check(rdx, rax); // kills rbx - __ movflt(xmm0, Address(rdx, rax, + LP64_ONLY(__ movflt(xmm0, Address(rdx, rax, Address::times_4, - arrayOopDesc::base_offset_in_bytes(T_FLOAT))); + arrayOopDesc::base_offset_in_bytes(T_FLOAT)))); + NOT_LP64(__ fld_s(Address(rdx, rax, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_FLOAT)))); } void TemplateTable::daload() { transition(itos, dtos); - __ pop_ptr(rdx); - // eax: index + // rax: index // rdx: array index_check(rdx, rax); // kills rbx - __ movdbl(xmm0, Address(rdx, rax, + LP64_ONLY(__ movdbl(xmm0, Address(rdx, rax, Address::times_8, - arrayOopDesc::base_offset_in_bytes(T_DOUBLE))); + arrayOopDesc::base_offset_in_bytes(T_DOUBLE)))); + NOT_LP64(__ fld_d(Address(rdx, rax, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_DOUBLE)))); } void TemplateTable::aaload() { transition(itos, atos); - __ pop_ptr(rdx); - // eax: index + // rax: index // rdx: array index_check(rdx, rax); // kills rbx __ load_heap_oop(rax, Address(rdx, rax, - UseCompressedOops ? Address::times_4 : Address::times_8, + UseCompressedOops ? Address::times_4 : Address::times_ptr, arrayOopDesc::base_offset_in_bytes(T_OBJECT))); } void TemplateTable::baload() { transition(itos, itos); - __ pop_ptr(rdx); - // eax: index + // rax: index // rdx: array index_check(rdx, rax); // kills rbx - __ load_signed_byte(rax, - Address(rdx, rax, - Address::times_1, - arrayOopDesc::base_offset_in_bytes(T_BYTE))); + __ load_signed_byte(rax, Address(rdx, rax, Address::times_1, arrayOopDesc::base_offset_in_bytes(T_BYTE))); } void TemplateTable::caload() { transition(itos, itos); - __ pop_ptr(rdx); - // eax: index + // rax: index // rdx: array index_check(rdx, rax); // kills rbx - __ load_unsigned_short(rax, - Address(rdx, rax, - Address::times_2, - arrayOopDesc::base_offset_in_bytes(T_CHAR))); + __ load_unsigned_short(rax, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); } // iload followed by caload frequent pair @@ -703,9 +769,8 @@ void TemplateTable::fast_icaload() { locals_index(rbx); __ movl(rax, iaddress(rbx)); - // eax: index + // rax: index // rdx: array - __ pop_ptr(rdx); index_check(rdx, rax); // kills rbx __ load_unsigned_short(rax, Address(rdx, rax, @@ -713,16 +778,13 @@ void TemplateTable::fast_icaload() { arrayOopDesc::base_offset_in_bytes(T_CHAR))); } + void TemplateTable::saload() { transition(itos, itos); - __ pop_ptr(rdx); - // eax: index + // rax: index // rdx: array index_check(rdx, rax); // kills rbx - __ load_signed_short(rax, - Address(rdx, rax, - Address::times_2, - arrayOopDesc::base_offset_in_bytes(T_SHORT))); + __ load_signed_short(rax, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_SHORT))); } void TemplateTable::iload(int n) { @@ -732,17 +794,20 @@ void TemplateTable::iload(int n) { void TemplateTable::lload(int n) { transition(vtos, ltos); - __ movq(rax, laddress(n)); + __ movptr(rax, laddress(n)); + NOT_LP64(__ movptr(rdx, haddress(n))); } void TemplateTable::fload(int n) { transition(vtos, ftos); - __ movflt(xmm0, faddress(n)); + LP64_ONLY(__ movflt(xmm0, faddress(n))); + NOT_LP64(__ fld_s(faddress(n))); } void TemplateTable::dload(int n) { transition(vtos, dtos); - __ movdbl(xmm0, daddress(n)); + LP64_ONLY(__ movdbl(xmm0, daddress(n))); + NOT_LP64(__ fld_d(daddress(n))); } void TemplateTable::aload(int n) { @@ -775,11 +840,12 @@ void TemplateTable::aload_0() { // to rewrite if (RewriteFrequentPairs) { Label rewrite, done; - const Register bc = c_rarg3; - assert(rbx != bc, "register damaged"); + + const Register bc = LP64_ONLY(c_rarg3) NOT_LP64(rcx); + LP64_ONLY(assert(rbx != bc, "register damaged")); + // get next byte - __ load_unsigned_byte(rbx, - at_bcp(Bytecodes::length_for(Bytecodes::_aload_0))); + __ load_unsigned_byte(rbx, at_bcp(Bytecodes::length_for(Bytecodes::_aload_0))); // do actual aload_0 aload(0); @@ -789,33 +855,25 @@ void TemplateTable::aload_0() { __ jcc(Assembler::equal, done); // if _igetfield then reqrite to _fast_iaccess_0 - assert(Bytecodes::java_code(Bytecodes::_fast_iaccess_0) == - Bytecodes::_aload_0, - "fix bytecode definition"); + assert(Bytecodes::java_code(Bytecodes::_fast_iaccess_0) == Bytecodes::_aload_0, "fix bytecode definition"); __ cmpl(rbx, Bytecodes::_fast_igetfield); __ movl(bc, Bytecodes::_fast_iaccess_0); __ jccb(Assembler::equal, rewrite); // if _agetfield then reqrite to _fast_aaccess_0 - assert(Bytecodes::java_code(Bytecodes::_fast_aaccess_0) == - Bytecodes::_aload_0, - "fix bytecode definition"); + assert(Bytecodes::java_code(Bytecodes::_fast_aaccess_0) == Bytecodes::_aload_0, "fix bytecode definition"); __ cmpl(rbx, Bytecodes::_fast_agetfield); __ movl(bc, Bytecodes::_fast_aaccess_0); __ jccb(Assembler::equal, rewrite); // if _fgetfield then reqrite to _fast_faccess_0 - assert(Bytecodes::java_code(Bytecodes::_fast_faccess_0) == - Bytecodes::_aload_0, - "fix bytecode definition"); + assert(Bytecodes::java_code(Bytecodes::_fast_faccess_0) == Bytecodes::_aload_0, "fix bytecode definition"); __ cmpl(rbx, Bytecodes::_fast_fgetfield); __ movl(bc, Bytecodes::_fast_faccess_0); __ jccb(Assembler::equal, rewrite); // else rewrite to _fast_aload0 - assert(Bytecodes::java_code(Bytecodes::_fast_aload_0) == - Bytecodes::_aload_0, - "fix bytecode definition"); + assert(Bytecodes::java_code(Bytecodes::_fast_aload_0) == Bytecodes::_aload_0, "fix bytecode definition"); __ movl(bc, Bytecodes::_fast_aload_0); // rewrite @@ -835,22 +893,26 @@ void TemplateTable::istore() { __ movl(iaddress(rbx), rax); } + void TemplateTable::lstore() { transition(ltos, vtos); locals_index(rbx); - __ movq(laddress(rbx), rax); + __ movptr(laddress(rbx), rax); + NOT_LP64(__ movptr(haddress(rbx), rdx)); } void TemplateTable::fstore() { transition(ftos, vtos); locals_index(rbx); - __ movflt(faddress(rbx), xmm0); + LP64_ONLY(__ movflt(faddress(rbx), xmm0)); + NOT_LP64(__ fstp_s(faddress(rbx))); } void TemplateTable::dstore() { transition(dtos, vtos); locals_index(rbx); - __ movdbl(daddress(rbx), xmm0); + LP64_ONLY(__ movdbl(daddress(rbx), xmm0)); + NOT_LP64(__ fstp_d(daddress(rbx))); } void TemplateTable::astore() { @@ -869,23 +931,33 @@ void TemplateTable::wide_istore() { void TemplateTable::wide_lstore() { transition(vtos, vtos); - __ pop_l(); + NOT_LP64(__ pop_l(rax, rdx)); + LP64_ONLY(__ pop_l()); locals_index_wide(rbx); - __ movq(laddress(rbx), rax); + __ movptr(laddress(rbx), rax); + NOT_LP64(__ movl(haddress(rbx), rdx)); } void TemplateTable::wide_fstore() { +#ifdef _LP64 transition(vtos, vtos); __ pop_f(); locals_index_wide(rbx); __ movflt(faddress(rbx), xmm0); +#else + wide_istore(); +#endif } void TemplateTable::wide_dstore() { +#ifdef _LP64 transition(vtos, vtos); __ pop_d(); locals_index_wide(rbx); __ movdbl(daddress(rbx), xmm0); +#else + wide_lstore(); +#endif } void TemplateTable::wide_astore() { @@ -898,11 +970,10 @@ void TemplateTable::wide_astore() { void TemplateTable::iastore() { transition(itos, vtos); __ pop_i(rbx); - __ pop_ptr(rdx); - // eax: value - // ebx: index + // rax: value + // rbx: index // rdx: array - index_check(rdx, rbx); // prefer index in ebx + index_check(rdx, rbx); // prefer index in rbx __ movl(Address(rdx, rbx, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_INT)), @@ -912,43 +983,42 @@ void TemplateTable::iastore() { void TemplateTable::lastore() { transition(ltos, vtos); __ pop_i(rbx); - __ pop_ptr(rdx); - // rax: value - // ebx: index - // rdx: array - index_check(rdx, rbx); // prefer index in ebx - __ movq(Address(rdx, rbx, - Address::times_8, - arrayOopDesc::base_offset_in_bytes(T_LONG)), - rax); + // rax,: low(value) + // rcx: array + // rdx: high(value) + index_check(rcx, rbx); // prefer index in rbx, + // rbx,: index + __ movptr(Address(rcx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize), rax); + NOT_LP64(__ movl(Address(rcx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 1 * wordSize), rdx)); } + void TemplateTable::fastore() { transition(ftos, vtos); __ pop_i(rbx); - __ pop_ptr(rdx); // xmm0: value - // ebx: index + // rbx: index // rdx: array - index_check(rdx, rbx); // prefer index in ebx - __ movflt(Address(rdx, rbx, + index_check(rdx, rbx); // prefer index in rbx + LP64_ONLY(__ movflt(Address(rdx, rbx, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_FLOAT)), - xmm0); + xmm0)); + NOT_LP64(__ fstp_s(Address(rdx, rbx, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_FLOAT)))); } void TemplateTable::dastore() { transition(dtos, vtos); __ pop_i(rbx); - __ pop_ptr(rdx); // xmm0: value - // ebx: index + // rbx: index // rdx: array - index_check(rdx, rbx); // prefer index in ebx - __ movdbl(Address(rdx, rbx, + index_check(rdx, rbx); // prefer index in rbx + LP64_ONLY(__ movdbl(Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_DOUBLE)), - xmm0); + xmm0)); + NOT_LP64(__ fstp_d(Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_DOUBLE)))); } void TemplateTable::aastore() { @@ -960,11 +1030,10 @@ void TemplateTable::aastore() { __ movptr(rdx, at_tos_p2()); // array Address element_address(rdx, rcx, - UseCompressedOops? Address::times_4 : Address::times_8, + UseCompressedOops? Address::times_4 : Address::times_ptr, arrayOopDesc::base_offset_in_bytes(T_OBJECT)); - index_check(rdx, rcx); // kills rbx - // do array store check - check for NULL value first + index_check_without_pop(rdx, rcx); // kills rbx __ testptr(rax, rax); __ jcc(Assembler::zero, is_null); @@ -1009,11 +1078,10 @@ void TemplateTable::aastore() { void TemplateTable::bastore() { transition(itos, vtos); __ pop_i(rbx); - __ pop_ptr(rdx); - // eax: value - // ebx: index + // rax: value + // rbx: index // rdx: array - index_check(rdx, rbx); // prefer index in ebx + index_check(rdx, rbx); // prefer index in rbx __ movb(Address(rdx, rbx, Address::times_1, arrayOopDesc::base_offset_in_bytes(T_BYTE)), @@ -1023,17 +1091,17 @@ void TemplateTable::bastore() { void TemplateTable::castore() { transition(itos, vtos); __ pop_i(rbx); - __ pop_ptr(rdx); - // eax: value - // ebx: index + // rax: value + // rbx: index // rdx: array - index_check(rdx, rbx); // prefer index in ebx + index_check(rdx, rbx); // prefer index in rbx __ movw(Address(rdx, rbx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)), rax); } + void TemplateTable::sastore() { castore(); } @@ -1045,19 +1113,23 @@ void TemplateTable::istore(int n) { void TemplateTable::lstore(int n) { transition(ltos, vtos); - __ movq(laddress(n), rax); + __ movptr(laddress(n), rax); + NOT_LP64(__ movptr(haddress(n), rdx)); } void TemplateTable::fstore(int n) { transition(ftos, vtos); - __ movflt(faddress(n), xmm0); + LP64_ONLY(__ movflt(faddress(n), xmm0)); + NOT_LP64(__ fstp_s(faddress(n))); } void TemplateTable::dstore(int n) { transition(dtos, vtos); - __ movdbl(daddress(n), xmm0); + LP64_ONLY(__ movdbl(daddress(n), xmm0)); + NOT_LP64(__ fstp_d(daddress(n))); } + void TemplateTable::astore(int n) { transition(vtos, vtos); __ pop_ptr(rax); @@ -1074,6 +1146,7 @@ void TemplateTable::pop2() { __ addptr(rsp, 2 * Interpreter::stackElementSize); } + void TemplateTable::dup() { transition(vtos, vtos); __ load_ptr(0, rax); @@ -1117,6 +1190,7 @@ void TemplateTable::dup2() { // stack: ..., a, b, a, b } + void TemplateTable::dup2_x1() { transition(vtos, vtos); // stack: ..., a, b, c @@ -1181,6 +1255,7 @@ void TemplateTable::iop2(Operation op) { void TemplateTable::lop2(Operation op) { transition(ltos, ltos); +#ifdef _LP64 switch (op) { case add : __ pop_l(rdx); __ addptr(rax, rdx); break; case sub : __ mov(rdx, rax); __ pop_l(rax); __ subptr(rax, rdx); break; @@ -1189,13 +1264,25 @@ void TemplateTable::lop2(Operation op) { case _xor : __ pop_l(rdx); __ xorptr(rax, rdx); break; default : ShouldNotReachHere(); } +#else + __ pop_l(rbx, rcx); + switch (op) { + case add : __ addl(rax, rbx); __ adcl(rdx, rcx); break; + case sub : __ subl(rbx, rax); __ sbbl(rcx, rdx); + __ mov (rax, rbx); __ mov (rdx, rcx); break; + case _and : __ andl(rax, rbx); __ andl(rdx, rcx); break; + case _or : __ orl (rax, rbx); __ orl (rdx, rcx); break; + case _xor : __ xorl(rax, rbx); __ xorl(rdx, rcx); break; + default : ShouldNotReachHere(); + } +#endif } void TemplateTable::idiv() { transition(itos, itos); __ movl(rcx, rax); __ pop_i(rax); - // Note: could xor eax and ecx and compare with (-1 ^ min_int). If + // Note: could xor rax and ecx and compare with (-1 ^ min_int). If // they are not equal, one could do a normal division (no correction // needed), which may speed up this implementation for the common case. // (see also JVM spec., p.243 & p.271) @@ -1206,7 +1293,7 @@ void TemplateTable::irem() { transition(itos, itos); __ movl(rcx, rax); __ pop_i(rax); - // Note: could xor eax and ecx and compare with (-1 ^ min_int). If + // Note: could xor rax and ecx and compare with (-1 ^ min_int). If // they are not equal, one could do a normal division (no correction // needed), which may speed up this implementation for the common case. // (see also JVM spec., p.243 & p.271) @@ -1216,12 +1303,21 @@ void TemplateTable::irem() { void TemplateTable::lmul() { transition(ltos, ltos); +#ifdef _LP64 __ pop_l(rdx); __ imulq(rax, rdx); +#else + __ pop_l(rbx, rcx); + __ push(rcx); __ push(rbx); + __ push(rdx); __ push(rax); + __ lmul(2 * wordSize, 0); + __ addptr(rsp, 4 * wordSize); // take off temporaries +#endif } void TemplateTable::ldiv() { transition(ltos, ltos); +#ifdef _LP64 __ mov(rcx, rax); __ pop_l(rax); // generate explicit div0 check @@ -1233,10 +1329,22 @@ void TemplateTable::ldiv() { // needed), which may speed up this implementation for the common case. // (see also JVM spec., p.243 & p.271) __ corrected_idivq(rcx); // kills rbx +#else + __ pop_l(rbx, rcx); + __ push(rcx); __ push(rbx); + __ push(rdx); __ push(rax); + // check if y = 0 + __ orl(rax, rdx); + __ jump_cc(Assembler::zero, + ExternalAddress(Interpreter::_throw_ArithmeticException_entry)); + __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::ldiv)); + __ addptr(rsp, 4 * wordSize); // take off temporaries +#endif } void TemplateTable::lrem() { transition(ltos, ltos); +#ifdef _LP64 __ mov(rcx, rax); __ pop_l(rax); __ testq(rcx, rcx); @@ -1248,31 +1356,61 @@ void TemplateTable::lrem() { // (see also JVM spec., p.243 & p.271) __ corrected_idivq(rcx); // kills rbx __ mov(rax, rdx); +#else + __ pop_l(rbx, rcx); + __ push(rcx); __ push(rbx); + __ push(rdx); __ push(rax); + // check if y = 0 + __ orl(rax, rdx); + __ jump_cc(Assembler::zero, + ExternalAddress(Interpreter::_throw_ArithmeticException_entry)); + __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::lrem)); + __ addptr(rsp, 4 * wordSize); +#endif } void TemplateTable::lshl() { transition(itos, ltos); __ movl(rcx, rax); // get shift count + #ifdef _LP64 __ pop_l(rax); // get shift value __ shlq(rax); +#else + __ pop_l(rax, rdx); // get shift value + __ lshl(rdx, rax); +#endif } void TemplateTable::lshr() { +#ifdef _LP64 transition(itos, ltos); __ movl(rcx, rax); // get shift count __ pop_l(rax); // get shift value __ sarq(rax); +#else + transition(itos, ltos); + __ mov(rcx, rax); // get shift count + __ pop_l(rax, rdx); // get shift value + __ lshr(rdx, rax, true); +#endif } void TemplateTable::lushr() { transition(itos, ltos); +#ifdef _LP64 __ movl(rcx, rax); // get shift count __ pop_l(rax); // get shift value __ shrq(rax); +#else + __ mov(rcx, rax); // get shift count + __ pop_l(rax, rdx); // get shift value + __ lshr(rdx, rax); +#endif } void TemplateTable::fop2(Operation op) { transition(ftos, ftos); +#ifdef _LP64 switch (op) { case add: __ addss(xmm0, at_rsp()); @@ -1301,10 +1439,23 @@ void TemplateTable::fop2(Operation op) { ShouldNotReachHere(); break; } +#else + switch (op) { + case add: __ fadd_s (at_rsp()); break; + case sub: __ fsubr_s(at_rsp()); break; + case mul: __ fmul_s (at_rsp()); break; + case div: __ fdivr_s(at_rsp()); break; + case rem: __ fld_s (at_rsp()); __ fremr(rax); break; + default : ShouldNotReachHere(); + } + __ f2ieee(); + __ pop(rax); // pop float thing off +#endif } void TemplateTable::dop2(Operation op) { transition(dtos, dtos); +#ifdef _LP64 switch (op) { case add: __ addsd(xmm0, at_rsp()); @@ -1333,6 +1484,56 @@ void TemplateTable::dop2(Operation op) { ShouldNotReachHere(); break; } +#else + switch (op) { + case add: __ fadd_d (at_rsp()); break; + case sub: __ fsubr_d(at_rsp()); break; + case mul: { + Label L_strict; + Label L_join; + const Address access_flags (rcx, Method::access_flags_offset()); + __ get_method(rcx); + __ movl(rcx, access_flags); + __ testl(rcx, JVM_ACC_STRICT); + __ jccb(Assembler::notZero, L_strict); + __ fmul_d (at_rsp()); + __ jmpb(L_join); + __ bind(L_strict); + __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias1())); + __ fmulp(); + __ fmul_d (at_rsp()); + __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias2())); + __ fmulp(); + __ bind(L_join); + break; + } + case div: { + Label L_strict; + Label L_join; + const Address access_flags (rcx, Method::access_flags_offset()); + __ get_method(rcx); + __ movl(rcx, access_flags); + __ testl(rcx, JVM_ACC_STRICT); + __ jccb(Assembler::notZero, L_strict); + __ fdivr_d(at_rsp()); + __ jmp(L_join); + __ bind(L_strict); + __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias1())); + __ fmul_d (at_rsp()); + __ fdivrp(); + __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias2())); + __ fmulp(); + __ bind(L_join); + break; + } + case rem: __ fld_d (at_rsp()); __ fremr(rax); break; + default : ShouldNotReachHere(); + } + __ d2ieee(); + // Pop double precision number from rsp. + __ pop(rax); + __ pop(rdx); +#endif } void TemplateTable::ineg() { @@ -1342,9 +1543,11 @@ void TemplateTable::ineg() { void TemplateTable::lneg() { transition(ltos, ltos); - __ negq(rax); + LP64_ONLY(__ negq(rax)); + NOT_LP64(__ lneg(rdx, rax)); } +#ifdef _LP64 // Note: 'double' and 'long long' have 32-bits alignment on x86. static jlong* double_quadword(jlong *adr, jlong lo, jlong hi) { // Use the expression (adr)&(~0xF) to provide 128-bits aligned address @@ -1359,17 +1562,26 @@ static jlong* double_quadword(jlong *adr, jlong lo, jlong hi) { // Buffer for 128-bits masks used by SSE instructions. static jlong float_signflip_pool[2*2]; static jlong double_signflip_pool[2*2]; +#endif void TemplateTable::fneg() { transition(ftos, ftos); +#ifdef _LP64 static jlong *float_signflip = double_quadword(&float_signflip_pool[1], 0x8000000080000000, 0x8000000080000000); __ xorps(xmm0, ExternalAddress((address) float_signflip)); +#else + __ fchs(); +#endif } void TemplateTable::dneg() { transition(dtos, dtos); +#ifdef _LP64 static jlong *double_signflip = double_quadword(&double_signflip_pool[1], 0x8000000000000000, 0x8000000000000000); __ xorpd(xmm0, ExternalAddress((address) double_signflip)); +#else + __ fchs(); +#endif } void TemplateTable::iinc() { @@ -1391,6 +1603,7 @@ void TemplateTable::wide_iinc() { } void TemplateTable::convert() { +#ifdef _LP64 // Checking #ifdef ASSERT { @@ -1518,10 +1731,143 @@ void TemplateTable::convert() { default: ShouldNotReachHere(); } +#else + // Checking +#ifdef ASSERT + { TosState tos_in = ilgl; + TosState tos_out = ilgl; + switch (bytecode()) { + case Bytecodes::_i2l: // fall through + case Bytecodes::_i2f: // fall through + case Bytecodes::_i2d: // fall through + case Bytecodes::_i2b: // fall through + case Bytecodes::_i2c: // fall through + case Bytecodes::_i2s: tos_in = itos; break; + case Bytecodes::_l2i: // fall through + case Bytecodes::_l2f: // fall through + case Bytecodes::_l2d: tos_in = ltos; break; + case Bytecodes::_f2i: // fall through + case Bytecodes::_f2l: // fall through + case Bytecodes::_f2d: tos_in = ftos; break; + case Bytecodes::_d2i: // fall through + case Bytecodes::_d2l: // fall through + case Bytecodes::_d2f: tos_in = dtos; break; + default : ShouldNotReachHere(); + } + switch (bytecode()) { + case Bytecodes::_l2i: // fall through + case Bytecodes::_f2i: // fall through + case Bytecodes::_d2i: // fall through + case Bytecodes::_i2b: // fall through + case Bytecodes::_i2c: // fall through + case Bytecodes::_i2s: tos_out = itos; break; + case Bytecodes::_i2l: // fall through + case Bytecodes::_f2l: // fall through + case Bytecodes::_d2l: tos_out = ltos; break; + case Bytecodes::_i2f: // fall through + case Bytecodes::_l2f: // fall through + case Bytecodes::_d2f: tos_out = ftos; break; + case Bytecodes::_i2d: // fall through + case Bytecodes::_l2d: // fall through + case Bytecodes::_f2d: tos_out = dtos; break; + default : ShouldNotReachHere(); + } + transition(tos_in, tos_out); + } +#endif // ASSERT + + // Conversion + // (Note: use push(rcx)/pop(rcx) for 1/2-word stack-ptr manipulation) + switch (bytecode()) { + case Bytecodes::_i2l: + __ extend_sign(rdx, rax); + break; + case Bytecodes::_i2f: + __ push(rax); // store int on tos + __ fild_s(at_rsp()); // load int to ST0 + __ f2ieee(); // truncate to float size + __ pop(rcx); // adjust rsp + break; + case Bytecodes::_i2d: + __ push(rax); // add one slot for d2ieee() + __ push(rax); // store int on tos + __ fild_s(at_rsp()); // load int to ST0 + __ d2ieee(); // truncate to double size + __ pop(rcx); // adjust rsp + __ pop(rcx); + break; + case Bytecodes::_i2b: + __ shll(rax, 24); // truncate upper 24 bits + __ sarl(rax, 24); // and sign-extend byte + LP64_ONLY(__ movsbl(rax, rax)); + break; + case Bytecodes::_i2c: + __ andl(rax, 0xFFFF); // truncate upper 16 bits + LP64_ONLY(__ movzwl(rax, rax)); + break; + case Bytecodes::_i2s: + __ shll(rax, 16); // truncate upper 16 bits + __ sarl(rax, 16); // and sign-extend short + LP64_ONLY(__ movswl(rax, rax)); + break; + case Bytecodes::_l2i: + /* nothing to do */ + break; + case Bytecodes::_l2f: + __ push(rdx); // store long on tos + __ push(rax); + __ fild_d(at_rsp()); // load long to ST0 + __ f2ieee(); // truncate to float size + __ pop(rcx); // adjust rsp + __ pop(rcx); + break; + case Bytecodes::_l2d: + __ push(rdx); // store long on tos + __ push(rax); + __ fild_d(at_rsp()); // load long to ST0 + __ d2ieee(); // truncate to double size + __ pop(rcx); // adjust rsp + __ pop(rcx); + break; + case Bytecodes::_f2i: + __ push(rcx); // reserve space for argument + __ fstp_s(at_rsp()); // pass float argument on stack + __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::f2i), 1); + break; + case Bytecodes::_f2l: + __ push(rcx); // reserve space for argument + __ fstp_s(at_rsp()); // pass float argument on stack + __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::f2l), 1); + break; + case Bytecodes::_f2d: + /* nothing to do */ + break; + case Bytecodes::_d2i: + __ push(rcx); // reserve space for argument + __ push(rcx); + __ fstp_d(at_rsp()); // pass double argument on stack + __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::d2i), 2); + break; + case Bytecodes::_d2l: + __ push(rcx); // reserve space for argument + __ push(rcx); + __ fstp_d(at_rsp()); // pass double argument on stack + __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::d2l), 2); + break; + case Bytecodes::_d2f: + __ push(rcx); // reserve space for f2ieee() + __ f2ieee(); // truncate to float size + __ pop(rcx); // adjust rsp + break; + default : + ShouldNotReachHere(); + } +#endif } void TemplateTable::lcmp() { transition(ltos, itos); +#ifdef _LP64 Label done; __ pop_l(rdx); __ cmpq(rdx, rax); @@ -1530,9 +1876,17 @@ void TemplateTable::lcmp() { __ setb(Assembler::notEqual, rax); __ movzbl(rax, rax); __ bind(done); +#else + + // y = rdx:rax + __ pop_l(rbx, rcx); // get x = rcx:rbx + __ lcmp2int(rcx, rbx, rdx, rax);// rcx := cmp(x, y) + __ mov(rax, rcx); +#endif } void TemplateTable::float_cmp(bool is_float, int unordered_result) { +#ifdef _LP64 Label done; if (is_float) { // XXX get rid of pop here, use ... reg, mem32 @@ -1558,6 +1912,16 @@ void TemplateTable::float_cmp(bool is_float, int unordered_result) { __ decrementl(rax); } __ bind(done); +#else + if (is_float) { + __ fld_s(at_rsp()); + } else { + __ fld_d(at_rsp()); + __ pop(rdx); + } + __ pop(rcx); + __ fcmp2int(rax, unordered_result < 0); +#endif } void TemplateTable::branch(bool is_jsr, bool is_wide) { @@ -1581,21 +1945,21 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) { if (!is_wide) { __ sarl(rdx, 16); } - __ movl2ptr(rdx, rdx); + LP64_ONLY(__ movl2ptr(rdx, rdx)); // Handle all the JSR stuff here, then exit. // It's much shorter and cleaner than intermingling with the non-JSR // normal-branch stuff occurring below. if (is_jsr) { // Pre-load the next target bytecode into rbx - __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1, 0)); + __ load_unsigned_byte(rbx, Address(rbcp, rdx, Address::times_1, 0)); // compute return address as bci in rax __ lea(rax, at_bcp((is_wide ? 5 : 3) - in_bytes(ConstMethod::codes_offset()))); __ subptr(rax, Address(rcx, Method::const_offset())); // Adjust the bcp in r13 by the displacement in rdx - __ addptr(r13, rdx); + __ addptr(rbcp, rdx); // jsr returns atos that is not an oop __ push_i(rax); __ dispatch_only(vtos); @@ -1605,7 +1969,7 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) { // Normal (non-jsr) branch handling // Adjust the bcp in r13 by the displacement in rdx - __ addptr(r13, rdx); + __ addptr(rbcp, rdx); assert(UseLoopCounter || !UseOnStackReplacement, "on-stack-replacement requires loop counters"); @@ -1615,7 +1979,7 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) { if (UseLoopCounter) { // increment backedge counter for backward branches // rax: MDO - // ebx: MDO bumped taken-count + // rbx: MDO bumped taken-count // rcx: method // rdx: target offset // r13: target bcp @@ -1657,7 +2021,7 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) { __ bind(no_mdo); // Increment backedge counter in MethodCounters* __ movptr(rcx, Address(rcx, Method::method_counters_offset())); - const Address mask(rcx, in_bytes(MethodCounters::backedge_mask_offset())); + const Address mask(rcx, in_bytes(MethodCounters::backedge_mask_offset())); __ increment_mask_and_jump(Address(rcx, be_offset), increment, mask, rax, false, Assembler::zero, &backedge_counter_overflow); } else { // not TieredCompilation @@ -1681,7 +2045,7 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) { __ test_method_data_pointer(rax, profile_method); if (UseOnStackReplacement) { - // check for overflow against ebx which is the MDO taken count + // check for overflow against rbx which is the MDO taken count __ cmp32(rbx, Address(rcx, in_bytes(MethodCounters::interpreter_backward_branch_limit_offset()))); __ jcc(Assembler::below, dispatch); @@ -1698,7 +2062,7 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) { } } else { if (UseOnStackReplacement) { - // check for overflow against eax, which is the sum of the + // check for overflow against rax, which is the sum of the // counters __ cmp32(rax, Address(rcx, in_bytes(MethodCounters::interpreter_backward_branch_limit_offset()))); __ jcc(Assembler::aboveEqual, backedge_counter_overflow); @@ -1710,11 +2074,11 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) { } // Pre-load the next target bytecode into rbx - __ load_unsigned_byte(rbx, Address(r13, 0)); + __ load_unsigned_byte(rbx, Address(rbcp, 0)); // continue with the bytecode @ target - // eax: return bci for jsr's, unused otherwise - // ebx: target bytecode + // rax: return bci for jsr's, unused otherwise + // rbx: target bytecode // r13: target bcp __ dispatch_only(vtos); @@ -1723,7 +2087,7 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) { // Out-of-line code to allocate method data oop. __ bind(profile_method); __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method)); - __ load_unsigned_byte(rbx, Address(r13, 0)); // restore target bytecode + __ load_unsigned_byte(rbx, Address(rbcp, 0)); // restore target bytecode __ set_method_data_pointer_for_bcp(); __ jmp(dispatch); } @@ -1732,16 +2096,16 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) { // invocation counter overflow __ bind(backedge_counter_overflow); __ negptr(rdx); - __ addptr(rdx, r13); // branch bcp + __ addptr(rdx, rbcp); // branch bcp // IcoResult frequency_counter_overflow([JavaThread*], address branch_bcp) __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), rdx); - __ load_unsigned_byte(rbx, Address(r13, 0)); // restore target bytecode + __ load_unsigned_byte(rbx, Address(rbcp, 0)); // restore target bytecode // rax: osr nmethod (osr ok) or NULL (osr not possible) - // ebx: target bytecode + // rbx: target bytecode // rdx: scratch // r14: locals pointer // r13: bcp @@ -1751,23 +2115,26 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) { __ cmpb(Address(rax, nmethod::state_offset()), nmethod::in_use); __ jcc(Assembler::notEqual, dispatch); - // We have the address of an on stack replacement routine in eax + // We have the address of an on stack replacement routine in rax // We need to prepare to execute the OSR method. First we must // migrate the locals and monitors off of the stack. - __ mov(r13, rax); // save the nmethod + LP64_ONLY(__ mov(r13, rax)); // save the nmethod + NOT_LP64(__ mov(rbx, rax)); // save the nmethod + NOT_LP64(__ get_thread(rcx)); call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin)); - // eax is OSR buffer, move it to expected parameter location - __ mov(j_rarg0, rax); - + // rax is OSR buffer, move it to expected parameter location + LP64_ONLY(__ mov(j_rarg0, rax)); + NOT_LP64(__ mov(rcx, rax)); // We use j_rarg definitions here so that registers don't conflict as parameter // registers change across platforms as we are in the midst of a calling // sequence to the OSR nmethod and we don't want collision. These are NOT parameters. - const Register retaddr = j_rarg2; - const Register sender_sp = j_rarg1; + const Register retaddr = LP64_ONLY(j_rarg2) NOT_LP64(rdi); + const Register sender_sp = LP64_ONLY(j_rarg1) NOT_LP64(rdx); + // pop the interpreter frame __ movptr(sender_sp, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); // get sender sp @@ -1784,12 +2151,12 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) { __ push(retaddr); // and begin the OSR nmethod - __ jmp(Address(r13, nmethod::osr_entry_point_offset())); + LP64_ONLY(__ jmp(Address(r13, nmethod::osr_entry_point_offset()))); + NOT_LP64(__ jmp(Address(rbx, nmethod::osr_entry_point_offset()))); } } } - void TemplateTable::if_0cmp(Condition cc) { transition(itos, vtos); // assume branch is more often taken than not (loops use backward branches) @@ -1839,11 +2206,12 @@ void TemplateTable::if_acmp(Condition cc) { void TemplateTable::ret() { transition(vtos, vtos); locals_index(rbx); - __ movslq(rbx, iaddress(rbx)); // get return bci, compute return bcp + LP64_ONLY(__ movslq(rbx, iaddress(rbx))); // get return bci, compute return bcp + NOT_LP64(__ movptr(rbx, iaddress(rbx))); __ profile_ret(rbx, rcx); __ get_method(rax); - __ movptr(r13, Address(rax, Method::const_offset())); - __ lea(r13, Address(r13, rbx, Address::times_1, + __ movptr(rbcp, Address(rax, Method::const_offset())); + __ lea(rbcp, Address(rbcp, rbx, Address::times_1, ConstMethod::codes_offset())); __ dispatch_next(vtos); } @@ -1854,15 +2222,16 @@ void TemplateTable::wide_ret() { __ movptr(rbx, aaddress(rbx)); // get return bci, compute return bcp __ profile_ret(rbx, rcx); __ get_method(rax); - __ movptr(r13, Address(rax, Method::const_offset())); - __ lea(r13, Address(r13, rbx, Address::times_1, ConstMethod::codes_offset())); + __ movptr(rbcp, Address(rax, Method::const_offset())); + __ lea(rbcp, Address(rbcp, rbx, Address::times_1, ConstMethod::codes_offset())); __ dispatch_next(vtos); } void TemplateTable::tableswitch() { Label default_case, continue_execution; transition(itos, vtos); - // align r13 + + // align r13/rsi __ lea(rbx, at_bcp(BytesPerInt)); __ andptr(rbx, -BytesPerInt); // load lo & hi @@ -1882,9 +2251,9 @@ void TemplateTable::tableswitch() { // continue execution __ bind(continue_execution); __ bswapl(rdx); - __ movl2ptr(rdx, rdx); - __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1)); - __ addptr(r13, rdx); + LP64_ONLY(__ movl2ptr(rdx, rdx)); + __ load_unsigned_byte(rbx, Address(rbcp, rdx, Address::times_1)); + __ addptr(rbcp, rdx); __ dispatch_only(vtos); // handle default __ bind(default_case); @@ -1931,8 +2300,8 @@ void TemplateTable::fast_linearswitch() { __ bind(continue_execution); __ bswapl(rdx); __ movl2ptr(rdx, rdx); - __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1)); - __ addptr(r13, rdx); + __ load_unsigned_byte(rbx, Address(rbcp, rdx, Address::times_1)); + __ addptr(rbcp, rdx); __ dispatch_only(vtos); } @@ -1972,6 +2341,8 @@ void TemplateTable::fast_binaryswitch() { const Register temp = rsi; // Find array start + NOT_LP64(__ save_bcp()); + __ lea(array, at_bcp(3 * BytesPerInt)); // btw: should be able to // get rid of this // instruction (change @@ -2006,9 +2377,9 @@ void TemplateTable::fast_binaryswitch() { __ bswapl(temp); __ cmpl(key, temp); // j = h if (key < array[h].fast_match()) - __ cmovl(Assembler::less, j, h); + __ cmov32(Assembler::less, j, h); // i = h if (key >= array[h].fast_match()) - __ cmovl(Assembler::greaterEqual, i, h); + __ cmov32(Assembler::greaterEqual, i, h); // while (i+1 < j) __ bind(entry); __ leal(h, Address(i, 1)); // i+1 @@ -2028,9 +2399,13 @@ void TemplateTable::fast_binaryswitch() { __ movl(j , Address(array, i, Address::times_8, BytesPerInt)); __ profile_switch_case(i, key, array); __ bswapl(j); - __ movl2ptr(j, j); - __ load_unsigned_byte(rbx, Address(r13, j, Address::times_1)); - __ addptr(r13, j); + LP64_ONLY(__ movslq(j, j)); + + NOT_LP64(__ restore_bcp()); + NOT_LP64(__ restore_locals()); // restore rdi + + __ load_unsigned_byte(rbx, Address(rbcp, j, Address::times_1)); + __ addptr(rbcp, j); __ dispatch_only(vtos); // default case -> j = default offset @@ -2038,34 +2413,40 @@ void TemplateTable::fast_binaryswitch() { __ profile_switch_default(i); __ movl(j, Address(array, -2 * BytesPerInt)); __ bswapl(j); - __ movl2ptr(j, j); - __ load_unsigned_byte(rbx, Address(r13, j, Address::times_1)); - __ addptr(r13, j); + LP64_ONLY(__ movslq(j, j)); + + NOT_LP64(__ restore_bcp()); + NOT_LP64(__ restore_locals()); + + __ load_unsigned_byte(rbx, Address(rbcp, j, Address::times_1)); + __ addptr(rbcp, j); __ dispatch_only(vtos); } - void TemplateTable::_return(TosState state) { transition(state, state); + + Register robj = LP64_ONLY(c_rarg1) NOT_LP64(rax); + assert(_desc->calls_vm(), "inconsistent calls_vm information"); // call in remove_activation if (_desc->bytecode() == Bytecodes::_return_register_finalizer) { assert(state == vtos, "only valid state"); - __ movptr(c_rarg1, aaddress(0)); - __ load_klass(rdi, c_rarg1); + __ movptr(robj, aaddress(0)); + __ load_klass(rdi, robj); __ movl(rdi, Address(rdi, Klass::access_flags_offset())); __ testl(rdi, JVM_ACC_HAS_FINALIZER); Label skip_register_finalizer; __ jcc(Assembler::zero, skip_register_finalizer); - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), c_rarg1); + __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), robj); __ bind(skip_register_finalizer); } - __ remove_activation(state, r13); - __ jmp(r13); + __ remove_activation(state, rbcp); + __ jmp(rbcp); } // ---------------------------------------------------------------------------- @@ -2096,12 +2477,11 @@ void TemplateTable::_return(TosState state) { // volatile-store-volatile-load case. This final case is placed after // volatile-stores although it could just as well go before // volatile-loads. -void TemplateTable::volatile_barrier(Assembler::Membar_mask_bits - order_constraint) { + +void TemplateTable::volatile_barrier(Assembler::Membar_mask_bits order_constraint ) { // Helper function to insert a is-volatile test and memory barrier - if (os::is_MP()) { // Not needed on single CPU - __ membar(order_constraint); - } + if(!os::is_MP()) return; // Not needed on single CPU + __ membar(order_constraint); } void TemplateTable::resolve_cache_and_index(int byte_no, @@ -2120,31 +2500,22 @@ void TemplateTable::resolve_cache_and_index(int byte_no, // resolve first time through address entry; switch (bytecode()) { - case Bytecodes::_getstatic: - case Bytecodes::_putstatic: - case Bytecodes::_getfield: - case Bytecodes::_putfield: - entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_get_put); - break; - case Bytecodes::_invokevirtual: - case Bytecodes::_invokespecial: - case Bytecodes::_invokestatic: - case Bytecodes::_invokeinterface: - entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invoke); - break; - case Bytecodes::_invokehandle: - entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invokehandle); - break; - case Bytecodes::_invokedynamic: - entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invokedynamic); - break; - default: - fatal(err_msg("unexpected bytecode: %s", Bytecodes::name(bytecode()))); - break; + case Bytecodes::_getstatic : // fall through + case Bytecodes::_putstatic : // fall through + case Bytecodes::_getfield : // fall through + case Bytecodes::_putfield : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_get_put); break; + case Bytecodes::_invokevirtual : // fall through + case Bytecodes::_invokespecial : // fall through + case Bytecodes::_invokestatic : // fall through + case Bytecodes::_invokeinterface: entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invoke); break; + case Bytecodes::_invokehandle : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invokehandle); break; + case Bytecodes::_invokedynamic : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invokedynamic); break; + default: + fatal(err_msg("unexpected bytecode: %s", Bytecodes::name(bytecode()))); + break; } - __ movl(temp, (int) bytecode()); + __ movl(temp, (int)bytecode()); __ call_VM(noreg, entry, temp); - // Update registers with resolved info __ get_cache_and_index_at_bcp(Rcache, index, 1, index_size); __ bind(resolved); @@ -2217,39 +2588,36 @@ void TemplateTable::load_invoke_cp_cache_entry(int byte_no, __ movl(flags, Address(cache, index, Address::times_ptr, flags_offset)); } +// The registers cache and index expected to be set before call. // Correct values of the cache and index registers are preserved. -void TemplateTable::jvmti_post_field_access(Register cache, Register index, - bool is_static, bool has_tos) { - // do the JVMTI work here to avoid disturbing the register state below - // We use c_rarg registers here because we want to use the register used in - // the call to the VM +void TemplateTable::jvmti_post_field_access(Register cache, + Register index, + bool is_static, + bool has_tos) { if (JvmtiExport::can_post_field_access()) { - // Check to see if a field access watch has been set before we - // take the time to call into the VM. + // Check to see if a field access watch has been set before we take + // the time to call into the VM. Label L1; assert_different_registers(cache, index, rax); __ mov32(rax, ExternalAddress((address) JvmtiExport::get_field_access_count_addr())); - __ testl(rax, rax); + __ testl(rax,rax); __ jcc(Assembler::zero, L1); - __ get_cache_and_index_at_bcp(c_rarg2, c_rarg3, 1); - // cache entry pointer - __ addptr(c_rarg2, in_bytes(ConstantPoolCache::base_offset())); - __ shll(c_rarg3, LogBytesPerWord); - __ addptr(c_rarg2, c_rarg3); + __ addptr(cache, in_bytes(ConstantPoolCache::base_offset())); + __ shll(index, LogBytesPerWord); + __ addptr(cache, index); if (is_static) { - __ xorl(c_rarg1, c_rarg1); // NULL object reference + __ xorptr(rax, rax); // NULL object reference } else { - __ movptr(c_rarg1, at_tos()); // get object pointer without popping it - __ verify_oop(c_rarg1); + __ pop(atos); // Get the object + __ verify_oop(rax); + __ push(atos); // Restore stack state } - // c_rarg1: object pointer or NULL - // c_rarg2: cache entry pointer - // c_rarg3: jvalue object on the stack - __ call_VM(noreg, CAST_FROM_FN_PTR(address, - InterpreterRuntime::post_field_access), - c_rarg1, c_rarg2, c_rarg3); + // rax,: object pointer or NULL + // cache: cache entry pointer + __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access), + rax, cache); __ get_cache_and_index_at_bcp(cache, index, 1); __ bind(L1); } @@ -2266,30 +2634,28 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static) { const Register cache = rcx; const Register index = rdx; - const Register obj = c_rarg3; + const Register obj = LP64_ONLY(c_rarg3) NOT_LP64(rcx); const Register off = rbx; const Register flags = rax; - const Register bc = c_rarg3; // uses same reg as obj, so don't mix them + const Register bc = LP64_ONLY(c_rarg3) NOT_LP64(rcx); // uses same reg as obj, so don't mix them resolve_cache_and_index(byte_no, cache, index, sizeof(u2)); jvmti_post_field_access(cache, index, is_static, false); load_field_cp_cache_entry(obj, cache, index, off, flags, is_static); - if (!is_static) { - // obj is on the stack - pop_and_check_object(obj); - } + if (!is_static) pop_and_check_object(obj); - const Address field(obj, off, Address::times_1); + const Address field(obj, off, Address::times_1, 0*wordSize); + NOT_LP64(const Address hi(obj, off, Address::times_1, 1*wordSize)); - Label Done, notByte, notInt, notShort, notChar, - notLong, notFloat, notObj, notDouble; + Label Done, notByte, notInt, notShort, notChar, notLong, notFloat, notObj, notDouble; __ shrl(flags, ConstantPoolCacheEntry::tos_state_shift); // Make sure we don't need to mask edx after the above shift assert(btos == 0, "change code, btos != 0"); __ andl(flags, ConstantPoolCacheEntry::tos_state_mask); + __ jcc(Assembler::notZero, notByte); // btos __ load_signed_byte(rax, field); @@ -2351,19 +2717,31 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static) { __ cmpl(flags, ltos); __ jcc(Assembler::notEqual, notLong); // ltos + +#ifndef _LP64 + // Generate code as if volatile. There just aren't enough registers to + // save that information and this code is faster than the test. + __ fild_d(field); // Must load atomically + __ subptr(rsp,2*wordSize); // Make space for store + __ fistp_d(Address(rsp,0)); + __ pop(rax); + __ pop(rdx); +#else __ movq(rax, field); +#endif + __ push(ltos); // Rewrite bytecode to be faster - if (!is_static) { - patch_bytecode(Bytecodes::_fast_lgetfield, bc, rbx); - } + LP64_ONLY(if (!is_static) patch_bytecode(Bytecodes::_fast_lgetfield, bc, rbx)); __ jmp(Done); __ bind(notLong); __ cmpl(flags, ftos); __ jcc(Assembler::notEqual, notFloat); // ftos - __ movflt(xmm0, field); + + LP64_ONLY(__ movflt(xmm0, field)); + NOT_LP64(__ fld_s(field)); __ push(ftos); // Rewrite bytecode to be faster if (!is_static) { @@ -2377,7 +2755,8 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static) { __ jcc(Assembler::notEqual, notDouble); #endif // dtos - __ movdbl(xmm0, field); + LP64_ONLY(__ movdbl(xmm0, field)); + NOT_LP64(__ fld_d(field)); __ push(dtos); // Rewrite bytecode to be faster if (!is_static) { @@ -2386,6 +2765,7 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static) { #ifdef ASSERT __ jmp(Done); + __ bind(notDouble); __ stop("Bad state"); #endif @@ -2396,7 +2776,6 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static) { // Assembler::LoadStore)); } - void TemplateTable::getfield(int byte_no) { getfield_or_static(byte_no, false); } @@ -2405,10 +2784,15 @@ void TemplateTable::getstatic(int byte_no) { getfield_or_static(byte_no, true); } + // The registers cache and index expected to be set before call. // The function may destroy various registers, just not the cache and index registers. void TemplateTable::jvmti_post_field_mod(Register cache, Register index, bool is_static) { - transition(vtos, vtos); + + const Register robj = LP64_ONLY(c_rarg2) NOT_LP64(rax); + const Register RBX = LP64_ONLY(c_rarg1) NOT_LP64(rbx); + const Register RCX = LP64_ONLY(c_rarg3) NOT_LP64(rcx); + const Register RDX = LP64_ONLY(rscratch1) NOT_LP64(rdx); ByteSize cp_base_offset = ConstantPoolCache::base_offset(); @@ -2421,23 +2805,31 @@ void TemplateTable::jvmti_post_field_mod(Register cache, Register index, bool is __ testl(rax, rax); __ jcc(Assembler::zero, L1); - __ get_cache_and_index_at_bcp(c_rarg2, rscratch1, 1); + __ get_cache_and_index_at_bcp(robj, RDX, 1); + if (is_static) { // Life is simple. Null out the object pointer. - __ xorl(c_rarg1, c_rarg1); + __ xorl(RBX, RBX); + } else { // Life is harder. The stack holds the value on top, followed by // the object. We don't know the size of the value, though; it // could be one or two words depending on its type. As a result, // we must find the type to determine where the object is. - __ movl(c_rarg3, Address(c_rarg2, rscratch1, - Address::times_8, +#ifndef _LP64 + Label two_word, valsize_known; +#endif + __ movl(RCX, Address(robj, RDX, + Address::times_ptr, in_bytes(cp_base_offset + ConstantPoolCacheEntry::flags_offset()))); - __ shrl(c_rarg3, ConstantPoolCacheEntry::tos_state_shift); + NOT_LP64(__ mov(rbx, rsp)); + __ shrl(RCX, ConstantPoolCacheEntry::tos_state_shift); + // Make sure we don't need to mask rcx after the above shift ConstantPoolCacheEntry::verify_tos_state_shift(); +#ifdef _LP64 __ movptr(c_rarg1, at_tos_p1()); // initially assume a one word jvalue __ cmpl(c_rarg3, ltos); __ cmovptr(Assembler::equal, @@ -2445,20 +2837,35 @@ void TemplateTable::jvmti_post_field_mod(Register cache, Register index, bool is __ cmpl(c_rarg3, dtos); __ cmovptr(Assembler::equal, c_rarg1, at_tos_p2()); // dtos (two word jvalue) +#else + __ cmpl(rcx, ltos); + __ jccb(Assembler::equal, two_word); + __ cmpl(rcx, dtos); + __ jccb(Assembler::equal, two_word); + __ addptr(rbx, Interpreter::expr_offset_in_bytes(1)); // one word jvalue (not ltos, dtos) + __ jmpb(valsize_known); + + __ bind(two_word); + __ addptr(rbx, Interpreter::expr_offset_in_bytes(2)); // two words jvalue + + __ bind(valsize_known); + // setup object pointer + __ movptr(rbx, Address(rbx, 0)); +#endif } // cache entry pointer - __ addptr(c_rarg2, in_bytes(cp_base_offset)); - __ shll(rscratch1, LogBytesPerWord); - __ addptr(c_rarg2, rscratch1); + __ addptr(robj, in_bytes(cp_base_offset)); + __ shll(RDX, LogBytesPerWord); + __ addptr(robj, RDX); // object (tos) - __ mov(c_rarg3, rsp); + __ mov(RCX, rsp); // c_rarg1: object pointer set up above (NULL if static) // c_rarg2: cache entry pointer // c_rarg3: jvalue object on the stack __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification), - c_rarg1, c_rarg2, c_rarg3); + RBX, robj, RCX); __ get_cache_and_index_at_bcp(cache, index, 1); __ bind(L1); } @@ -2472,7 +2879,7 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static) { const Register obj = rcx; const Register off = rbx; const Register flags = rax; - const Register bc = c_rarg3; + const Register bc = LP64_ONLY(c_rarg3) NOT_LP64(rcx); resolve_cache_and_index(byte_no, cache, index, sizeof(u2)); jvmti_post_field_mod(cache, index, is_static); @@ -2487,8 +2894,9 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static) { __ shrl(rdx, ConstantPoolCacheEntry::is_volatile_shift); __ andl(rdx, 0x1); - // field address - const Address field(obj, off, Address::times_1); + // field addresses + const Address field(obj, off, Address::times_1, 0*wordSize); + NOT_LP64( const Address hi(obj, off, Address::times_1, 1*wordSize);) Label notByte, notInt, notShort, notChar, notLong, notFloat, notObj, notDouble; @@ -2576,6 +2984,7 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static) { __ jcc(Assembler::notEqual, notLong); // ltos +#ifdef _LP64 { __ pop(ltos); if (!is_static) pop_and_check_object(obj); @@ -2585,6 +2994,37 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static) { } __ jmp(Done); } +#else + { + Label notVolatileLong; + __ testl(rdx, rdx); + __ jcc(Assembler::zero, notVolatileLong); + + __ pop(ltos); // overwrites rdx, do this after testing volatile. + if (!is_static) pop_and_check_object(obj); + + // Replace with real volatile test + __ push(rdx); + __ push(rax); // Must update atomically with FIST + __ fild_d(Address(rsp,0)); // So load into FPU register + __ fistp_d(field); // and put into memory atomically + __ addptr(rsp, 2*wordSize); + // volatile_barrier(); + volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad | + Assembler::StoreStore)); + // Don't rewrite volatile version + __ jmp(notVolatile); + + __ bind(notVolatileLong); + + __ pop(ltos); // overwrites rdx + if (!is_static) pop_and_check_object(obj); + __ movptr(hi, rdx); + __ movptr(field, rax); + // Don't rewrite to _fast_lputfield for potential volatile case. + __ jmp(notVolatile); + } +#endif // _LP64 __ bind(notLong); __ cmpl(flags, ftos); @@ -2594,7 +3034,8 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static) { { __ pop(ftos); if (!is_static) pop_and_check_object(obj); - __ movflt(field, xmm0); + NOT_LP64( __ fstp_s(field);) + LP64_ONLY( __ movflt(field, xmm0);) if (!is_static) { patch_bytecode(Bytecodes::_fast_fputfield, bc, rbx, true, byte_no); } @@ -2611,7 +3052,8 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static) { { __ pop(dtos); if (!is_static) pop_and_check_object(obj); - __ movdbl(field, xmm0); + NOT_LP64( __ fstp_d(field);) + LP64_ONLY( __ movdbl(field, xmm0);) if (!is_static) { patch_bytecode(Bytecodes::_fast_dputfield, bc, rbx, true, byte_no); } @@ -2643,12 +3085,15 @@ void TemplateTable::putstatic(int byte_no) { } void TemplateTable::jvmti_post_fast_field_mod() { + + const Register scratch = LP64_ONLY(c_rarg3) NOT_LP64(rcx); + if (JvmtiExport::can_post_field_modification()) { // Check to see if a field modification watch has been set before // we take the time to call into the VM. Label L2; - __ mov32(c_rarg3, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr())); - __ testl(c_rarg3, c_rarg3); + __ mov32(scratch, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr())); + __ testl(scratch, scratch); __ jcc(Assembler::zero, L2); __ pop_ptr(rbx); // copy the object pointer from tos __ verify_oop(rbx); @@ -2669,17 +3114,16 @@ void TemplateTable::jvmti_post_fast_field_mod() { default: ShouldNotReachHere(); } - __ mov(c_rarg3, rsp); // points to jvalue on the stack + __ mov(scratch, rsp); // points to jvalue on the stack // access constant pool cache entry - __ get_cache_entry_pointer_at_bcp(c_rarg2, rax, 1); + LP64_ONLY(__ get_cache_entry_pointer_at_bcp(c_rarg2, rax, 1)); + NOT_LP64(__ get_cache_entry_pointer_at_bcp(rax, rdx, 1)); __ verify_oop(rbx); // rbx: object pointer copied above // c_rarg2: cache entry pointer // c_rarg3: jvalue object on the stack - __ call_VM(noreg, - CAST_FROM_FN_PTR(address, - InterpreterRuntime::post_field_modification), - rbx, c_rarg2, c_rarg3); + LP64_ONLY(__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification), rbx, c_rarg2, c_rarg3)); + NOT_LP64(__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification), rbx, rax, rcx)); switch (bytecode()) { // restore tos values case Bytecodes::_fast_aputfield: __ pop_ptr(rax); break; @@ -2705,13 +3149,13 @@ void TemplateTable::fast_storefield(TosState state) { // access constant pool cache __ get_cache_and_index_at_bcp(rcx, rbx, 1); - // test for volatile with rdx - __ movl(rdx, Address(rcx, rbx, Address::times_8, + // test for volatile with rdx but rdx is tos register for lputfield. + __ movl(rdx, Address(rcx, rbx, Address::times_ptr, in_bytes(base + ConstantPoolCacheEntry::flags_offset()))); // replace index with field offset from cache entry - __ movptr(rbx, Address(rcx, rbx, Address::times_8, + __ movptr(rbx, Address(rcx, rbx, Address::times_ptr, in_bytes(base + ConstantPoolCacheEntry::f2_offset()))); // [jk] not needed currently @@ -2734,7 +3178,11 @@ void TemplateTable::fast_storefield(TosState state) { do_oop_store(_masm, field, rax, _bs->kind(), false); break; case Bytecodes::_fast_lputfield: - __ movq(field, rax); +#ifdef _LP64 + __ movq(field, rax); +#else + __ stop("should not be rewritten"); +#endif break; case Bytecodes::_fast_iputfield: __ movl(field, rax); @@ -2748,10 +3196,12 @@ void TemplateTable::fast_storefield(TosState state) { __ movw(field, rax); break; case Bytecodes::_fast_fputfield: - __ movflt(field, xmm0); + NOT_LP64( __ fstp_s(field); ) + LP64_ONLY( __ movflt(field, xmm0);) break; case Bytecodes::_fast_dputfield: - __ movdbl(field, xmm0); + NOT_LP64( __ fstp_d(field); ) + LP64_ONLY( __ movdbl(field, xmm0);) break; default: ShouldNotReachHere(); @@ -2765,7 +3215,6 @@ void TemplateTable::fast_storefield(TosState state) { __ bind(notVolatile); } - void TemplateTable::fast_accessfield(TosState state) { transition(atos, state); @@ -2778,16 +3227,15 @@ void TemplateTable::fast_accessfield(TosState state) { __ testl(rcx, rcx); __ jcc(Assembler::zero, L1); // access constant pool cache entry - __ get_cache_entry_pointer_at_bcp(c_rarg2, rcx, 1); + LP64_ONLY(__ get_cache_entry_pointer_at_bcp(c_rarg2, rcx, 1)); + NOT_LP64(__ get_cache_entry_pointer_at_bcp(rcx, rdx, 1)); __ verify_oop(rax); __ push_ptr(rax); // save object pointer before call_VM() clobbers it - __ mov(c_rarg1, rax); + LP64_ONLY(__ mov(c_rarg1, rax)); // c_rarg1: object pointer copied above // c_rarg2: cache entry pointer - __ call_VM(noreg, - CAST_FROM_FN_PTR(address, - InterpreterRuntime::post_field_access), - c_rarg1, c_rarg2); + LP64_ONLY(__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access), c_rarg1, c_rarg2)); + NOT_LP64(__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access), rax, rcx)); __ pop_ptr(rax); // restore object pointer __ bind(L1); } @@ -2803,7 +3251,7 @@ void TemplateTable::fast_accessfield(TosState state) { // __ shrl(rdx, ConstantPoolCacheEntry::is_volatile_shift); // __ andl(rdx, 0x1); // } - __ movptr(rbx, Address(rcx, rbx, Address::times_8, + __ movptr(rbx, Address(rcx, rbx, Address::times_ptr, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::f2_offset()))); @@ -2819,7 +3267,11 @@ void TemplateTable::fast_accessfield(TosState state) { __ verify_oop(rax); break; case Bytecodes::_fast_lgetfield: - __ movq(rax, field); +#ifdef _LP64 + __ movq(rax, field); +#else + __ stop("should not be rewritten"); +#endif break; case Bytecodes::_fast_igetfield: __ movl(rax, field); @@ -2834,10 +3286,12 @@ void TemplateTable::fast_accessfield(TosState state) { __ load_unsigned_short(rax, field); break; case Bytecodes::_fast_fgetfield: - __ movflt(xmm0, field); + LP64_ONLY(__ movflt(xmm0, field)); + NOT_LP64(__ fld_s(field)); break; case Bytecodes::_fast_dgetfield: - __ movdbl(xmm0, field); + LP64_ONLY(__ movdbl(xmm0, field)); + NOT_LP64(__ fld_d(field)); break; default: ShouldNotReachHere(); @@ -2860,23 +3314,25 @@ void TemplateTable::fast_xaccess(TosState state) { // access constant pool cache __ get_cache_and_index_at_bcp(rcx, rdx, 2); __ movptr(rbx, - Address(rcx, rdx, Address::times_8, + Address(rcx, rdx, Address::times_ptr, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::f2_offset()))); // make sure exception is reported in correct bcp range (getfield is // next instruction) - __ increment(r13); + __ increment(rbcp); __ null_check(rax); + const Address field = Address(rax, rbx, Address::times_1, 0*wordSize); switch (state) { case itos: - __ movl(rax, Address(rax, rbx, Address::times_1)); + __ movl(rax, field); break; case atos: - __ load_heap_oop(rax, Address(rax, rbx, Address::times_1)); + __ load_heap_oop(rax, field); __ verify_oop(rax); break; case ftos: - __ movflt(xmm0, Address(rax, rbx, Address::times_1)); + LP64_ONLY(__ movflt(xmm0, field)); + NOT_LP64(__ fld_s(field)); break; default: ShouldNotReachHere(); @@ -2895,11 +3351,9 @@ void TemplateTable::fast_xaccess(TosState state) { // __ bind(notVolatile); // } - __ decrement(r13); + __ decrement(rbcp); } - - //----------------------------------------------------------------------------- // Calls @@ -2968,7 +3422,7 @@ void TemplateTable::prepare_invoke(int byte_no, } if (save_flags) { - __ movl(r13, flags); + __ movl(rbcp, flags); } // compute return type @@ -2979,8 +3433,9 @@ void TemplateTable::prepare_invoke(int byte_no, { const address table_addr = (address) Interpreter::invoke_return_entry_table_for(code); ExternalAddress table(table_addr); - __ lea(rscratch1, table); - __ movptr(flags, Address(rscratch1, flags, Address::times_ptr)); + LP64_ONLY(__ lea(rscratch1, table)); + LP64_ONLY(__ movptr(flags, Address(rscratch1, flags, Address::times_ptr))); + NOT_LP64(__ movptr(flags, ArrayAddress(table, Address(noreg, flags, Address::times_ptr)))); } // push return address @@ -2989,12 +3444,11 @@ void TemplateTable::prepare_invoke(int byte_no, // Restore flags value from the constant pool cache, and restore rsi // for later null checks. r13 is the bytecode pointer if (save_flags) { - __ movl(flags, r13); + __ movl(flags, rbcp); __ restore_bcp(); } } - void TemplateTable::invokevirtual_helper(Register index, Register recv, Register flags) { @@ -3021,7 +3475,7 @@ void TemplateTable::invokevirtual_helper(Register index, // profile this call __ profile_final_call(rax); - __ profile_arguments_type(rax, method, r13, true); + __ profile_arguments_type(rax, method, rbcp, true); __ jump_from_interpreted(method, rax); @@ -3032,15 +3486,13 @@ void TemplateTable::invokevirtual_helper(Register index, __ load_klass(rax, recv); // profile this call - __ profile_virtual_call(rax, r14, rdx); - + __ profile_virtual_call(rax, rlocals, rdx); // get target Method* & entry point __ lookup_virtual_method(rax, index, method); - __ profile_arguments_type(rdx, method, r13, true); + __ profile_arguments_type(rdx, method, rbcp, true); __ jump_from_interpreted(method, rdx); } - void TemplateTable::invokevirtual(int byte_no) { transition(vtos, vtos); assert(byte_no == f2_byte, "use this argument"); @@ -3056,7 +3508,6 @@ void TemplateTable::invokevirtual(int byte_no) { invokevirtual_helper(rbx, rcx, rdx); } - void TemplateTable::invokespecial(int byte_no) { transition(vtos, vtos); assert(byte_no == f1_byte, "use this argument"); @@ -3066,27 +3517,28 @@ void TemplateTable::invokespecial(int byte_no) { __ null_check(rcx); // do the call __ profile_call(rax); - __ profile_arguments_type(rax, rbx, r13, false); + __ profile_arguments_type(rax, rbx, rbcp, false); __ jump_from_interpreted(rbx, rax); } - void TemplateTable::invokestatic(int byte_no) { transition(vtos, vtos); assert(byte_no == f1_byte, "use this argument"); prepare_invoke(byte_no, rbx); // get f1 Method* // do the call __ profile_call(rax); - __ profile_arguments_type(rax, rbx, r13, false); + __ profile_arguments_type(rax, rbx, rbcp, false); __ jump_from_interpreted(rbx, rax); } + void TemplateTable::fast_invokevfinal(int byte_no) { transition(vtos, vtos); assert(byte_no == f2_byte, "use this argument"); - __ stop("fast_invokevfinal not used on amd64"); + __ stop("fast_invokevfinal not used on x86"); } + void TemplateTable::invokeinterface(int byte_no) { transition(vtos, vtos); assert(byte_no == f1_byte, "use this argument"); @@ -3103,8 +3555,9 @@ void TemplateTable::invokeinterface(int byte_no) { // This code isn't produced by javac, but could be produced by // another compliant java compiler. Label notMethod; - __ movl(r14, rdx); - __ andl(r14, (1 << ConstantPoolCacheEntry::is_forced_virtual_shift)); + __ movl(rlocals, rdx); + __ andl(rlocals, (1 << ConstantPoolCacheEntry::is_forced_virtual_shift)); + __ jcc(Assembler::zero, notMethod); invokevirtual_helper(rbx, rcx, rdx); @@ -3116,14 +3569,14 @@ void TemplateTable::invokeinterface(int byte_no) { __ load_klass(rdx, rcx); // profile this call - __ profile_virtual_call(rdx, r13, r14); + __ profile_virtual_call(rdx, rbcp, rlocals); Label no_such_interface, no_such_method; __ lookup_interface_method(// inputs: rec. class, interface, itable index rdx, rax, rbx, // outputs: method, scan temp. reg - rbx, r13, + rbx, rbcp, no_such_interface); // rbx: Method* to call @@ -3135,7 +3588,7 @@ void TemplateTable::invokeinterface(int byte_no) { __ testptr(rbx, rbx); __ jcc(Assembler::zero, no_such_method); - __ profile_arguments_type(rdx, rbx, r13, true); + __ profile_arguments_type(rdx, rbx, rbcp, true); // do the call // rcx: receiver @@ -3150,7 +3603,7 @@ void TemplateTable::invokeinterface(int byte_no) { __ bind(no_such_method); // throw exception __ pop(rbx); // pop return address (pushed by prepare_invoke) - __ restore_bcp(); // r13 must be correct for exception handler (was destroyed) + __ restore_bcp(); // rbcp must be correct for exception handler (was destroyed) __ restore_locals(); // make sure locals pointer is correct as well (was destroyed) __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError)); // the call_VM checks for exception, so we should never return here. @@ -3159,7 +3612,7 @@ void TemplateTable::invokeinterface(int byte_no) { __ bind(no_such_interface); // throw exception __ pop(rbx); // pop return address (pushed by prepare_invoke) - __ restore_bcp(); // r13 must be correct for exception handler (was destroyed) + __ restore_bcp(); // rbcp must be correct for exception handler (was destroyed) __ restore_locals(); // make sure locals pointer is correct as well (was destroyed) __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeError)); @@ -3167,7 +3620,6 @@ void TemplateTable::invokeinterface(int byte_no) { __ should_not_reach_here(); } - void TemplateTable::invokehandle(int byte_no) { transition(vtos, vtos); assert(byte_no == f1_byte, "use this argument"); @@ -3188,12 +3640,11 @@ void TemplateTable::invokehandle(int byte_no) { // FIXME: profile the LambdaForm also __ profile_final_call(rax); - __ profile_arguments_type(rdx, rbx_method, r13, true); + __ profile_arguments_type(rdx, rbx_method, rbcp, true); __ jump_from_interpreted(rbx_method, rdx); } - void TemplateTable::invokedynamic(int byte_no) { transition(vtos, vtos); assert(byte_no == f1_byte, "use this argument"); @@ -3210,15 +3661,14 @@ void TemplateTable::invokedynamic(int byte_no) { // %%% should make a type profile for any invokedynamic that takes a ref argument // profile this call - __ profile_call(r13); - __ profile_arguments_type(rdx, rbx_method, r13, false); + __ profile_call(rbcp); + __ profile_arguments_type(rdx, rbx_method, rbcp, false); __ verify_oop(rax_callsite); __ jump_from_interpreted(rbx_method, rdx); } - //----------------------------------------------------------------------------- // Allocation @@ -3226,39 +3676,37 @@ void TemplateTable::_new() { transition(vtos, atos); __ get_unsigned_2_byte_index_at_bcp(rdx, 1); Label slow_case; + Label slow_case_no_pop; Label done; Label initialize_header; - Label initialize_object; // including clearing the fields + Label initialize_object; // including clearing the fields Label allocate_shared; - __ get_cpool_and_tags(rsi, rax); + __ get_cpool_and_tags(rcx, rax); + // Make sure the class we're about to instantiate has been resolved. // This is done before loading InstanceKlass to be consistent with the order // how Constant Pool is updated (see ConstantPool::klass_at_put) const int tags_offset = Array::base_offset_in_bytes(); - __ cmpb(Address(rax, rdx, Address::times_1, tags_offset), - JVM_CONSTANT_Class); - __ jcc(Assembler::notEqual, slow_case); + __ cmpb(Address(rax, rdx, Address::times_1, tags_offset), JVM_CONSTANT_Class); + __ jcc(Assembler::notEqual, slow_case_no_pop); // get InstanceKlass - __ movptr(rsi, Address(rsi, rdx, - Address::times_8, sizeof(ConstantPool))); + __ movptr(rcx, Address(rcx, rdx, Address::times_ptr, sizeof(ConstantPool))); + __ push(rcx); // save the contexts of klass for initializing the header // make sure klass is initialized & doesn't have finalizer // make sure klass is fully initialized - __ cmpb(Address(rsi, - InstanceKlass::init_state_offset()), - InstanceKlass::fully_initialized); + __ cmpb(Address(rcx, InstanceKlass::init_state_offset()), InstanceKlass::fully_initialized); __ jcc(Assembler::notEqual, slow_case); // get instance_size in InstanceKlass (scaled to a count of bytes) - __ movl(rdx, - Address(rsi, - Klass::layout_helper_offset())); + __ movl(rdx, Address(rcx, Klass::layout_helper_offset())); // test to see if it has a finalizer or is malformed in some way __ testl(rdx, Klass::_lh_instance_slow_path_bit); __ jcc(Assembler::notZero, slow_case); + // // Allocate the instance // 1) Try to allocate in the TLAB // 2) if fail and the object is large allocate in the shared Eden @@ -3268,12 +3716,19 @@ void TemplateTable::_new() { const bool allow_shared_alloc = Universe::heap()->supports_inline_contig_alloc(); + const Register thread = LP64_ONLY(r15_thread) NOT_LP64(rcx); +#ifndef _LP64 + if (UseTLAB || allow_shared_alloc) { + __ get_thread(thread); + } +#endif // _LP64 + if (UseTLAB) { - __ movptr(rax, Address(r15_thread, in_bytes(JavaThread::tlab_top_offset()))); + __ movptr(rax, Address(thread, in_bytes(JavaThread::tlab_top_offset()))); __ lea(rbx, Address(rax, rdx, Address::times_1)); - __ cmpptr(rbx, Address(r15_thread, in_bytes(JavaThread::tlab_end_offset()))); + __ cmpptr(rbx, Address(thread, in_bytes(JavaThread::tlab_end_offset()))); __ jcc(Assembler::above, allow_shared_alloc ? allocate_shared : slow_case); - __ movptr(Address(r15_thread, in_bytes(JavaThread::tlab_top_offset())), rbx); + __ movptr(Address(thread, in_bytes(JavaThread::tlab_top_offset())), rbx); if (ZeroTLAB) { // the fields have been already cleared __ jmp(initialize_header); @@ -3289,93 +3744,104 @@ void TemplateTable::_new() { if (allow_shared_alloc) { __ bind(allocate_shared); - ExternalAddress top((address)Universe::heap()->top_addr()); - ExternalAddress end((address)Universe::heap()->end_addr()); + ExternalAddress heap_top((address)Universe::heap()->top_addr()); + ExternalAddress heap_end((address)Universe::heap()->end_addr()); - const Register RtopAddr = rscratch1; - const Register RendAddr = rscratch2; - - __ lea(RtopAddr, top); - __ lea(RendAddr, end); - __ movptr(rax, Address(RtopAddr, 0)); - - // For retries rax gets set by cmpxchgq Label retry; __ bind(retry); + __ movptr(rax, heap_top); __ lea(rbx, Address(rax, rdx, Address::times_1)); - __ cmpptr(rbx, Address(RendAddr, 0)); + __ cmpptr(rbx, heap_end); __ jcc(Assembler::above, slow_case); - // Compare rax with the top addr, and if still equal, store the new - // top addr in rbx at the address of the top addr pointer. Sets ZF if was + // Compare rax, with the top addr, and if still equal, store the new + // top addr in rbx, at the address of the top addr pointer. Sets ZF if was // equal, and clears it otherwise. Use lock prefix for atomicity on MPs. // - // rax: object begin - // rbx: object end + // rax,: object begin + // rbx,: object end // rdx: instance size in bytes - if (os::is_MP()) { - __ lock(); - } - __ cmpxchgptr(rbx, Address(RtopAddr, 0)); + __ locked_cmpxchgptr(rbx, heap_top); // if someone beat us on the allocation, try again, otherwise continue __ jcc(Assembler::notEqual, retry); - __ incr_allocated_bytes(r15_thread, rdx, 0); + __ incr_allocated_bytes(thread, rdx, 0); } if (UseTLAB || Universe::heap()->supports_inline_contig_alloc()) { // The object is initialized before the header. If the object size is // zero, go directly to the header initialization. __ bind(initialize_object); - __ decrementl(rdx, sizeof(oopDesc)); + __ decrement(rdx, sizeof(oopDesc)); __ jcc(Assembler::zero, initialize_header); - // Initialize object fields - __ xorl(rcx, rcx); // use zero reg to clear memory (shorter code) - __ shrl(rdx, LogBytesPerLong); // divide by oopSize to simplify the loop - { - Label loop; - __ bind(loop); - __ movq(Address(rax, rdx, Address::times_8, - sizeof(oopDesc) - oopSize), - rcx); - __ decrementl(rdx); - __ jcc(Assembler::notZero, loop); + // Initialize topmost object field, divide rdx by 8, check if odd and + // test if zero. + __ xorl(rcx, rcx); // use zero reg to clear memory (shorter code) + __ shrl(rdx, LogBytesPerLong); // divide by 2*oopSize and set carry flag if odd + + // rdx must have been multiple of 8 +#ifdef ASSERT + // make sure rdx was multiple of 8 + Label L; + // Ignore partial flag stall after shrl() since it is debug VM + __ jccb(Assembler::carryClear, L); + __ stop("object size is not multiple of 2 - adjust this code"); + __ bind(L); + // rdx must be > 0, no extra check needed here +#endif + + // initialize remaining object fields: rdx was a multiple of 8 + { Label loop; + __ bind(loop); + __ movptr(Address(rax, rdx, Address::times_8, sizeof(oopDesc) - 1*oopSize), rcx); + NOT_LP64(__ movptr(Address(rax, rdx, Address::times_8, sizeof(oopDesc) - 2*oopSize), rcx)); + __ decrement(rdx); + __ jcc(Assembler::notZero, loop); } // initialize object header only. __ bind(initialize_header); if (UseBiasedLocking) { - __ movptr(rscratch1, Address(rsi, Klass::prototype_header_offset())); - __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()), rscratch1); + __ pop(rcx); // get saved klass back in the register. + __ movptr(rbx, Address(rcx, Klass::prototype_header_offset())); + __ movptr(Address(rax, oopDesc::mark_offset_in_bytes ()), rbx); } else { - __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()), - (intptr_t) markOopDesc::prototype()); // header (address 0x1) + __ movptr(Address(rax, oopDesc::mark_offset_in_bytes ()), + (intptr_t)markOopDesc::prototype()); // header + __ pop(rcx); // get saved klass back in the register. } - __ xorl(rcx, rcx); // use zero reg to clear memory (shorter code) - __ store_klass_gap(rax, rcx); // zero klass gap for compressed oops - __ store_klass(rax, rsi); // store klass last +#ifdef _LP64 + __ xorl(rsi, rsi); // use zero reg to clear memory (shorter code) + __ store_klass_gap(rax, rsi); // zero klass gap for compressed oops +#endif + __ store_klass(rax, rcx); // klass { - SkipIfEqual skip(_masm, &DTraceAllocProbes, false); + SkipIfEqual skip_if(_masm, &DTraceAllocProbes, 0); // Trigger dtrace event for fastpath - __ push(atos); // save the return value + __ push(atos); __ call_VM_leaf( CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc), rax); - __ pop(atos); // restore the return value - + __ pop(atos); } + __ jmp(done); } - // slow case __ bind(slow_case); - __ get_constant_pool(c_rarg1); - __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1); - call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2); - __ verify_oop(rax); + __ pop(rcx); // restore stack pointer to what it was when we came in. + __ bind(slow_case_no_pop); + + Register rarg1 = LP64_ONLY(c_rarg1) NOT_LP64(rax); + Register rarg2 = LP64_ONLY(c_rarg2) NOT_LP64(rdx); + + __ get_constant_pool(rarg1); + __ get_unsigned_2_byte_index_at_bcp(rarg2, 1); + call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), rarg1, rarg2); + __ verify_oop(rax); // continue __ bind(done); @@ -3383,19 +3849,22 @@ void TemplateTable::_new() { void TemplateTable::newarray() { transition(itos, atos); - __ load_unsigned_byte(c_rarg1, at_bcp(1)); - __ movl(c_rarg2, rax); + Register rarg1 = LP64_ONLY(c_rarg1) NOT_LP64(rdx); + __ load_unsigned_byte(rarg1, at_bcp(1)); call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::newarray), - c_rarg1, c_rarg2); + rarg1, rax); } void TemplateTable::anewarray() { transition(itos, atos); - __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1); - __ get_constant_pool(c_rarg1); - __ movl(c_rarg3, rax); + + Register rarg1 = LP64_ONLY(c_rarg1) NOT_LP64(rcx); + Register rarg2 = LP64_ONLY(c_rarg2) NOT_LP64(rdx); + + __ get_unsigned_2_byte_index_at_bcp(rarg2, 1); + __ get_constant_pool(rarg1); call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray), - c_rarg1, c_rarg2, c_rarg3); + rarg1, rarg2, rax); } void TemplateTable::arraylength() { @@ -3421,8 +3890,17 @@ void TemplateTable::checkcast() { __ jcc(Assembler::equal, quicked); __ push(atos); // save receiver for result, and for GC call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc)); + // vm_result_2 has metadata result +#ifndef _LP64 + // borrow rdi from locals + __ get_thread(rdi); + __ get_vm_result_2(rax, rdi); + __ restore_locals(); +#else __ get_vm_result_2(rax, r15_thread); +#endif + __ pop_ptr(rdx); // restore receiver __ jmpb(resolved); @@ -3430,7 +3908,7 @@ void TemplateTable::checkcast() { __ bind(quicked); __ mov(rdx, rax); // Save object in rdx; rax needed for subtype check __ movptr(rax, Address(rcx, rbx, - Address::times_8, sizeof(ConstantPool))); + Address::times_ptr, sizeof(ConstantPool))); __ bind(resolved); __ load_klass(rbx, rdx); @@ -3478,7 +3956,16 @@ void TemplateTable::instanceof() { __ push(atos); // save receiver for result, and for GC call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc)); // vm_result_2 has metadata result + +#ifndef _LP64 + // borrow rdi from locals + __ get_thread(rdi); + __ get_vm_result_2(rax, rdi); + __ restore_locals(); +#else __ get_vm_result_2(rax, r15_thread); +#endif + __ pop_ptr(rdx); // restore receiver __ verify_oop(rdx); __ load_klass(rdx, rdx); @@ -3488,7 +3975,7 @@ void TemplateTable::instanceof() { __ bind(quicked); __ load_klass(rdx, rax); __ movptr(rax, Address(rcx, rbx, - Address::times_8, sizeof(ConstantPool))); + Address::times_ptr, sizeof(ConstantPool))); __ bind(resolved); @@ -3516,28 +4003,31 @@ void TemplateTable::instanceof() { // rax = 1: obj != NULL and obj is an instanceof the specified klass } -//----------------------------------------------------------------------------- + +//---------------------------------------------------------------------------------------------------- // Breakpoints void TemplateTable::_breakpoint() { // Note: We get here even if we are single stepping.. - // jbug inists on setting breakpoints at every bytecode + // jbug insists on setting breakpoints at every bytecode // even if we are in single step mode. transition(vtos, vtos); + Register rarg = LP64_ONLY(c_rarg1) NOT_LP64(rcx); + // get the unpatched byte code - __ get_method(c_rarg1); + __ get_method(rarg); __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::get_original_bytecode_at), - c_rarg1, r13); - __ mov(rbx, rax); + rarg, rbcp); + __ mov(rbx, rax); // why? // post the breakpoint event - __ get_method(c_rarg1); + __ get_method(rarg); __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::_breakpoint), - c_rarg1, r13); + rarg, rbcp); // complete the execution of original bytecode __ dispatch_only_normal(vtos); @@ -3583,75 +4073,79 @@ void TemplateTable::monitorenter() { Label allocated; - // initialize entry pointer - __ xorl(c_rarg1, c_rarg1); // points to free slot or NULL + Register rtop = LP64_ONLY(c_rarg3) NOT_LP64(rcx); + Register rbot = LP64_ONLY(c_rarg2) NOT_LP64(rbx); + Register rmon = LP64_ONLY(c_rarg1) NOT_LP64(rdx); - // find a free slot in the monitor block (result in c_rarg1) + // initialize entry pointer + __ xorl(rmon, rmon); // points to free slot or NULL + + // find a free slot in the monitor block (result in rmon) { Label entry, loop, exit; - __ movptr(c_rarg3, monitor_block_top); // points to current entry, - // starting with top-most entry - __ lea(c_rarg2, monitor_block_bot); // points to word before bottom - // of monitor block + __ movptr(rtop, monitor_block_top); // points to current entry, + // starting with top-most entry + __ lea(rbot, monitor_block_bot); // points to word before bottom + // of monitor block __ jmpb(entry); __ bind(loop); // check if current entry is used - __ cmpptr(Address(c_rarg3, BasicObjectLock::obj_offset_in_bytes()), (int32_t) NULL_WORD); - // if not used then remember entry in c_rarg1 - __ cmov(Assembler::equal, c_rarg1, c_rarg3); + __ cmpptr(Address(rtop, BasicObjectLock::obj_offset_in_bytes()), (int32_t) NULL_WORD); + // if not used then remember entry in rmon + __ cmovptr(Assembler::equal, rmon, rtop); // cmov => cmovptr // check if current entry is for same object - __ cmpptr(rax, Address(c_rarg3, BasicObjectLock::obj_offset_in_bytes())); + __ cmpptr(rax, Address(rtop, BasicObjectLock::obj_offset_in_bytes())); // if same object then stop searching __ jccb(Assembler::equal, exit); // otherwise advance to next entry - __ addptr(c_rarg3, entry_size); + __ addptr(rtop, entry_size); __ bind(entry); // check if bottom reached - __ cmpptr(c_rarg3, c_rarg2); + __ cmpptr(rtop, rbot); // if not at bottom then check this entry __ jcc(Assembler::notEqual, loop); __ bind(exit); } - __ testptr(c_rarg1, c_rarg1); // check if a slot has been found + __ testptr(rmon, rmon); // check if a slot has been found __ jcc(Assembler::notZero, allocated); // if found, continue with that one // allocate one if there's no free slot { Label entry, loop; - // 1. compute new pointers // rsp: old expression stack top - __ movptr(c_rarg1, monitor_block_bot); // c_rarg1: old expression stack bottom - __ subptr(rsp, entry_size); // move expression stack top - __ subptr(c_rarg1, entry_size); // move expression stack bottom - __ mov(c_rarg3, rsp); // set start value for copy loop - __ movptr(monitor_block_bot, c_rarg1); // set new monitor block bottom + // 1. compute new pointers // rsp: old expression stack top + __ movptr(rmon, monitor_block_bot); // rmon: old expression stack bottom + __ subptr(rsp, entry_size); // move expression stack top + __ subptr(rmon, entry_size); // move expression stack bottom + __ mov(rtop, rsp); // set start value for copy loop + __ movptr(monitor_block_bot, rmon); // set new monitor block bottom __ jmp(entry); // 2. move expression stack contents __ bind(loop); - __ movptr(c_rarg2, Address(c_rarg3, entry_size)); // load expression stack - // word from old location - __ movptr(Address(c_rarg3, 0), c_rarg2); // and store it at new location - __ addptr(c_rarg3, wordSize); // advance to next word + __ movptr(rbot, Address(rtop, entry_size)); // load expression stack + // word from old location + __ movptr(Address(rtop, 0), rbot); // and store it at new location + __ addptr(rtop, wordSize); // advance to next word __ bind(entry); - __ cmpptr(c_rarg3, c_rarg1); // check if bottom reached - __ jcc(Assembler::notEqual, loop); // if not at bottom then - // copy next word + __ cmpptr(rtop, rmon); // check if bottom reached + __ jcc(Assembler::notEqual, loop); // if not at bottom then + // copy next word } // call run-time routine - // c_rarg1: points to monitor entry + // rmon: points to monitor entry __ bind(allocated); // Increment bcp to point to the next bytecode, so exception // handling for async. exceptions work correctly. // The object has already been poped from the stack, so the // expression stack looks correct. - __ increment(r13); + __ increment(rbcp); // store object - __ movptr(Address(c_rarg1, BasicObjectLock::obj_offset_in_bytes()), rax); - __ lock_object(c_rarg1); + __ movptr(Address(rmon, BasicObjectLock::obj_offset_in_bytes()), rax); + __ lock_object(rmon); // check to make sure this monitor doesn't cause stack overflow after locking __ save_bcp(); // in case of exception @@ -3662,7 +4156,6 @@ void TemplateTable::monitorenter() { __ dispatch_next(vtos); } - void TemplateTable::monitorexit() { transition(atos, vtos); @@ -3675,27 +4168,30 @@ void TemplateTable::monitorexit() { rbp, frame::interpreter_frame_initial_sp_offset * wordSize); const int entry_size = frame::interpreter_frame_monitor_size() * wordSize; + Register rtop = LP64_ONLY(c_rarg1) NOT_LP64(rdx); + Register rbot = LP64_ONLY(c_rarg2) NOT_LP64(rbx); + Label found; // find matching slot { Label entry, loop; - __ movptr(c_rarg1, monitor_block_top); // points to current entry, - // starting with top-most entry - __ lea(c_rarg2, monitor_block_bot); // points to word before bottom - // of monitor block + __ movptr(rtop, monitor_block_top); // points to current entry, + // starting with top-most entry + __ lea(rbot, monitor_block_bot); // points to word before bottom + // of monitor block __ jmpb(entry); __ bind(loop); // check if current entry is for same object - __ cmpptr(rax, Address(c_rarg1, BasicObjectLock::obj_offset_in_bytes())); + __ cmpptr(rax, Address(rtop, BasicObjectLock::obj_offset_in_bytes())); // if same object then stop searching __ jcc(Assembler::equal, found); // otherwise advance to next entry - __ addptr(c_rarg1, entry_size); + __ addptr(rtop, entry_size); __ bind(entry); // check if bottom reached - __ cmpptr(c_rarg1, c_rarg2); + __ cmpptr(rtop, rbot); // if not at bottom then check this entry __ jcc(Assembler::notEqual, loop); } @@ -3706,36 +4202,34 @@ void TemplateTable::monitorexit() { __ should_not_reach_here(); // call run-time routine - // rsi: points to monitor entry __ bind(found); __ push_ptr(rax); // make sure object is on stack (contract with oopMaps) - __ unlock_object(c_rarg1); + __ unlock_object(rtop); __ pop_ptr(rax); // discard object } - // Wide instructions void TemplateTable::wide() { transition(vtos, vtos); __ load_unsigned_byte(rbx, at_bcp(1)); - __ lea(rscratch1, ExternalAddress((address)Interpreter::_wentry_point)); - __ jmp(Address(rscratch1, rbx, Address::times_8)); - // Note: the r13 increment step is part of the individual wide - // bytecode implementations + ExternalAddress wtable((address)Interpreter::_wentry_point); + __ jump(ArrayAddress(wtable, Address(noreg, rbx, Address::times_ptr))); + // Note: the rbcp increment step is part of the individual wide bytecode implementations } - // Multi arrays void TemplateTable::multianewarray() { transition(vtos, atos); + + Register rarg = LP64_ONLY(c_rarg1) NOT_LP64(rax); __ load_unsigned_byte(rax, at_bcp(3)); // get number of dimensions // last dim is on top of stack; we want address of first one: - // first_addr = last_addr + (ndims - 1) * wordSize - __ lea(c_rarg1, Address(rsp, rax, Address::times_8, -wordSize)); - call_VM(rax, - CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray), - c_rarg1); + // first_addr = last_addr + (ndims - 1) * stackElementSize - 1*wordsize + // the latter wordSize to point to the beginning of the array. + __ lea(rarg, Address(rsp, rax, Interpreter::stackElementScale(), -wordSize)); + call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray), rarg); __ load_unsigned_byte(rbx, at_bcp(3)); - __ lea(rsp, Address(rsp, rbx, Address::times_8)); + __ lea(rsp, Address(rsp, rbx, Interpreter::stackElementScale())); // get rid of counts } -#endif // !CC_INTERP +#endif /* !CC_INTERP */ + diff --git a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp deleted file mode 100644 index 1a8d8870c2a..00000000000 --- a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp +++ /dev/null @@ -1,3668 +0,0 @@ -/* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#include "precompiled.hpp" -#include "asm/macroAssembler.hpp" -#include "interpreter/interpreter.hpp" -#include "interpreter/interpreterRuntime.hpp" -#include "interpreter/interp_masm.hpp" -#include "interpreter/templateTable.hpp" -#include "memory/universe.inline.hpp" -#include "oops/methodData.hpp" -#include "oops/objArrayKlass.hpp" -#include "oops/oop.inline.hpp" -#include "prims/methodHandles.hpp" -#include "runtime/sharedRuntime.hpp" -#include "runtime/stubRoutines.hpp" -#include "runtime/synchronizer.hpp" -#include "utilities/macros.hpp" - -#ifndef CC_INTERP -#define __ _masm-> - -//---------------------------------------------------------------------------------------------------- -// Platform-dependent initialization - -void TemplateTable::pd_initialize() { - // No i486 specific initialization -} - -//---------------------------------------------------------------------------------------------------- -// Address computation - -// local variables -static inline Address iaddress(int n) { - return Address(rdi, Interpreter::local_offset_in_bytes(n)); -} - -static inline Address laddress(int n) { return iaddress(n + 1); } -static inline Address haddress(int n) { return iaddress(n + 0); } -static inline Address faddress(int n) { return iaddress(n); } -static inline Address daddress(int n) { return laddress(n); } -static inline Address aaddress(int n) { return iaddress(n); } - -static inline Address iaddress(Register r) { - return Address(rdi, r, Interpreter::stackElementScale()); -} -static inline Address laddress(Register r) { - return Address(rdi, r, Interpreter::stackElementScale(), Interpreter::local_offset_in_bytes(1)); -} -static inline Address haddress(Register r) { - return Address(rdi, r, Interpreter::stackElementScale(), Interpreter::local_offset_in_bytes(0)); -} - -static inline Address faddress(Register r) { return iaddress(r); } -static inline Address daddress(Register r) { return laddress(r); } -static inline Address aaddress(Register r) { return iaddress(r); } - -// expression stack -// (Note: Must not use symmetric equivalents at_rsp_m1/2 since they store -// data beyond the rsp which is potentially unsafe in an MT environment; -// an interrupt may overwrite that data.) -static inline Address at_rsp () { - return Address(rsp, 0); -} - -// At top of Java expression stack which may be different than rsp(). It -// isn't for category 1 objects. -static inline Address at_tos () { - Address tos = Address(rsp, Interpreter::expr_offset_in_bytes(0)); - return tos; -} - -static inline Address at_tos_p1() { - return Address(rsp, Interpreter::expr_offset_in_bytes(1)); -} - -static inline Address at_tos_p2() { - return Address(rsp, Interpreter::expr_offset_in_bytes(2)); -} - -// Condition conversion -static Assembler::Condition j_not(TemplateTable::Condition cc) { - switch (cc) { - case TemplateTable::equal : return Assembler::notEqual; - case TemplateTable::not_equal : return Assembler::equal; - case TemplateTable::less : return Assembler::greaterEqual; - case TemplateTable::less_equal : return Assembler::greater; - case TemplateTable::greater : return Assembler::lessEqual; - case TemplateTable::greater_equal: return Assembler::less; - } - ShouldNotReachHere(); - return Assembler::zero; -} - - -//---------------------------------------------------------------------------------------------------- -// Miscelaneous helper routines - -// Store an oop (or NULL) at the address described by obj. -// If val == noreg this means store a NULL - -static void do_oop_store(InterpreterMacroAssembler* _masm, - Address obj, - Register val, - BarrierSet::Name barrier, - bool precise) { - assert(val == noreg || val == rax, "parameter is just for looks"); - switch (barrier) { -#if INCLUDE_ALL_GCS - case BarrierSet::G1SATBCT: - case BarrierSet::G1SATBCTLogging: - { - // flatten object address if needed - // We do it regardless of precise because we need the registers - if (obj.index() == noreg && obj.disp() == 0) { - if (obj.base() != rdx) { - __ movl(rdx, obj.base()); - } - } else { - __ leal(rdx, obj); - } - __ get_thread(rcx); - __ save_bcp(); - __ g1_write_barrier_pre(rdx /* obj */, - rbx /* pre_val */, - rcx /* thread */, - rsi /* tmp */, - val != noreg /* tosca_live */, - false /* expand_call */); - - // Do the actual store - // noreg means NULL - if (val == noreg) { - __ movptr(Address(rdx, 0), NULL_WORD); - // No post barrier for NULL - } else { - __ movl(Address(rdx, 0), val); - __ g1_write_barrier_post(rdx /* store_adr */, - val /* new_val */, - rcx /* thread */, - rbx /* tmp */, - rsi /* tmp2 */); - } - __ restore_bcp(); - - } - break; -#endif // INCLUDE_ALL_GCS - case BarrierSet::CardTableModRef: - case BarrierSet::CardTableExtension: - { - if (val == noreg) { - __ movptr(obj, NULL_WORD); - } else { - __ movl(obj, val); - // flatten object address if needed - if (!precise || (obj.index() == noreg && obj.disp() == 0)) { - __ store_check(obj.base()); - } else { - __ leal(rdx, obj); - __ store_check(rdx); - } - } - } - break; - case BarrierSet::ModRef: - if (val == noreg) { - __ movptr(obj, NULL_WORD); - } else { - __ movl(obj, val); - } - break; - default : - ShouldNotReachHere(); - - } -} - -Address TemplateTable::at_bcp(int offset) { - assert(_desc->uses_bcp(), "inconsistent uses_bcp information"); - return Address(rsi, offset); -} - - -void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg, - Register temp_reg, bool load_bc_into_bc_reg/*=true*/, - int byte_no) { - if (!RewriteBytecodes) return; - Label L_patch_done; - - switch (bc) { - case Bytecodes::_fast_aputfield: - case Bytecodes::_fast_bputfield: - case Bytecodes::_fast_cputfield: - case Bytecodes::_fast_dputfield: - case Bytecodes::_fast_fputfield: - case Bytecodes::_fast_iputfield: - case Bytecodes::_fast_lputfield: - case Bytecodes::_fast_sputfield: - { - // We skip bytecode quickening for putfield instructions when - // the put_code written to the constant pool cache is zero. - // This is required so that every execution of this instruction - // calls out to InterpreterRuntime::resolve_get_put to do - // additional, required work. - assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range"); - assert(load_bc_into_bc_reg, "we use bc_reg as temp"); - __ get_cache_and_index_and_bytecode_at_bcp(bc_reg, temp_reg, temp_reg, byte_no, 1); - __ movl(bc_reg, bc); - __ cmpl(temp_reg, (int) 0); - __ jcc(Assembler::zero, L_patch_done); // don't patch - } - break; - default: - assert(byte_no == -1, "sanity"); - // the pair bytecodes have already done the load. - if (load_bc_into_bc_reg) { - __ movl(bc_reg, bc); - } - } - - if (JvmtiExport::can_post_breakpoint()) { - Label L_fast_patch; - // if a breakpoint is present we can't rewrite the stream directly - __ movzbl(temp_reg, at_bcp(0)); - __ cmpl(temp_reg, Bytecodes::_breakpoint); - __ jcc(Assembler::notEqual, L_fast_patch); - __ get_method(temp_reg); - // Let breakpoint table handling rewrite to quicker bytecode - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::set_original_bytecode_at), temp_reg, rsi, bc_reg); -#ifndef ASSERT - __ jmpb(L_patch_done); -#else - __ jmp(L_patch_done); -#endif - __ bind(L_fast_patch); - } - -#ifdef ASSERT - Label L_okay; - __ load_unsigned_byte(temp_reg, at_bcp(0)); - __ cmpl(temp_reg, (int)Bytecodes::java_code(bc)); - __ jccb(Assembler::equal, L_okay); - __ cmpl(temp_reg, bc_reg); - __ jcc(Assembler::equal, L_okay); - __ stop("patching the wrong bytecode"); - __ bind(L_okay); -#endif - - // patch bytecode - __ movb(at_bcp(0), bc_reg); - __ bind(L_patch_done); -} - -//---------------------------------------------------------------------------------------------------- -// Individual instructions - -void TemplateTable::nop() { - transition(vtos, vtos); - // nothing to do -} - -void TemplateTable::shouldnotreachhere() { - transition(vtos, vtos); - __ stop("shouldnotreachhere bytecode"); -} - - - -void TemplateTable::aconst_null() { - transition(vtos, atos); - __ xorptr(rax, rax); -} - - -void TemplateTable::iconst(int value) { - transition(vtos, itos); - if (value == 0) { - __ xorptr(rax, rax); - } else { - __ movptr(rax, value); - } -} - - -void TemplateTable::lconst(int value) { - transition(vtos, ltos); - if (value == 0) { - __ xorptr(rax, rax); - } else { - __ movptr(rax, value); - } - assert(value >= 0, "check this code"); - __ xorptr(rdx, rdx); -} - - -void TemplateTable::fconst(int value) { - transition(vtos, ftos); - if (value == 0) { __ fldz(); - } else if (value == 1) { __ fld1(); - } else if (value == 2) { __ fld1(); __ fld1(); __ faddp(); // should do a better solution here - } else { ShouldNotReachHere(); - } -} - - -void TemplateTable::dconst(int value) { - transition(vtos, dtos); - if (value == 0) { __ fldz(); - } else if (value == 1) { __ fld1(); - } else { ShouldNotReachHere(); - } -} - - -void TemplateTable::bipush() { - transition(vtos, itos); - __ load_signed_byte(rax, at_bcp(1)); -} - - -void TemplateTable::sipush() { - transition(vtos, itos); - __ load_unsigned_short(rax, at_bcp(1)); - __ bswapl(rax); - __ sarl(rax, 16); -} - -void TemplateTable::ldc(bool wide) { - transition(vtos, vtos); - Label call_ldc, notFloat, notClass, Done; - - if (wide) { - __ get_unsigned_2_byte_index_at_bcp(rbx, 1); - } else { - __ load_unsigned_byte(rbx, at_bcp(1)); - } - __ get_cpool_and_tags(rcx, rax); - const int base_offset = ConstantPool::header_size() * wordSize; - const int tags_offset = Array::base_offset_in_bytes(); - - // get type - __ xorptr(rdx, rdx); - __ movb(rdx, Address(rax, rbx, Address::times_1, tags_offset)); - - // unresolved class - get the resolved class - __ cmpl(rdx, JVM_CONSTANT_UnresolvedClass); - __ jccb(Assembler::equal, call_ldc); - - // unresolved class in error (resolution failed) - call into runtime - // so that the same error from first resolution attempt is thrown. - __ cmpl(rdx, JVM_CONSTANT_UnresolvedClassInError); - __ jccb(Assembler::equal, call_ldc); - - // resolved class - need to call vm to get java mirror of the class - __ cmpl(rdx, JVM_CONSTANT_Class); - __ jcc(Assembler::notEqual, notClass); - - __ bind(call_ldc); - __ movl(rcx, wide); - call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::ldc), rcx); - __ push(atos); - __ jmp(Done); - - __ bind(notClass); - __ cmpl(rdx, JVM_CONSTANT_Float); - __ jccb(Assembler::notEqual, notFloat); - // ftos - __ fld_s( Address(rcx, rbx, Address::times_ptr, base_offset)); - __ push(ftos); - __ jmp(Done); - - __ bind(notFloat); -#ifdef ASSERT - { Label L; - __ cmpl(rdx, JVM_CONSTANT_Integer); - __ jcc(Assembler::equal, L); - // String and Object are rewritten to fast_aldc - __ stop("unexpected tag type in ldc"); - __ bind(L); - } -#endif - // itos JVM_CONSTANT_Integer only - __ movl(rax, Address(rcx, rbx, Address::times_ptr, base_offset)); - __ push(itos); - __ bind(Done); -} - -// Fast path for caching oop constants. -void TemplateTable::fast_aldc(bool wide) { - transition(vtos, atos); - - Register result = rax; - Register tmp = rdx; - int index_size = wide ? sizeof(u2) : sizeof(u1); - - Label resolved; - - // We are resolved if the resolved reference cache entry contains a - // non-null object (String, MethodType, etc.) - assert_different_registers(result, tmp); - __ get_cache_index_at_bcp(tmp, 1, index_size); - __ load_resolved_reference_at_index(result, tmp); - __ testl(result, result); - __ jcc(Assembler::notZero, resolved); - - address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_ldc); - - // first time invocation - must resolve first - __ movl(tmp, (int)bytecode()); - __ call_VM(result, entry, tmp); - - __ bind(resolved); - - if (VerifyOops) { - __ verify_oop(result); - } -} - -void TemplateTable::ldc2_w() { - transition(vtos, vtos); - Label Long, Done; - __ get_unsigned_2_byte_index_at_bcp(rbx, 1); - - __ get_cpool_and_tags(rcx, rax); - const int base_offset = ConstantPool::header_size() * wordSize; - const int tags_offset = Array::base_offset_in_bytes(); - - // get type - __ cmpb(Address(rax, rbx, Address::times_1, tags_offset), JVM_CONSTANT_Double); - __ jccb(Assembler::notEqual, Long); - // dtos - __ fld_d( Address(rcx, rbx, Address::times_ptr, base_offset)); - __ push(dtos); - __ jmpb(Done); - - __ bind(Long); - // ltos - __ movptr(rax, Address(rcx, rbx, Address::times_ptr, base_offset + 0 * wordSize)); - NOT_LP64(__ movptr(rdx, Address(rcx, rbx, Address::times_ptr, base_offset + 1 * wordSize))); - - __ push(ltos); - - __ bind(Done); -} - - -void TemplateTable::locals_index(Register reg, int offset) { - __ load_unsigned_byte(reg, at_bcp(offset)); - __ negptr(reg); -} - - -void TemplateTable::iload() { - transition(vtos, itos); - if (RewriteFrequentPairs) { - Label rewrite, done; - - // get next byte - __ load_unsigned_byte(rbx, at_bcp(Bytecodes::length_for(Bytecodes::_iload))); - // if _iload, wait to rewrite to iload2. We only want to rewrite the - // last two iloads in a pair. Comparing against fast_iload means that - // the next bytecode is neither an iload or a caload, and therefore - // an iload pair. - __ cmpl(rbx, Bytecodes::_iload); - __ jcc(Assembler::equal, done); - - __ cmpl(rbx, Bytecodes::_fast_iload); - __ movl(rcx, Bytecodes::_fast_iload2); - __ jccb(Assembler::equal, rewrite); - - // if _caload, rewrite to fast_icaload - __ cmpl(rbx, Bytecodes::_caload); - __ movl(rcx, Bytecodes::_fast_icaload); - __ jccb(Assembler::equal, rewrite); - - // rewrite so iload doesn't check again. - __ movl(rcx, Bytecodes::_fast_iload); - - // rewrite - // rcx: fast bytecode - __ bind(rewrite); - patch_bytecode(Bytecodes::_iload, rcx, rbx, false); - __ bind(done); - } - - // Get the local value into tos - locals_index(rbx); - __ movl(rax, iaddress(rbx)); -} - - -void TemplateTable::fast_iload2() { - transition(vtos, itos); - locals_index(rbx); - __ movl(rax, iaddress(rbx)); - __ push(itos); - locals_index(rbx, 3); - __ movl(rax, iaddress(rbx)); -} - -void TemplateTable::fast_iload() { - transition(vtos, itos); - locals_index(rbx); - __ movl(rax, iaddress(rbx)); -} - - -void TemplateTable::lload() { - transition(vtos, ltos); - locals_index(rbx); - __ movptr(rax, laddress(rbx)); - NOT_LP64(__ movl(rdx, haddress(rbx))); -} - - -void TemplateTable::fload() { - transition(vtos, ftos); - locals_index(rbx); - __ fld_s(faddress(rbx)); -} - - -void TemplateTable::dload() { - transition(vtos, dtos); - locals_index(rbx); - __ fld_d(daddress(rbx)); -} - - -void TemplateTable::aload() { - transition(vtos, atos); - locals_index(rbx); - __ movptr(rax, aaddress(rbx)); -} - - -void TemplateTable::locals_index_wide(Register reg) { - __ load_unsigned_short(reg, at_bcp(2)); - __ bswapl(reg); - __ shrl(reg, 16); - __ negptr(reg); -} - - -void TemplateTable::wide_iload() { - transition(vtos, itos); - locals_index_wide(rbx); - __ movl(rax, iaddress(rbx)); -} - - -void TemplateTable::wide_lload() { - transition(vtos, ltos); - locals_index_wide(rbx); - __ movptr(rax, laddress(rbx)); - NOT_LP64(__ movl(rdx, haddress(rbx))); -} - - -void TemplateTable::wide_fload() { - transition(vtos, ftos); - locals_index_wide(rbx); - __ fld_s(faddress(rbx)); -} - - -void TemplateTable::wide_dload() { - transition(vtos, dtos); - locals_index_wide(rbx); - __ fld_d(daddress(rbx)); -} - - -void TemplateTable::wide_aload() { - transition(vtos, atos); - locals_index_wide(rbx); - __ movptr(rax, aaddress(rbx)); -} - -void TemplateTable::index_check(Register array, Register index) { - // Pop ptr into array - __ pop_ptr(array); - index_check_without_pop(array, index); -} - -void TemplateTable::index_check_without_pop(Register array, Register index) { - // destroys rbx, - // check array - __ null_check(array, arrayOopDesc::length_offset_in_bytes()); - LP64_ONLY(__ movslq(index, index)); - // check index - __ cmpl(index, Address(array, arrayOopDesc::length_offset_in_bytes())); - if (index != rbx) { - // ??? convention: move aberrant index into rbx, for exception message - assert(rbx != array, "different registers"); - __ mov(rbx, index); - } - __ jump_cc(Assembler::aboveEqual, - ExternalAddress(Interpreter::_throw_ArrayIndexOutOfBoundsException_entry)); -} - - -void TemplateTable::iaload() { - transition(itos, itos); - // rdx: array - index_check(rdx, rax); // kills rbx, - // rax,: index - __ movl(rax, Address(rdx, rax, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_INT))); -} - - -void TemplateTable::laload() { - transition(itos, ltos); - // rax,: index - // rdx: array - index_check(rdx, rax); - __ mov(rbx, rax); - // rbx,: index - __ movptr(rax, Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize)); - NOT_LP64(__ movl(rdx, Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 1 * wordSize))); -} - - -void TemplateTable::faload() { - transition(itos, ftos); - // rdx: array - index_check(rdx, rax); // kills rbx, - // rax,: index - __ fld_s(Address(rdx, rax, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_FLOAT))); -} - - -void TemplateTable::daload() { - transition(itos, dtos); - // rdx: array - index_check(rdx, rax); // kills rbx, - // rax,: index - __ fld_d(Address(rdx, rax, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_DOUBLE))); -} - - -void TemplateTable::aaload() { - transition(itos, atos); - // rdx: array - index_check(rdx, rax); // kills rbx, - // rax,: index - __ movptr(rax, Address(rdx, rax, Address::times_ptr, arrayOopDesc::base_offset_in_bytes(T_OBJECT))); -} - - -void TemplateTable::baload() { - transition(itos, itos); - // rdx: array - index_check(rdx, rax); // kills rbx, - // rax,: index - // can do better code for P5 - fix this at some point - __ load_signed_byte(rbx, Address(rdx, rax, Address::times_1, arrayOopDesc::base_offset_in_bytes(T_BYTE))); - __ mov(rax, rbx); -} - - -void TemplateTable::caload() { - transition(itos, itos); - // rdx: array - index_check(rdx, rax); // kills rbx, - // rax,: index - // can do better code for P5 - may want to improve this at some point - __ load_unsigned_short(rbx, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); - __ mov(rax, rbx); -} - -// iload followed by caload frequent pair -void TemplateTable::fast_icaload() { - transition(vtos, itos); - // load index out of locals - locals_index(rbx); - __ movl(rax, iaddress(rbx)); - - // rdx: array - index_check(rdx, rax); - // rax,: index - __ load_unsigned_short(rbx, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); - __ mov(rax, rbx); -} - -void TemplateTable::saload() { - transition(itos, itos); - // rdx: array - index_check(rdx, rax); // kills rbx, - // rax,: index - // can do better code for P5 - may want to improve this at some point - __ load_signed_short(rbx, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_SHORT))); - __ mov(rax, rbx); -} - - -void TemplateTable::iload(int n) { - transition(vtos, itos); - __ movl(rax, iaddress(n)); -} - - -void TemplateTable::lload(int n) { - transition(vtos, ltos); - __ movptr(rax, laddress(n)); - NOT_LP64(__ movptr(rdx, haddress(n))); -} - - -void TemplateTable::fload(int n) { - transition(vtos, ftos); - __ fld_s(faddress(n)); -} - - -void TemplateTable::dload(int n) { - transition(vtos, dtos); - __ fld_d(daddress(n)); -} - - -void TemplateTable::aload(int n) { - transition(vtos, atos); - __ movptr(rax, aaddress(n)); -} - - -void TemplateTable::aload_0() { - transition(vtos, atos); - // According to bytecode histograms, the pairs: - // - // _aload_0, _fast_igetfield - // _aload_0, _fast_agetfield - // _aload_0, _fast_fgetfield - // - // occur frequently. If RewriteFrequentPairs is set, the (slow) _aload_0 - // bytecode checks if the next bytecode is either _fast_igetfield, - // _fast_agetfield or _fast_fgetfield and then rewrites the - // current bytecode into a pair bytecode; otherwise it rewrites the current - // bytecode into _fast_aload_0 that doesn't do the pair check anymore. - // - // Note: If the next bytecode is _getfield, the rewrite must be delayed, - // otherwise we may miss an opportunity for a pair. - // - // Also rewrite frequent pairs - // aload_0, aload_1 - // aload_0, iload_1 - // These bytecodes with a small amount of code are most profitable to rewrite - if (RewriteFrequentPairs) { - Label rewrite, done; - // get next byte - __ load_unsigned_byte(rbx, at_bcp(Bytecodes::length_for(Bytecodes::_aload_0))); - - // do actual aload_0 - aload(0); - - // if _getfield then wait with rewrite - __ cmpl(rbx, Bytecodes::_getfield); - __ jcc(Assembler::equal, done); - - // if _igetfield then reqrite to _fast_iaccess_0 - assert(Bytecodes::java_code(Bytecodes::_fast_iaccess_0) == Bytecodes::_aload_0, "fix bytecode definition"); - __ cmpl(rbx, Bytecodes::_fast_igetfield); - __ movl(rcx, Bytecodes::_fast_iaccess_0); - __ jccb(Assembler::equal, rewrite); - - // if _agetfield then reqrite to _fast_aaccess_0 - assert(Bytecodes::java_code(Bytecodes::_fast_aaccess_0) == Bytecodes::_aload_0, "fix bytecode definition"); - __ cmpl(rbx, Bytecodes::_fast_agetfield); - __ movl(rcx, Bytecodes::_fast_aaccess_0); - __ jccb(Assembler::equal, rewrite); - - // if _fgetfield then reqrite to _fast_faccess_0 - assert(Bytecodes::java_code(Bytecodes::_fast_faccess_0) == Bytecodes::_aload_0, "fix bytecode definition"); - __ cmpl(rbx, Bytecodes::_fast_fgetfield); - __ movl(rcx, Bytecodes::_fast_faccess_0); - __ jccb(Assembler::equal, rewrite); - - // else rewrite to _fast_aload0 - assert(Bytecodes::java_code(Bytecodes::_fast_aload_0) == Bytecodes::_aload_0, "fix bytecode definition"); - __ movl(rcx, Bytecodes::_fast_aload_0); - - // rewrite - // rcx: fast bytecode - __ bind(rewrite); - patch_bytecode(Bytecodes::_aload_0, rcx, rbx, false); - - __ bind(done); - } else { - aload(0); - } -} - -void TemplateTable::istore() { - transition(itos, vtos); - locals_index(rbx); - __ movl(iaddress(rbx), rax); -} - - -void TemplateTable::lstore() { - transition(ltos, vtos); - locals_index(rbx); - __ movptr(laddress(rbx), rax); - NOT_LP64(__ movptr(haddress(rbx), rdx)); -} - - -void TemplateTable::fstore() { - transition(ftos, vtos); - locals_index(rbx); - __ fstp_s(faddress(rbx)); -} - - -void TemplateTable::dstore() { - transition(dtos, vtos); - locals_index(rbx); - __ fstp_d(daddress(rbx)); -} - - -void TemplateTable::astore() { - transition(vtos, vtos); - __ pop_ptr(rax); - locals_index(rbx); - __ movptr(aaddress(rbx), rax); -} - - -void TemplateTable::wide_istore() { - transition(vtos, vtos); - __ pop_i(rax); - locals_index_wide(rbx); - __ movl(iaddress(rbx), rax); -} - - -void TemplateTable::wide_lstore() { - transition(vtos, vtos); - __ pop_l(rax, rdx); - locals_index_wide(rbx); - __ movptr(laddress(rbx), rax); - NOT_LP64(__ movl(haddress(rbx), rdx)); -} - - -void TemplateTable::wide_fstore() { - wide_istore(); -} - - -void TemplateTable::wide_dstore() { - wide_lstore(); -} - - -void TemplateTable::wide_astore() { - transition(vtos, vtos); - __ pop_ptr(rax); - locals_index_wide(rbx); - __ movptr(aaddress(rbx), rax); -} - - -void TemplateTable::iastore() { - transition(itos, vtos); - __ pop_i(rbx); - // rax,: value - // rdx: array - index_check(rdx, rbx); // prefer index in rbx, - // rbx,: index - __ movl(Address(rdx, rbx, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_INT)), rax); -} - - -void TemplateTable::lastore() { - transition(ltos, vtos); - __ pop_i(rbx); - // rax,: low(value) - // rcx: array - // rdx: high(value) - index_check(rcx, rbx); // prefer index in rbx, - // rbx,: index - __ movptr(Address(rcx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize), rax); - NOT_LP64(__ movl(Address(rcx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 1 * wordSize), rdx)); -} - - -void TemplateTable::fastore() { - transition(ftos, vtos); - __ pop_i(rbx); - // rdx: array - // st0: value - index_check(rdx, rbx); // prefer index in rbx, - // rbx,: index - __ fstp_s(Address(rdx, rbx, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_FLOAT))); -} - - -void TemplateTable::dastore() { - transition(dtos, vtos); - __ pop_i(rbx); - // rdx: array - // st0: value - index_check(rdx, rbx); // prefer index in rbx, - // rbx,: index - __ fstp_d(Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_DOUBLE))); -} - - -void TemplateTable::aastore() { - Label is_null, ok_is_subtype, done; - transition(vtos, vtos); - // stack: ..., array, index, value - __ movptr(rax, at_tos()); // Value - __ movl(rcx, at_tos_p1()); // Index - __ movptr(rdx, at_tos_p2()); // Array - - Address element_address(rdx, rcx, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_OBJECT)); - index_check_without_pop(rdx, rcx); // kills rbx, - // do array store check - check for NULL value first - __ testptr(rax, rax); - __ jcc(Assembler::zero, is_null); - - // Move subklass into EBX - __ load_klass(rbx, rax); - // Move superklass into EAX - __ load_klass(rax, rdx); - __ movptr(rax, Address(rax, ObjArrayKlass::element_klass_offset())); - // Compress array+index*wordSize+12 into a single register. Frees ECX. - __ lea(rdx, element_address); - - // Generate subtype check. Blows ECX. Resets EDI to locals. - // Superklass in EAX. Subklass in EBX. - __ gen_subtype_check( rbx, ok_is_subtype ); - - // Come here on failure - // object is at TOS - __ jump(ExternalAddress(Interpreter::_throw_ArrayStoreException_entry)); - - // Come here on success - __ bind(ok_is_subtype); - - // Get the value to store - __ movptr(rax, at_rsp()); - // and store it with appropriate barrier - do_oop_store(_masm, Address(rdx, 0), rax, _bs->kind(), true); - - __ jmp(done); - - // Have a NULL in EAX, EDX=array, ECX=index. Store NULL at ary[idx] - __ bind(is_null); - __ profile_null_seen(rbx); - - // Store NULL, (noreg means NULL to do_oop_store) - do_oop_store(_masm, element_address, noreg, _bs->kind(), true); - - // Pop stack arguments - __ bind(done); - __ addptr(rsp, 3 * Interpreter::stackElementSize); -} - - -void TemplateTable::bastore() { - transition(itos, vtos); - __ pop_i(rbx); - // rax,: value - // rdx: array - index_check(rdx, rbx); // prefer index in rbx, - // rbx,: index - __ movb(Address(rdx, rbx, Address::times_1, arrayOopDesc::base_offset_in_bytes(T_BYTE)), rax); -} - - -void TemplateTable::castore() { - transition(itos, vtos); - __ pop_i(rbx); - // rax,: value - // rdx: array - index_check(rdx, rbx); // prefer index in rbx, - // rbx,: index - __ movw(Address(rdx, rbx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)), rax); -} - - -void TemplateTable::sastore() { - castore(); -} - - -void TemplateTable::istore(int n) { - transition(itos, vtos); - __ movl(iaddress(n), rax); -} - - -void TemplateTable::lstore(int n) { - transition(ltos, vtos); - __ movptr(laddress(n), rax); - NOT_LP64(__ movptr(haddress(n), rdx)); -} - - -void TemplateTable::fstore(int n) { - transition(ftos, vtos); - __ fstp_s(faddress(n)); -} - - -void TemplateTable::dstore(int n) { - transition(dtos, vtos); - __ fstp_d(daddress(n)); -} - - -void TemplateTable::astore(int n) { - transition(vtos, vtos); - __ pop_ptr(rax); - __ movptr(aaddress(n), rax); -} - - -void TemplateTable::pop() { - transition(vtos, vtos); - __ addptr(rsp, Interpreter::stackElementSize); -} - - -void TemplateTable::pop2() { - transition(vtos, vtos); - __ addptr(rsp, 2*Interpreter::stackElementSize); -} - - -void TemplateTable::dup() { - transition(vtos, vtos); - // stack: ..., a - __ load_ptr(0, rax); - __ push_ptr(rax); - // stack: ..., a, a -} - - -void TemplateTable::dup_x1() { - transition(vtos, vtos); - // stack: ..., a, b - __ load_ptr( 0, rax); // load b - __ load_ptr( 1, rcx); // load a - __ store_ptr(1, rax); // store b - __ store_ptr(0, rcx); // store a - __ push_ptr(rax); // push b - // stack: ..., b, a, b -} - - -void TemplateTable::dup_x2() { - transition(vtos, vtos); - // stack: ..., a, b, c - __ load_ptr( 0, rax); // load c - __ load_ptr( 2, rcx); // load a - __ store_ptr(2, rax); // store c in a - __ push_ptr(rax); // push c - // stack: ..., c, b, c, c - __ load_ptr( 2, rax); // load b - __ store_ptr(2, rcx); // store a in b - // stack: ..., c, a, c, c - __ store_ptr(1, rax); // store b in c - // stack: ..., c, a, b, c -} - - -void TemplateTable::dup2() { - transition(vtos, vtos); - // stack: ..., a, b - __ load_ptr(1, rax); // load a - __ push_ptr(rax); // push a - __ load_ptr(1, rax); // load b - __ push_ptr(rax); // push b - // stack: ..., a, b, a, b -} - - -void TemplateTable::dup2_x1() { - transition(vtos, vtos); - // stack: ..., a, b, c - __ load_ptr( 0, rcx); // load c - __ load_ptr( 1, rax); // load b - __ push_ptr(rax); // push b - __ push_ptr(rcx); // push c - // stack: ..., a, b, c, b, c - __ store_ptr(3, rcx); // store c in b - // stack: ..., a, c, c, b, c - __ load_ptr( 4, rcx); // load a - __ store_ptr(2, rcx); // store a in 2nd c - // stack: ..., a, c, a, b, c - __ store_ptr(4, rax); // store b in a - // stack: ..., b, c, a, b, c - // stack: ..., b, c, a, b, c -} - - -void TemplateTable::dup2_x2() { - transition(vtos, vtos); - // stack: ..., a, b, c, d - __ load_ptr( 0, rcx); // load d - __ load_ptr( 1, rax); // load c - __ push_ptr(rax); // push c - __ push_ptr(rcx); // push d - // stack: ..., a, b, c, d, c, d - __ load_ptr( 4, rax); // load b - __ store_ptr(2, rax); // store b in d - __ store_ptr(4, rcx); // store d in b - // stack: ..., a, d, c, b, c, d - __ load_ptr( 5, rcx); // load a - __ load_ptr( 3, rax); // load c - __ store_ptr(3, rcx); // store a in c - __ store_ptr(5, rax); // store c in a - // stack: ..., c, d, a, b, c, d - // stack: ..., c, d, a, b, c, d -} - - -void TemplateTable::swap() { - transition(vtos, vtos); - // stack: ..., a, b - __ load_ptr( 1, rcx); // load a - __ load_ptr( 0, rax); // load b - __ store_ptr(0, rcx); // store a in b - __ store_ptr(1, rax); // store b in a - // stack: ..., b, a -} - - -void TemplateTable::iop2(Operation op) { - transition(itos, itos); - switch (op) { - case add : __ pop_i(rdx); __ addl (rax, rdx); break; - case sub : __ mov(rdx, rax); __ pop_i(rax); __ subl (rax, rdx); break; - case mul : __ pop_i(rdx); __ imull(rax, rdx); break; - case _and : __ pop_i(rdx); __ andl (rax, rdx); break; - case _or : __ pop_i(rdx); __ orl (rax, rdx); break; - case _xor : __ pop_i(rdx); __ xorl (rax, rdx); break; - case shl : __ mov(rcx, rax); __ pop_i(rax); __ shll (rax); break; // implicit masking of lower 5 bits by Intel shift instr. - case shr : __ mov(rcx, rax); __ pop_i(rax); __ sarl (rax); break; // implicit masking of lower 5 bits by Intel shift instr. - case ushr : __ mov(rcx, rax); __ pop_i(rax); __ shrl (rax); break; // implicit masking of lower 5 bits by Intel shift instr. - default : ShouldNotReachHere(); - } -} - - -void TemplateTable::lop2(Operation op) { - transition(ltos, ltos); - __ pop_l(rbx, rcx); - switch (op) { - case add : __ addl(rax, rbx); __ adcl(rdx, rcx); break; - case sub : __ subl(rbx, rax); __ sbbl(rcx, rdx); - __ mov (rax, rbx); __ mov (rdx, rcx); break; - case _and : __ andl(rax, rbx); __ andl(rdx, rcx); break; - case _or : __ orl (rax, rbx); __ orl (rdx, rcx); break; - case _xor : __ xorl(rax, rbx); __ xorl(rdx, rcx); break; - default : ShouldNotReachHere(); - } -} - - -void TemplateTable::idiv() { - transition(itos, itos); - __ mov(rcx, rax); - __ pop_i(rax); - // Note: could xor rax, and rcx and compare with (-1 ^ min_int). If - // they are not equal, one could do a normal division (no correction - // needed), which may speed up this implementation for the common case. - // (see also JVM spec., p.243 & p.271) - __ corrected_idivl(rcx); -} - - -void TemplateTable::irem() { - transition(itos, itos); - __ mov(rcx, rax); - __ pop_i(rax); - // Note: could xor rax, and rcx and compare with (-1 ^ min_int). If - // they are not equal, one could do a normal division (no correction - // needed), which may speed up this implementation for the common case. - // (see also JVM spec., p.243 & p.271) - __ corrected_idivl(rcx); - __ mov(rax, rdx); -} - - -void TemplateTable::lmul() { - transition(ltos, ltos); - __ pop_l(rbx, rcx); - __ push(rcx); __ push(rbx); - __ push(rdx); __ push(rax); - __ lmul(2 * wordSize, 0); - __ addptr(rsp, 4 * wordSize); // take off temporaries -} - - -void TemplateTable::ldiv() { - transition(ltos, ltos); - __ pop_l(rbx, rcx); - __ push(rcx); __ push(rbx); - __ push(rdx); __ push(rax); - // check if y = 0 - __ orl(rax, rdx); - __ jump_cc(Assembler::zero, - ExternalAddress(Interpreter::_throw_ArithmeticException_entry)); - __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::ldiv)); - __ addptr(rsp, 4 * wordSize); // take off temporaries -} - - -void TemplateTable::lrem() { - transition(ltos, ltos); - __ pop_l(rbx, rcx); - __ push(rcx); __ push(rbx); - __ push(rdx); __ push(rax); - // check if y = 0 - __ orl(rax, rdx); - __ jump_cc(Assembler::zero, - ExternalAddress(Interpreter::_throw_ArithmeticException_entry)); - __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::lrem)); - __ addptr(rsp, 4 * wordSize); -} - - -void TemplateTable::lshl() { - transition(itos, ltos); - __ movl(rcx, rax); // get shift count - __ pop_l(rax, rdx); // get shift value - __ lshl(rdx, rax); -} - - -void TemplateTable::lshr() { - transition(itos, ltos); - __ mov(rcx, rax); // get shift count - __ pop_l(rax, rdx); // get shift value - __ lshr(rdx, rax, true); -} - - -void TemplateTable::lushr() { - transition(itos, ltos); - __ mov(rcx, rax); // get shift count - __ pop_l(rax, rdx); // get shift value - __ lshr(rdx, rax); -} - - -void TemplateTable::fop2(Operation op) { - transition(ftos, ftos); - switch (op) { - case add: __ fadd_s (at_rsp()); break; - case sub: __ fsubr_s(at_rsp()); break; - case mul: __ fmul_s (at_rsp()); break; - case div: __ fdivr_s(at_rsp()); break; - case rem: __ fld_s (at_rsp()); __ fremr(rax); break; - default : ShouldNotReachHere(); - } - __ f2ieee(); - __ pop(rax); // pop float thing off -} - - -void TemplateTable::dop2(Operation op) { - transition(dtos, dtos); - - switch (op) { - case add: __ fadd_d (at_rsp()); break; - case sub: __ fsubr_d(at_rsp()); break; - case mul: { - Label L_strict; - Label L_join; - const Address access_flags (rcx, Method::access_flags_offset()); - __ get_method(rcx); - __ movl(rcx, access_flags); - __ testl(rcx, JVM_ACC_STRICT); - __ jccb(Assembler::notZero, L_strict); - __ fmul_d (at_rsp()); - __ jmpb(L_join); - __ bind(L_strict); - __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias1())); - __ fmulp(); - __ fmul_d (at_rsp()); - __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias2())); - __ fmulp(); - __ bind(L_join); - break; - } - case div: { - Label L_strict; - Label L_join; - const Address access_flags (rcx, Method::access_flags_offset()); - __ get_method(rcx); - __ movl(rcx, access_flags); - __ testl(rcx, JVM_ACC_STRICT); - __ jccb(Assembler::notZero, L_strict); - __ fdivr_d(at_rsp()); - __ jmp(L_join); - __ bind(L_strict); - __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias1())); - __ fmul_d (at_rsp()); - __ fdivrp(); - __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias2())); - __ fmulp(); - __ bind(L_join); - break; - } - case rem: __ fld_d (at_rsp()); __ fremr(rax); break; - default : ShouldNotReachHere(); - } - __ d2ieee(); - // Pop double precision number from rsp. - __ pop(rax); - __ pop(rdx); -} - - -void TemplateTable::ineg() { - transition(itos, itos); - __ negl(rax); -} - - -void TemplateTable::lneg() { - transition(ltos, ltos); - __ lneg(rdx, rax); -} - - -void TemplateTable::fneg() { - transition(ftos, ftos); - __ fchs(); -} - - -void TemplateTable::dneg() { - transition(dtos, dtos); - __ fchs(); -} - - -void TemplateTable::iinc() { - transition(vtos, vtos); - __ load_signed_byte(rdx, at_bcp(2)); // get constant - locals_index(rbx); - __ addl(iaddress(rbx), rdx); -} - - -void TemplateTable::wide_iinc() { - transition(vtos, vtos); - __ movl(rdx, at_bcp(4)); // get constant - locals_index_wide(rbx); - __ bswapl(rdx); // swap bytes & sign-extend constant - __ sarl(rdx, 16); - __ addl(iaddress(rbx), rdx); - // Note: should probably use only one movl to get both - // the index and the constant -> fix this -} - - -void TemplateTable::convert() { - // Checking -#ifdef ASSERT - { TosState tos_in = ilgl; - TosState tos_out = ilgl; - switch (bytecode()) { - case Bytecodes::_i2l: // fall through - case Bytecodes::_i2f: // fall through - case Bytecodes::_i2d: // fall through - case Bytecodes::_i2b: // fall through - case Bytecodes::_i2c: // fall through - case Bytecodes::_i2s: tos_in = itos; break; - case Bytecodes::_l2i: // fall through - case Bytecodes::_l2f: // fall through - case Bytecodes::_l2d: tos_in = ltos; break; - case Bytecodes::_f2i: // fall through - case Bytecodes::_f2l: // fall through - case Bytecodes::_f2d: tos_in = ftos; break; - case Bytecodes::_d2i: // fall through - case Bytecodes::_d2l: // fall through - case Bytecodes::_d2f: tos_in = dtos; break; - default : ShouldNotReachHere(); - } - switch (bytecode()) { - case Bytecodes::_l2i: // fall through - case Bytecodes::_f2i: // fall through - case Bytecodes::_d2i: // fall through - case Bytecodes::_i2b: // fall through - case Bytecodes::_i2c: // fall through - case Bytecodes::_i2s: tos_out = itos; break; - case Bytecodes::_i2l: // fall through - case Bytecodes::_f2l: // fall through - case Bytecodes::_d2l: tos_out = ltos; break; - case Bytecodes::_i2f: // fall through - case Bytecodes::_l2f: // fall through - case Bytecodes::_d2f: tos_out = ftos; break; - case Bytecodes::_i2d: // fall through - case Bytecodes::_l2d: // fall through - case Bytecodes::_f2d: tos_out = dtos; break; - default : ShouldNotReachHere(); - } - transition(tos_in, tos_out); - } -#endif // ASSERT - - // Conversion - // (Note: use push(rcx)/pop(rcx) for 1/2-word stack-ptr manipulation) - switch (bytecode()) { - case Bytecodes::_i2l: - __ extend_sign(rdx, rax); - break; - case Bytecodes::_i2f: - __ push(rax); // store int on tos - __ fild_s(at_rsp()); // load int to ST0 - __ f2ieee(); // truncate to float size - __ pop(rcx); // adjust rsp - break; - case Bytecodes::_i2d: - __ push(rax); // add one slot for d2ieee() - __ push(rax); // store int on tos - __ fild_s(at_rsp()); // load int to ST0 - __ d2ieee(); // truncate to double size - __ pop(rcx); // adjust rsp - __ pop(rcx); - break; - case Bytecodes::_i2b: - __ shll(rax, 24); // truncate upper 24 bits - __ sarl(rax, 24); // and sign-extend byte - LP64_ONLY(__ movsbl(rax, rax)); - break; - case Bytecodes::_i2c: - __ andl(rax, 0xFFFF); // truncate upper 16 bits - LP64_ONLY(__ movzwl(rax, rax)); - break; - case Bytecodes::_i2s: - __ shll(rax, 16); // truncate upper 16 bits - __ sarl(rax, 16); // and sign-extend short - LP64_ONLY(__ movswl(rax, rax)); - break; - case Bytecodes::_l2i: - /* nothing to do */ - break; - case Bytecodes::_l2f: - __ push(rdx); // store long on tos - __ push(rax); - __ fild_d(at_rsp()); // load long to ST0 - __ f2ieee(); // truncate to float size - __ pop(rcx); // adjust rsp - __ pop(rcx); - break; - case Bytecodes::_l2d: - __ push(rdx); // store long on tos - __ push(rax); - __ fild_d(at_rsp()); // load long to ST0 - __ d2ieee(); // truncate to double size - __ pop(rcx); // adjust rsp - __ pop(rcx); - break; - case Bytecodes::_f2i: - __ push(rcx); // reserve space for argument - __ fstp_s(at_rsp()); // pass float argument on stack - __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::f2i), 1); - break; - case Bytecodes::_f2l: - __ push(rcx); // reserve space for argument - __ fstp_s(at_rsp()); // pass float argument on stack - __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::f2l), 1); - break; - case Bytecodes::_f2d: - /* nothing to do */ - break; - case Bytecodes::_d2i: - __ push(rcx); // reserve space for argument - __ push(rcx); - __ fstp_d(at_rsp()); // pass double argument on stack - __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::d2i), 2); - break; - case Bytecodes::_d2l: - __ push(rcx); // reserve space for argument - __ push(rcx); - __ fstp_d(at_rsp()); // pass double argument on stack - __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::d2l), 2); - break; - case Bytecodes::_d2f: - __ push(rcx); // reserve space for f2ieee() - __ f2ieee(); // truncate to float size - __ pop(rcx); // adjust rsp - break; - default : - ShouldNotReachHere(); - } -} - - -void TemplateTable::lcmp() { - transition(ltos, itos); - // y = rdx:rax - __ pop_l(rbx, rcx); // get x = rcx:rbx - __ lcmp2int(rcx, rbx, rdx, rax);// rcx := cmp(x, y) - __ mov(rax, rcx); -} - - -void TemplateTable::float_cmp(bool is_float, int unordered_result) { - if (is_float) { - __ fld_s(at_rsp()); - } else { - __ fld_d(at_rsp()); - __ pop(rdx); - } - __ pop(rcx); - __ fcmp2int(rax, unordered_result < 0); -} - - -void TemplateTable::branch(bool is_jsr, bool is_wide) { - __ get_method(rcx); // ECX holds method - __ profile_taken_branch(rax,rbx); // EAX holds updated MDP, EBX holds bumped taken count - - const ByteSize be_offset = MethodCounters::backedge_counter_offset() + - InvocationCounter::counter_offset(); - const ByteSize inv_offset = MethodCounters::invocation_counter_offset() + - InvocationCounter::counter_offset(); - - // Load up EDX with the branch displacement - if (is_wide) { - __ movl(rdx, at_bcp(1)); - } else { - __ load_signed_short(rdx, at_bcp(1)); - } - __ bswapl(rdx); - if (!is_wide) __ sarl(rdx, 16); - LP64_ONLY(__ movslq(rdx, rdx)); - - - // Handle all the JSR stuff here, then exit. - // It's much shorter and cleaner than intermingling with the - // non-JSR normal-branch stuff occurring below. - if (is_jsr) { - // Pre-load the next target bytecode into EBX - __ load_unsigned_byte(rbx, Address(rsi, rdx, Address::times_1, 0)); - - // compute return address as bci in rax, - __ lea(rax, at_bcp((is_wide ? 5 : 3) - in_bytes(ConstMethod::codes_offset()))); - __ subptr(rax, Address(rcx, Method::const_offset())); - // Adjust the bcp in RSI by the displacement in EDX - __ addptr(rsi, rdx); - // Push return address - __ push_i(rax); - // jsr returns vtos - __ dispatch_only_noverify(vtos); - return; - } - - // Normal (non-jsr) branch handling - - // Adjust the bcp in RSI by the displacement in EDX - __ addptr(rsi, rdx); - - assert(UseLoopCounter || !UseOnStackReplacement, "on-stack-replacement requires loop counters"); - Label backedge_counter_overflow; - Label profile_method; - Label dispatch; - if (UseLoopCounter) { - // increment backedge counter for backward branches - // rax,: MDO - // rbx,: MDO bumped taken-count - // rcx: method - // rdx: target offset - // rsi: target bcp - // rdi: locals pointer - __ testl(rdx, rdx); // check if forward or backward branch - __ jcc(Assembler::positive, dispatch); // count only if backward branch - - // check if MethodCounters exists - Label has_counters; - __ movptr(rax, Address(rcx, Method::method_counters_offset())); - __ testptr(rax, rax); - __ jcc(Assembler::notZero, has_counters); - __ push(rdx); - __ push(rcx); - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::build_method_counters), - rcx); - __ pop(rcx); - __ pop(rdx); - __ movptr(rax, Address(rcx, Method::method_counters_offset())); - __ testptr(rax, rax); - __ jcc(Assembler::zero, dispatch); - __ bind(has_counters); - - if (TieredCompilation) { - Label no_mdo; - int increment = InvocationCounter::count_increment; - if (ProfileInterpreter) { - // Are we profiling? - __ movptr(rbx, Address(rcx, in_bytes(Method::method_data_offset()))); - __ testptr(rbx, rbx); - __ jccb(Assembler::zero, no_mdo); - // Increment the MDO backedge counter - const Address mdo_backedge_counter(rbx, in_bytes(MethodData::backedge_counter_offset()) + - in_bytes(InvocationCounter::counter_offset())); - const Address mask(rbx, in_bytes(MethodData::backedge_mask_offset())); - __ increment_mask_and_jump(mdo_backedge_counter, increment, mask, - rax, false, Assembler::zero, &backedge_counter_overflow); - __ jmp(dispatch); - } - __ bind(no_mdo); - // Increment backedge counter in MethodCounters* - __ movptr(rcx, Address(rcx, Method::method_counters_offset())); - const Address mask(rcx, in_bytes(MethodCounters::backedge_mask_offset())); - __ increment_mask_and_jump(Address(rcx, be_offset), increment, mask, - rax, false, Assembler::zero, &backedge_counter_overflow); - } else { // not TieredCompilation - // increment counter - __ movptr(rcx, Address(rcx, Method::method_counters_offset())); - __ movl(rax, Address(rcx, be_offset)); // load backedge counter - __ incrementl(rax, InvocationCounter::count_increment); // increment counter - __ movl(Address(rcx, be_offset), rax); // store counter - - __ movl(rax, Address(rcx, inv_offset)); // load invocation counter - - __ andl(rax, InvocationCounter::count_mask_value); // and the status bits - __ addl(rax, Address(rcx, be_offset)); // add both counters - - if (ProfileInterpreter) { - // Test to see if we should create a method data oop - __ cmp32(rax, Address(rcx, in_bytes(MethodCounters::interpreter_profile_limit_offset()))); - __ jcc(Assembler::less, dispatch); - - // if no method data exists, go to profile method - __ test_method_data_pointer(rax, profile_method); - - if (UseOnStackReplacement) { - // check for overflow against rbx, which is the MDO taken count - __ cmp32(rbx, Address(rcx, in_bytes(MethodCounters::interpreter_backward_branch_limit_offset()))); - __ jcc(Assembler::below, dispatch); - - // When ProfileInterpreter is on, the backedge_count comes from the - // MethodData*, which value does not get reset on the call to - // frequency_counter_overflow(). To avoid excessive calls to the overflow - // routine while the method is being compiled, add a second test to make - // sure the overflow function is called only once every overflow_frequency. - const int overflow_frequency = 1024; - __ andptr(rbx, overflow_frequency-1); - __ jcc(Assembler::zero, backedge_counter_overflow); - } - } else { - if (UseOnStackReplacement) { - // check for overflow against rax, which is the sum of the counters - __ cmp32(rax, Address(rcx, in_bytes(MethodCounters::interpreter_backward_branch_limit_offset()))); - __ jcc(Assembler::aboveEqual, backedge_counter_overflow); - - } - } - } - __ bind(dispatch); - } - - // Pre-load the next target bytecode into EBX - __ load_unsigned_byte(rbx, Address(rsi, 0)); - - // continue with the bytecode @ target - // rax,: return bci for jsr's, unused otherwise - // rbx,: target bytecode - // rsi: target bcp - __ dispatch_only(vtos); - - if (UseLoopCounter) { - if (ProfileInterpreter) { - // Out-of-line code to allocate method data oop. - __ bind(profile_method); - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method)); - __ load_unsigned_byte(rbx, Address(rsi, 0)); // restore target bytecode - __ set_method_data_pointer_for_bcp(); - __ jmp(dispatch); - } - - if (UseOnStackReplacement) { - - // invocation counter overflow - __ bind(backedge_counter_overflow); - __ negptr(rdx); - __ addptr(rdx, rsi); // branch bcp - call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), rdx); - __ load_unsigned_byte(rbx, Address(rsi, 0)); // restore target bytecode - - // rax,: osr nmethod (osr ok) or NULL (osr not possible) - // rbx,: target bytecode - // rdx: scratch - // rdi: locals pointer - // rsi: bcp - __ testptr(rax, rax); // test result - __ jcc(Assembler::zero, dispatch); // no osr if null - // nmethod may have been invalidated (VM may block upon call_VM return) - __ cmpb(Address(rax, nmethod::state_offset()), nmethod::in_use); - __ jcc(Assembler::notEqual, dispatch); - - // We have the address of an on stack replacement routine in rax, - // We need to prepare to execute the OSR method. First we must - // migrate the locals and monitors off of the stack. - - __ mov(rbx, rax); // save the nmethod - - __ get_thread(rcx); - call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin)); - // rax, is OSR buffer, move it to expected parameter location - __ mov(rcx, rax); - - // pop the interpreter frame - __ movptr(rdx, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); // get sender sp - __ leave(); // remove frame anchor - __ pop(rdi); // get return address - __ mov(rsp, rdx); // set sp to sender sp - - // Align stack pointer for compiled code (note that caller is - // responsible for undoing this fixup by remembering the old SP - // in an rbp,-relative location) - __ andptr(rsp, -(StackAlignmentInBytes)); - - // push the (possibly adjusted) return address - __ push(rdi); - - // and begin the OSR nmethod - __ jmp(Address(rbx, nmethod::osr_entry_point_offset())); - } - } -} - - -void TemplateTable::if_0cmp(Condition cc) { - transition(itos, vtos); - // assume branch is more often taken than not (loops use backward branches) - Label not_taken; - __ testl(rax, rax); - __ jcc(j_not(cc), not_taken); - branch(false, false); - __ bind(not_taken); - __ profile_not_taken_branch(rax); -} - - -void TemplateTable::if_icmp(Condition cc) { - transition(itos, vtos); - // assume branch is more often taken than not (loops use backward branches) - Label not_taken; - __ pop_i(rdx); - __ cmpl(rdx, rax); - __ jcc(j_not(cc), not_taken); - branch(false, false); - __ bind(not_taken); - __ profile_not_taken_branch(rax); -} - - -void TemplateTable::if_nullcmp(Condition cc) { - transition(atos, vtos); - // assume branch is more often taken than not (loops use backward branches) - Label not_taken; - __ testptr(rax, rax); - __ jcc(j_not(cc), not_taken); - branch(false, false); - __ bind(not_taken); - __ profile_not_taken_branch(rax); -} - - -void TemplateTable::if_acmp(Condition cc) { - transition(atos, vtos); - // assume branch is more often taken than not (loops use backward branches) - Label not_taken; - __ pop_ptr(rdx); - __ cmpptr(rdx, rax); - __ jcc(j_not(cc), not_taken); - branch(false, false); - __ bind(not_taken); - __ profile_not_taken_branch(rax); -} - - -void TemplateTable::ret() { - transition(vtos, vtos); - locals_index(rbx); - __ movptr(rbx, iaddress(rbx)); // get return bci, compute return bcp - __ profile_ret(rbx, rcx); - __ get_method(rax); - __ movptr(rsi, Address(rax, Method::const_offset())); - __ lea(rsi, Address(rsi, rbx, Address::times_1, - ConstMethod::codes_offset())); - __ dispatch_next(vtos); -} - - -void TemplateTable::wide_ret() { - transition(vtos, vtos); - locals_index_wide(rbx); - __ movptr(rbx, iaddress(rbx)); // get return bci, compute return bcp - __ profile_ret(rbx, rcx); - __ get_method(rax); - __ movptr(rsi, Address(rax, Method::const_offset())); - __ lea(rsi, Address(rsi, rbx, Address::times_1, ConstMethod::codes_offset())); - __ dispatch_next(vtos); -} - - -void TemplateTable::tableswitch() { - Label default_case, continue_execution; - transition(itos, vtos); - // align rsi - __ lea(rbx, at_bcp(wordSize)); - __ andptr(rbx, -wordSize); - // load lo & hi - __ movl(rcx, Address(rbx, 1 * wordSize)); - __ movl(rdx, Address(rbx, 2 * wordSize)); - __ bswapl(rcx); - __ bswapl(rdx); - // check against lo & hi - __ cmpl(rax, rcx); - __ jccb(Assembler::less, default_case); - __ cmpl(rax, rdx); - __ jccb(Assembler::greater, default_case); - // lookup dispatch offset - __ subl(rax, rcx); - __ movl(rdx, Address(rbx, rax, Address::times_4, 3 * BytesPerInt)); - __ profile_switch_case(rax, rbx, rcx); - // continue execution - __ bind(continue_execution); - __ bswapl(rdx); - __ load_unsigned_byte(rbx, Address(rsi, rdx, Address::times_1)); - __ addptr(rsi, rdx); - __ dispatch_only(vtos); - // handle default - __ bind(default_case); - __ profile_switch_default(rax); - __ movl(rdx, Address(rbx, 0)); - __ jmp(continue_execution); -} - - -void TemplateTable::lookupswitch() { - transition(itos, itos); - __ stop("lookupswitch bytecode should have been rewritten"); -} - - -void TemplateTable::fast_linearswitch() { - transition(itos, vtos); - Label loop_entry, loop, found, continue_execution; - // bswapl rax, so we can avoid bswapping the table entries - __ bswapl(rax); - // align rsi - __ lea(rbx, at_bcp(wordSize)); // btw: should be able to get rid of this instruction (change offsets below) - __ andptr(rbx, -wordSize); - // set counter - __ movl(rcx, Address(rbx, wordSize)); - __ bswapl(rcx); - __ jmpb(loop_entry); - // table search - __ bind(loop); - __ cmpl(rax, Address(rbx, rcx, Address::times_8, 2 * wordSize)); - __ jccb(Assembler::equal, found); - __ bind(loop_entry); - __ decrementl(rcx); - __ jcc(Assembler::greaterEqual, loop); - // default case - __ profile_switch_default(rax); - __ movl(rdx, Address(rbx, 0)); - __ jmpb(continue_execution); - // entry found -> get offset - __ bind(found); - __ movl(rdx, Address(rbx, rcx, Address::times_8, 3 * wordSize)); - __ profile_switch_case(rcx, rax, rbx); - // continue execution - __ bind(continue_execution); - __ bswapl(rdx); - __ load_unsigned_byte(rbx, Address(rsi, rdx, Address::times_1)); - __ addptr(rsi, rdx); - __ dispatch_only(vtos); -} - - -void TemplateTable::fast_binaryswitch() { - transition(itos, vtos); - // Implementation using the following core algorithm: - // - // int binary_search(int key, LookupswitchPair* array, int n) { - // // Binary search according to "Methodik des Programmierens" by - // // Edsger W. Dijkstra and W.H.J. Feijen, Addison Wesley Germany 1985. - // int i = 0; - // int j = n; - // while (i+1 < j) { - // // invariant P: 0 <= i < j <= n and (a[i] <= key < a[j] or Q) - // // with Q: for all i: 0 <= i < n: key < a[i] - // // where a stands for the array and assuming that the (inexisting) - // // element a[n] is infinitely big. - // int h = (i + j) >> 1; - // // i < h < j - // if (key < array[h].fast_match()) { - // j = h; - // } else { - // i = h; - // } - // } - // // R: a[i] <= key < a[i+1] or Q - // // (i.e., if key is within array, i is the correct index) - // return i; - // } - - // register allocation - const Register key = rax; // already set (tosca) - const Register array = rbx; - const Register i = rcx; - const Register j = rdx; - const Register h = rdi; // needs to be restored - const Register temp = rsi; - // setup array - __ save_bcp(); - - __ lea(array, at_bcp(3*wordSize)); // btw: should be able to get rid of this instruction (change offsets below) - __ andptr(array, -wordSize); - // initialize i & j - __ xorl(i, i); // i = 0; - __ movl(j, Address(array, -wordSize)); // j = length(array); - // Convert j into native byteordering - __ bswapl(j); - // and start - Label entry; - __ jmp(entry); - - // binary search loop - { Label loop; - __ bind(loop); - // int h = (i + j) >> 1; - __ leal(h, Address(i, j, Address::times_1)); // h = i + j; - __ sarl(h, 1); // h = (i + j) >> 1; - // if (key < array[h].fast_match()) { - // j = h; - // } else { - // i = h; - // } - // Convert array[h].match to native byte-ordering before compare - __ movl(temp, Address(array, h, Address::times_8, 0*wordSize)); - __ bswapl(temp); - __ cmpl(key, temp); - // j = h if (key < array[h].fast_match()) - __ cmov32(Assembler::less , j, h); - // i = h if (key >= array[h].fast_match()) - __ cmov32(Assembler::greaterEqual, i, h); - // while (i+1 < j) - __ bind(entry); - __ leal(h, Address(i, 1)); // i+1 - __ cmpl(h, j); // i+1 < j - __ jcc(Assembler::less, loop); - } - - // end of binary search, result index is i (must check again!) - Label default_case; - // Convert array[i].match to native byte-ordering before compare - __ movl(temp, Address(array, i, Address::times_8, 0*wordSize)); - __ bswapl(temp); - __ cmpl(key, temp); - __ jcc(Assembler::notEqual, default_case); - - // entry found -> j = offset - __ movl(j , Address(array, i, Address::times_8, 1*wordSize)); - __ profile_switch_case(i, key, array); - __ bswapl(j); - LP64_ONLY(__ movslq(j, j)); - __ restore_bcp(); - __ restore_locals(); // restore rdi - __ load_unsigned_byte(rbx, Address(rsi, j, Address::times_1)); - - __ addptr(rsi, j); - __ dispatch_only(vtos); - - // default case -> j = default offset - __ bind(default_case); - __ profile_switch_default(i); - __ movl(j, Address(array, -2*wordSize)); - __ bswapl(j); - LP64_ONLY(__ movslq(j, j)); - __ restore_bcp(); - __ restore_locals(); // restore rdi - __ load_unsigned_byte(rbx, Address(rsi, j, Address::times_1)); - __ addptr(rsi, j); - __ dispatch_only(vtos); -} - - -void TemplateTable::_return(TosState state) { - transition(state, state); - assert(_desc->calls_vm(), "inconsistent calls_vm information"); // call in remove_activation - - if (_desc->bytecode() == Bytecodes::_return_register_finalizer) { - assert(state == vtos, "only valid state"); - __ movptr(rax, aaddress(0)); - __ load_klass(rdi, rax); - __ movl(rdi, Address(rdi, Klass::access_flags_offset())); - __ testl(rdi, JVM_ACC_HAS_FINALIZER); - Label skip_register_finalizer; - __ jcc(Assembler::zero, skip_register_finalizer); - - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), rax); - - __ bind(skip_register_finalizer); - } - - __ remove_activation(state, rsi); - __ jmp(rsi); -} - - -// ---------------------------------------------------------------------------- -// Volatile variables demand their effects be made known to all CPU's in -// order. Store buffers on most chips allow reads & writes to reorder; the -// JMM's ReadAfterWrite.java test fails in -Xint mode without some kind of -// memory barrier (i.e., it's not sufficient that the interpreter does not -// reorder volatile references, the hardware also must not reorder them). -// -// According to the new Java Memory Model (JMM): -// (1) All volatiles are serialized wrt to each other. -// ALSO reads & writes act as aquire & release, so: -// (2) A read cannot let unrelated NON-volatile memory refs that happen after -// the read float up to before the read. It's OK for non-volatile memory refs -// that happen before the volatile read to float down below it. -// (3) Similar a volatile write cannot let unrelated NON-volatile memory refs -// that happen BEFORE the write float down to after the write. It's OK for -// non-volatile memory refs that happen after the volatile write to float up -// before it. -// -// We only put in barriers around volatile refs (they are expensive), not -// _between_ memory refs (that would require us to track the flavor of the -// previous memory refs). Requirements (2) and (3) require some barriers -// before volatile stores and after volatile loads. These nearly cover -// requirement (1) but miss the volatile-store-volatile-load case. This final -// case is placed after volatile-stores although it could just as well go -// before volatile-loads. -void TemplateTable::volatile_barrier(Assembler::Membar_mask_bits order_constraint ) { - // Helper function to insert a is-volatile test and memory barrier - if( !os::is_MP() ) return; // Not needed on single CPU - __ membar(order_constraint); -} - -void TemplateTable::resolve_cache_and_index(int byte_no, - Register Rcache, - Register index, - size_t index_size) { - const Register temp = rbx; - assert_different_registers(Rcache, index, temp); - - Label resolved; - assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range"); - __ get_cache_and_index_and_bytecode_at_bcp(Rcache, index, temp, byte_no, 1, index_size); - __ cmpl(temp, (int) bytecode()); // have we resolved this bytecode? - __ jcc(Assembler::equal, resolved); - - // resolve first time through - address entry; - switch (bytecode()) { - case Bytecodes::_getstatic : // fall through - case Bytecodes::_putstatic : // fall through - case Bytecodes::_getfield : // fall through - case Bytecodes::_putfield : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_get_put); break; - case Bytecodes::_invokevirtual : // fall through - case Bytecodes::_invokespecial : // fall through - case Bytecodes::_invokestatic : // fall through - case Bytecodes::_invokeinterface: entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invoke); break; - case Bytecodes::_invokehandle : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invokehandle); break; - case Bytecodes::_invokedynamic : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invokedynamic); break; - default: - fatal(err_msg("unexpected bytecode: %s", Bytecodes::name(bytecode()))); - break; - } - __ movl(temp, (int)bytecode()); - __ call_VM(noreg, entry, temp); - // Update registers with resolved info - __ get_cache_and_index_at_bcp(Rcache, index, 1, index_size); - __ bind(resolved); -} - - -// The cache and index registers must be set before call -void TemplateTable::load_field_cp_cache_entry(Register obj, - Register cache, - Register index, - Register off, - Register flags, - bool is_static = false) { - assert_different_registers(cache, index, flags, off); - - ByteSize cp_base_offset = ConstantPoolCache::base_offset(); - // Field offset - __ movptr(off, Address(cache, index, Address::times_ptr, - in_bytes(cp_base_offset + ConstantPoolCacheEntry::f2_offset()))); - // Flags - __ movl(flags, Address(cache, index, Address::times_ptr, - in_bytes(cp_base_offset + ConstantPoolCacheEntry::flags_offset()))); - - // klass overwrite register - if (is_static) { - __ movptr(obj, Address(cache, index, Address::times_ptr, - in_bytes(cp_base_offset + ConstantPoolCacheEntry::f1_offset()))); - const int mirror_offset = in_bytes(Klass::java_mirror_offset()); - __ movptr(obj, Address(obj, mirror_offset)); - } -} - -void TemplateTable::load_invoke_cp_cache_entry(int byte_no, - Register method, - Register itable_index, - Register flags, - bool is_invokevirtual, - bool is_invokevfinal, /*unused*/ - bool is_invokedynamic) { - // setup registers - const Register cache = rcx; - const Register index = rdx; - assert_different_registers(method, flags); - assert_different_registers(method, cache, index); - assert_different_registers(itable_index, flags); - assert_different_registers(itable_index, cache, index); - // determine constant pool cache field offsets - assert(is_invokevirtual == (byte_no == f2_byte), "is_invokevirtual flag redundant"); - const int method_offset = in_bytes( - ConstantPoolCache::base_offset() + - ((byte_no == f2_byte) - ? ConstantPoolCacheEntry::f2_offset() - : ConstantPoolCacheEntry::f1_offset())); - const int flags_offset = in_bytes(ConstantPoolCache::base_offset() + - ConstantPoolCacheEntry::flags_offset()); - // access constant pool cache fields - const int index_offset = in_bytes(ConstantPoolCache::base_offset() + - ConstantPoolCacheEntry::f2_offset()); - - size_t index_size = (is_invokedynamic ? sizeof(u4) : sizeof(u2)); - resolve_cache_and_index(byte_no, cache, index, index_size); - __ movptr(method, Address(cache, index, Address::times_ptr, method_offset)); - - if (itable_index != noreg) { - __ movptr(itable_index, Address(cache, index, Address::times_ptr, index_offset)); - } - __ movl(flags, Address(cache, index, Address::times_ptr, flags_offset)); -} - - -// The registers cache and index expected to be set before call. -// Correct values of the cache and index registers are preserved. -void TemplateTable::jvmti_post_field_access(Register cache, - Register index, - bool is_static, - bool has_tos) { - if (JvmtiExport::can_post_field_access()) { - // Check to see if a field access watch has been set before we take - // the time to call into the VM. - Label L1; - assert_different_registers(cache, index, rax); - __ mov32(rax, ExternalAddress((address) JvmtiExport::get_field_access_count_addr())); - __ testl(rax,rax); - __ jcc(Assembler::zero, L1); - - // cache entry pointer - __ addptr(cache, in_bytes(ConstantPoolCache::base_offset())); - __ shll(index, LogBytesPerWord); - __ addptr(cache, index); - if (is_static) { - __ xorptr(rax, rax); // NULL object reference - } else { - __ pop(atos); // Get the object - __ verify_oop(rax); - __ push(atos); // Restore stack state - } - // rax,: object pointer or NULL - // cache: cache entry pointer - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access), - rax, cache); - __ get_cache_and_index_at_bcp(cache, index, 1); - __ bind(L1); - } -} - -void TemplateTable::pop_and_check_object(Register r) { - __ pop_ptr(r); - __ null_check(r); // for field access must check obj. - __ verify_oop(r); -} - -void TemplateTable::getfield_or_static(int byte_no, bool is_static) { - transition(vtos, vtos); - - const Register cache = rcx; - const Register index = rdx; - const Register obj = rcx; - const Register off = rbx; - const Register flags = rax; - - resolve_cache_and_index(byte_no, cache, index, sizeof(u2)); - jvmti_post_field_access(cache, index, is_static, false); - load_field_cp_cache_entry(obj, cache, index, off, flags, is_static); - - if (!is_static) pop_and_check_object(obj); - - const Address lo(obj, off, Address::times_1, 0*wordSize); - const Address hi(obj, off, Address::times_1, 1*wordSize); - - Label Done, notByte, notInt, notShort, notChar, notLong, notFloat, notObj, notDouble; - - __ shrl(flags, ConstantPoolCacheEntry::tos_state_shift); - assert(btos == 0, "change code, btos != 0"); - // btos - __ andptr(flags, ConstantPoolCacheEntry::tos_state_mask); - __ jcc(Assembler::notZero, notByte); - - __ load_signed_byte(rax, lo ); - __ push(btos); - // Rewrite bytecode to be faster - if (!is_static) { - patch_bytecode(Bytecodes::_fast_bgetfield, rcx, rbx); - } - __ jmp(Done); - - __ bind(notByte); - // itos - __ cmpl(flags, itos ); - __ jcc(Assembler::notEqual, notInt); - - __ movl(rax, lo ); - __ push(itos); - // Rewrite bytecode to be faster - if (!is_static) { - patch_bytecode(Bytecodes::_fast_igetfield, rcx, rbx); - } - __ jmp(Done); - - __ bind(notInt); - // atos - __ cmpl(flags, atos ); - __ jcc(Assembler::notEqual, notObj); - - __ movl(rax, lo ); - __ push(atos); - if (!is_static) { - patch_bytecode(Bytecodes::_fast_agetfield, rcx, rbx); - } - __ jmp(Done); - - __ bind(notObj); - // ctos - __ cmpl(flags, ctos ); - __ jcc(Assembler::notEqual, notChar); - - __ load_unsigned_short(rax, lo ); - __ push(ctos); - if (!is_static) { - patch_bytecode(Bytecodes::_fast_cgetfield, rcx, rbx); - } - __ jmp(Done); - - __ bind(notChar); - // stos - __ cmpl(flags, stos ); - __ jcc(Assembler::notEqual, notShort); - - __ load_signed_short(rax, lo ); - __ push(stos); - if (!is_static) { - patch_bytecode(Bytecodes::_fast_sgetfield, rcx, rbx); - } - __ jmp(Done); - - __ bind(notShort); - // ltos - __ cmpl(flags, ltos ); - __ jcc(Assembler::notEqual, notLong); - - // Generate code as if volatile. There just aren't enough registers to - // save that information and this code is faster than the test. - __ fild_d(lo); // Must load atomically - __ subptr(rsp,2*wordSize); // Make space for store - __ fistp_d(Address(rsp,0)); - __ pop(rax); - __ pop(rdx); - - __ push(ltos); - // Don't rewrite to _fast_lgetfield for potential volatile case. - __ jmp(Done); - - __ bind(notLong); - // ftos - __ cmpl(flags, ftos ); - __ jcc(Assembler::notEqual, notFloat); - - __ fld_s(lo); - __ push(ftos); - if (!is_static) { - patch_bytecode(Bytecodes::_fast_fgetfield, rcx, rbx); - } - __ jmp(Done); - - __ bind(notFloat); - // dtos - __ cmpl(flags, dtos ); - __ jcc(Assembler::notEqual, notDouble); - - __ fld_d(lo); - __ push(dtos); - if (!is_static) { - patch_bytecode(Bytecodes::_fast_dgetfield, rcx, rbx); - } - __ jmpb(Done); - - __ bind(notDouble); - - __ stop("Bad state"); - - __ bind(Done); - // Doug Lea believes this is not needed with current Sparcs (TSO) and Intel (PSO). - // volatile_barrier( ); -} - - -void TemplateTable::getfield(int byte_no) { - getfield_or_static(byte_no, false); -} - - -void TemplateTable::getstatic(int byte_no) { - getfield_or_static(byte_no, true); -} - -// The registers cache and index expected to be set before call. -// The function may destroy various registers, just not the cache and index registers. -void TemplateTable::jvmti_post_field_mod(Register cache, Register index, bool is_static) { - - ByteSize cp_base_offset = ConstantPoolCache::base_offset(); - - if (JvmtiExport::can_post_field_modification()) { - // Check to see if a field modification watch has been set before we take - // the time to call into the VM. - Label L1; - assert_different_registers(cache, index, rax); - __ mov32(rax, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr())); - __ testl(rax, rax); - __ jcc(Assembler::zero, L1); - - // The cache and index registers have been already set. - // This allows to eliminate this call but the cache and index - // registers have to be correspondingly used after this line. - __ get_cache_and_index_at_bcp(rax, rdx, 1); - - if (is_static) { - // Life is simple. Null out the object pointer. - __ xorptr(rbx, rbx); - } else { - // Life is harder. The stack holds the value on top, followed by the object. - // We don't know the size of the value, though; it could be one or two words - // depending on its type. As a result, we must find the type to determine where - // the object is. - Label two_word, valsize_known; - __ movl(rcx, Address(rax, rdx, Address::times_ptr, in_bytes(cp_base_offset + - ConstantPoolCacheEntry::flags_offset()))); - __ mov(rbx, rsp); - __ shrl(rcx, ConstantPoolCacheEntry::tos_state_shift); - // Make sure we don't need to mask rcx after the above shift - ConstantPoolCacheEntry::verify_tos_state_shift(); - __ cmpl(rcx, ltos); - __ jccb(Assembler::equal, two_word); - __ cmpl(rcx, dtos); - __ jccb(Assembler::equal, two_word); - __ addptr(rbx, Interpreter::expr_offset_in_bytes(1)); // one word jvalue (not ltos, dtos) - __ jmpb(valsize_known); - - __ bind(two_word); - __ addptr(rbx, Interpreter::expr_offset_in_bytes(2)); // two words jvalue - - __ bind(valsize_known); - // setup object pointer - __ movptr(rbx, Address(rbx, 0)); - } - // cache entry pointer - __ addptr(rax, in_bytes(cp_base_offset)); - __ shll(rdx, LogBytesPerWord); - __ addptr(rax, rdx); - // object (tos) - __ mov(rcx, rsp); - // rbx,: object pointer set up above (NULL if static) - // rax,: cache entry pointer - // rcx: jvalue object on the stack - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification), - rbx, rax, rcx); - __ get_cache_and_index_at_bcp(cache, index, 1); - __ bind(L1); - } -} - - -void TemplateTable::putfield_or_static(int byte_no, bool is_static) { - transition(vtos, vtos); - - const Register cache = rcx; - const Register index = rdx; - const Register obj = rcx; - const Register off = rbx; - const Register flags = rax; - - resolve_cache_and_index(byte_no, cache, index, sizeof(u2)); - jvmti_post_field_mod(cache, index, is_static); - load_field_cp_cache_entry(obj, cache, index, off, flags, is_static); - - // Doug Lea believes this is not needed with current Sparcs (TSO) and Intel (PSO). - // volatile_barrier( ); - - Label notVolatile, Done; - __ movl(rdx, flags); - __ shrl(rdx, ConstantPoolCacheEntry::is_volatile_shift); - __ andl(rdx, 0x1); - - // field addresses - const Address lo(obj, off, Address::times_1, 0*wordSize); - const Address hi(obj, off, Address::times_1, 1*wordSize); - - Label notByte, notInt, notShort, notChar, notLong, notFloat, notObj, notDouble; - - __ shrl(flags, ConstantPoolCacheEntry::tos_state_shift); - assert(btos == 0, "change code, btos != 0"); - __ andl(flags, ConstantPoolCacheEntry::tos_state_mask); - __ jcc(Assembler::notZero, notByte); - - // btos - { - __ pop(btos); - if (!is_static) pop_and_check_object(obj); - __ movb(lo, rax); - if (!is_static) { - patch_bytecode(Bytecodes::_fast_bputfield, rcx, rbx, true, byte_no); - } - __ jmp(Done); - } - - __ bind(notByte); - __ cmpl(flags, itos); - __ jcc(Assembler::notEqual, notInt); - - // itos - { - __ pop(itos); - if (!is_static) pop_and_check_object(obj); - __ movl(lo, rax); - if (!is_static) { - patch_bytecode(Bytecodes::_fast_iputfield, rcx, rbx, true, byte_no); - } - __ jmp(Done); - } - - __ bind(notInt); - __ cmpl(flags, atos); - __ jcc(Assembler::notEqual, notObj); - - // atos - { - __ pop(atos); - if (!is_static) pop_and_check_object(obj); - do_oop_store(_masm, lo, rax, _bs->kind(), false); - if (!is_static) { - patch_bytecode(Bytecodes::_fast_aputfield, rcx, rbx, true, byte_no); - } - __ jmp(Done); - } - - __ bind(notObj); - __ cmpl(flags, ctos); - __ jcc(Assembler::notEqual, notChar); - - // ctos - { - __ pop(ctos); - if (!is_static) pop_and_check_object(obj); - __ movw(lo, rax); - if (!is_static) { - patch_bytecode(Bytecodes::_fast_cputfield, rcx, rbx, true, byte_no); - } - __ jmp(Done); - } - - __ bind(notChar); - __ cmpl(flags, stos); - __ jcc(Assembler::notEqual, notShort); - - // stos - { - __ pop(stos); - if (!is_static) pop_and_check_object(obj); - __ movw(lo, rax); - if (!is_static) { - patch_bytecode(Bytecodes::_fast_sputfield, rcx, rbx, true, byte_no); - } - __ jmp(Done); - } - - __ bind(notShort); - __ cmpl(flags, ltos); - __ jcc(Assembler::notEqual, notLong); - - // ltos - { - Label notVolatileLong; - __ testl(rdx, rdx); - __ jcc(Assembler::zero, notVolatileLong); - - __ pop(ltos); // overwrites rdx, do this after testing volatile. - if (!is_static) pop_and_check_object(obj); - - // Replace with real volatile test - __ push(rdx); - __ push(rax); // Must update atomically with FIST - __ fild_d(Address(rsp,0)); // So load into FPU register - __ fistp_d(lo); // and put into memory atomically - __ addptr(rsp, 2*wordSize); - // volatile_barrier(); - volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad | - Assembler::StoreStore)); - // Don't rewrite volatile version - __ jmp(notVolatile); - - __ bind(notVolatileLong); - - __ pop(ltos); // overwrites rdx - if (!is_static) pop_and_check_object(obj); - NOT_LP64(__ movptr(hi, rdx)); - __ movptr(lo, rax); - if (!is_static) { - patch_bytecode(Bytecodes::_fast_lputfield, rcx, rbx, true, byte_no); - } - __ jmp(notVolatile); - } - - __ bind(notLong); - __ cmpl(flags, ftos); - __ jcc(Assembler::notEqual, notFloat); - - // ftos - { - __ pop(ftos); - if (!is_static) pop_and_check_object(obj); - __ fstp_s(lo); - if (!is_static) { - patch_bytecode(Bytecodes::_fast_fputfield, rcx, rbx, true, byte_no); - } - __ jmp(Done); - } - - __ bind(notFloat); -#ifdef ASSERT - __ cmpl(flags, dtos); - __ jcc(Assembler::notEqual, notDouble); -#endif - - // dtos - { - __ pop(dtos); - if (!is_static) pop_and_check_object(obj); - __ fstp_d(lo); - if (!is_static) { - patch_bytecode(Bytecodes::_fast_dputfield, rcx, rbx, true, byte_no); - } - __ jmp(Done); - } - -#ifdef ASSERT - __ bind(notDouble); - __ stop("Bad state"); -#endif - - __ bind(Done); - - // Check for volatile store - __ testl(rdx, rdx); - __ jcc(Assembler::zero, notVolatile); - volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad | - Assembler::StoreStore)); - __ bind(notVolatile); -} - - -void TemplateTable::putfield(int byte_no) { - putfield_or_static(byte_no, false); -} - - -void TemplateTable::putstatic(int byte_no) { - putfield_or_static(byte_no, true); -} - -void TemplateTable::jvmti_post_fast_field_mod() { - if (JvmtiExport::can_post_field_modification()) { - // Check to see if a field modification watch has been set before we take - // the time to call into the VM. - Label L2; - __ mov32(rcx, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr())); - __ testl(rcx,rcx); - __ jcc(Assembler::zero, L2); - __ pop_ptr(rbx); // copy the object pointer from tos - __ verify_oop(rbx); - __ push_ptr(rbx); // put the object pointer back on tos - - // Save tos values before call_VM() clobbers them. Since we have - // to do it for every data type, we use the saved values as the - // jvalue object. - switch (bytecode()) { // load values into the jvalue object - case Bytecodes::_fast_aputfield: __ push_ptr(rax); break; - case Bytecodes::_fast_bputfield: // fall through - case Bytecodes::_fast_sputfield: // fall through - case Bytecodes::_fast_cputfield: // fall through - case Bytecodes::_fast_iputfield: __ push_i(rax); break; - case Bytecodes::_fast_dputfield: __ push_d(); break; - case Bytecodes::_fast_fputfield: __ push_f(); break; - case Bytecodes::_fast_lputfield: __ push_l(rax); break; - - default: - ShouldNotReachHere(); - } - __ mov(rcx, rsp); // points to jvalue on the stack - // access constant pool cache entry - __ get_cache_entry_pointer_at_bcp(rax, rdx, 1); - __ verify_oop(rbx); - // rbx,: object pointer copied above - // rax,: cache entry pointer - // rcx: jvalue object on the stack - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification), rbx, rax, rcx); - - switch (bytecode()) { // restore tos values - case Bytecodes::_fast_aputfield: __ pop_ptr(rax); break; - case Bytecodes::_fast_bputfield: // fall through - case Bytecodes::_fast_sputfield: // fall through - case Bytecodes::_fast_cputfield: // fall through - case Bytecodes::_fast_iputfield: __ pop_i(rax); break; - case Bytecodes::_fast_dputfield: __ pop_d(); break; - case Bytecodes::_fast_fputfield: __ pop_f(); break; - case Bytecodes::_fast_lputfield: __ pop_l(rax); break; - } - __ bind(L2); - } -} - -void TemplateTable::fast_storefield(TosState state) { - transition(state, vtos); - - ByteSize base = ConstantPoolCache::base_offset(); - - jvmti_post_fast_field_mod(); - - // access constant pool cache - __ get_cache_and_index_at_bcp(rcx, rbx, 1); - - // test for volatile with rdx but rdx is tos register for lputfield. - if (bytecode() == Bytecodes::_fast_lputfield) __ push(rdx); - __ movl(rdx, Address(rcx, rbx, Address::times_ptr, in_bytes(base + - ConstantPoolCacheEntry::flags_offset()))); - - // replace index with field offset from cache entry - __ movptr(rbx, Address(rcx, rbx, Address::times_ptr, in_bytes(base + ConstantPoolCacheEntry::f2_offset()))); - - // Doug Lea believes this is not needed with current Sparcs (TSO) and Intel (PSO). - // volatile_barrier( ); - - Label notVolatile, Done; - __ shrl(rdx, ConstantPoolCacheEntry::is_volatile_shift); - __ andl(rdx, 0x1); - // Check for volatile store - __ testl(rdx, rdx); - __ jcc(Assembler::zero, notVolatile); - - if (bytecode() == Bytecodes::_fast_lputfield) __ pop(rdx); - - // Get object from stack - pop_and_check_object(rcx); - - // field addresses - const Address lo(rcx, rbx, Address::times_1, 0*wordSize); - const Address hi(rcx, rbx, Address::times_1, 1*wordSize); - - // access field - switch (bytecode()) { - case Bytecodes::_fast_bputfield: __ movb(lo, rax); break; - case Bytecodes::_fast_sputfield: // fall through - case Bytecodes::_fast_cputfield: __ movw(lo, rax); break; - case Bytecodes::_fast_iputfield: __ movl(lo, rax); break; - case Bytecodes::_fast_lputfield: - NOT_LP64(__ movptr(hi, rdx)); - __ movptr(lo, rax); - break; - case Bytecodes::_fast_fputfield: __ fstp_s(lo); break; - case Bytecodes::_fast_dputfield: __ fstp_d(lo); break; - case Bytecodes::_fast_aputfield: { - do_oop_store(_masm, lo, rax, _bs->kind(), false); - break; - } - default: - ShouldNotReachHere(); - } - - Label done; - volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad | - Assembler::StoreStore)); - // Barriers are so large that short branch doesn't reach! - __ jmp(done); - - // Same code as above, but don't need rdx to test for volatile. - __ bind(notVolatile); - - if (bytecode() == Bytecodes::_fast_lputfield) __ pop(rdx); - - // Get object from stack - pop_and_check_object(rcx); - - // access field - switch (bytecode()) { - case Bytecodes::_fast_bputfield: __ movb(lo, rax); break; - case Bytecodes::_fast_sputfield: // fall through - case Bytecodes::_fast_cputfield: __ movw(lo, rax); break; - case Bytecodes::_fast_iputfield: __ movl(lo, rax); break; - case Bytecodes::_fast_lputfield: - NOT_LP64(__ movptr(hi, rdx)); - __ movptr(lo, rax); - break; - case Bytecodes::_fast_fputfield: __ fstp_s(lo); break; - case Bytecodes::_fast_dputfield: __ fstp_d(lo); break; - case Bytecodes::_fast_aputfield: { - do_oop_store(_masm, lo, rax, _bs->kind(), false); - break; - } - default: - ShouldNotReachHere(); - } - __ bind(done); -} - - -void TemplateTable::fast_accessfield(TosState state) { - transition(atos, state); - - // do the JVMTI work here to avoid disturbing the register state below - if (JvmtiExport::can_post_field_access()) { - // Check to see if a field access watch has been set before we take - // the time to call into the VM. - Label L1; - __ mov32(rcx, ExternalAddress((address) JvmtiExport::get_field_access_count_addr())); - __ testl(rcx,rcx); - __ jcc(Assembler::zero, L1); - // access constant pool cache entry - __ get_cache_entry_pointer_at_bcp(rcx, rdx, 1); - __ push_ptr(rax); // save object pointer before call_VM() clobbers it - __ verify_oop(rax); - // rax,: object pointer copied above - // rcx: cache entry pointer - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access), rax, rcx); - __ pop_ptr(rax); // restore object pointer - __ bind(L1); - } - - // access constant pool cache - __ get_cache_and_index_at_bcp(rcx, rbx, 1); - // replace index with field offset from cache entry - __ movptr(rbx, Address(rcx, - rbx, - Address::times_ptr, - in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::f2_offset()))); - - - // rax,: object - __ verify_oop(rax); - __ null_check(rax); - // field addresses - const Address lo = Address(rax, rbx, Address::times_1, 0*wordSize); - const Address hi = Address(rax, rbx, Address::times_1, 1*wordSize); - - // access field - switch (bytecode()) { - case Bytecodes::_fast_bgetfield: __ movsbl(rax, lo ); break; - case Bytecodes::_fast_sgetfield: __ load_signed_short(rax, lo ); break; - case Bytecodes::_fast_cgetfield: __ load_unsigned_short(rax, lo ); break; - case Bytecodes::_fast_igetfield: __ movl(rax, lo); break; - case Bytecodes::_fast_lgetfield: __ stop("should not be rewritten"); break; - case Bytecodes::_fast_fgetfield: __ fld_s(lo); break; - case Bytecodes::_fast_dgetfield: __ fld_d(lo); break; - case Bytecodes::_fast_agetfield: __ movptr(rax, lo); __ verify_oop(rax); break; - default: - ShouldNotReachHere(); - } - - // Doug Lea believes this is not needed with current Sparcs(TSO) and Intel(PSO) - // volatile_barrier( ); -} - -void TemplateTable::fast_xaccess(TosState state) { - transition(vtos, state); - // get receiver - __ movptr(rax, aaddress(0)); - // access constant pool cache - __ get_cache_and_index_at_bcp(rcx, rdx, 2); - __ movptr(rbx, Address(rcx, - rdx, - Address::times_ptr, - in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::f2_offset()))); - // make sure exception is reported in correct bcp range (getfield is next instruction) - __ increment(rsi); - __ null_check(rax); - const Address lo = Address(rax, rbx, Address::times_1, 0*wordSize); - if (state == itos) { - __ movl(rax, lo); - } else if (state == atos) { - __ movptr(rax, lo); - __ verify_oop(rax); - } else if (state == ftos) { - __ fld_s(lo); - } else { - ShouldNotReachHere(); - } - __ decrement(rsi); -} - - - -//---------------------------------------------------------------------------------------------------- -// Calls - -void TemplateTable::count_calls(Register method, Register temp) { - // implemented elsewhere - ShouldNotReachHere(); -} - - -void TemplateTable::prepare_invoke(int byte_no, - Register method, // linked method (or i-klass) - Register index, // itable index, MethodType, etc. - Register recv, // if caller wants to see it - Register flags // if caller wants to test it - ) { - // determine flags - const Bytecodes::Code code = bytecode(); - const bool is_invokeinterface = code == Bytecodes::_invokeinterface; - const bool is_invokedynamic = code == Bytecodes::_invokedynamic; - const bool is_invokehandle = code == Bytecodes::_invokehandle; - const bool is_invokevirtual = code == Bytecodes::_invokevirtual; - const bool is_invokespecial = code == Bytecodes::_invokespecial; - const bool load_receiver = (recv != noreg); - const bool save_flags = (flags != noreg); - assert(load_receiver == (code != Bytecodes::_invokestatic && code != Bytecodes::_invokedynamic), ""); - assert(save_flags == (is_invokeinterface || is_invokevirtual), "need flags for vfinal"); - assert(flags == noreg || flags == rdx, ""); - assert(recv == noreg || recv == rcx, ""); - - // setup registers & access constant pool cache - if (recv == noreg) recv = rcx; - if (flags == noreg) flags = rdx; - assert_different_registers(method, index, recv, flags); - - // save 'interpreter return address' - __ save_bcp(); - - load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual, false, is_invokedynamic); - - // maybe push appendix to arguments (just before return address) - if (is_invokedynamic || is_invokehandle) { - Label L_no_push; - __ testl(flags, (1 << ConstantPoolCacheEntry::has_appendix_shift)); - __ jccb(Assembler::zero, L_no_push); - // Push the appendix as a trailing parameter. - // This must be done before we get the receiver, - // since the parameter_size includes it. - __ push(rbx); - __ mov(rbx, index); - assert(ConstantPoolCacheEntry::_indy_resolved_references_appendix_offset == 0, "appendix expected at index+0"); - __ load_resolved_reference_at_index(index, rbx); - __ pop(rbx); - __ push(index); // push appendix (MethodType, CallSite, etc.) - __ bind(L_no_push); - } - - // load receiver if needed (note: no return address pushed yet) - if (load_receiver) { - __ movl(recv, flags); - __ andl(recv, ConstantPoolCacheEntry::parameter_size_mask); - const int no_return_pc_pushed_yet = -1; // argument slot correction before we push return address - const int receiver_is_at_end = -1; // back off one slot to get receiver - Address recv_addr = __ argument_address(recv, no_return_pc_pushed_yet + receiver_is_at_end); - __ movptr(recv, recv_addr); - __ verify_oop(recv); - } - - if (save_flags) { - __ mov(rsi, flags); - } - - // compute return type - __ shrl(flags, ConstantPoolCacheEntry::tos_state_shift); - // Make sure we don't need to mask flags after the above shift - ConstantPoolCacheEntry::verify_tos_state_shift(); - // load return address - { - const address table_addr = (address) Interpreter::invoke_return_entry_table_for(code); - ExternalAddress table(table_addr); - __ movptr(flags, ArrayAddress(table, Address(noreg, flags, Address::times_ptr))); - } - - // push return address - __ push(flags); - - // Restore flags value from the constant pool cache, and restore rsi - // for later null checks. rsi is the bytecode pointer - if (save_flags) { - __ mov(flags, rsi); - __ restore_bcp(); - } -} - - -void TemplateTable::invokevirtual_helper(Register index, - Register recv, - Register flags) { - // Uses temporary registers rax, rdx - assert_different_registers(index, recv, rax, rdx); - assert(index == rbx, ""); - assert(recv == rcx, ""); - - // Test for an invoke of a final method - Label notFinal; - __ movl(rax, flags); - __ andl(rax, (1 << ConstantPoolCacheEntry::is_vfinal_shift)); - __ jcc(Assembler::zero, notFinal); - - const Register method = index; // method must be rbx - assert(method == rbx, - "Method* must be rbx for interpreter calling convention"); - - // do the call - the index is actually the method to call - // that is, f2 is a vtable index if !is_vfinal, else f2 is a Method* - - // It's final, need a null check here! - __ null_check(recv); - - // profile this call - __ profile_final_call(rax); - __ profile_arguments_type(rax, method, rsi, true); - - __ jump_from_interpreted(method, rax); - - __ bind(notFinal); - - // get receiver klass - __ null_check(recv, oopDesc::klass_offset_in_bytes()); - __ load_klass(rax, recv); - - // profile this call - __ profile_virtual_call(rax, rdi, rdx); - - // get target Method* & entry point - __ lookup_virtual_method(rax, index, method); - __ profile_arguments_type(rdx, method, rsi, true); - __ jump_from_interpreted(method, rdx); -} - - -void TemplateTable::invokevirtual(int byte_no) { - transition(vtos, vtos); - assert(byte_no == f2_byte, "use this argument"); - prepare_invoke(byte_no, - rbx, // method or vtable index - noreg, // unused itable index - rcx, rdx); // recv, flags - - // rbx: index - // rcx: receiver - // rdx: flags - - invokevirtual_helper(rbx, rcx, rdx); -} - - -void TemplateTable::invokespecial(int byte_no) { - transition(vtos, vtos); - assert(byte_no == f1_byte, "use this argument"); - prepare_invoke(byte_no, rbx, noreg, // get f1 Method* - rcx); // get receiver also for null check - __ verify_oop(rcx); - __ null_check(rcx); - // do the call - __ profile_call(rax); - __ profile_arguments_type(rax, rbx, rsi, false); - __ jump_from_interpreted(rbx, rax); -} - - -void TemplateTable::invokestatic(int byte_no) { - transition(vtos, vtos); - assert(byte_no == f1_byte, "use this argument"); - prepare_invoke(byte_no, rbx); // get f1 Method* - // do the call - __ profile_call(rax); - __ profile_arguments_type(rax, rbx, rsi, false); - __ jump_from_interpreted(rbx, rax); -} - - -void TemplateTable::fast_invokevfinal(int byte_no) { - transition(vtos, vtos); - assert(byte_no == f2_byte, "use this argument"); - __ stop("fast_invokevfinal not used on x86"); -} - - -void TemplateTable::invokeinterface(int byte_no) { - transition(vtos, vtos); - assert(byte_no == f1_byte, "use this argument"); - prepare_invoke(byte_no, rax, rbx, // get f1 Klass*, f2 itable index - rcx, rdx); // recv, flags - - // rax: interface klass (from f1) - // rbx: itable index (from f2) - // rcx: receiver - // rdx: flags - - // Special case of invokeinterface called for virtual method of - // java.lang.Object. See cpCacheOop.cpp for details. - // This code isn't produced by javac, but could be produced by - // another compliant java compiler. - Label notMethod; - __ movl(rdi, rdx); - __ andl(rdi, (1 << ConstantPoolCacheEntry::is_forced_virtual_shift)); - __ jcc(Assembler::zero, notMethod); - - invokevirtual_helper(rbx, rcx, rdx); - __ bind(notMethod); - - // Get receiver klass into rdx - also a null check - __ restore_locals(); // restore rdi - __ null_check(rcx, oopDesc::klass_offset_in_bytes()); - __ load_klass(rdx, rcx); - - // profile this call - __ profile_virtual_call(rdx, rsi, rdi); - - Label no_such_interface, no_such_method; - - __ lookup_interface_method(// inputs: rec. class, interface, itable index - rdx, rax, rbx, - // outputs: method, scan temp. reg - rbx, rsi, - no_such_interface); - - // rbx: Method* to call - // rcx: receiver - // Check for abstract method error - // Note: This should be done more efficiently via a throw_abstract_method_error - // interpreter entry point and a conditional jump to it in case of a null - // method. - __ testptr(rbx, rbx); - __ jcc(Assembler::zero, no_such_method); - - __ profile_arguments_type(rdx, rbx, rsi, true); - - // do the call - // rcx: receiver - // rbx,: Method* - __ jump_from_interpreted(rbx, rdx); - __ should_not_reach_here(); - - // exception handling code follows... - // note: must restore interpreter registers to canonical - // state for exception handling to work correctly! - - __ bind(no_such_method); - // throw exception - __ pop(rbx); // pop return address (pushed by prepare_invoke) - __ restore_bcp(); // rsi must be correct for exception handler (was destroyed) - __ restore_locals(); // make sure locals pointer is correct as well (was destroyed) - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError)); - // the call_VM checks for exception, so we should never return here. - __ should_not_reach_here(); - - __ bind(no_such_interface); - // throw exception - __ pop(rbx); // pop return address (pushed by prepare_invoke) - __ restore_bcp(); // rsi must be correct for exception handler (was destroyed) - __ restore_locals(); // make sure locals pointer is correct as well (was destroyed) - __ call_VM(noreg, CAST_FROM_FN_PTR(address, - InterpreterRuntime::throw_IncompatibleClassChangeError)); - // the call_VM checks for exception, so we should never return here. - __ should_not_reach_here(); -} - -void TemplateTable::invokehandle(int byte_no) { - transition(vtos, vtos); - assert(byte_no == f1_byte, "use this argument"); - const Register rbx_method = rbx; - const Register rax_mtype = rax; - const Register rcx_recv = rcx; - const Register rdx_flags = rdx; - - prepare_invoke(byte_no, rbx_method, rax_mtype, rcx_recv); - __ verify_method_ptr(rbx_method); - __ verify_oop(rcx_recv); - __ null_check(rcx_recv); - - // rax: MethodType object (from cpool->resolved_references[f1], if necessary) - // rbx: MH.invokeExact_MT method (from f2) - - // Note: rax_mtype is already pushed (if necessary) by prepare_invoke - - // FIXME: profile the LambdaForm also - __ profile_final_call(rax); - __ profile_arguments_type(rdx, rbx_method, rsi, true); - - __ jump_from_interpreted(rbx_method, rdx); -} - - -void TemplateTable::invokedynamic(int byte_no) { - transition(vtos, vtos); - assert(byte_no == f1_byte, "use this argument"); - - const Register rbx_method = rbx; - const Register rax_callsite = rax; - - prepare_invoke(byte_no, rbx_method, rax_callsite); - - // rax: CallSite object (from cpool->resolved_references[f1]) - // rbx: MH.linkToCallSite method (from f2) - - // Note: rax_callsite is already pushed by prepare_invoke - - // %%% should make a type profile for any invokedynamic that takes a ref argument - // profile this call - __ profile_call(rsi); - __ profile_arguments_type(rdx, rbx, rsi, false); - - __ verify_oop(rax_callsite); - - __ jump_from_interpreted(rbx_method, rdx); -} - -//---------------------------------------------------------------------------------------------------- -// Allocation - -void TemplateTable::_new() { - transition(vtos, atos); - __ get_unsigned_2_byte_index_at_bcp(rdx, 1); - Label slow_case; - Label slow_case_no_pop; - Label done; - Label initialize_header; - Label initialize_object; // including clearing the fields - Label allocate_shared; - - __ get_cpool_and_tags(rcx, rax); - - // Make sure the class we're about to instantiate has been resolved. - // This is done before loading InstanceKlass to be consistent with the order - // how Constant Pool is updated (see ConstantPool::klass_at_put) - const int tags_offset = Array::base_offset_in_bytes(); - __ cmpb(Address(rax, rdx, Address::times_1, tags_offset), JVM_CONSTANT_Class); - __ jcc(Assembler::notEqual, slow_case_no_pop); - - // get InstanceKlass - __ movptr(rcx, Address(rcx, rdx, Address::times_ptr, sizeof(ConstantPool))); - __ push(rcx); // save the contexts of klass for initializing the header - - // make sure klass is initialized & doesn't have finalizer - // make sure klass is fully initialized - __ cmpb(Address(rcx, InstanceKlass::init_state_offset()), InstanceKlass::fully_initialized); - __ jcc(Assembler::notEqual, slow_case); - - // get instance_size in InstanceKlass (scaled to a count of bytes) - __ movl(rdx, Address(rcx, Klass::layout_helper_offset())); - // test to see if it has a finalizer or is malformed in some way - __ testl(rdx, Klass::_lh_instance_slow_path_bit); - __ jcc(Assembler::notZero, slow_case); - - // - // Allocate the instance - // 1) Try to allocate in the TLAB - // 2) if fail and the object is large allocate in the shared Eden - // 3) if the above fails (or is not applicable), go to a slow case - // (creates a new TLAB, etc.) - - const bool allow_shared_alloc = - Universe::heap()->supports_inline_contig_alloc(); - - const Register thread = rcx; - if (UseTLAB || allow_shared_alloc) { - __ get_thread(thread); - } - - if (UseTLAB) { - __ movptr(rax, Address(thread, in_bytes(JavaThread::tlab_top_offset()))); - __ lea(rbx, Address(rax, rdx, Address::times_1)); - __ cmpptr(rbx, Address(thread, in_bytes(JavaThread::tlab_end_offset()))); - __ jcc(Assembler::above, allow_shared_alloc ? allocate_shared : slow_case); - __ movptr(Address(thread, in_bytes(JavaThread::tlab_top_offset())), rbx); - if (ZeroTLAB) { - // the fields have been already cleared - __ jmp(initialize_header); - } else { - // initialize both the header and fields - __ jmp(initialize_object); - } - } - - // Allocation in the shared Eden, if allowed. - // - // rdx: instance size in bytes - if (allow_shared_alloc) { - __ bind(allocate_shared); - - ExternalAddress heap_top((address)Universe::heap()->top_addr()); - - Label retry; - __ bind(retry); - __ movptr(rax, heap_top); - __ lea(rbx, Address(rax, rdx, Address::times_1)); - __ cmpptr(rbx, ExternalAddress((address)Universe::heap()->end_addr())); - __ jcc(Assembler::above, slow_case); - - // Compare rax, with the top addr, and if still equal, store the new - // top addr in rbx, at the address of the top addr pointer. Sets ZF if was - // equal, and clears it otherwise. Use lock prefix for atomicity on MPs. - // - // rax,: object begin - // rbx,: object end - // rdx: instance size in bytes - __ locked_cmpxchgptr(rbx, heap_top); - - // if someone beat us on the allocation, try again, otherwise continue - __ jcc(Assembler::notEqual, retry); - - __ incr_allocated_bytes(thread, rdx, 0); - } - - if (UseTLAB || Universe::heap()->supports_inline_contig_alloc()) { - // The object is initialized before the header. If the object size is - // zero, go directly to the header initialization. - __ bind(initialize_object); - __ decrement(rdx, sizeof(oopDesc)); - __ jcc(Assembler::zero, initialize_header); - - // Initialize topmost object field, divide rdx by 8, check if odd and - // test if zero. - __ xorl(rcx, rcx); // use zero reg to clear memory (shorter code) - __ shrl(rdx, LogBytesPerLong); // divide by 2*oopSize and set carry flag if odd - - // rdx must have been multiple of 8 -#ifdef ASSERT - // make sure rdx was multiple of 8 - Label L; - // Ignore partial flag stall after shrl() since it is debug VM - __ jccb(Assembler::carryClear, L); - __ stop("object size is not multiple of 2 - adjust this code"); - __ bind(L); - // rdx must be > 0, no extra check needed here -#endif - - // initialize remaining object fields: rdx was a multiple of 8 - { Label loop; - __ bind(loop); - __ movptr(Address(rax, rdx, Address::times_8, sizeof(oopDesc) - 1*oopSize), rcx); - NOT_LP64(__ movptr(Address(rax, rdx, Address::times_8, sizeof(oopDesc) - 2*oopSize), rcx)); - __ decrement(rdx); - __ jcc(Assembler::notZero, loop); - } - - // initialize object header only. - __ bind(initialize_header); - if (UseBiasedLocking) { - __ pop(rcx); // get saved klass back in the register. - __ movptr(rbx, Address(rcx, Klass::prototype_header_offset())); - __ movptr(Address(rax, oopDesc::mark_offset_in_bytes ()), rbx); - } else { - __ movptr(Address(rax, oopDesc::mark_offset_in_bytes ()), - (int32_t)markOopDesc::prototype()); // header - __ pop(rcx); // get saved klass back in the register. - } - __ store_klass(rax, rcx); // klass - - { - SkipIfEqual skip_if(_masm, &DTraceAllocProbes, 0); - // Trigger dtrace event for fastpath - __ push(atos); - __ call_VM_leaf( - CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc), rax); - __ pop(atos); - } - - __ jmp(done); - } - - // slow case - __ bind(slow_case); - __ pop(rcx); // restore stack pointer to what it was when we came in. - __ bind(slow_case_no_pop); - __ get_constant_pool(rax); - __ get_unsigned_2_byte_index_at_bcp(rdx, 1); - call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), rax, rdx); - - // continue - __ bind(done); -} - - -void TemplateTable::newarray() { - transition(itos, atos); - __ push_i(rax); // make sure everything is on the stack - __ load_unsigned_byte(rdx, at_bcp(1)); - call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::newarray), rdx, rax); - __ pop_i(rdx); // discard size -} - - -void TemplateTable::anewarray() { - transition(itos, atos); - __ get_unsigned_2_byte_index_at_bcp(rdx, 1); - __ get_constant_pool(rcx); - call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray), rcx, rdx, rax); -} - - -void TemplateTable::arraylength() { - transition(atos, itos); - __ null_check(rax, arrayOopDesc::length_offset_in_bytes()); - __ movl(rax, Address(rax, arrayOopDesc::length_offset_in_bytes())); -} - - -void TemplateTable::checkcast() { - transition(atos, atos); - Label done, is_null, ok_is_subtype, quicked, resolved; - __ testptr(rax, rax); // Object is in EAX - __ jcc(Assembler::zero, is_null); - - // Get cpool & tags index - __ get_cpool_and_tags(rcx, rdx); // ECX=cpool, EDX=tags array - __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // EBX=index - // See if bytecode has already been quicked - __ cmpb(Address(rdx, rbx, Address::times_1, Array::base_offset_in_bytes()), JVM_CONSTANT_Class); - __ jcc(Assembler::equal, quicked); - - __ push(atos); - call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc) ); - // vm_result_2 has metadata result - // borrow rdi from locals - __ get_thread(rdi); - __ get_vm_result_2(rax, rdi); - __ restore_locals(); - __ pop_ptr(rdx); - __ jmpb(resolved); - - // Get superklass in EAX and subklass in EBX - __ bind(quicked); - __ mov(rdx, rax); // Save object in EDX; EAX needed for subtype check - __ movptr(rax, Address(rcx, rbx, Address::times_ptr, sizeof(ConstantPool))); - - __ bind(resolved); - __ load_klass(rbx, rdx); - - // Generate subtype check. Blows ECX. Resets EDI. Object in EDX. - // Superklass in EAX. Subklass in EBX. - __ gen_subtype_check( rbx, ok_is_subtype ); - - // Come here on failure - __ push(rdx); - // object is at TOS - __ jump(ExternalAddress(Interpreter::_throw_ClassCastException_entry)); - - // Come here on success - __ bind(ok_is_subtype); - __ mov(rax,rdx); // Restore object in EDX - - // Collect counts on whether this check-cast sees NULLs a lot or not. - if (ProfileInterpreter) { - __ jmp(done); - __ bind(is_null); - __ profile_null_seen(rcx); - } else { - __ bind(is_null); // same as 'done' - } - __ bind(done); -} - - -void TemplateTable::instanceof() { - transition(atos, itos); - Label done, is_null, ok_is_subtype, quicked, resolved; - __ testptr(rax, rax); - __ jcc(Assembler::zero, is_null); - - // Get cpool & tags index - __ get_cpool_and_tags(rcx, rdx); // ECX=cpool, EDX=tags array - __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // EBX=index - // See if bytecode has already been quicked - __ cmpb(Address(rdx, rbx, Address::times_1, Array::base_offset_in_bytes()), JVM_CONSTANT_Class); - __ jcc(Assembler::equal, quicked); - - __ push(atos); - call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc) ); - // vm_result_2 has metadata result - // borrow rdi from locals - __ get_thread(rdi); - __ get_vm_result_2(rax, rdi); - __ restore_locals(); - __ pop_ptr(rdx); - __ load_klass(rdx, rdx); - __ jmp(resolved); - - // Get superklass in EAX and subklass in EDX - __ bind(quicked); - __ load_klass(rdx, rax); - __ movptr(rax, Address(rcx, rbx, Address::times_ptr, sizeof(ConstantPool))); - - __ bind(resolved); - - // Generate subtype check. Blows ECX. Resets EDI. - // Superklass in EAX. Subklass in EDX. - __ gen_subtype_check( rdx, ok_is_subtype ); - - // Come here on failure - __ xorl(rax,rax); - __ jmpb(done); - // Come here on success - __ bind(ok_is_subtype); - __ movl(rax, 1); - - // Collect counts on whether this test sees NULLs a lot or not. - if (ProfileInterpreter) { - __ jmp(done); - __ bind(is_null); - __ profile_null_seen(rcx); - } else { - __ bind(is_null); // same as 'done' - } - __ bind(done); - // rax, = 0: obj == NULL or obj is not an instanceof the specified klass - // rax, = 1: obj != NULL and obj is an instanceof the specified klass -} - - -//---------------------------------------------------------------------------------------------------- -// Breakpoints -void TemplateTable::_breakpoint() { - - // Note: We get here even if we are single stepping.. - // jbug inists on setting breakpoints at every bytecode - // even if we are in single step mode. - - transition(vtos, vtos); - - // get the unpatched byte code - __ get_method(rcx); - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::get_original_bytecode_at), rcx, rsi); - __ mov(rbx, rax); - - // post the breakpoint event - __ get_method(rcx); - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::_breakpoint), rcx, rsi); - - // complete the execution of original bytecode - __ dispatch_only_normal(vtos); -} - - -//---------------------------------------------------------------------------------------------------- -// Exceptions - -void TemplateTable::athrow() { - transition(atos, vtos); - __ null_check(rax); - __ jump(ExternalAddress(Interpreter::throw_exception_entry())); -} - - -//---------------------------------------------------------------------------------------------------- -// Synchronization -// -// Note: monitorenter & exit are symmetric routines; which is reflected -// in the assembly code structure as well -// -// Stack layout: -// -// [expressions ] <--- rsp = expression stack top -// .. -// [expressions ] -// [monitor entry] <--- monitor block top = expression stack bot -// .. -// [monitor entry] -// [frame data ] <--- monitor block bot -// ... -// [saved rbp, ] <--- rbp, - - -void TemplateTable::monitorenter() { - transition(atos, vtos); - - // check for NULL object - __ null_check(rax); - - const Address monitor_block_top(rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize); - const Address monitor_block_bot(rbp, frame::interpreter_frame_initial_sp_offset * wordSize); - const int entry_size = ( frame::interpreter_frame_monitor_size() * wordSize); - Label allocated; - - // initialize entry pointer - __ xorl(rdx, rdx); // points to free slot or NULL - - // find a free slot in the monitor block (result in rdx) - { Label entry, loop, exit; - __ movptr(rcx, monitor_block_top); // points to current entry, starting with top-most entry - - __ lea(rbx, monitor_block_bot); // points to word before bottom of monitor block - __ jmpb(entry); - - __ bind(loop); - __ cmpptr(Address(rcx, BasicObjectLock::obj_offset_in_bytes()), (int32_t)NULL_WORD); // check if current entry is used - __ cmovptr(Assembler::equal, rdx, rcx); // if not used then remember entry in rdx - __ cmpptr(rax, Address(rcx, BasicObjectLock::obj_offset_in_bytes())); // check if current entry is for same object - __ jccb(Assembler::equal, exit); // if same object then stop searching - __ addptr(rcx, entry_size); // otherwise advance to next entry - __ bind(entry); - __ cmpptr(rcx, rbx); // check if bottom reached - __ jcc(Assembler::notEqual, loop); // if not at bottom then check this entry - __ bind(exit); - } - - __ testptr(rdx, rdx); // check if a slot has been found - __ jccb(Assembler::notZero, allocated); // if found, continue with that one - - // allocate one if there's no free slot - { Label entry, loop; - // 1. compute new pointers // rsp: old expression stack top - __ movptr(rdx, monitor_block_bot); // rdx: old expression stack bottom - __ subptr(rsp, entry_size); // move expression stack top - __ subptr(rdx, entry_size); // move expression stack bottom - __ mov(rcx, rsp); // set start value for copy loop - __ movptr(monitor_block_bot, rdx); // set new monitor block top - __ jmp(entry); - // 2. move expression stack contents - __ bind(loop); - __ movptr(rbx, Address(rcx, entry_size)); // load expression stack word from old location - __ movptr(Address(rcx, 0), rbx); // and store it at new location - __ addptr(rcx, wordSize); // advance to next word - __ bind(entry); - __ cmpptr(rcx, rdx); // check if bottom reached - __ jcc(Assembler::notEqual, loop); // if not at bottom then copy next word - } - - // call run-time routine - // rdx: points to monitor entry - __ bind(allocated); - - // Increment bcp to point to the next bytecode, so exception handling for async. exceptions work correctly. - // The object has already been poped from the stack, so the expression stack looks correct. - __ increment(rsi); - - __ movptr(Address(rdx, BasicObjectLock::obj_offset_in_bytes()), rax); // store object - __ lock_object(rdx); - - // check to make sure this monitor doesn't cause stack overflow after locking - __ save_bcp(); // in case of exception - __ generate_stack_overflow_check(0); - - // The bcp has already been incremented. Just need to dispatch to next instruction. - __ dispatch_next(vtos); -} - - -void TemplateTable::monitorexit() { - transition(atos, vtos); - - // check for NULL object - __ null_check(rax); - - const Address monitor_block_top(rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize); - const Address monitor_block_bot(rbp, frame::interpreter_frame_initial_sp_offset * wordSize); - const int entry_size = ( frame::interpreter_frame_monitor_size() * wordSize); - Label found; - - // find matching slot - { Label entry, loop; - __ movptr(rdx, monitor_block_top); // points to current entry, starting with top-most entry - __ lea(rbx, monitor_block_bot); // points to word before bottom of monitor block - __ jmpb(entry); - - __ bind(loop); - __ cmpptr(rax, Address(rdx, BasicObjectLock::obj_offset_in_bytes())); // check if current entry is for same object - __ jcc(Assembler::equal, found); // if same object then stop searching - __ addptr(rdx, entry_size); // otherwise advance to next entry - __ bind(entry); - __ cmpptr(rdx, rbx); // check if bottom reached - __ jcc(Assembler::notEqual, loop); // if not at bottom then check this entry - } - - // error handling. Unlocking was not block-structured - Label end; - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_illegal_monitor_state_exception)); - __ should_not_reach_here(); - - // call run-time routine - // rcx: points to monitor entry - __ bind(found); - __ push_ptr(rax); // make sure object is on stack (contract with oopMaps) - __ unlock_object(rdx); - __ pop_ptr(rax); // discard object - __ bind(end); -} - - -//---------------------------------------------------------------------------------------------------- -// Wide instructions - -void TemplateTable::wide() { - transition(vtos, vtos); - __ load_unsigned_byte(rbx, at_bcp(1)); - ExternalAddress wtable((address)Interpreter::_wentry_point); - __ jump(ArrayAddress(wtable, Address(noreg, rbx, Address::times_ptr))); - // Note: the rsi increment step is part of the individual wide bytecode implementations -} - - -//---------------------------------------------------------------------------------------------------- -// Multi arrays - -void TemplateTable::multianewarray() { - transition(vtos, atos); - __ load_unsigned_byte(rax, at_bcp(3)); // get number of dimensions - // last dim is on top of stack; we want address of first one: - // first_addr = last_addr + (ndims - 1) * stackElementSize - 1*wordsize - // the latter wordSize to point to the beginning of the array. - __ lea( rax, Address(rsp, rax, Interpreter::stackElementScale(), -wordSize)); - call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray), rax); // pass in rax, - __ load_unsigned_byte(rbx, at_bcp(3)); - __ lea(rsp, Address(rsp, rbx, Interpreter::stackElementScale())); // get rid of counts -} - -#endif /* !CC_INTERP */ From 1c5857f8dddb09330f28f42762e407b43296e100 Mon Sep 17 00:00:00 2001 From: Jaroslav Bachorik Date: Tue, 10 Mar 2015 09:37:56 +0100 Subject: [PATCH 27/82] 6712222: Race condition in java/lang/management/ThreadMXBean/AllThreadIds.java Reviewed-by: dholmes, dfuchs --- .../management/ThreadMXBean/AllThreadIds.java | 99 +++++++++---------- 1 file changed, 49 insertions(+), 50 deletions(-) diff --git a/jdk/test/java/lang/management/ThreadMXBean/AllThreadIds.java b/jdk/test/java/lang/management/ThreadMXBean/AllThreadIds.java index 05547b78001..aa80c746cf2 100644 --- a/jdk/test/java/lang/management/ThreadMXBean/AllThreadIds.java +++ b/jdk/test/java/lang/management/ThreadMXBean/AllThreadIds.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, Oracle and/or its affiliates. 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 @@ -27,21 +27,19 @@ * @summary Basic unit test of ThreadMXBean.getAllThreadIds() * @author Alexei Guibadoulline and Mandy Chung * - * @run build Barrier * @run main/othervm AllThreadIds */ import java.lang.management.*; -import java.util.*; +import java.util.concurrent.Phaser; public class AllThreadIds { final static int DAEMON_THREADS = 20; final static int USER_THREADS = 5; final static int ALL_THREADS = DAEMON_THREADS + USER_THREADS; - private static volatile boolean live[] = new boolean[ALL_THREADS]; - private static Thread allThreads[] = new Thread[ALL_THREADS]; - private static ThreadMXBean mbean - = ManagementFactory.getThreadMXBean(); + private static final boolean live[] = new boolean[ALL_THREADS]; + private static final Thread allThreads[] = new Thread[ALL_THREADS]; + private static final ThreadMXBean mbean = ManagementFactory.getThreadMXBean(); private static boolean testFailed = false; private static boolean trace = false; @@ -52,8 +50,7 @@ public class AllThreadIds { private static int curLiveThreadCount = 0; private static int curPeakThreadCount = 0; - // barrier for threads communication - private static Barrier barrier = new Barrier(ALL_THREADS); + private static final Phaser startupCheck = new Phaser(ALL_THREADS + 1); private static void printThreadList() { if (!trace) return; @@ -124,18 +121,15 @@ public class AllThreadIds { curPeakThreadCount = mbean.getPeakThreadCount(); checkThreadCount(0, 0); - // Start all threads and wait to be sure they all are alive - barrier.set(ALL_THREADS); for (int i = 0; i < ALL_THREADS; i++) { - live[i] = true; + setLive(i, true); allThreads[i] = new MyThread(i); - allThreads[i].setDaemon( (i < DAEMON_THREADS) ? true : false); + allThreads[i].setDaemon(i < DAEMON_THREADS); allThreads[i].start(); } // wait until all threads are started. - barrier.await(); - + startupCheck.arriveAndAwaitAdvance(); checkThreadCount(ALL_THREADS, 0); printThreadList(); @@ -173,15 +167,14 @@ public class AllThreadIds { // Stop daemon threads, wait to be sure they all are dead, and check // that they disappeared from getAllThreadIds() list - barrier.set(DAEMON_THREADS); for (int i = 0; i < DAEMON_THREADS; i++) { - live[i] = false; + setLive(i, false); } - // wait until daemon threads are terminated. - barrier.await(); - // give chance to threads to terminate - pause(); + // make sure the daemon threads are completely dead + joinDaemonThreads(); + + // and check the reported thread count checkThreadCount(0, DAEMON_THREADS); // Check mbean now @@ -190,11 +183,11 @@ public class AllThreadIds { for (int i = 0; i < ALL_THREADS; i++) { long expectedId = allThreads[i].getId(); boolean found = false; - boolean live = (i >= DAEMON_THREADS); + boolean alive = (i >= DAEMON_THREADS); if (trace) { System.out.print("Looking for thread with id " + expectedId + - (live ? " expected alive." : " expected terminated.")); + (alive ? " expected alive." : " expected terminated.")); } for (int j = 0; j < list.length; j++) { if (expectedId == list[j]) { @@ -203,11 +196,11 @@ public class AllThreadIds { } } - if (live != found) { + if (alive != found) { testFailed = true; } if (trace) { - if (live != found) { + if (alive != found) { System.out.println(" TEST FAILED."); } else { System.out.println(); @@ -216,15 +209,14 @@ public class AllThreadIds { } // Stop all threads and wait to be sure they all are dead - barrier.set(ALL_THREADS - DAEMON_THREADS); for (int i = DAEMON_THREADS; i < ALL_THREADS; i++) { - live[i] = false; + setLive(i, false); } - // wait until daemon threads are terminated . - barrier.await(); - // give chance to threads to terminate - pause(); + // make sure the non-daemon threads are completely dead + joinNonDaemonThreads(); + + // and check the thread count checkThreadCount(0, ALL_THREADS - DAEMON_THREADS); if (testFailed) @@ -233,6 +225,30 @@ public class AllThreadIds { System.out.println("Test passed."); } + private static void joinDaemonThreads() throws InterruptedException { + for (int i = 0; i < DAEMON_THREADS; i++) { + allThreads[i].join(); + } + } + + private static void joinNonDaemonThreads() throws InterruptedException { + for (int i = DAEMON_THREADS; i < ALL_THREADS; i++) { + allThreads[i].join(); + } + } + + private static void setLive(int i, boolean val) { + synchronized(live) { + live[i] = val; + } + } + + private static boolean isLive(int i) { + synchronized(live) { + return live[i]; + } + } + // The MyThread thread lives as long as correspondent live[i] value is true private static class MyThread extends Thread { int id; @@ -243,8 +259,8 @@ public class AllThreadIds { public void run() { // signal started - barrier.signal(); - while (live[id]) { + startupCheck.arrive(); + while (isLive(id)) { try { sleep(100); } catch (InterruptedException e) { @@ -253,23 +269,6 @@ public class AllThreadIds { testFailed = true; } } - // signal about to exit - barrier.signal(); } } - - private static Object pauseObj = new Object(); - private static void pause() { - // Enter lock a without blocking - synchronized (pauseObj) { - try { - // may need to tune this timeout for different platforms - pauseObj.wait(50); - } catch (Exception e) { - System.err.println("Unexpected exception."); - e.printStackTrace(System.err); - } - } - } - } From 06a745fd7ecf7762adc9eddefcd021854c455708 Mon Sep 17 00:00:00 2001 From: Christian Tornqvist Date: Tue, 10 Mar 2015 04:53:58 -0700 Subject: [PATCH 28/82] 8069124: runtime/NMT/MallocSiteHashOverflow.java failing in nightlies Reviewed-by: coleenp, gtriantafill, dholmes --- .../src/share/vm/services/mallocSiteTable.cpp | 3 +-- .../src/share/vm/services/mallocSiteTable.hpp | 3 +-- .../src/share/vm/utilities/nativeCallStack.cpp | 16 +++++++--------- .../src/share/vm/utilities/nativeCallStack.hpp | 6 +++--- 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/hotspot/src/share/vm/services/mallocSiteTable.cpp b/hotspot/src/share/vm/services/mallocSiteTable.cpp index 59339a17750..4ab10b49a52 100644 --- a/hotspot/src/share/vm/services/mallocSiteTable.cpp +++ b/hotspot/src/share/vm/services/mallocSiteTable.cpp @@ -135,8 +135,7 @@ bool MallocSiteTable::walk(MallocSiteWalker* walker) { */ MallocSite* MallocSiteTable::lookup_or_add(const NativeCallStack& key, size_t* bucket_idx, size_t* pos_idx) { - int index = hash_to_index(key.hash()); - assert(index >= 0, err_msg("Negative index %d", index)); + unsigned int index = hash_to_index(key.hash()); *bucket_idx = (size_t)index; *pos_idx = 0; diff --git a/hotspot/src/share/vm/services/mallocSiteTable.hpp b/hotspot/src/share/vm/services/mallocSiteTable.hpp index cff98161449..7ded2d2b74a 100644 --- a/hotspot/src/share/vm/services/mallocSiteTable.hpp +++ b/hotspot/src/share/vm/services/mallocSiteTable.hpp @@ -238,8 +238,7 @@ class MallocSiteTable : AllStatic { static MallocSite* malloc_site(size_t bucket_idx, size_t pos_idx); static bool walk(MallocSiteWalker* walker); - static inline int hash_to_index(int hash) { - hash = (hash > 0) ? hash : (-hash); + static inline unsigned int hash_to_index(unsigned int hash) { return (hash % table_size); } diff --git a/hotspot/src/share/vm/utilities/nativeCallStack.cpp b/hotspot/src/share/vm/utilities/nativeCallStack.cpp index aa3a1e67a5d..7b3717be4c0 100644 --- a/hotspot/src/share/vm/utilities/nativeCallStack.cpp +++ b/hotspot/src/share/vm/utilities/nativeCallStack.cpp @@ -55,6 +55,7 @@ NativeCallStack::NativeCallStack(address* pc, int frameCount) { for (; index < NMT_TrackingStackDepth; index ++) { _stack[index] = NULL; } + _hash_value = 0; } // number of stack frames captured @@ -69,19 +70,16 @@ int NativeCallStack::frames() const { } // Hash code. Any better algorithm? -int NativeCallStack::hash() const { - long hash_val = _hash_value; +unsigned int NativeCallStack::hash() const { + uintptr_t hash_val = _hash_value; if (hash_val == 0) { - long pc; - int index; - for (index = 0; index < NMT_TrackingStackDepth; index ++) { - pc = (long)_stack[index]; - if (pc == 0) break; - hash_val += pc; + for (int index = 0; index < NMT_TrackingStackDepth; index++) { + if (_stack[index] == NULL) break; + hash_val += (uintptr_t)_stack[index]; } NativeCallStack* p = const_cast(this); - p->_hash_value = (int)(hash_val & 0xFFFFFFFF); + p->_hash_value = (unsigned int)(hash_val & 0xFFFFFFFF); } return _hash_value; } diff --git a/hotspot/src/share/vm/utilities/nativeCallStack.hpp b/hotspot/src/share/vm/utilities/nativeCallStack.hpp index b6d6a35303e..673d4938b26 100644 --- a/hotspot/src/share/vm/utilities/nativeCallStack.hpp +++ b/hotspot/src/share/vm/utilities/nativeCallStack.hpp @@ -56,8 +56,8 @@ class NativeCallStack : public StackObj { static const NativeCallStack EMPTY_STACK; private: - address _stack[NMT_TrackingStackDepth]; - int _hash_value; + address _stack[NMT_TrackingStackDepth]; + unsigned int _hash_value; public: NativeCallStack(int toSkip = 0, bool fillStack = false); @@ -89,7 +89,7 @@ class NativeCallStack : public StackObj { } // Hash code. Any better algorithm? - int hash() const; + unsigned int hash() const; void print_on(outputStream* out) const; void print_on(outputStream* out, int indent) const; From 8bc60ff868295a48a7e1d38c63f051eefe17e32f Mon Sep 17 00:00:00 2001 From: Alexander Zvegintsev Date: Tue, 10 Mar 2015 15:39:26 +0300 Subject: [PATCH 29/82] 8056151: Switching to GTK L&F on-the-fly leads to X Window System error RenderBadPicture Reviewed-by: alexsch, serb --- .../unix/classes/sun/awt/UNIXToolkit.java | 28 +++++---- .../plaf/gtk/crash/RenderBadPictureCrash.java | 59 +++++++++++++++++++ 2 files changed, 76 insertions(+), 11 deletions(-) create mode 100644 jdk/test/javax/swing/plaf/gtk/crash/RenderBadPictureCrash.java diff --git a/jdk/src/java.desktop/unix/classes/sun/awt/UNIXToolkit.java b/jdk/src/java.desktop/unix/classes/sun/awt/UNIXToolkit.java index 2fad1b6b4a7..bf6f87d4a6e 100644 --- a/jdk/src/java.desktop/unix/classes/sun/awt/UNIXToolkit.java +++ b/jdk/src/java.desktop/unix/classes/sun/awt/UNIXToolkit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2015, Oracle and/or its affiliates. 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 @@ -29,11 +29,10 @@ import static java.awt.RenderingHints.*; import java.awt.color.ColorSpace; import java.awt.image.*; import java.security.AccessController; -import java.security.PrivilegedAction; import sun.security.action.GetIntegerAction; import com.sun.java.swing.plaf.gtk.GTKConstants.TextDirection; +import sun.awt.X11.XToolkit; import sun.java2d.opengl.OGLRenderQueue; -import java.lang.reflect.InvocationTargetException; public abstract class UNIXToolkit extends SunToolkit { @@ -73,16 +72,16 @@ public abstract class UNIXToolkit extends SunToolkit if (nativeGTKLoaded != null) { // We've already attempted to load GTK, so just return the // status of that attempt. - return nativeGTKLoaded.booleanValue(); + return nativeGTKLoaded; } else if (nativeGTKAvailable != null) { // We've already checked the availability of the native GTK // libraries, so just return the status of that attempt. - return nativeGTKAvailable.booleanValue(); + return nativeGTKAvailable; } else { boolean success = check_gtk(); - nativeGTKAvailable = Boolean.valueOf(success); + nativeGTKAvailable = success; return success; } } @@ -99,11 +98,15 @@ public abstract class UNIXToolkit extends SunToolkit public boolean loadGTK() { synchronized (GTK_LOCK) { if (nativeGTKLoaded == null) { - boolean success = load_gtk(); - nativeGTKLoaded = Boolean.valueOf(success); + XToolkit.awtLock(); + try { + nativeGTKLoaded = load_gtk(); + } finally { + XToolkit.awtUnlock(); + } } } - return nativeGTKLoaded.booleanValue(); + return nativeGTKLoaded; } /** @@ -252,6 +255,7 @@ public abstract class UNIXToolkit extends SunToolkit private native void nativeSync(); + @Override public void sync() { // flush the X11 buffer nativeSync(); @@ -266,6 +270,8 @@ public abstract class UNIXToolkit extends SunToolkit * This requires that the Gnome properties have already been gathered. */ public static final String FONTCONFIGAAHINT = "fontconfig/Antialias"; + + @Override protected RenderingHints getDesktopAAHints() { Object aaValue = getDesktopProperty("gnome.Xft/Antialias"); @@ -288,8 +294,8 @@ public abstract class UNIXToolkit extends SunToolkit * us to default to "OFF". I don't think that's the best guess. * So if its !=0 then lets assume AA. */ - boolean aa = Boolean.valueOf(((aaValue instanceof Number) && - ((Number)aaValue).intValue() != 0)); + boolean aa = ((aaValue instanceof Number) + && ((Number) aaValue).intValue() != 0); Object aaHint; if (aa) { String subpixOrder = diff --git a/jdk/test/javax/swing/plaf/gtk/crash/RenderBadPictureCrash.java b/jdk/test/javax/swing/plaf/gtk/crash/RenderBadPictureCrash.java new file mode 100644 index 00000000000..0ef16996cf5 --- /dev/null +++ b/jdk/test/javax/swing/plaf/gtk/crash/RenderBadPictureCrash.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + @test + @bug 8056151 + @summary Switching to GTK L&F on-the-fly leads to X Window System error RenderBadPicture + @run main/othervm -Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel -Dsun.java2d.xrender=T RenderBadPictureCrash + */ + +import java.awt.Color; +import java.lang.reflect.InvocationTargetException; +import javax.swing.JFrame; +import javax.swing.SwingUtilities; + +import javax.swing.UIManager; + +public class RenderBadPictureCrash { + + public static void main(String[] args) throws InterruptedException, InvocationTargetException { + SwingUtilities.invokeAndWait(() -> { + JFrame f = new JFrame(); + f.setUndecorated(true); + f.setBackground(new Color(0, 0, 0, 0)); + f.setSize(200, 300); + f.setVisible(true); + + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); + } catch (Exception e) { + System.err.println(e); + System.err.println("Could not set GTKLookAndFeel, skipping this test"); + } finally { + f.dispose(); + } + }); + } + +} From 017611edae784060107305a258f0a7364aca89a0 Mon Sep 17 00:00:00 2001 From: Mikael Vidstedt Date: Tue, 10 Mar 2015 09:42:23 -0700 Subject: [PATCH 30/82] 8074726: Update source and target version used when compiling hotspot class files Use BOOT_JDK_SOURCETARGET from top level, or fall back to -source 8 -target 8 Reviewed-by: dholmes, sla --- hotspot/make/aix/makefiles/rules.make | 13 ++++++++++--- hotspot/make/bsd/makefiles/rules.make | 13 ++++++++++--- hotspot/make/defs.make | 2 ++ hotspot/make/linux/makefiles/rules.make | 13 ++++++++++--- hotspot/make/solaris/makefiles/rules.make | 13 ++++++++++--- hotspot/make/windows/makefiles/rules.make | 13 ++++++++++--- 6 files changed, 52 insertions(+), 15 deletions(-) diff --git a/hotspot/make/aix/makefiles/rules.make b/hotspot/make/aix/makefiles/rules.make index 894c169e39d..2c4c38658c6 100644 --- a/hotspot/make/aix/makefiles/rules.make +++ b/hotspot/make/aix/makefiles/rules.make @@ -126,10 +126,17 @@ QUIETLY$(MAKE_VERBOSE) = @ RUN.JAR$(MAKE_VERBOSE) += >/dev/null # Settings for javac -BOOT_SOURCE_LANGUAGE_VERSION = 6 -BOOT_TARGET_CLASS_VERSION = 6 JAVAC_FLAGS = -g -encoding ascii -BOOTSTRAP_JAVAC_FLAGS = $(JAVAC_FLAGS) -source $(BOOT_SOURCE_LANGUAGE_VERSION) -target $(BOOT_TARGET_CLASS_VERSION) + +# Prefer BOOT_JDK_SOURCETARGET if it's set (typically by the top build system) +# Fall back to the values here if it's not set (hotspot only builds) +ifeq ($(BOOT_JDK_SOURCETARGET),) +BOOTSTRAP_SOURCETARGET := -source 8 -target 8 +else +BOOTSTRAP_SOURCETARGET := $(BOOT_JDK_SOURCETARGET) +endif + +BOOTSTRAP_JAVAC_FLAGS = $(JAVAC_FLAGS) $(BOOTSTRAP_SOURCETARGET) # With parallel makes, print a message at the end of compilation. ifeq ($(findstring j,$(MFLAGS)),j) diff --git a/hotspot/make/bsd/makefiles/rules.make b/hotspot/make/bsd/makefiles/rules.make index 894c169e39d..2c4c38658c6 100644 --- a/hotspot/make/bsd/makefiles/rules.make +++ b/hotspot/make/bsd/makefiles/rules.make @@ -126,10 +126,17 @@ QUIETLY$(MAKE_VERBOSE) = @ RUN.JAR$(MAKE_VERBOSE) += >/dev/null # Settings for javac -BOOT_SOURCE_LANGUAGE_VERSION = 6 -BOOT_TARGET_CLASS_VERSION = 6 JAVAC_FLAGS = -g -encoding ascii -BOOTSTRAP_JAVAC_FLAGS = $(JAVAC_FLAGS) -source $(BOOT_SOURCE_LANGUAGE_VERSION) -target $(BOOT_TARGET_CLASS_VERSION) + +# Prefer BOOT_JDK_SOURCETARGET if it's set (typically by the top build system) +# Fall back to the values here if it's not set (hotspot only builds) +ifeq ($(BOOT_JDK_SOURCETARGET),) +BOOTSTRAP_SOURCETARGET := -source 8 -target 8 +else +BOOTSTRAP_SOURCETARGET := $(BOOT_JDK_SOURCETARGET) +endif + +BOOTSTRAP_JAVAC_FLAGS = $(JAVAC_FLAGS) $(BOOTSTRAP_SOURCETARGET) # With parallel makes, print a message at the end of compilation. ifeq ($(findstring j,$(MFLAGS)),j) diff --git a/hotspot/make/defs.make b/hotspot/make/defs.make index 5c4f00dc1d8..1c7f8ce9624 100644 --- a/hotspot/make/defs.make +++ b/hotspot/make/defs.make @@ -347,6 +347,8 @@ MAKE_ARGS += JRE_RELEASE_VERSION=$(JRE_RELEASE_VERSION) # includes this make/defs.make file. MAKE_ARGS += HOTSPOT_BUILD_VERSION=$(HOTSPOT_BUILD_VERSION) +MAKE_ARGS += BOOT_JDK_SOURCETARGET="$(BOOT_JDK_SOURCETARGET)" + # Various export sub directories EXPORT_INCLUDE_DIR = $(EXPORT_PATH)/include EXPORT_DOCS_DIR = $(EXPORT_PATH)/docs diff --git a/hotspot/make/linux/makefiles/rules.make b/hotspot/make/linux/makefiles/rules.make index 894c169e39d..2c4c38658c6 100644 --- a/hotspot/make/linux/makefiles/rules.make +++ b/hotspot/make/linux/makefiles/rules.make @@ -126,10 +126,17 @@ QUIETLY$(MAKE_VERBOSE) = @ RUN.JAR$(MAKE_VERBOSE) += >/dev/null # Settings for javac -BOOT_SOURCE_LANGUAGE_VERSION = 6 -BOOT_TARGET_CLASS_VERSION = 6 JAVAC_FLAGS = -g -encoding ascii -BOOTSTRAP_JAVAC_FLAGS = $(JAVAC_FLAGS) -source $(BOOT_SOURCE_LANGUAGE_VERSION) -target $(BOOT_TARGET_CLASS_VERSION) + +# Prefer BOOT_JDK_SOURCETARGET if it's set (typically by the top build system) +# Fall back to the values here if it's not set (hotspot only builds) +ifeq ($(BOOT_JDK_SOURCETARGET),) +BOOTSTRAP_SOURCETARGET := -source 8 -target 8 +else +BOOTSTRAP_SOURCETARGET := $(BOOT_JDK_SOURCETARGET) +endif + +BOOTSTRAP_JAVAC_FLAGS = $(JAVAC_FLAGS) $(BOOTSTRAP_SOURCETARGET) # With parallel makes, print a message at the end of compilation. ifeq ($(findstring j,$(MFLAGS)),j) diff --git a/hotspot/make/solaris/makefiles/rules.make b/hotspot/make/solaris/makefiles/rules.make index d7435502107..e809b49f691 100644 --- a/hotspot/make/solaris/makefiles/rules.make +++ b/hotspot/make/solaris/makefiles/rules.make @@ -118,10 +118,17 @@ QUIETLY$(MAKE_VERBOSE) = @ RUN.JAR$(MAKE_VERBOSE) += >/dev/null # Settings for javac -BOOT_SOURCE_LANGUAGE_VERSION = 6 -BOOT_TARGET_CLASS_VERSION = 6 JAVAC_FLAGS = -g -encoding ascii -BOOTSTRAP_JAVAC_FLAGS = $(JAVAC_FLAGS) -source $(BOOT_SOURCE_LANGUAGE_VERSION) -target $(BOOT_TARGET_CLASS_VERSION) + +# Prefer BOOT_JDK_SOURCETARGET if it's set (typically by the top build system) +# Fall back to the values here if it's not set (hotspot only builds) +ifeq ($(BOOT_JDK_SOURCETARGET),) +BOOTSTRAP_SOURCETARGET := -source 8 -target 8 +else +BOOTSTRAP_SOURCETARGET := $(BOOT_JDK_SOURCETARGET) +endif + +BOOTSTRAP_JAVAC_FLAGS = $(JAVAC_FLAGS) $(BOOTSTRAP_SOURCETARGET) # With parallel makes, print a message at the end of compilation. ifeq ($(findstring j,$(MFLAGS)),j) diff --git a/hotspot/make/windows/makefiles/rules.make b/hotspot/make/windows/makefiles/rules.make index 08a6a85e101..2bd02379060 100644 --- a/hotspot/make/windows/makefiles/rules.make +++ b/hotspot/make/windows/makefiles/rules.make @@ -44,10 +44,17 @@ BOOT_JAVA_HOME= !endif # Settings for javac -BOOT_SOURCE_LANGUAGE_VERSION=6 -BOOT_TARGET_CLASS_VERSION=6 JAVAC_FLAGS=-g -encoding ascii -BOOTSTRAP_JAVAC_FLAGS=$(JAVAC_FLAGS) -source $(BOOT_SOURCE_LANGUAGE_VERSION) -target $(BOOT_TARGET_CLASS_VERSION) + +# Prefer BOOT_JDK_SOURCETARGET if it's set (typically by the top build system) +# Fall back to the values here if it's not set (hotspot only builds) +!ifndef BOOT_JDK_SOURCETARGET +BOOTSTRAP_SOURCETARGET=-source 8 -target 8 +!else +BOOTSTRAP_SOURCETARGET=$(BOOT_JDK_SOURCETARGET) +!endif + +BOOTSTRAP_JAVAC_FLAGS=$(JAVAC_FLAGS) $(BOOTSTRAP_SOURCETARGET) # VS2012 and VS2013 loads VS10 projects just fine (and will # upgrade them automatically to VS2012 format). From 741e72173c32cb9c32f234c4d640f7940fc6fcd9 Mon Sep 17 00:00:00 2001 From: Nakul Natu Date: Tue, 10 Mar 2015 21:48:37 +0300 Subject: [PATCH 31/82] 8066436: Minimize can cause window to disappear on osx Reviewed-by: serb, azvegint --- .../sun/lwawt/macosx/CPlatformWindow.java | 3 + .../classes/sun/lwawt/macosx/LWCToolkit.java | 2 +- .../MaximizedNormalBoundsUndecoratedTest.java | 76 +++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 jdk/test/java/awt/Frame/MaximizedNormalBoundsUndecoratedTest/MaximizedNormalBoundsUndecoratedTest.java diff --git a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java index dd59cf11365..888e89cd11c 100644 --- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java +++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java @@ -488,6 +488,9 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo } else { deliverZoom(true); + // We need an up to date size of the peer, so we flush the native events + // to be sure that there are no setBounds requests in the queue. + LWCToolkit.flushNativeSelectors(); this.normalBounds = peer.getBounds(); GraphicsConfiguration config = getPeer().getGraphicsConfiguration(); diff --git a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java index 9d01af03eaf..da01ed005e0 100644 --- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java +++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java @@ -843,7 +843,7 @@ public final class LWCToolkit extends LWToolkit { /** * Just spin a single empty block synchronously. */ - private static native void flushNativeSelectors(); + static native void flushNativeSelectors(); @Override public Clipboard createPlatformClipboard() { diff --git a/jdk/test/java/awt/Frame/MaximizedNormalBoundsUndecoratedTest/MaximizedNormalBoundsUndecoratedTest.java b/jdk/test/java/awt/Frame/MaximizedNormalBoundsUndecoratedTest/MaximizedNormalBoundsUndecoratedTest.java new file mode 100644 index 00000000000..119224ac299 --- /dev/null +++ b/jdk/test/java/awt/Frame/MaximizedNormalBoundsUndecoratedTest/MaximizedNormalBoundsUndecoratedTest.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2007, 2015, Oracle and/or its affiliates. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.Frame; +import java.awt.Toolkit; +import java.awt.Dimension; +/* + * @test + * @bug 8066436 + * @summary Set the size of frame. Set extendedState Frame.MAXIMIZED_BOTH and Frame.NORMAL + * sequentially for undecorated Frame and . + * Check if resulted size is equal to original frame size. + * @run main MaximizedNormalBoundsUndecoratedTest + */ + + +public class MaximizedNormalBoundsUndecoratedTest { + private Frame frame; + public static void main(String args[]) { + if (!Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_BOTH) + && !Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.NORMAL)) { + return; + } + MaximizedNormalBoundsUndecoratedTest test = new MaximizedNormalBoundsUndecoratedTest(); + boolean doPass = true; + if( !test.doTest() ) { + System.out.println("Maximizing frame not saving correct normal bounds"); + doPass = false; + } + + if(!doPass) { + throw new RuntimeException("Maximizing frame not saving correct normal bounds"); + } + } + + boolean doTest() { + Dimension beforeMaximizeCalled = new Dimension(300,300); + + frame = new Frame("Test Frame"); + frame.setUndecorated(true); + frame.setFocusable(true); + frame.setSize(beforeMaximizeCalled); + frame.setVisible(true); + frame.setExtendedState(Frame.MAXIMIZED_BOTH); + frame.setExtendedState(Frame.NORMAL); + + Dimension afterMaximizedCalled= frame.getBounds().getSize(); + + frame.dispose(); + + if (beforeMaximizeCalled.equals(afterMaximizedCalled)) { + return true; + } + return false; + } +} From 996a61cf68a28190d1ec90bd1fa50b7d8199bfa4 Mon Sep 17 00:00:00 2001 From: Jaroslav Bachorik Date: Tue, 10 Mar 2015 20:25:48 +0100 Subject: [PATCH 32/82] 8049696: com/sun/jdi/RunToExit fails with "ConnectException: Connection refused" Reviewed-by: sla --- jdk/test/com/sun/jdi/RunToExit.java | 117 +++++++----------- .../jdk/testlibrary/ProcessTools.java | 62 +++++++--- 2 files changed, 91 insertions(+), 88 deletions(-) diff --git a/jdk/test/com/sun/jdi/RunToExit.java b/jdk/test/com/sun/jdi/RunToExit.java index 01a15c85697..f76f4b0b9fa 100644 --- a/jdk/test/com/sun/jdi/RunToExit.java +++ b/jdk/test/com/sun/jdi/RunToExit.java @@ -24,74 +24,29 @@ /* @test * @bug 4997445 * @summary Test that with server=y, when VM runs to System.exit() no error happens - * - * @build VMConnection RunToExit Exit0 + * @library /lib/testlibrary + * @build jdk.testlibrary.* VMConnection RunToExit Exit0 * @run driver RunToExit */ -import java.io.InputStream; -import java.io.IOException; -import java.io.File; -import java.io.BufferedInputStream; import java.net.ServerSocket; import com.sun.jdi.Bootstrap; import com.sun.jdi.VirtualMachine; import com.sun.jdi.event.*; import com.sun.jdi.connect.Connector; import com.sun.jdi.connect.AttachingConnector; +import java.net.ConnectException; import java.util.Map; import java.util.List; import java.util.Iterator; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import jdk.testlibrary.ProcessTools; public class RunToExit { /* Increment this when ERROR: seen */ - static int error_seen = 0; + static volatile int error_seen = 0; static volatile boolean ready = false; - /* - * Helper class to direct process output to a StringBuffer - */ - static class IOHandler implements Runnable { - private String name; - private BufferedInputStream in; - private StringBuffer buffer; - - IOHandler(String name, InputStream in) { - this.name = name; - this.in = new BufferedInputStream(in); - this.buffer = new StringBuffer(); - } - - static void handle(String name, InputStream in) { - IOHandler handler = new IOHandler(name, in); - Thread thr = new Thread(handler); - thr.setDaemon(true); - thr.start(); - } - - public void run() { - try { - byte b[] = new byte[100]; - for (;;) { - int n = in.read(b, 0, 100); - // The first thing that will get read is - // Listening for transport dt_socket at address: xxxxx - // which shows the debuggee is ready to accept connections. - ready = true; - if (n < 0) { - break; - } - buffer.append(new String(b, 0, n)); - } - } catch (IOException ioe) { } - - String str = buffer.toString(); - if ( str.contains("ERROR:") ) { - error_seen++; - } - System.out.println(name + ": " + str); - } - - } /* * Find a connector by name @@ -111,24 +66,40 @@ public class RunToExit { /* * Launch a server debuggee with the given address */ - private static Process launch(String address, String class_name) throws IOException { - String exe = System.getProperty("java.home") - + File.separator + "bin" + File.separator + "java"; - String cmd = exe + " " + VMConnection.getDebuggeeVMOptions() + - " -agentlib:jdwp=transport=dt_socket" + - ",server=y" + ",suspend=y" + ",address=" + address + - " " + class_name; + private static Process launch(String address, String class_name) throws Exception { + String args[] = new String[]{ + "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=" + + address, + class_name + }; + args = VMConnection.insertDebuggeeVMOptions(args); - System.out.println("Starting: " + cmd); + ProcessBuilder launcher = ProcessTools.createJavaProcessBuilder(args); - Process p = Runtime.getRuntime().exec(cmd); + System.out.println(launcher.command().stream().collect(Collectors.joining(" ", "Starting: ", ""))); - IOHandler.handle("Input Stream", p.getInputStream()); - IOHandler.handle("Error Stream", p.getErrorStream()); + Process p = ProcessTools.startProcess( + class_name, + launcher, + RunToExit::checkForError, + RunToExit::isTransportListening, + 0, + TimeUnit.NANOSECONDS + ); return p; } + private static boolean isTransportListening(String line) { + return line.startsWith("Listening for transport dt_socket"); + } + + private static void checkForError(String line) { + if (line.contains("ERROR:")) { + error_seen++; + } + } + /* * - pick a TCP port * - Launch a server debuggee: server=y,suspend=y,address=${port} @@ -146,15 +117,6 @@ public class RunToExit { // launch the server debuggee Process process = launch(address, "Exit0"); - // wait for the debugge to be ready - while (!ready) { - try { - Thread.sleep(1000); - } catch(Exception ee) { - throw ee; - } - } - // attach to server debuggee and resume it so it can exit AttachingConnector conn = (AttachingConnector)findConnector("com.sun.jdi.SocketAttach"); Map conn_args = conn.defaultArguments(); @@ -164,7 +126,16 @@ public class RunToExit { System.out.println("Connection arguments: " + conn_args); - VirtualMachine vm = conn.attach(conn_args); + VirtualMachine vm = null; + while (vm == null) { + try { + vm = conn.attach(conn_args); + } catch (ConnectException e) { + e.printStackTrace(System.out); + System.out.println("--- Debugee not ready. Retrying in 500ms. ---"); + Thread.sleep(500); + } + } // The first event is always a VMStartEvent, and it is always in // an EventSet by itself. Wait for it. diff --git a/jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java b/jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java index fedcd91f796..3e88f8887df 100644 --- a/jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java +++ b/jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java @@ -88,24 +88,12 @@ public final class ProcessTools { ProcessBuilder processBuilder, Consumer consumer) throws IOException { - Process p = null; try { - p = startProcess( - name, - processBuilder, - line -> { - if (consumer != null) { - consumer.accept(line); - } - return false; - }, - -1, - TimeUnit.NANOSECONDS - ); + return startProcess(name, processBuilder, consumer, null, -1, TimeUnit.NANOSECONDS); } catch (InterruptedException | TimeoutException e) { - // can't ever happen + // will never happen + throw new RuntimeException(e); } - return p; } /** @@ -133,6 +121,38 @@ public final class ProcessTools { final Predicate linePredicate, long timeout, TimeUnit unit) + throws IOException, InterruptedException, TimeoutException { + return startProcess(name, processBuilder, null, linePredicate, timeout, unit); + } + + /** + *

    Starts a process from its builder.

    + * The default redirects of STDOUT and STDERR are started + *

    + * It is possible to wait for the process to get to a warmed-up state + * via {@linkplain Predicate} condition on the STDOUT and monitor the + * in-streams via the provided {@linkplain Consumer} + *

    + * @param name The process name + * @param processBuilder The process builder + * @param lineConsumer The {@linkplain Consumer} the lines will be forwarded to + * @param linePredicate The {@linkplain Predicate} to use on the STDOUT + * Used to determine the moment the target app is + * properly warmed-up. + * It can be null - in that case the warmup is skipped. + * @param timeout The timeout for the warmup waiting; -1 = no wait; 0 = wait forever + * @param unit The timeout {@linkplain TimeUnit} + * @return Returns the initialized {@linkplain Process} + * @throws IOException + * @throws InterruptedException + * @throws TimeoutException + */ + public static Process startProcess(String name, + ProcessBuilder processBuilder, + final Consumer lineConsumer, + final Predicate linePredicate, + long timeout, + TimeUnit unit) throws IOException, InterruptedException, TimeoutException { System.out.println("["+name+"]:" + processBuilder.command().stream().collect(Collectors.joining(" "))); Process p = processBuilder.start(); @@ -141,6 +161,18 @@ public final class ProcessTools { stdout.addPump(new LineForwarder(name, System.out)); stderr.addPump(new LineForwarder(name, System.err)); + if (lineConsumer != null) { + StreamPumper.LinePump pump = new StreamPumper.LinePump() { + @Override + protected void processLine(String line) { + lineConsumer.accept(line); + } + }; + stdout.addPump(pump); + stderr.addPump(pump); + } + + CountDownLatch latch = new CountDownLatch(1); if (linePredicate != null) { StreamPumper.LinePump pump = new StreamPumper.LinePump() { From d24e1db13aa4871eded32742dc5a3536e6c49994 Mon Sep 17 00:00:00 2001 From: Alexander Kulyakhtin Date: Wed, 11 Mar 2015 00:45:02 +0300 Subject: [PATCH 33/82] 8072754: com/sun/jdi/NativeInstanceFilter.java requires adjustments to work with module boundaries The tests uses sun.misc.Version to check if the JVM version is greater than a certain version. For the JDK 9 the condition is always true and the usage of sun.misc.Version thus can be eliminated. Reviewed-by: alanb, sla --- .../com/sun/jdi/NativeInstanceFilterTarg.java | 24 +++---------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/jdk/test/com/sun/jdi/NativeInstanceFilterTarg.java b/jdk/test/com/sun/jdi/NativeInstanceFilterTarg.java index a3179da7078..5b81fc8e0b1 100644 --- a/jdk/test/com/sun/jdi/NativeInstanceFilterTarg.java +++ b/jdk/test/com/sun/jdi/NativeInstanceFilterTarg.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2015, Oracle and/or its affiliates. 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 @@ -21,36 +21,18 @@ * questions. */ -import sun.misc.Version; - public class NativeInstanceFilterTarg { public static void main(String args[]) { - boolean runTest = jvmSupportsJVMTI_12x(); String s1 = "abc"; String s2 = "def"; latch(s1); s1.intern(); - if (runTest) { - s2.intern(); // this is the call that generates events that ought - // to be filtered out. - } else { - System.out.println("Neutering test since JVMTI 1.2 not supported"); - } + s2.intern(); // this is the call that generates events that ought + // to be filtered out. } // Used by debugger to get an instance to filter with public static String latch(String s) { return s; } - public static boolean jvmSupportsJVMTI_12x() { - // This fix requires the JVM to support JVMTI 1.2, which doesn't - // happen until HSX 20.0, build 05. - int major = Version.jvmMajorVersion(); - int minor = Version.jvmMinorVersion(); - int micro = Version.jvmMicroVersion(); - int build = Version.jvmBuildNumber(); - - return (major > 20 || major == 20 && - (minor > 0 || micro > 0 || build >= 5)); - } } From 465abe9cfd9ba53dc318b35269cb09cd6e62c2bc Mon Sep 17 00:00:00 2001 From: Alexander Zvegintsev Date: Wed, 11 Mar 2015 16:48:43 +0300 Subject: [PATCH 34/82] 8074921: OS X build broken by reference to XToolkit Reviewed-by: alexsch, serb --- .../java.desktop/unix/classes/sun/awt/UNIXToolkit.java | 8 +------- .../unix/native/libawt_xawt/awt/gtk2_interface.c | 5 ++++- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/jdk/src/java.desktop/unix/classes/sun/awt/UNIXToolkit.java b/jdk/src/java.desktop/unix/classes/sun/awt/UNIXToolkit.java index bf6f87d4a6e..702bccb3d43 100644 --- a/jdk/src/java.desktop/unix/classes/sun/awt/UNIXToolkit.java +++ b/jdk/src/java.desktop/unix/classes/sun/awt/UNIXToolkit.java @@ -31,7 +31,6 @@ import java.awt.image.*; import java.security.AccessController; import sun.security.action.GetIntegerAction; import com.sun.java.swing.plaf.gtk.GTKConstants.TextDirection; -import sun.awt.X11.XToolkit; import sun.java2d.opengl.OGLRenderQueue; public abstract class UNIXToolkit extends SunToolkit @@ -98,12 +97,7 @@ public abstract class UNIXToolkit extends SunToolkit public boolean loadGTK() { synchronized (GTK_LOCK) { if (nativeGTKLoaded == null) { - XToolkit.awtLock(); - try { - nativeGTKLoaded = load_gtk(); - } finally { - XToolkit.awtUnlock(); - } + nativeGTKLoaded = load_gtk(); } } return nativeGTKLoaded; diff --git a/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c b/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c index 8204b8d4836..2e35e5ea43a 100644 --- a/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c +++ b/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2015, Oracle and/or its affiliates. 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 @@ -33,6 +33,7 @@ #include "jvm_md.h" #include "sizecalc.h" #include +#include "awt.h" #define GTK2_LIB_VERSIONED VERSIONED_JNI_LIB_NAME("gtk-x11-2.0", "0") #define GTK2_LIB JNI_LIB_NAME("gtk-x11-2.0") @@ -890,6 +891,7 @@ gboolean gtk2_load(JNIEnv *env) * BadMatch errors which we would normally ignore. The IO error handler * is preserved here, too, just for consistency. */ + AWT_LOCK(); handler = XSetErrorHandler(NULL); io_handler = XSetIOErrorHandler(NULL); @@ -926,6 +928,7 @@ gboolean gtk2_load(JNIEnv *env) XSetErrorHandler(handler); XSetIOErrorHandler(io_handler); + AWT_UNLOCK(); /* Initialize widget array. */ for (i = 0; i < _GTK_WIDGET_TYPE_SIZE; i++) From 8a235045ca1416362a49fa18b0d5a1fc35d007ab Mon Sep 17 00:00:00 2001 From: Igor Ignatyev Date: Thu, 12 Mar 2015 19:11:17 +0300 Subject: [PATCH 35/82] 8074980: add WhiteBox API to get a flag value for a method Reviewed-by: kvn, fzhinkin --- test/lib/sun/hotspot/WhiteBox.java | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/test/lib/sun/hotspot/WhiteBox.java b/test/lib/sun/hotspot/WhiteBox.java index b19845392ff..fb95cc4a106 100644 --- a/test/lib/sun/hotspot/WhiteBox.java +++ b/test/lib/sun/hotspot/WhiteBox.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. 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 @@ -27,6 +27,7 @@ package sun.hotspot; import java.lang.reflect.Executable; import java.util.Arrays; import java.util.List; +import java.util.function.BiFunction; import java.util.function.Function; import java.util.stream.Stream; import java.security.BasicPermission; @@ -250,6 +251,23 @@ public class WhiteBox { } return offset; } + public native Boolean getMethodBooleanOption(Executable method, String name); + public native Long getMethodIntxOption(Executable method, String name); + public native Long getMethodUintxOption(Executable method, String name); + public native Double getMethodDoubleOption(Executable method, String name); + public native String getMethodStringOption(Executable method, String name); + private final List> methodOptionGetters + = Arrays.asList(this::getMethodBooleanOption, this::getMethodIntxOption, + this::getMethodUintxOption, this::getMethodDoubleOption, + this::getMethodStringOption); + + public Object getMethodOption(Executable method, String name) { + return methodOptionGetters.stream() + .map(f -> f.apply(method, name)) + .filter(x -> x != null) + .findAny() + .orElse(null); + } // Safepoint Checking public native void assertMatchingSafepointCalls(boolean mutexSafepointValue, boolean attemptedNoSafepointValue); From b78d23ed01a13e4e0dc6f8782db6290c4c7c2d83 Mon Sep 17 00:00:00 2001 From: Igor Ignatyev Date: Thu, 12 Mar 2015 19:12:52 +0300 Subject: [PATCH 36/82] 8073860: [TESTBUG] compiler/whitebox/DeoptimizeFramesTest fails with exit code 1 Reviewed-by: kvn, roland --- hotspot/test/compiler/whitebox/DeoptimizeFramesTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/hotspot/test/compiler/whitebox/DeoptimizeFramesTest.java b/hotspot/test/compiler/whitebox/DeoptimizeFramesTest.java index d5268dfe5b6..40d7be385bf 100644 --- a/hotspot/test/compiler/whitebox/DeoptimizeFramesTest.java +++ b/hotspot/test/compiler/whitebox/DeoptimizeFramesTest.java @@ -31,11 +31,13 @@ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions * -XX:+WhiteBoxAPI -Xmixed * -XX:CompileCommand=compileonly,DeoptimizeFramesTest$TestCaseImpl::method - * -XX:-DeoptimizeRandom -XX:-DeoptimizeALot DeoptimizeFramesTest true + * -XX:+IgnoreUnexpectedVMOptions -XX:-DeoptimizeRandom -XX:-DeoptimizeALot + * DeoptimizeFramesTest true * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions * -XX:+WhiteBoxAPI -Xmixed * -XX:CompileCommand=compileonly,DeoptimizeFramesTest$TestCaseImpl::method - * -XX:-DeoptimizeRandom -XX:-DeoptimizeALot DeoptimizeFramesTest false + * -XX:+IgnoreUnexpectedVMOptions -XX:-DeoptimizeRandom -XX:-DeoptimizeALot + * DeoptimizeFramesTest false * @summary testing of WB::deoptimizeFrames() */ import java.lang.reflect.Executable; From cc89bac7ab5981245cf4d30bbd748aac1b55e50c Mon Sep 17 00:00:00 2001 From: Igor Ignatyev Date: Thu, 12 Mar 2015 19:11:25 +0300 Subject: [PATCH 37/82] 8074980: add WhiteBox API to get a flag value for a method Reviewed-by: kvn, fzhinkin --- hotspot/src/share/vm/prims/whitebox.cpp | 84 ++++++++++++++ .../compiler/oracle/GetMethodOptionTest.java | 104 ++++++++++++++++++ 2 files changed, 188 insertions(+) create mode 100644 hotspot/test/compiler/oracle/GetMethodOptionTest.java diff --git a/hotspot/src/share/vm/prims/whitebox.cpp b/hotspot/src/share/vm/prims/whitebox.cpp index d469831b37e..76e60f18906 100644 --- a/hotspot/src/share/vm/prims/whitebox.cpp +++ b/hotspot/src/share/vm/prims/whitebox.cpp @@ -1133,6 +1133,75 @@ WB_ENTRY(void, WB_ForceSafepoint(JNIEnv* env, jobject wb)) VMThread::execute(&force_safepoint_op); WB_END +template +static bool GetMethodOption(JavaThread* thread, JNIEnv* env, jobject method, jstring name, T* value) { + assert(value != NULL, "sanity"); + if (method == NULL || name == NULL) { + return false; + } + jmethodID jmid = reflected_method_to_jmid(thread, env, method); + CHECK_JNI_EXCEPTION_(env, false); + methodHandle mh(thread, Method::checked_resolve_jmethod_id(jmid)); + // can't be in VM when we call JNI + ThreadToNativeFromVM ttnfv(thread); + const char* flag_name = env->GetStringUTFChars(name, NULL); + bool result = CompilerOracle::has_option_value(mh, flag_name, *value); + env->ReleaseStringUTFChars(name, flag_name); + return result; +} + +WB_ENTRY(jobject, WB_GetMethodBooleaneOption(JNIEnv* env, jobject wb, jobject method, jstring name)) + bool result; + if (GetMethodOption (thread, env, method, name, &result)) { + // can't be in VM when we call JNI + ThreadToNativeFromVM ttnfv(thread); + return booleanBox(thread, env, result); + } + return NULL; +WB_END + +WB_ENTRY(jobject, WB_GetMethodIntxOption(JNIEnv* env, jobject wb, jobject method, jstring name)) + intx result; + if (GetMethodOption (thread, env, method, name, &result)) { + // can't be in VM when we call JNI + ThreadToNativeFromVM ttnfv(thread); + return longBox(thread, env, result); + } + return NULL; +WB_END + +WB_ENTRY(jobject, WB_GetMethodUintxOption(JNIEnv* env, jobject wb, jobject method, jstring name)) + uintx result; + if (GetMethodOption (thread, env, method, name, &result)) { + // can't be in VM when we call JNI + ThreadToNativeFromVM ttnfv(thread); + return longBox(thread, env, result); + } + return NULL; +WB_END + +WB_ENTRY(jobject, WB_GetMethodDoubleOption(JNIEnv* env, jobject wb, jobject method, jstring name)) + double result; + if (GetMethodOption (thread, env, method, name, &result)) { + // can't be in VM when we call JNI + ThreadToNativeFromVM ttnfv(thread); + return doubleBox(thread, env, result); + } + return NULL; +WB_END + +WB_ENTRY(jobject, WB_GetMethodStringOption(JNIEnv* env, jobject wb, jobject method, jstring name)) + ccstr ccstrResult; + if (GetMethodOption (thread, env, method, name, &ccstrResult)) { + // can't be in VM when we call JNI + ThreadToNativeFromVM ttnfv(thread); + jstring result = env->NewStringUTF(ccstrResult); + CHECK_JNI_EXCEPTION_(env, NULL); + return result; + } + return NULL; +WB_END + //Some convenience methods to deal with objects from java int WhiteBox::offset_for_field(const char* field_name, oop object, Symbol* signature_symbol) { @@ -1333,6 +1402,21 @@ static JNINativeMethod methods[] = { {CC"assertMatchingSafepointCalls", CC"(ZZ)V", (void*)&WB_AssertMatchingSafepointCalls }, {CC"isMonitorInflated", CC"(Ljava/lang/Object;)Z", (void*)&WB_IsMonitorInflated }, {CC"forceSafepoint", CC"()V", (void*)&WB_ForceSafepoint }, + {CC"getMethodBooleanOption", + CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Boolean;", + (void*)&WB_GetMethodBooleaneOption}, + {CC"getMethodIntxOption", + CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Long;", + (void*)&WB_GetMethodIntxOption}, + {CC"getMethodUintxOption", + CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Long;", + (void*)&WB_GetMethodUintxOption}, + {CC"getMethodDoubleOption", + CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Double;", + (void*)&WB_GetMethodDoubleOption}, + {CC"getMethodStringOption", + CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/String;", + (void*)&WB_GetMethodStringOption}, }; #undef CC diff --git a/hotspot/test/compiler/oracle/GetMethodOptionTest.java b/hotspot/test/compiler/oracle/GetMethodOptionTest.java new file mode 100644 index 00000000000..d66a102673b --- /dev/null +++ b/hotspot/test/compiler/oracle/GetMethodOptionTest.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.reflect.Executable; +import java.util.function.BiFunction; + +import com.oracle.java.testlibrary.Asserts; +import sun.hotspot.WhiteBox; + +/* + * @test + * @bug 8074980 + * @library /testlibrary /../../test/lib + * @build sun.hotspot.WhiteBox com.oracle.java.testlibrary.Asserts GetMethodOptionTest + * @run main ClassFileInstaller sun.hotspot.WhiteBox + * sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * -XX:CompileCommand=option,GetMethodOptionTest::test,ccstrlist,MyListOption,_foo,_bar + * -XX:CompileCommand=option,GetMethodOptionTest::test,ccstr,MyStrOption,_foo + * -XX:CompileCommand=option,GetMethodOptionTest::test,bool,MyBoolOption,false + * -XX:CompileCommand=option,GetMethodOptionTest::test,intx,MyIntxOption,-1 + * -XX:CompileCommand=option,GetMethodOptionTest::test,uintx,MyUintxOption,1 + * -XX:CompileCommand=option,GetMethodOptionTest::test,MyFlag + * -XX:CompileCommand=option,GetMethodOptionTest::test,double,MyDoubleOption1,1.123 + * -XX:CompileCommand=option,GetMethodOptionTest.test,double,MyDoubleOption2,1.123 + * -XX:CompileCommand=option,GetMethodOptionTest::test,bool,MyBoolOptionX,false,intx,MyIntxOptionX,-1,uintx,MyUintxOptionX,1,MyFlagX,double,MyDoubleOptionX,1.123 + * GetMethodOptionTest + */ + +public class GetMethodOptionTest { + private static final WhiteBox WB = WhiteBox.getWhiteBox(); + public static void main(String[] args) { + Executable test = getMethod("test"); + Executable test2 = getMethod("test2"); + BiFunction getter = WB::getMethodOption; + for (TestCase testCase : TestCase.values()) { + Object expected = testCase.value; + String name = testCase.name(); + Asserts.assertEQ(expected, getter.apply(test, name), + testCase + ": universal getter returns wrong value"); + Asserts.assertEQ(expected, testCase.getter.apply(test, name), + testCase + ": specific getter returns wrong value"); + Asserts.assertEQ(null, getter.apply(test2, name), + testCase + ": universal getter returns value for unused method"); + Asserts.assertEQ(null, testCase.getter.apply(test2, name), + testCase + ": type specific getter returns value for unused method"); + } + } + private static void test() { } + private static void test2() { } + + private static enum TestCase { + MyListOption("_foo _bar", WB::getMethodStringOption), + MyStrOption("_foo", WB::getMethodStringOption), + MyBoolOption(false, WB::getMethodBooleanOption), + MyIntxOption(-1L, WB::getMethodIntxOption), + MyUintxOption(1L, WB::getMethodUintxOption), + MyFlag(true, WB::getMethodBooleanOption), + MyDoubleOption1(1.123d, WB::getMethodDoubleOption), + MyDoubleOption2(1.123d, WB::getMethodDoubleOption), + MyBoolOptionX(false, WB::getMethodBooleanOption), + MyIntxOptionX(-1L, WB::getMethodIntxOption), + MyUintxOptionX(1L, WB::getMethodUintxOption), + MyFlagX(true, WB::getMethodBooleanOption), + MyDoubleOptionX(1.123d, WB::getMethodDoubleOption); + + public final Object value; + public final BiFunction getter; + private TestCase(Object value, BiFunction getter) { + this.value = value; + this.getter = getter; + } + } + + private static Executable getMethod(String name) { + Executable result; + try { + result = GetMethodOptionTest.class.getDeclaredMethod(name); + } catch (NoSuchMethodException | SecurityException e) { + throw new Error("TESTBUG : can't get method " + name, e); + } + return result; + } +} From bb8dc09453b6dcd82825eb40e1db881d9d0ae263 Mon Sep 17 00:00:00 2001 From: Andrew Haley Date: Fri, 13 Mar 2015 12:44:28 +0000 Subject: [PATCH 38/82] 8074723: AARCH64: Stray pop in C1 LIR_Assembler::emit_profile_type Remove stray POP instruction Reviewed-by: dholmes --- hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp index 6b2c4d2741f..d5e0184d6ff 100644 --- a/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp +++ b/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp @@ -2776,7 +2776,6 @@ void LIR_Assembler::emit_profile_type(LIR_OpProfileType* op) { __ stop("unexpected profiling mismatch"); __ bind(ok); - __ pop(tmp); } #endif // first time here. Set profile type. From 827d9d39285738e0dc35807dae3330ec657f2032 Mon Sep 17 00:00:00 2001 From: Frank Yuan Date: Fri, 13 Mar 2015 15:50:39 +0300 Subject: [PATCH 39/82] 8061293: Update javax/xml tests to remove references of jre dir Reviewed-by: lancea, mkos --- jdk/test/javax/xml/ws/8033113/WsImportTest.java | 3 --- jdk/test/javax/xml/ws/8046817/GenerateEnumSchema.java | 3 --- jdk/test/javax/xml/ws/clientjar/TestWsImport.java | 3 --- jdk/test/javax/xml/ws/ebcdic/WsImportTest.java | 3 --- 4 files changed, 12 deletions(-) diff --git a/jdk/test/javax/xml/ws/8033113/WsImportTest.java b/jdk/test/javax/xml/ws/8033113/WsImportTest.java index aa1cf860ab4..ac1b13e3949 100644 --- a/jdk/test/javax/xml/ws/8033113/WsImportTest.java +++ b/jdk/test/javax/xml/ws/8033113/WsImportTest.java @@ -140,9 +140,6 @@ public class WsImportTest { private static String getWsImport() { String javaHome = System.getProperty("java.home"); - if (javaHome.endsWith("jre")) { - javaHome = new File(javaHome).getParent(); - } String wsimport = javaHome + File.separator + "bin" + File.separator + "wsimport"; if (System.getProperty("os.name").startsWith("Windows")) { wsimport = wsimport.concat(".exe"); diff --git a/jdk/test/javax/xml/ws/8046817/GenerateEnumSchema.java b/jdk/test/javax/xml/ws/8046817/GenerateEnumSchema.java index cb70d2247ae..1edd3c23907 100644 --- a/jdk/test/javax/xml/ws/8046817/GenerateEnumSchema.java +++ b/jdk/test/javax/xml/ws/8046817/GenerateEnumSchema.java @@ -86,9 +86,6 @@ public class GenerateEnumSchema { private static String getSchemagen() { String javaHome = System.getProperty("java.home"); - if (javaHome.endsWith("jre")) { - javaHome = new File(javaHome).getParent(); - } String schemagen = javaHome + File.separator + "bin" + File.separator + "schemagen"; if (System.getProperty("os.name").startsWith("Windows")) { schemagen = schemagen.concat(".exe"); diff --git a/jdk/test/javax/xml/ws/clientjar/TestWsImport.java b/jdk/test/javax/xml/ws/clientjar/TestWsImport.java index 422f4f5f045..dadceb34295 100644 --- a/jdk/test/javax/xml/ws/clientjar/TestWsImport.java +++ b/jdk/test/javax/xml/ws/clientjar/TestWsImport.java @@ -55,9 +55,6 @@ public class TestWsImport { public static void main(String[] args) throws IOException { String javaHome = System.getProperty("java.home"); - if (javaHome.endsWith("jre")) { - javaHome = new File(javaHome).getParent(); - } String wsimport = javaHome + File.separator + "bin" + File.separator + "wsimport"; if (System.getProperty("os.name").startsWith("Windows")) { wsimport = wsimport.concat(".exe"); diff --git a/jdk/test/javax/xml/ws/ebcdic/WsImportTest.java b/jdk/test/javax/xml/ws/ebcdic/WsImportTest.java index 7977cf98730..21a9fd874cc 100644 --- a/jdk/test/javax/xml/ws/ebcdic/WsImportTest.java +++ b/jdk/test/javax/xml/ws/ebcdic/WsImportTest.java @@ -133,9 +133,6 @@ public class WsImportTest { private static String getWsImport() { String javaHome = System.getProperty("java.home"); - if (javaHome.endsWith("jre")) { - javaHome = new File(javaHome).getParent(); - } String wsimport = javaHome + File.separator + "bin" + File.separator + "wsimport"; if (System.getProperty("os.name").startsWith("Windows")) { wsimport = wsimport.concat(".exe"); From 71ad1eca2063468709b0f0204ade4b7f15ad347b Mon Sep 17 00:00:00 2001 From: Magnus Ihse Bursie Date: Fri, 13 Mar 2015 14:00:36 +0100 Subject: [PATCH 40/82] 8075054: Mixed case Windows path break native dependency checks Reviewed-by: erikj --- make/common/NativeCompilation.gmk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/make/common/NativeCompilation.gmk b/make/common/NativeCompilation.gmk index 17dca95b7fe..c749532875e 100644 --- a/make/common/NativeCompilation.gmk +++ b/make/common/NativeCompilation.gmk @@ -60,7 +60,7 @@ WINDOWS_SHOWINCLUDE_SED_PATTERN := \ -e 's|Note: including file: *||' \ -e 's|\\|/|g' \ -e 's|^\([a-zA-Z]\):|$(UNIX_PATH_PREFIX)/\1|g' \ - -e '/$(subst /,\/,$(TOPDIR))/!d' \ + -e '\|$(TOPDIR)|I !d' \ -e 's|$$$$| \\|g' \ # @@ -153,7 +153,7 @@ define add_native_source exit `cat $$($1_$2_DEP).exitvalue` $(RM) $$($1_$2_DEP).exitvalue ($(ECHO) $$@: \\ \ - && $(SED) $(WINDOWS_SHOWINCLUDE_SED_PATTERN) $$($1_$2_DEP).raw) > $$($1_$2_DEP) + && $(SED) $(WINDOWS_SHOWINCLUDE_SED_PATTERN) $$($1_$2_DEP).raw) | $(SORT) -u > $$($1_$2_DEP) endif # Create a dependency target file from the dependency file. # Solution suggested by http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/ From a55dd41fc7ad4987f699778f206e48686b0f437b Mon Sep 17 00:00:00 2001 From: Jamil Nimeh Date: Fri, 13 Mar 2015 09:32:54 -0700 Subject: [PATCH 41/82] 8074064: OCSPResponse.SingleResponse objects do not parse singleExtensions Reviewed-by: mullan, vinnie --- .../provider/certpath/OCSPResponse.java | 134 +++++--- .../certpath/OCSP/OCSPSingleExtensions.java | 185 ++++++++++ .../provider/certpath/OCSP/TEST.properties | 1 + .../security/provider/certpath/OCSP/int.crt | 121 +++++++ .../certpath/OCSP/ocsp-good-nonext.resp | 316 +++++++++++++++++ .../certpath/OCSP/ocsp-good-witharchcut.resp | 320 +++++++++++++++++ .../certpath/OCSP/ocsp-good-withnext.resp | 317 +++++++++++++++++ .../certpath/OCSP/ocsp-rev-bad-sr-tag.resp | 60 ++++ .../certpath/OCSP/ocsp-rev-nocerts.resp | 53 +++ .../certpath/OCSP/ocsp-rev-nonext-noinv.resp | 317 +++++++++++++++++ .../OCSP/ocsp-rev-nonext-withinv.resp | 323 ++++++++++++++++++ .../OCSP/ocsp-rev-sr-cont-reverse.resp | 61 ++++ .../certpath/OCSP/ocsp-rev-twonext.resp | 58 ++++ .../OCSP/ocsp-rev-withnext-noinv.resp | 319 +++++++++++++++++ .../OCSP/ocsp-rev-withnext-withinv.resp | 323 ++++++++++++++++++ 15 files changed, 2861 insertions(+), 47 deletions(-) create mode 100644 jdk/test/sun/security/provider/certpath/OCSP/OCSPSingleExtensions.java create mode 100644 jdk/test/sun/security/provider/certpath/OCSP/TEST.properties create mode 100644 jdk/test/sun/security/provider/certpath/OCSP/int.crt create mode 100644 jdk/test/sun/security/provider/certpath/OCSP/ocsp-good-nonext.resp create mode 100644 jdk/test/sun/security/provider/certpath/OCSP/ocsp-good-witharchcut.resp create mode 100644 jdk/test/sun/security/provider/certpath/OCSP/ocsp-good-withnext.resp create mode 100644 jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-bad-sr-tag.resp create mode 100644 jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-nocerts.resp create mode 100644 jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-nonext-noinv.resp create mode 100644 jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-nonext-withinv.resp create mode 100644 jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-sr-cont-reverse.resp create mode 100644 jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-twonext.resp create mode 100644 jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-withnext-noinv.resp create mode 100644 jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-withnext-withinv.resp diff --git a/jdk/src/java.base/share/classes/sun/security/provider/certpath/OCSPResponse.java b/jdk/src/java.base/share/classes/sun/security/provider/certpath/OCSPResponse.java index 8075d73fd81..f8e72abebc0 100644 --- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/OCSPResponse.java +++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/OCSPResponse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, Oracle and/or its affiliates. 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 @@ -670,6 +670,38 @@ public final class OCSPResponse { return signerCert; // set in verify() } + /** + * Build a String-Extension map from DER encoded data. + * @param derVal A {@code DerValue} object built from a SEQUENCE of + * extensions + * + * @return A {@code Map} using the OID in string form as the keys. If no + * extensions are found or an empty SEQUENCE is passed in, then + * an empty {@code Map} will be returned. + * + * @throws IOException if any decoding errors occur. + */ + private static Map + parseExtensions(DerValue derVal) throws IOException { + DerValue[] extDer = derVal.data.getSequence(3); + Map extMap = + new HashMap<>(extDer.length); + + for (DerValue extDerVal : extDer) { + Extension ext = new Extension(extDerVal); + // We don't support any extensions yet. Therefore, if it + // is critical we must throw an exception because we + // don't know how to process it. + if (ext.isCritical()) { + throw new IOException("Unsupported OCSP critical extension: " + + ext.getExtensionId()); + } + extMap.put(ext.getId(), ext); + } + + return extMap; + } + /* * A class representing a single OCSP response. */ @@ -718,7 +750,7 @@ public final class OCSPResponse { } } else { revocationTime = null; - revocationReason = CRLReason.UNSPECIFIED; + revocationReason = null; if (tag == CERT_STATUS_GOOD) { certStatus = CertStatus.GOOD; } else if (tag == CERT_STATUS_UNKNOWN) { @@ -729,55 +761,59 @@ public final class OCSPResponse { } thisUpdate = tmp.getGeneralizedTime(); - - if (tmp.available() == 0) { - // we are done - nextUpdate = null; - } else { - derVal = tmp.getDerValue(); - tag = (byte)(derVal.tag & 0x1f); - if (tag == 0) { - // next update - nextUpdate = derVal.data.getGeneralizedTime(); - - if (tmp.available() == 0) { - // we are done - } else { - derVal = tmp.getDerValue(); - tag = (byte)(derVal.tag & 0x1f); - } - } else { - nextUpdate = null; - } + if (debug != null) { + debug.println("thisUpdate: " + thisUpdate); } - // singleExtensions + + // Parse optional fields like nextUpdate and singleExtensions + Date tmpNextUpdate = null; + Map tmpMap = null; + + // Check for the first optional item, it could be nextUpdate + // [CONTEXT 0] or singleExtensions [CONTEXT 1] if (tmp.available() > 0) { derVal = tmp.getDerValue(); - if (derVal.isContextSpecific((byte)1)) { - DerValue[] singleExtDer = derVal.data.getSequence(3); - singleExtensions = - new HashMap - (singleExtDer.length); - for (int i = 0; i < singleExtDer.length; i++) { - Extension ext = new Extension(singleExtDer[i]); - if (debug != null) { - debug.println("OCSP single extension: " + ext); - } - // We don't support any extensions yet. Therefore, if it - // is critical we must throw an exception because we - // don't know how to process it. - if (ext.isCritical()) { - throw new IOException( - "Unsupported OCSP critical extension: " + - ext.getExtensionId()); - } - singleExtensions.put(ext.getId(), ext); + + // nextUpdate processing + if (derVal.isContextSpecific((byte)0)) { + tmpNextUpdate = derVal.data.getGeneralizedTime(); + if (debug != null) { + debug.println("nextUpdate: " + tmpNextUpdate); } - } else { - singleExtensions = Collections.emptyMap(); + + // If more data exists in the singleResponse, it + // can only be singleExtensions. Get this DER value + // for processing in the next block + derVal = tmp.available() > 0 ? tmp.getDerValue() : null; + } + + // singleExtensions processing + if (derVal != null) { + if (derVal.isContextSpecific((byte)1)) { + tmpMap = parseExtensions(derVal); + + // There should not be any other items in the + // singleResponse at this point. + if (tmp.available() > 0) { + throw new IOException(tmp.available() + + " bytes of additional data in singleResponse"); + } + } else { + // Unknown item in the singleResponse + throw new IOException("Unsupported singleResponse " + + "item, tag = " + String.format("%02X", derVal.tag)); + } + } + } + + nextUpdate = tmpNextUpdate; + singleExtensions = (tmpMap != null) ? tmpMap : + Collections.emptyMap(); + if (debug != null) { + for (java.security.cert.Extension ext : + singleExtensions.values()) { + debug.println("singleExtension: " + ext); } - } else { - singleExtensions = Collections.emptyMap(); } } @@ -793,7 +829,8 @@ public final class OCSPResponse { } @Override public Date getRevocationTime() { - return (Date) revocationTime.clone(); + return (revocationTime != null ? (Date) revocationTime.clone() : + null); } @Override public CRLReason getRevocationReason() { @@ -821,6 +858,9 @@ public final class OCSPResponse { if (nextUpdate != null) { sb.append("nextUpdate is " + nextUpdate + "\n"); } + for (java.security.cert.Extension ext : singleExtensions.values()) { + sb.append("singleExtension: " + ext + "\n"); + } return sb.toString(); } } diff --git a/jdk/test/sun/security/provider/certpath/OCSP/OCSPSingleExtensions.java b/jdk/test/sun/security/provider/certpath/OCSP/OCSPSingleExtensions.java new file mode 100644 index 00000000000..3e518375800 --- /dev/null +++ b/jdk/test/sun/security/provider/certpath/OCSP/OCSPSingleExtensions.java @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8074064 + * @summary OCSPResponse.SingleResponse objects do not parse singleExtensions + * @run main/othervm sun.security.provider.certpath.OCSPSingleExtensions + */ + +package sun.security.provider.certpath; + +import java.io.*; +import java.util.*; +import java.security.cert.*; + +import sun.security.x509.SerialNumber; + +/* + * Tester note: + * For this test, all input files should be co-located with the test source + * code. All test input data should be in PEM format, and may be commented + * with the '#' character at the beginning of any comment line. Most tests were + * generated using the "openssl ocsp" utility in server mode and used the same + * utility as a client to drive the responses. In rare cases + * (ocsp-good-witharchcut.resp, etc.) the test input was manually modified + * because openssl's ocsp could not generate data in that format (e.g. a + * "good" response with singleExtensions in the SingleResponse structure.) + * These tests were created to force the code to walk codepaths reached only + * with invalid OCSP data or legal formats that are not easily generated using + * the tools at hand. These hand-modified test cases will not verify. + */ + +public class OCSPSingleExtensions { + public static CertificateFactory CF; + public static final File testDir = + new File(System.getProperty("test.src", ".")); + public static final Base64.Decoder B64D = Base64.getMimeDecoder(); + + public static void main(String [] args) throws Exception { + // Get a CertificateFactory for various tests + CF = CertificateFactory.getInstance("X509"); + ByteArrayInputStream bais = + new ByteArrayInputStream(readFile("int.crt").getBytes()); + X509Certificate intCA = (X509Certificate)CF.generateCertificate(bais); + System.out.println("Successfully instantiated CA cert \"" + + intCA.getSubjectX500Principal() + "\""); + + CertId cid0x1500 = new CertId(intCA, new SerialNumber(0x1500)); + boolean noFailures = true; + + OCSPResponse.SingleResponse sr = + getSRByFilename("ocsp-good-nonext.resp", cid0x1500); + noFailures &= checkSingleExts(sr, 0); + + if (sr.getRevocationTime() != null) { + throw new RuntimeException("Oops. revocationTime is non-null " + + sr.getRevocationTime()); + } else if (sr.getRevocationReason() != null) { + throw new RuntimeException("Oops. revocationReason is non-null " + + sr.getRevocationReason()); + } + + sr = getSRByFilename("ocsp-good-withnext.resp", cid0x1500); + noFailures &= checkSingleExts(sr, 0); + + sr = getSRByFilename("ocsp-good-witharchcut.resp", cid0x1500); + noFailures &= checkSingleExts(sr, 1); + + sr = getSRByFilename("ocsp-rev-nocerts.resp", cid0x1500); + noFailures &= checkSingleExts(sr, 1); + + sr = getSRByFilename("ocsp-rev-nonext-noinv.resp", cid0x1500); + noFailures &= checkSingleExts(sr, 0); + + sr = getSRByFilename("ocsp-rev-withnext-noinv.resp", cid0x1500); + noFailures &= checkSingleExts(sr, 0); + + sr = getSRByFilename("ocsp-rev-nonext-withinv.resp", cid0x1500); + noFailures &= checkSingleExts(sr, 1); + + sr = getSRByFilename("ocsp-rev-withnext-withinv.resp", cid0x1500); + noFailures &= checkSingleExts(sr, 1); + + try { + sr = getSRByFilename("ocsp-rev-twonext.resp", cid0x1500); + System.out.println("FAIL: Allowed two nextUpdate fields"); + noFailures = false; + } catch (IOException ioe) { + System.out.println("Caught expected exception: " + ioe); + } + + try { + sr = getSRByFilename("ocsp-rev-bad-sr-tag.resp", cid0x1500); + System.out.println("FAIL: Allowed invalid singleResponse item"); + noFailures = false; + } catch (IOException ioe) { + System.out.println("Caught expected exception: " + ioe); + } + + try { + sr = getSRByFilename("ocsp-rev-sr-cont-reverse.resp", cid0x1500); + System.out.println("FAIL: Allowed reversed " + + "nextUpdate/singleExtensions"); + noFailures = false; + } catch (IOException ioe) { + System.out.println("Caught expected exception: " + ioe); + } + + if (!noFailures) { + throw new RuntimeException("One or more tests failed"); + } + } + + private static OCSPResponse.SingleResponse getSRByFilename(String fileName, + CertId cid) throws IOException { + byte[] respDER = B64D.decode(readFile(fileName)); + OCSPResponse or = new OCSPResponse(respDER); + OCSPResponse.SingleResponse sr = or.getSingleResponse(cid); + return sr; + } + + private static String readFile(String fileName) throws IOException { + String filePath = testDir + "/" + fileName; + StringBuilder sb = new StringBuilder(); + + try (FileReader fr = new FileReader(filePath); + BufferedReader br = new BufferedReader(fr)) { + String line; + while ((line = br.readLine()) != null) { + if (!line.trim().startsWith("#")) { + sb.append(line).append("\n"); + } + } + } + + System.out.println("Successfully read " + fileName); + return sb.toString(); + } + + private static boolean checkSingleExts(OCSPResponse.SingleResponse sr, + int singleExtCount) { + Map singleExts; + try { + singleExts = sr.getSingleExtensions(); + } catch (NullPointerException npe) { + System.out.println( + "Warning: Sent null singleResponse into checkSingleExts"); + return false; + } + + for (String key : singleExts.keySet()) { + System.out.println("singleExtension: " + singleExts.get(key)); + } + + if (singleExts.size() != singleExtCount) { + System.out.println("Single Extension count mismatch, " + + "expected " + singleExtCount + ", got " + + singleExts.size()); + return false; + } else { + return true; + } + } +} diff --git a/jdk/test/sun/security/provider/certpath/OCSP/TEST.properties b/jdk/test/sun/security/provider/certpath/OCSP/TEST.properties new file mode 100644 index 00000000000..72f8b4cfd43 --- /dev/null +++ b/jdk/test/sun/security/provider/certpath/OCSP/TEST.properties @@ -0,0 +1 @@ +bootclasspath.dirs=. diff --git a/jdk/test/sun/security/provider/certpath/OCSP/int.crt b/jdk/test/sun/security/provider/certpath/OCSP/int.crt new file mode 100644 index 00000000000..7922392f300 --- /dev/null +++ b/jdk/test/sun/security/provider/certpath/OCSP/int.crt @@ -0,0 +1,121 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: O=Test, CN=TestRoot + Validity + Not Before: Feb 24 00:59:51 2015 GMT + Not After : Feb 13 00:59:51 2017 GMT + Subject: O=Test, CN=TestIntCA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (4096 bit) + Modulus: + 00:bf:0a:29:02:54:00:97:c3:81:e6:33:89:74:03: + cc:a7:f4:8d:54:17:36:48:97:6a:32:4e:b8:87:6d: + 62:8e:87:7f:91:64:3b:75:d5:3d:93:19:17:d2:00: + d8:db:c3:91:7c:35:23:59:d4:29:a3:e1:da:28:66: + 28:85:6b:d3:44:09:38:82:42:2f:23:ab:e6:1b:2f: + 8c:c3:12:40:99:8d:2e:a6:95:16:9c:75:b1:07:bd: + 76:f6:17:bc:a4:93:8f:9f:cd:eb:6d:1c:8c:5c:0c: + 2a:8d:b8:71:2c:ed:ad:fe:7b:ed:3e:c3:e7:24:d4: + ae:53:42:34:c5:82:f9:fa:15:71:ba:9e:16:a7:1e: + c5:5c:a7:48:b3:26:f4:a9:34:71:84:b8:7b:77:a7: + f1:a2:8e:f5:e8:cd:25:f9:63:89:b1:98:2a:8e:4d: + da:9e:2d:d2:a5:96:ca:32:1e:e2:22:b1:0b:b9:0f: + 98:0a:ae:08:2f:a8:fe:90:2f:d8:0d:16:79:2d:c8: + 62:22:69:f3:18:2b:a9:c7:d1:85:f7:5d:d5:ab:44: + 6f:91:9a:1a:86:22:0b:7e:57:97:98:6a:bd:bb:55: + 1e:e6:44:62:18:0b:af:a4:3e:ba:a7:5f:f1:a6:28: + 5c:fe:df:19:9a:cd:39:e3:9a:5e:bc:aa:49:0c:22: + 24:b7:1c:d4:21:99:0b:c4:48:95:b8:de:ad:4c:e1: + 39:e8:34:5d:c6:0c:4f:2c:22:c8:e8:cd:19:b7:d3: + 8f:d3:cd:76:76:0f:b1:bb:0a:45:be:9d:5f:2a:5d: + 51:1c:47:79:bc:c9:d1:bc:30:33:ae:2d:db:27:b9: + 1b:ff:2c:cb:b2:af:7d:e5:a6:9b:6f:23:98:7e:76: + 74:45:5f:41:15:73:c1:9c:f5:88:c6:8f:ca:9b:78: + 70:ee:8b:ba:d1:bc:60:4f:29:76:6d:28:2f:3b:09: + e6:47:53:49:04:15:67:1d:af:0d:51:f8:43:92:c8: + ab:ea:f0:09:9e:47:87:2e:62:d8:91:6e:40:de:ac: + 1b:e1:6a:47:41:c3:7d:cf:90:e0:e9:34:80:d0:56: + 9a:92:83:18:0a:c4:61:b7:60:3d:9a:4c:db:61:0a: + d0:d0:71:f1:ee:de:11:ad:fa:ee:4b:8f:fe:15:ed: + 6d:e4:b0:ba:70:9c:30:ea:52:4d:31:a4:95:35:a1: + 1c:d9:15:9f:9c:ab:06:50:eb:ae:d4:bb:17:74:27: + 44:b9:35:fa:15:61:e1:13:f6:1e:46:88:9c:d3:67: + ca:bc:a5:7c:db:b9:7e:23:1c:24:77:fa:84:8f:38: + 7f:2a:42:d5:49:e0:33:09:5d:29:28:2f:93:33:20: + f9:cf:21 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 9B:F9:84:06:6A:FC:D2:EB:08:93:FB:E4:EE:2F:D8:C1:C2:89:7A:A7 + X509v3 Authority Key Identifier: + keyid:12:B9:C3:48:79:ED:7D:30:C9:78:78:61:94:58:37:07:40:76:38:18 + + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: + Certificate Sign, CRL Sign + Signature Algorithm: sha256WithRSAEncryption + 79:28:d5:46:92:1f:6b:25:de:b0:1e:e2:44:d3:7b:a3:4a:6e: + 05:43:dd:85:47:4d:ca:d0:d9:43:65:34:38:a0:c2:6c:fb:49: + 85:6d:f3:dc:10:8c:73:37:49:22:c3:87:dd:28:8a:b0:b2:2c: + a3:9c:f6:15:4d:98:39:95:a1:21:72:36:ff:04:67:e5:ba:3e: + bd:5e:d4:81:ac:f4:1c:f5:ab:8d:dd:73:e9:37:d9:d2:80:39: + 5b:f5:ec:fe:9c:56:ec:10:f7:86:42:17:d1:f1:4b:c5:38:fe: + 0e:85:2c:6e:ac:6f:52:e5:a8:b9:fe:af:f5:dc:35:0a:74:f8: + 72:4f:51:d5:95:f4:fe:8f:fa:3f:d5:d2:1f:44:3b:63:60:4a: + e2:99:37:bf:09:40:32:6c:ea:3c:61:85:77:bc:63:6e:11:f9: + 41:5f:cb:4c:99:39:2a:37:66:79:4d:5a:7e:93:91:53:33:ce: + b1:c0:1c:68:97:2e:5a:e1:66:59:41:52:07:cf:4a:02:24:54: + dd:01:97:2f:f1:85:db:50:9c:3b:16:95:d2:08:ca:f6:93:9a: + 01:33:36:40:7c:39:e3:df:f8:7b:a7:b5:ea:60:06:a5:74:3a: + dc:ea:36:08:6b:c1:59:03:01:77:17:0e:6b:e1:9a:48:68:06: + 31:03:28:0b:cb:dd:61:93:80:0c:f1:16:e4:87:26:86:72:b4: + 12:32:7b:f7:85:59:9a:e3:1c:c4:d8:6e:55:a9:7e:c5:ce:8b: + be:d2:bf:57:34:62:83:f1:d0:3a:73:e1:75:e1:f4:77:5b:a3: + a3:35:7a:fb:b6:85:68:d5:ad:26:95:71:60:62:92:30:d3:5c: + 7b:8e:42:14:e8:7b:27:13:e6:aa:cb:35:42:2c:db:e9:1f:ff: + fd:4c:8f:fc:04:d8:05:16:da:a8:93:db:3b:f2:51:17:ff:dc: + c7:11:97:14:ac:d8:5a:e7:ad:38:fa:17:bf:bd:4b:92:84:0d: + 96:20:7d:17:ee:31:a6:56:57:5e:a4:0d:d2:cb:47:e8:45:14: + e4:6a:4a:a1:40:da:b7:bc:e8:aa:60:59:4c:4a:3b:0c:ef:26: + 39:fc:cb:8c:fe:79:c3:35:34:f5:3a:11:d3:e6:e7:fe:fd:bc: + 89:6a:c5:d0:5b:a2:b9:84:9d:b4:53:d1:1f:c0:f6:fd:80:8a: + 88:f8:aa:04:8f:5d:83:4a:91:ed:90:f0:f6:0a:bb:1a:01:d7: + a4:bb:3c:c4:c1:e1:38:ca:03:8b:61:d8:18:ab:bc:ef:7e:18: + aa:df:61:d1:1f:64:10:04:e9:25:7d:c3:bb:10:e0:11:55:29: + e6:56:87:80:bf:95:20:c5 + +-----BEGIN CERTIFICATE----- +MIIFIDCCAwigAwIBAgIBAjANBgkqhkiG9w0BAQsFADAiMQ0wCwYDVQQKDARUZXN0 +MREwDwYDVQQDDAhUZXN0Um9vdDAeFw0xNTAyMjQwMDU5NTFaFw0xNzAyMTMwMDU5 +NTFaMCMxDTALBgNVBAoMBFRlc3QxEjAQBgNVBAMMCVRlc3RJbnRDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL8KKQJUAJfDgeYziXQDzKf0jVQXNkiX +ajJOuIdtYo6Hf5FkO3XVPZMZF9IA2NvDkXw1I1nUKaPh2ihmKIVr00QJOIJCLyOr +5hsvjMMSQJmNLqaVFpx1sQe9dvYXvKSTj5/N620cjFwMKo24cSztrf577T7D5yTU +rlNCNMWC+foVcbqeFqcexVynSLMm9Kk0cYS4e3en8aKO9ejNJfljibGYKo5N2p4t +0qWWyjIe4iKxC7kPmAquCC+o/pAv2A0WeS3IYiJp8xgrqcfRhfdd1atEb5GaGoYi +C35Xl5hqvbtVHuZEYhgLr6Q+uqdf8aYoXP7fGZrNOeOaXryqSQwiJLcc1CGZC8RI +lbjerUzhOeg0XcYMTywiyOjNGbfTj9PNdnYPsbsKRb6dXypdURxHebzJ0bwwM64t +2ye5G/8sy7KvfeWmm28jmH52dEVfQRVzwZz1iMaPypt4cO6LutG8YE8pdm0oLzsJ +5kdTSQQVZx2vDVH4Q5LIq+rwCZ5Hhy5i2JFuQN6sG+FqR0HDfc+Q4Ok0gNBWmpKD +GArEYbdgPZpM22EK0NBx8e7eEa367kuP/hXtbeSwunCcMOpSTTGklTWhHNkVn5yr +BlDrrtS7F3QnRLk1+hVh4RP2HkaInNNnyrylfNu5fiMcJHf6hI84fypC1UngMwld +KSgvkzMg+c8hAgMBAAGjYDBeMB0GA1UdDgQWBBSb+YQGavzS6wiT++TuL9jBwol6 +pzAfBgNVHSMEGDAWgBQSucNIee19MMl4eGGUWDcHQHY4GDAPBgNVHRMBAf8EBTAD +AQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAeSjVRpIfayXesB7i +RNN7o0puBUPdhUdNytDZQ2U0OKDCbPtJhW3z3BCMczdJIsOH3SiKsLIso5z2FU2Y +OZWhIXI2/wRn5bo+vV7Ugaz0HPWrjd1z6TfZ0oA5W/Xs/pxW7BD3hkIX0fFLxTj+ +DoUsbqxvUuWouf6v9dw1CnT4ck9R1ZX0/o/6P9XSH0Q7Y2BK4pk3vwlAMmzqPGGF +d7xjbhH5QV/LTJk5KjdmeU1afpORUzPOscAcaJcuWuFmWUFSB89KAiRU3QGXL/GF +21CcOxaV0gjK9pOaATM2QHw549/4e6e16mAGpXQ63Oo2CGvBWQMBdxcOa+GaSGgG +MQMoC8vdYZOADPEW5IcmhnK0EjJ794VZmuMcxNhuVal+xc6LvtK/VzRig/HQOnPh +deH0d1ujozV6+7aFaNWtJpVxYGKSMNNce45CFOh7JxPmqss1Qizb6R///UyP/ATY +BRbaqJPbO/JRF//cxxGXFKzYWuetOPoXv71LkoQNliB9F+4xplZXXqQN0stH6EUU +5GpKoUDat7zoqmBZTEo7DO8mOfzLjP55wzU09ToR0+bn/v28iWrF0FuiuYSdtFPR +H8D2/YCKiPiqBI9dg0qR7ZDw9gq7GgHXpLs8xMHhOMoDi2HYGKu8734Yqt9h0R9k +EATpJX3DuxDgEVUp5laHgL+VIMU= +-----END CERTIFICATE----- diff --git a/jdk/test/sun/security/provider/certpath/OCSP/ocsp-good-nonext.resp b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-good-nonext.resp new file mode 100644 index 00000000000..173164acc18 --- /dev/null +++ b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-good-nonext.resp @@ -0,0 +1,316 @@ +#OCSP Response Data: +# OCSP Response Status: successful (0x0) +# Response Type: Basic OCSP Response +# Version: 1 (0x0) +# Responder Id: O = Test, CN = TestOCSP +# Produced At: Feb 28 00:44:43 2015 GMT +# Responses: +# Certificate ID: +# Hash Algorithm: sha1 +# Issuer Name Hash: 1056578B741813261FD9712ADA60077FF7C61E8F +# Issuer Key Hash: 9BF984066AFCD2EB0893FBE4EE2FD8C1C2897AA7 +# Serial Number: 1500 +# Cert Status: good +# This Update: Feb 28 00:44:43 2015 GMT +# +# Response Extensions: +# OCSP Nonce: +# 0410AC8B4F37A9FC4A780725B40C10737187 +# Signature Algorithm: sha1WithRSAEncryption +# 34:89:04:55:0d:5d:78:0a:ad:19:50:11:eb:34:dc:49:9a:a8: +# 5d:e6:c1:ff:a9:83:54:6f:3e:30:87:6a:78:c9:d1:09:e9:b9: +# af:27:08:a9:9e:57:62:ab:b7:27:f2:81:61:f4:44:df:46:01: +# 32:e7:eb:c6:f2:8d:fc:55:a4:58:84:60:ac:e2:f2:f1:de:05: +# f2:5f:b3:bc:9e:83:7d:e3:d4:58:71:01:b8:c0:ae:cf:e3:07: +# 23:7a:88:03:d2:c8:45:cd:07:ee:d6:81:31:81:7e:bd:e3:f4: +# 7a:fe:c1:49:99:b1:d9:0d:73:d4:47:b7:2d:14:63:d0:87:23: +# ec:a6:46:86:f6:98:4e:97:d7:93:dc:77:9f:a0:b5:0d:1a:14: +# 08:33:4c:70:34:ba:d5:1c:21:31:fb:3b:e0:78:33:32:11:70: +# d2:7a:3c:e4:62:3c:50:cd:d5:11:5f:cc:99:52:2b:6b:75:43: +# aa:e2:42:a5:d6:a7:4d:09:43:61:13:5b:b7:6a:eb:85:e1:9f: +# 3b:bf:49:fe:b0:54:4c:16:3a:3b:cc:3c:6c:82:08:08:2f:bf: +# dc:e6:7e:d3:58:41:1d:2c:cd:a7:f7:64:30:66:0c:b8:06:e6: +# df:99:10:37:fc:3a:ff:9a:05:37:01:ee:75:6a:ff:58:04:c7: +# 85:19:e6:48 +#Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 257 (0x101) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: O=Test, CN=TestIntCA +# Validity +# Not Before: Feb 24 01:22:24 2015 GMT +# Not After : Feb 24 01:22:24 2016 GMT +# Subject: O=Test, CN=TestOCSP +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:d2:5c:ae:11:f6:c6:ae:97:ba:31:ed:2b:b6:e1: +# c7:58:03:e5:9b:ee:78:53:cb:33:a5:15:fd:c6:49: +# 16:83:0e:c8:21:7d:cf:a8:eb:18:31:32:0a:62:0c: +# 4e:c7:a5:a5:75:9d:db:72:90:e3:5a:ae:53:0a:1b: +# 59:3f:bd:3a:67:b1:bf:98:64:a4:85:f0:97:10:8b: +# 0e:7e:7b:5e:d4:32:ab:b5:ef:c3:de:22:c0:11:90: +# c8:37:e4:48:b0:5e:fc:1a:2c:7a:85:2b:a6:bd:18: +# 64:08:d3:e3:b8:d8:ab:2e:b5:d8:e8:12:2e:58:45: +# 69:ac:56:94:62:e3:c2:c4:3c:08:ea:b3:bb:a4:89: +# 7e:fb:84:5e:95:49:6f:b9:33:66:1a:c2:7f:36:55: +# 18:a7:21:e4:1b:75:c0:e8:c9:02:1b:9c:f1:8b:b1: +# 58:b0:8c:da:5c:24:a5:f4:a5:36:52:1c:76:d3:5a: +# 71:ee:f0:c8:4b:65:58:0b:d6:d6:6c:23:3b:d0:8f: +# f5:3a:66:d4:f4:fd:34:90:c2:35:a1:6d:70:49:39: +# a6:71:3d:0d:7c:85:d3:d1:f5:6e:30:05:42:a1:88: +# ab:94:1f:25:f2:76:85:57:cb:77:b6:9e:a3:03:26: +# ff:b1:47:71:67:20:75:8d:83:10:17:6c:9a:93:4b: +# f6:31 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# 58:78:83:0E:47:61:C2:C9:E0:77:A7:FE:AD:9C:A4:5F:00:E8:A6:6C +# X509v3 Authority Key Identifier: +# keyid:9B:F9:84:06:6A:FC:D2:EB:08:93:FB:E4:EE:2F:D8:C1:C2:89:7A:A7 +# +# X509v3 Key Usage: critical +# Digital Signature +# X509v3 Extended Key Usage: +# OCSP Signing +# OCSP No Check: +# +# Signature Algorithm: sha256WithRSAEncryption +# 55:13:0c:0b:4a:35:14:25:ef:36:48:59:86:07:e8:c0:cd:d0: +# 9c:19:d1:36:63:85:d1:f0:46:ff:af:39:37:80:bd:3e:c4:88: +# fa:66:2d:57:08:97:1b:20:00:37:30:38:14:cf:ff:5d:01:c4: +# e0:06:aa:82:c9:64:3f:ed:89:1e:da:2a:02:c5:1d:4f:8b:d0: +# 15:f3:26:43:b1:a8:09:f7:1e:d4:0f:37:bd:50:6c:cd:b1:8b: +# a7:77:1a:e9:95:ec:fc:45:31:36:e4:23:c6:63:5e:64:61:ac: +# a9:a3:a8:7c:26:f5:91:57:aa:0d:51:d3:df:ad:29:d3:ef:58: +# ab:74:2f:81:dc:9e:97:35:0d:94:88:0f:34:5d:b7:80:ed:49: +# 2a:39:f4:c9:51:b8:8d:8d:db:e6:ec:04:39:ba:69:55:67:24: +# fe:8f:26:f1:1c:62:0c:ad:95:dc:de:5c:7b:6c:0e:e9:d4:fe: +# e3:cf:9e:d1:5d:da:aa:f9:17:8d:92:ab:2d:54:67:05:c2:7a: +# 51:84:72:c9:ab:f0:32:6b:86:f3:1f:c4:93:3b:9b:8d:73:12: +# 4f:58:2d:59:43:32:1d:0a:0c:a5:58:59:da:ce:9d:12:b4:d3: +# 4f:29:98:dc:a5:44:bd:93:23:65:ad:19:30:ab:72:44:15:48: +# a0:7a:9e:ea:d5:f5:9a:9e:fa:70:32:aa:51:b3:04:b6:91:c4: +# b8:d7:61:ae:c0:41:ec:5a:93:b4:62:bc:09:c4:04:d8:d4:33: +# 09:f9:63:20:d5:01:ed:b9:60:47:14:77:d1:f7:c5:41:3b:3b: +# e7:5d:73:d9:ad:ad:95:20:9c:40:1f:e4:47:0a:f6:54:bb:b8: +# 09:63:00:49:db:2e:7c:2a:79:96:86:1b:96:3b:54:97:48:b4: +# 39:46:f2:27:ef:8c:96:46:cd:af:8e:55:70:9d:6c:8f:d1:1a: +# 4c:fa:e8:90:a4:29:10:04:d1:bf:b2:de:04:28:2a:af:ae:dd: +# df:a6:f9:4a:66:19:76:7a:aa:cf:b0:68:c3:ef:83:3b:7b:e9: +# 6f:12:97:1d:db:1e:2a:da:07:03:d0:ba:c1:87:02:cd:59:be: +# b4:21:22:3b:d8:5d:7d:b4:a3:c7:2a:56:3e:09:6c:6b:6f:54: +# 22:03:bb:b2:d7:98:8a:2f:51:ec:fa:7d:3e:dc:c8:6f:db:2a: +# 6f:46:56:2e:08:b9:41:81:d8:58:a4:6e:2a:c8:46:db:63:52: +# 38:c6:45:1a:6a:a3:04:3e:48:0e:84:3d:29:47:8b:80:fc:ee: +# b4:c8:12:f0:03:ef:7b:48:2d:94:80:a2:51:c3:14:92:7e:57: +# 83:cd:56:7e:9b:8d:c5:c2 +#-----BEGIN CERTIFICATE----- +#MIIEOTCCAiGgAwIBAgICAQEwDQYJKoZIhvcNAQELBQAwIzENMAsGA1UECgwEVGVz +#dDESMBAGA1UEAwwJVGVzdEludENBMB4XDTE1MDIyNDAxMjIyNFoXDTE2MDIyNDAx +#MjIyNFowIjENMAsGA1UECgwEVGVzdDERMA8GA1UEAwwIVGVzdE9DU1AwggEiMA0G +#CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSXK4R9saul7ox7Su24cdYA+Wb7nhT +#yzOlFf3GSRaDDsghfc+o6xgxMgpiDE7HpaV1ndtykONarlMKG1k/vTpnsb+YZKSF +#8JcQiw5+e17UMqu178PeIsARkMg35EiwXvwaLHqFK6a9GGQI0+O42KsutdjoEi5Y +#RWmsVpRi48LEPAjqs7ukiX77hF6VSW+5M2Yawn82VRinIeQbdcDoyQIbnPGLsViw +#jNpcJKX0pTZSHHbTWnHu8MhLZVgL1tZsIzvQj/U6ZtT0/TSQwjWhbXBJOaZxPQ18 +#hdPR9W4wBUKhiKuUHyXydoVXy3e2nqMDJv+xR3FnIHWNgxAXbJqTS/YxAgMBAAGj +#eDB2MB0GA1UdDgQWBBRYeIMOR2HCyeB3p/6tnKRfAOimbDAfBgNVHSMEGDAWgBSb +#+YQGavzS6wiT++TuL9jBwol6pzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYI +#KwYBBQUHAwkwDwYJKwYBBQUHMAEFBAIFADANBgkqhkiG9w0BAQsFAAOCAgEAVRMM +#C0o1FCXvNkhZhgfowM3QnBnRNmOF0fBG/685N4C9PsSI+mYtVwiXGyAANzA4FM// +#XQHE4AaqgslkP+2JHtoqAsUdT4vQFfMmQ7GoCfce1A83vVBszbGLp3ca6ZXs/EUx +#NuQjxmNeZGGsqaOofCb1kVeqDVHT360p0+9Yq3QvgdyelzUNlIgPNF23gO1JKjn0 +#yVG4jY3b5uwEObppVWck/o8m8RxiDK2V3N5ce2wO6dT+48+e0V3aqvkXjZKrLVRn +#BcJ6UYRyyavwMmuG8x/EkzubjXMST1gtWUMyHQoMpVhZ2s6dErTTTymY3KVEvZMj +#Za0ZMKtyRBVIoHqe6tX1mp76cDKqUbMEtpHEuNdhrsBB7FqTtGK8CcQE2NQzCflj +#INUB7blgRxR30ffFQTs7511z2a2tlSCcQB/kRwr2VLu4CWMASdsufCp5loYbljtU +#l0i0OUbyJ++MlkbNr45VcJ1sj9EaTProkKQpEATRv7LeBCgqr67d36b5SmYZdnqq +#z7Bow++DO3vpbxKXHdseKtoHA9C6wYcCzVm+tCEiO9hdfbSjxypWPglsa29UIgO7 +#steYii9R7Pp9PtzIb9sqb0ZWLgi5QYHYWKRuKshG22NSOMZFGmqjBD5IDoQ9KUeL +#gPzutMgS8APve0gtlICiUcMUkn5Xg81WfpuNxcI= +#-----END CERTIFICATE----- +#Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 2 (0x2) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: O=Test, CN=TestRoot +# Validity +# Not Before: Feb 24 00:59:51 2015 GMT +# Not After : Feb 13 00:59:51 2017 GMT +# Subject: O=Test, CN=TestIntCA +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (4096 bit) +# Modulus: +# 00:bf:0a:29:02:54:00:97:c3:81:e6:33:89:74:03: +# cc:a7:f4:8d:54:17:36:48:97:6a:32:4e:b8:87:6d: +# 62:8e:87:7f:91:64:3b:75:d5:3d:93:19:17:d2:00: +# d8:db:c3:91:7c:35:23:59:d4:29:a3:e1:da:28:66: +# 28:85:6b:d3:44:09:38:82:42:2f:23:ab:e6:1b:2f: +# 8c:c3:12:40:99:8d:2e:a6:95:16:9c:75:b1:07:bd: +# 76:f6:17:bc:a4:93:8f:9f:cd:eb:6d:1c:8c:5c:0c: +# 2a:8d:b8:71:2c:ed:ad:fe:7b:ed:3e:c3:e7:24:d4: +# ae:53:42:34:c5:82:f9:fa:15:71:ba:9e:16:a7:1e: +# c5:5c:a7:48:b3:26:f4:a9:34:71:84:b8:7b:77:a7: +# f1:a2:8e:f5:e8:cd:25:f9:63:89:b1:98:2a:8e:4d: +# da:9e:2d:d2:a5:96:ca:32:1e:e2:22:b1:0b:b9:0f: +# 98:0a:ae:08:2f:a8:fe:90:2f:d8:0d:16:79:2d:c8: +# 62:22:69:f3:18:2b:a9:c7:d1:85:f7:5d:d5:ab:44: +# 6f:91:9a:1a:86:22:0b:7e:57:97:98:6a:bd:bb:55: +# 1e:e6:44:62:18:0b:af:a4:3e:ba:a7:5f:f1:a6:28: +# 5c:fe:df:19:9a:cd:39:e3:9a:5e:bc:aa:49:0c:22: +# 24:b7:1c:d4:21:99:0b:c4:48:95:b8:de:ad:4c:e1: +# 39:e8:34:5d:c6:0c:4f:2c:22:c8:e8:cd:19:b7:d3: +# 8f:d3:cd:76:76:0f:b1:bb:0a:45:be:9d:5f:2a:5d: +# 51:1c:47:79:bc:c9:d1:bc:30:33:ae:2d:db:27:b9: +# 1b:ff:2c:cb:b2:af:7d:e5:a6:9b:6f:23:98:7e:76: +# 74:45:5f:41:15:73:c1:9c:f5:88:c6:8f:ca:9b:78: +# 70:ee:8b:ba:d1:bc:60:4f:29:76:6d:28:2f:3b:09: +# e6:47:53:49:04:15:67:1d:af:0d:51:f8:43:92:c8: +# ab:ea:f0:09:9e:47:87:2e:62:d8:91:6e:40:de:ac: +# 1b:e1:6a:47:41:c3:7d:cf:90:e0:e9:34:80:d0:56: +# 9a:92:83:18:0a:c4:61:b7:60:3d:9a:4c:db:61:0a: +# d0:d0:71:f1:ee:de:11:ad:fa:ee:4b:8f:fe:15:ed: +# 6d:e4:b0:ba:70:9c:30:ea:52:4d:31:a4:95:35:a1: +# 1c:d9:15:9f:9c:ab:06:50:eb:ae:d4:bb:17:74:27: +# 44:b9:35:fa:15:61:e1:13:f6:1e:46:88:9c:d3:67: +# ca:bc:a5:7c:db:b9:7e:23:1c:24:77:fa:84:8f:38: +# 7f:2a:42:d5:49:e0:33:09:5d:29:28:2f:93:33:20: +# f9:cf:21 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# 9B:F9:84:06:6A:FC:D2:EB:08:93:FB:E4:EE:2F:D8:C1:C2:89:7A:A7 +# X509v3 Authority Key Identifier: +# keyid:12:B9:C3:48:79:ED:7D:30:C9:78:78:61:94:58:37:07:40:76:38:18 +# +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Key Usage: +# Certificate Sign, CRL Sign +# Signature Algorithm: sha256WithRSAEncryption +# 79:28:d5:46:92:1f:6b:25:de:b0:1e:e2:44:d3:7b:a3:4a:6e: +# 05:43:dd:85:47:4d:ca:d0:d9:43:65:34:38:a0:c2:6c:fb:49: +# 85:6d:f3:dc:10:8c:73:37:49:22:c3:87:dd:28:8a:b0:b2:2c: +# a3:9c:f6:15:4d:98:39:95:a1:21:72:36:ff:04:67:e5:ba:3e: +# bd:5e:d4:81:ac:f4:1c:f5:ab:8d:dd:73:e9:37:d9:d2:80:39: +# 5b:f5:ec:fe:9c:56:ec:10:f7:86:42:17:d1:f1:4b:c5:38:fe: +# 0e:85:2c:6e:ac:6f:52:e5:a8:b9:fe:af:f5:dc:35:0a:74:f8: +# 72:4f:51:d5:95:f4:fe:8f:fa:3f:d5:d2:1f:44:3b:63:60:4a: +# e2:99:37:bf:09:40:32:6c:ea:3c:61:85:77:bc:63:6e:11:f9: +# 41:5f:cb:4c:99:39:2a:37:66:79:4d:5a:7e:93:91:53:33:ce: +# b1:c0:1c:68:97:2e:5a:e1:66:59:41:52:07:cf:4a:02:24:54: +# dd:01:97:2f:f1:85:db:50:9c:3b:16:95:d2:08:ca:f6:93:9a: +# 01:33:36:40:7c:39:e3:df:f8:7b:a7:b5:ea:60:06:a5:74:3a: +# dc:ea:36:08:6b:c1:59:03:01:77:17:0e:6b:e1:9a:48:68:06: +# 31:03:28:0b:cb:dd:61:93:80:0c:f1:16:e4:87:26:86:72:b4: +# 12:32:7b:f7:85:59:9a:e3:1c:c4:d8:6e:55:a9:7e:c5:ce:8b: +# be:d2:bf:57:34:62:83:f1:d0:3a:73:e1:75:e1:f4:77:5b:a3: +# a3:35:7a:fb:b6:85:68:d5:ad:26:95:71:60:62:92:30:d3:5c: +# 7b:8e:42:14:e8:7b:27:13:e6:aa:cb:35:42:2c:db:e9:1f:ff: +# fd:4c:8f:fc:04:d8:05:16:da:a8:93:db:3b:f2:51:17:ff:dc: +# c7:11:97:14:ac:d8:5a:e7:ad:38:fa:17:bf:bd:4b:92:84:0d: +# 96:20:7d:17:ee:31:a6:56:57:5e:a4:0d:d2:cb:47:e8:45:14: +# e4:6a:4a:a1:40:da:b7:bc:e8:aa:60:59:4c:4a:3b:0c:ef:26: +# 39:fc:cb:8c:fe:79:c3:35:34:f5:3a:11:d3:e6:e7:fe:fd:bc: +# 89:6a:c5:d0:5b:a2:b9:84:9d:b4:53:d1:1f:c0:f6:fd:80:8a: +# 88:f8:aa:04:8f:5d:83:4a:91:ed:90:f0:f6:0a:bb:1a:01:d7: +# a4:bb:3c:c4:c1:e1:38:ca:03:8b:61:d8:18:ab:bc:ef:7e:18: +# aa:df:61:d1:1f:64:10:04:e9:25:7d:c3:bb:10:e0:11:55:29: +# e6:56:87:80:bf:95:20:c5 +#-----BEGIN CERTIFICATE----- +#MIIFIDCCAwigAwIBAgIBAjANBgkqhkiG9w0BAQsFADAiMQ0wCwYDVQQKDARUZXN0 +#MREwDwYDVQQDDAhUZXN0Um9vdDAeFw0xNTAyMjQwMDU5NTFaFw0xNzAyMTMwMDU5 +#NTFaMCMxDTALBgNVBAoMBFRlc3QxEjAQBgNVBAMMCVRlc3RJbnRDQTCCAiIwDQYJ +#KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL8KKQJUAJfDgeYziXQDzKf0jVQXNkiX +#ajJOuIdtYo6Hf5FkO3XVPZMZF9IA2NvDkXw1I1nUKaPh2ihmKIVr00QJOIJCLyOr +#5hsvjMMSQJmNLqaVFpx1sQe9dvYXvKSTj5/N620cjFwMKo24cSztrf577T7D5yTU +#rlNCNMWC+foVcbqeFqcexVynSLMm9Kk0cYS4e3en8aKO9ejNJfljibGYKo5N2p4t +#0qWWyjIe4iKxC7kPmAquCC+o/pAv2A0WeS3IYiJp8xgrqcfRhfdd1atEb5GaGoYi +#C35Xl5hqvbtVHuZEYhgLr6Q+uqdf8aYoXP7fGZrNOeOaXryqSQwiJLcc1CGZC8RI +#lbjerUzhOeg0XcYMTywiyOjNGbfTj9PNdnYPsbsKRb6dXypdURxHebzJ0bwwM64t +#2ye5G/8sy7KvfeWmm28jmH52dEVfQRVzwZz1iMaPypt4cO6LutG8YE8pdm0oLzsJ +#5kdTSQQVZx2vDVH4Q5LIq+rwCZ5Hhy5i2JFuQN6sG+FqR0HDfc+Q4Ok0gNBWmpKD +#GArEYbdgPZpM22EK0NBx8e7eEa367kuP/hXtbeSwunCcMOpSTTGklTWhHNkVn5yr +#BlDrrtS7F3QnRLk1+hVh4RP2HkaInNNnyrylfNu5fiMcJHf6hI84fypC1UngMwld +#KSgvkzMg+c8hAgMBAAGjYDBeMB0GA1UdDgQWBBSb+YQGavzS6wiT++TuL9jBwol6 +#pzAfBgNVHSMEGDAWgBQSucNIee19MMl4eGGUWDcHQHY4GDAPBgNVHRMBAf8EBTAD +#AQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAeSjVRpIfayXesB7i +#RNN7o0puBUPdhUdNytDZQ2U0OKDCbPtJhW3z3BCMczdJIsOH3SiKsLIso5z2FU2Y +#OZWhIXI2/wRn5bo+vV7Ugaz0HPWrjd1z6TfZ0oA5W/Xs/pxW7BD3hkIX0fFLxTj+ +#DoUsbqxvUuWouf6v9dw1CnT4ck9R1ZX0/o/6P9XSH0Q7Y2BK4pk3vwlAMmzqPGGF +#d7xjbhH5QV/LTJk5KjdmeU1afpORUzPOscAcaJcuWuFmWUFSB89KAiRU3QGXL/GF +#21CcOxaV0gjK9pOaATM2QHw549/4e6e16mAGpXQ63Oo2CGvBWQMBdxcOa+GaSGgG +#MQMoC8vdYZOADPEW5IcmhnK0EjJ794VZmuMcxNhuVal+xc6LvtK/VzRig/HQOnPh +#deH0d1ujozV6+7aFaNWtJpVxYGKSMNNce45CFOh7JxPmqss1Qizb6R///UyP/ATY +#BRbaqJPbO/JRF//cxxGXFKzYWuetOPoXv71LkoQNliB9F+4xplZXXqQN0stH6EUU +#5GpKoUDat7zoqmBZTEo7DO8mOfzLjP55wzU09ToR0+bn/v28iWrF0FuiuYSdtFPR +#H8D2/YCKiPiqBI9dg0qR7ZDw9gq7GgHXpLs8xMHhOMoDi2HYGKu8734Yqt9h0R9k +#EATpJX3DuxDgEVUp5laHgL+VIMU= +#-----END CERTIFICATE----- + +MIILTgoBAKCCC0cwggtDBgkrBgEFBQcwAQEEggs0MIILMDCBsKEkMCIxDTALBgNV +BAoMBFRlc3QxETAPBgNVBAMMCFRlc3RPQ1NQGA8yMDE1MDIyODAwNDQ0M1owUjBQ +MDswCQYFKw4DAhoFAAQUEFZXi3QYEyYf2XEq2mAHf/fGHo8EFJv5hAZq/NLrCJP7 +5O4v2MHCiXqnAgIVAIAAGA8yMDE1MDIyODAwNDQ0M1qhIzAhMB8GCSsGAQUFBzAB +AgQSBBCsi083qfxKeAcltAwQc3GHMA0GCSqGSIb3DQEBBQUAA4IBAQA0iQRVDV14 +Cq0ZUBHrNNxJmqhd5sH/qYNUbz4wh2p4ydEJ6bmvJwipnldiq7cn8oFh9ETfRgEy +5+vG8o38VaRYhGCs4vLx3gXyX7O8noN949RYcQG4wK7P4wcjeogD0shFzQfu1oEx +gX694/R6/sFJmbHZDXPUR7ctFGPQhyPspkaG9phOl9eT3HefoLUNGhQIM0xwNLrV +HCEx+zvgeDMyEXDSejzkYjxQzdURX8yZUitrdUOq4kKl1qdNCUNhE1u3auuF4Z87 +v0n+sFRMFjo7zDxsgggIL7/c5n7TWEEdLM2n92QwZgy4BubfmRA3/Dr/mgU3Ae51 +av9YBMeFGeZIoIIJZTCCCWEwggQ5MIICIaADAgECAgIBATANBgkqhkiG9w0BAQsF +ADAjMQ0wCwYDVQQKDARUZXN0MRIwEAYDVQQDDAlUZXN0SW50Q0EwHhcNMTUwMjI0 +MDEyMjI0WhcNMTYwMjI0MDEyMjI0WjAiMQ0wCwYDVQQKDARUZXN0MREwDwYDVQQD +DAhUZXN0T0NTUDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANJcrhH2 +xq6XujHtK7bhx1gD5ZvueFPLM6UV/cZJFoMOyCF9z6jrGDEyCmIMTselpXWd23KQ +41quUwobWT+9Omexv5hkpIXwlxCLDn57XtQyq7Xvw94iwBGQyDfkSLBe/BoseoUr +pr0YZAjT47jYqy612OgSLlhFaaxWlGLjwsQ8COqzu6SJfvuEXpVJb7kzZhrCfzZV +GKch5Bt1wOjJAhuc8YuxWLCM2lwkpfSlNlIcdtNace7wyEtlWAvW1mwjO9CP9Tpm +1PT9NJDCNaFtcEk5pnE9DXyF09H1bjAFQqGIq5QfJfJ2hVfLd7aeowMm/7FHcWcg +dY2DEBdsmpNL9jECAwEAAaN4MHYwHQYDVR0OBBYEFFh4gw5HYcLJ4Hen/q2cpF8A +6KZsMB8GA1UdIwQYMBaAFJv5hAZq/NLrCJP75O4v2MHCiXqnMA4GA1UdDwEB/wQE +AwIHgDATBgNVHSUEDDAKBggrBgEFBQcDCTAPBgkrBgEFBQcwAQUEAgUAMA0GCSqG +SIb3DQEBCwUAA4ICAQBVEwwLSjUUJe82SFmGB+jAzdCcGdE2Y4XR8Eb/rzk3gL0+ +xIj6Zi1XCJcbIAA3MDgUz/9dAcTgBqqCyWQ/7Yke2ioCxR1Pi9AV8yZDsagJ9x7U +Dze9UGzNsYundxrplez8RTE25CPGY15kYaypo6h8JvWRV6oNUdPfrSnT71irdC+B +3J6XNQ2UiA80XbeA7UkqOfTJUbiNjdvm7AQ5umlVZyT+jybxHGIMrZXc3lx7bA7p +1P7jz57RXdqq+ReNkqstVGcFwnpRhHLJq/Aya4bzH8STO5uNcxJPWC1ZQzIdCgyl +WFnazp0StNNPKZjcpUS9kyNlrRkwq3JEFUigep7q1fWanvpwMqpRswS2kcS412Gu +wEHsWpO0YrwJxATY1DMJ+WMg1QHtuWBHFHfR98VBOzvnXXPZra2VIJxAH+RHCvZU +u7gJYwBJ2y58KnmWhhuWO1SXSLQ5RvIn74yWRs2vjlVwnWyP0RpM+uiQpCkQBNG/ +st4EKCqvrt3fpvlKZhl2eqrPsGjD74M7e+lvEpcd2x4q2gcD0LrBhwLNWb60ISI7 +2F19tKPHKlY+CWxrb1QiA7uy15iKL1Hs+n0+3Mhv2ypvRlYuCLlBgdhYpG4qyEbb +Y1I4xkUaaqMEPkgOhD0pR4uA/O60yBLwA+97SC2UgKJRwxSSfleDzVZ+m43FwjCC +BSAwggMIoAMCAQICAQIwDQYJKoZIhvcNAQELBQAwIjENMAsGA1UECgwEVGVzdDER +MA8GA1UEAwwIVGVzdFJvb3QwHhcNMTUwMjI0MDA1OTUxWhcNMTcwMjEzMDA1OTUx +WjAjMQ0wCwYDVQQKDARUZXN0MRIwEAYDVQQDDAlUZXN0SW50Q0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/CikCVACXw4HmM4l0A8yn9I1UFzZIl2oy +TriHbWKOh3+RZDt11T2TGRfSANjbw5F8NSNZ1Cmj4dooZiiFa9NECTiCQi8jq+Yb +L4zDEkCZjS6mlRacdbEHvXb2F7ykk4+fzettHIxcDCqNuHEs7a3+e+0+w+ck1K5T +QjTFgvn6FXG6nhanHsVcp0izJvSpNHGEuHt3p/GijvXozSX5Y4mxmCqOTdqeLdKl +lsoyHuIisQu5D5gKrggvqP6QL9gNFnktyGIiafMYK6nH0YX3XdWrRG+RmhqGIgt+ +V5eYar27VR7mRGIYC6+kPrqnX/GmKFz+3xmazTnjml68qkkMIiS3HNQhmQvESJW4 +3q1M4TnoNF3GDE8sIsjozRm304/TzXZ2D7G7CkW+nV8qXVEcR3m8ydG8MDOuLdsn +uRv/LMuyr33lpptvI5h+dnRFX0EVc8Gc9YjGj8qbeHDui7rRvGBPKXZtKC87CeZH +U0kEFWcdrw1R+EOSyKvq8AmeR4cuYtiRbkDerBvhakdBw33PkODpNIDQVpqSgxgK +xGG3YD2aTNthCtDQcfHu3hGt+u5Lj/4V7W3ksLpwnDDqUk0xpJU1oRzZFZ+cqwZQ +667Uuxd0J0S5NfoVYeET9h5GiJzTZ8q8pXzbuX4jHCR3+oSPOH8qQtVJ4DMJXSko +L5MzIPnPIQIDAQABo2AwXjAdBgNVHQ4EFgQUm/mEBmr80usIk/vk7i/YwcKJeqcw +HwYDVR0jBBgwFoAUErnDSHntfTDJeHhhlFg3B0B2OBgwDwYDVR0TAQH/BAUwAwEB +/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHko1UaSH2sl3rAe4kTT +e6NKbgVD3YVHTcrQ2UNlNDigwmz7SYVt89wQjHM3SSLDh90oirCyLKOc9hVNmDmV +oSFyNv8EZ+W6Pr1e1IGs9Bz1q43dc+k32dKAOVv17P6cVuwQ94ZCF9HxS8U4/g6F +LG6sb1LlqLn+r/XcNQp0+HJPUdWV9P6P+j/V0h9EO2NgSuKZN78JQDJs6jxhhXe8 +Y24R+UFfy0yZOSo3ZnlNWn6TkVMzzrHAHGiXLlrhZllBUgfPSgIkVN0Bly/xhdtQ +nDsWldIIyvaTmgEzNkB8OePf+HuntepgBqV0OtzqNghrwVkDAXcXDmvhmkhoBjED +KAvL3WGTgAzxFuSHJoZytBIye/eFWZrjHMTYblWpfsXOi77Sv1c0YoPx0Dpz4XXh +9Hdbo6M1evu2hWjVrSaVcWBikjDTXHuOQhToeycT5qrLNUIs2+kf//1Mj/wE2AUW +2qiT2zvyURf/3McRlxSs2FrnrTj6F7+9S5KEDZYgfRfuMaZWV16kDdLLR+hFFORq +SqFA2re86KpgWUxKOwzvJjn8y4z+ecM1NPU6EdPm5/79vIlqxdBbormEnbRT0R/A +9v2Aioj4qgSPXYNKke2Q8PYKuxoB16S7PMTB4TjKA4th2BirvO9+GKrfYdEfZBAE +6SV9w7sQ4BFVKeZWh4C/lSDF diff --git a/jdk/test/sun/security/provider/certpath/OCSP/ocsp-good-witharchcut.resp b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-good-witharchcut.resp new file mode 100644 index 00000000000..610c63a9bc7 --- /dev/null +++ b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-good-witharchcut.resp @@ -0,0 +1,320 @@ +#OCSP Response Data: +# OCSP Response Status: successful (0x0) +# Response Type: Basic OCSP Response +# Version: 1 (0x0) +# Responder Id: O = Test, CN = TestOCSP +# Produced At: Feb 28 00:44:43 2015 GMT +# Responses: +# Certificate ID: +# Hash Algorithm: sha1 +# Issuer Name Hash: 1056578B741813261FD9712ADA60077FF7C61E8F +# Issuer Key Hash: 9BF984066AFCD2EB0893FBE4EE2FD8C1C2897AA7 +# Serial Number: 1500 +# Cert Status: good +# This Update: Feb 28 00:44:43 2015 GMT +# Response Single Extensions: +# OCSP Archive Cutoff: +# Feb 19 14:00:00 2015 GMT +# +# Response Extensions: +# OCSP Nonce: +# 0410AC8B4F37A9FC4A780725B40C10737187 +# Signature Algorithm: sha1WithRSAEncryption +# 34:89:04:55:0d:5d:78:0a:ad:19:50:11:eb:34:dc:49:9a:a8: +# 5d:e6:c1:ff:a9:83:54:6f:3e:30:87:6a:78:c9:d1:09:e9:b9: +# af:27:08:a9:9e:57:62:ab:b7:27:f2:81:61:f4:44:df:46:01: +# 32:e7:eb:c6:f2:8d:fc:55:a4:58:84:60:ac:e2:f2:f1:de:05: +# f2:5f:b3:bc:9e:83:7d:e3:d4:58:71:01:b8:c0:ae:cf:e3:07: +# 23:7a:88:03:d2:c8:45:cd:07:ee:d6:81:31:81:7e:bd:e3:f4: +# 7a:fe:c1:49:99:b1:d9:0d:73:d4:47:b7:2d:14:63:d0:87:23: +# ec:a6:46:86:f6:98:4e:97:d7:93:dc:77:9f:a0:b5:0d:1a:14: +# 08:33:4c:70:34:ba:d5:1c:21:31:fb:3b:e0:78:33:32:11:70: +# d2:7a:3c:e4:62:3c:50:cd:d5:11:5f:cc:99:52:2b:6b:75:43: +# aa:e2:42:a5:d6:a7:4d:09:43:61:13:5b:b7:6a:eb:85:e1:9f: +# 3b:bf:49:fe:b0:54:4c:16:3a:3b:cc:3c:6c:82:08:08:2f:bf: +# dc:e6:7e:d3:58:41:1d:2c:cd:a7:f7:64:30:66:0c:b8:06:e6: +# df:99:10:37:fc:3a:ff:9a:05:37:01:ee:75:6a:ff:58:04:c7: +# 85:19:e6:48 +#Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 257 (0x101) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: O=Test, CN=TestIntCA +# Validity +# Not Before: Feb 24 01:22:24 2015 GMT +# Not After : Feb 24 01:22:24 2016 GMT +# Subject: O=Test, CN=TestOCSP +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:d2:5c:ae:11:f6:c6:ae:97:ba:31:ed:2b:b6:e1: +# c7:58:03:e5:9b:ee:78:53:cb:33:a5:15:fd:c6:49: +# 16:83:0e:c8:21:7d:cf:a8:eb:18:31:32:0a:62:0c: +# 4e:c7:a5:a5:75:9d:db:72:90:e3:5a:ae:53:0a:1b: +# 59:3f:bd:3a:67:b1:bf:98:64:a4:85:f0:97:10:8b: +# 0e:7e:7b:5e:d4:32:ab:b5:ef:c3:de:22:c0:11:90: +# c8:37:e4:48:b0:5e:fc:1a:2c:7a:85:2b:a6:bd:18: +# 64:08:d3:e3:b8:d8:ab:2e:b5:d8:e8:12:2e:58:45: +# 69:ac:56:94:62:e3:c2:c4:3c:08:ea:b3:bb:a4:89: +# 7e:fb:84:5e:95:49:6f:b9:33:66:1a:c2:7f:36:55: +# 18:a7:21:e4:1b:75:c0:e8:c9:02:1b:9c:f1:8b:b1: +# 58:b0:8c:da:5c:24:a5:f4:a5:36:52:1c:76:d3:5a: +# 71:ee:f0:c8:4b:65:58:0b:d6:d6:6c:23:3b:d0:8f: +# f5:3a:66:d4:f4:fd:34:90:c2:35:a1:6d:70:49:39: +# a6:71:3d:0d:7c:85:d3:d1:f5:6e:30:05:42:a1:88: +# ab:94:1f:25:f2:76:85:57:cb:77:b6:9e:a3:03:26: +# ff:b1:47:71:67:20:75:8d:83:10:17:6c:9a:93:4b: +# f6:31 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# 58:78:83:0E:47:61:C2:C9:E0:77:A7:FE:AD:9C:A4:5F:00:E8:A6:6C +# X509v3 Authority Key Identifier: +# keyid:9B:F9:84:06:6A:FC:D2:EB:08:93:FB:E4:EE:2F:D8:C1:C2:89:7A:A7 +# +# X509v3 Key Usage: critical +# Digital Signature +# X509v3 Extended Key Usage: +# OCSP Signing +# OCSP No Check: +# +# Signature Algorithm: sha256WithRSAEncryption +# 55:13:0c:0b:4a:35:14:25:ef:36:48:59:86:07:e8:c0:cd:d0: +# 9c:19:d1:36:63:85:d1:f0:46:ff:af:39:37:80:bd:3e:c4:88: +# fa:66:2d:57:08:97:1b:20:00:37:30:38:14:cf:ff:5d:01:c4: +# e0:06:aa:82:c9:64:3f:ed:89:1e:da:2a:02:c5:1d:4f:8b:d0: +# 15:f3:26:43:b1:a8:09:f7:1e:d4:0f:37:bd:50:6c:cd:b1:8b: +# a7:77:1a:e9:95:ec:fc:45:31:36:e4:23:c6:63:5e:64:61:ac: +# a9:a3:a8:7c:26:f5:91:57:aa:0d:51:d3:df:ad:29:d3:ef:58: +# ab:74:2f:81:dc:9e:97:35:0d:94:88:0f:34:5d:b7:80:ed:49: +# 2a:39:f4:c9:51:b8:8d:8d:db:e6:ec:04:39:ba:69:55:67:24: +# fe:8f:26:f1:1c:62:0c:ad:95:dc:de:5c:7b:6c:0e:e9:d4:fe: +# e3:cf:9e:d1:5d:da:aa:f9:17:8d:92:ab:2d:54:67:05:c2:7a: +# 51:84:72:c9:ab:f0:32:6b:86:f3:1f:c4:93:3b:9b:8d:73:12: +# 4f:58:2d:59:43:32:1d:0a:0c:a5:58:59:da:ce:9d:12:b4:d3: +# 4f:29:98:dc:a5:44:bd:93:23:65:ad:19:30:ab:72:44:15:48: +# a0:7a:9e:ea:d5:f5:9a:9e:fa:70:32:aa:51:b3:04:b6:91:c4: +# b8:d7:61:ae:c0:41:ec:5a:93:b4:62:bc:09:c4:04:d8:d4:33: +# 09:f9:63:20:d5:01:ed:b9:60:47:14:77:d1:f7:c5:41:3b:3b: +# e7:5d:73:d9:ad:ad:95:20:9c:40:1f:e4:47:0a:f6:54:bb:b8: +# 09:63:00:49:db:2e:7c:2a:79:96:86:1b:96:3b:54:97:48:b4: +# 39:46:f2:27:ef:8c:96:46:cd:af:8e:55:70:9d:6c:8f:d1:1a: +# 4c:fa:e8:90:a4:29:10:04:d1:bf:b2:de:04:28:2a:af:ae:dd: +# df:a6:f9:4a:66:19:76:7a:aa:cf:b0:68:c3:ef:83:3b:7b:e9: +# 6f:12:97:1d:db:1e:2a:da:07:03:d0:ba:c1:87:02:cd:59:be: +# b4:21:22:3b:d8:5d:7d:b4:a3:c7:2a:56:3e:09:6c:6b:6f:54: +# 22:03:bb:b2:d7:98:8a:2f:51:ec:fa:7d:3e:dc:c8:6f:db:2a: +# 6f:46:56:2e:08:b9:41:81:d8:58:a4:6e:2a:c8:46:db:63:52: +# 38:c6:45:1a:6a:a3:04:3e:48:0e:84:3d:29:47:8b:80:fc:ee: +# b4:c8:12:f0:03:ef:7b:48:2d:94:80:a2:51:c3:14:92:7e:57: +# 83:cd:56:7e:9b:8d:c5:c2 +#-----BEGIN CERTIFICATE----- +#MIIEOTCCAiGgAwIBAgICAQEwDQYJKoZIhvcNAQELBQAwIzENMAsGA1UECgwEVGVz +#dDESMBAGA1UEAwwJVGVzdEludENBMB4XDTE1MDIyNDAxMjIyNFoXDTE2MDIyNDAx +#MjIyNFowIjENMAsGA1UECgwEVGVzdDERMA8GA1UEAwwIVGVzdE9DU1AwggEiMA0G +#CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSXK4R9saul7ox7Su24cdYA+Wb7nhT +#yzOlFf3GSRaDDsghfc+o6xgxMgpiDE7HpaV1ndtykONarlMKG1k/vTpnsb+YZKSF +#8JcQiw5+e17UMqu178PeIsARkMg35EiwXvwaLHqFK6a9GGQI0+O42KsutdjoEi5Y +#RWmsVpRi48LEPAjqs7ukiX77hF6VSW+5M2Yawn82VRinIeQbdcDoyQIbnPGLsViw +#jNpcJKX0pTZSHHbTWnHu8MhLZVgL1tZsIzvQj/U6ZtT0/TSQwjWhbXBJOaZxPQ18 +#hdPR9W4wBUKhiKuUHyXydoVXy3e2nqMDJv+xR3FnIHWNgxAXbJqTS/YxAgMBAAGj +#eDB2MB0GA1UdDgQWBBRYeIMOR2HCyeB3p/6tnKRfAOimbDAfBgNVHSMEGDAWgBSb +#+YQGavzS6wiT++TuL9jBwol6pzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYI +#KwYBBQUHAwkwDwYJKwYBBQUHMAEFBAIFADANBgkqhkiG9w0BAQsFAAOCAgEAVRMM +#C0o1FCXvNkhZhgfowM3QnBnRNmOF0fBG/685N4C9PsSI+mYtVwiXGyAANzA4FM// +#XQHE4AaqgslkP+2JHtoqAsUdT4vQFfMmQ7GoCfce1A83vVBszbGLp3ca6ZXs/EUx +#NuQjxmNeZGGsqaOofCb1kVeqDVHT360p0+9Yq3QvgdyelzUNlIgPNF23gO1JKjn0 +#yVG4jY3b5uwEObppVWck/o8m8RxiDK2V3N5ce2wO6dT+48+e0V3aqvkXjZKrLVRn +#BcJ6UYRyyavwMmuG8x/EkzubjXMST1gtWUMyHQoMpVhZ2s6dErTTTymY3KVEvZMj +#Za0ZMKtyRBVIoHqe6tX1mp76cDKqUbMEtpHEuNdhrsBB7FqTtGK8CcQE2NQzCflj +#INUB7blgRxR30ffFQTs7511z2a2tlSCcQB/kRwr2VLu4CWMASdsufCp5loYbljtU +#l0i0OUbyJ++MlkbNr45VcJ1sj9EaTProkKQpEATRv7LeBCgqr67d36b5SmYZdnqq +#z7Bow++DO3vpbxKXHdseKtoHA9C6wYcCzVm+tCEiO9hdfbSjxypWPglsa29UIgO7 +#steYii9R7Pp9PtzIb9sqb0ZWLgi5QYHYWKRuKshG22NSOMZFGmqjBD5IDoQ9KUeL +#gPzutMgS8APve0gtlICiUcMUkn5Xg81WfpuNxcI= +#-----END CERTIFICATE----- +#Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 2 (0x2) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: O=Test, CN=TestRoot +# Validity +# Not Before: Feb 24 00:59:51 2015 GMT +# Not After : Feb 13 00:59:51 2017 GMT +# Subject: O=Test, CN=TestIntCA +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (4096 bit) +# Modulus: +# 00:bf:0a:29:02:54:00:97:c3:81:e6:33:89:74:03: +# cc:a7:f4:8d:54:17:36:48:97:6a:32:4e:b8:87:6d: +# 62:8e:87:7f:91:64:3b:75:d5:3d:93:19:17:d2:00: +# d8:db:c3:91:7c:35:23:59:d4:29:a3:e1:da:28:66: +# 28:85:6b:d3:44:09:38:82:42:2f:23:ab:e6:1b:2f: +# 8c:c3:12:40:99:8d:2e:a6:95:16:9c:75:b1:07:bd: +# 76:f6:17:bc:a4:93:8f:9f:cd:eb:6d:1c:8c:5c:0c: +# 2a:8d:b8:71:2c:ed:ad:fe:7b:ed:3e:c3:e7:24:d4: +# ae:53:42:34:c5:82:f9:fa:15:71:ba:9e:16:a7:1e: +# c5:5c:a7:48:b3:26:f4:a9:34:71:84:b8:7b:77:a7: +# f1:a2:8e:f5:e8:cd:25:f9:63:89:b1:98:2a:8e:4d: +# da:9e:2d:d2:a5:96:ca:32:1e:e2:22:b1:0b:b9:0f: +# 98:0a:ae:08:2f:a8:fe:90:2f:d8:0d:16:79:2d:c8: +# 62:22:69:f3:18:2b:a9:c7:d1:85:f7:5d:d5:ab:44: +# 6f:91:9a:1a:86:22:0b:7e:57:97:98:6a:bd:bb:55: +# 1e:e6:44:62:18:0b:af:a4:3e:ba:a7:5f:f1:a6:28: +# 5c:fe:df:19:9a:cd:39:e3:9a:5e:bc:aa:49:0c:22: +# 24:b7:1c:d4:21:99:0b:c4:48:95:b8:de:ad:4c:e1: +# 39:e8:34:5d:c6:0c:4f:2c:22:c8:e8:cd:19:b7:d3: +# 8f:d3:cd:76:76:0f:b1:bb:0a:45:be:9d:5f:2a:5d: +# 51:1c:47:79:bc:c9:d1:bc:30:33:ae:2d:db:27:b9: +# 1b:ff:2c:cb:b2:af:7d:e5:a6:9b:6f:23:98:7e:76: +# 74:45:5f:41:15:73:c1:9c:f5:88:c6:8f:ca:9b:78: +# 70:ee:8b:ba:d1:bc:60:4f:29:76:6d:28:2f:3b:09: +# e6:47:53:49:04:15:67:1d:af:0d:51:f8:43:92:c8: +# ab:ea:f0:09:9e:47:87:2e:62:d8:91:6e:40:de:ac: +# 1b:e1:6a:47:41:c3:7d:cf:90:e0:e9:34:80:d0:56: +# 9a:92:83:18:0a:c4:61:b7:60:3d:9a:4c:db:61:0a: +# d0:d0:71:f1:ee:de:11:ad:fa:ee:4b:8f:fe:15:ed: +# 6d:e4:b0:ba:70:9c:30:ea:52:4d:31:a4:95:35:a1: +# 1c:d9:15:9f:9c:ab:06:50:eb:ae:d4:bb:17:74:27: +# 44:b9:35:fa:15:61:e1:13:f6:1e:46:88:9c:d3:67: +# ca:bc:a5:7c:db:b9:7e:23:1c:24:77:fa:84:8f:38: +# 7f:2a:42:d5:49:e0:33:09:5d:29:28:2f:93:33:20: +# f9:cf:21 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# 9B:F9:84:06:6A:FC:D2:EB:08:93:FB:E4:EE:2F:D8:C1:C2:89:7A:A7 +# X509v3 Authority Key Identifier: +# keyid:12:B9:C3:48:79:ED:7D:30:C9:78:78:61:94:58:37:07:40:76:38:18 +# +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Key Usage: +# Certificate Sign, CRL Sign +# Signature Algorithm: sha256WithRSAEncryption +# 79:28:d5:46:92:1f:6b:25:de:b0:1e:e2:44:d3:7b:a3:4a:6e: +# 05:43:dd:85:47:4d:ca:d0:d9:43:65:34:38:a0:c2:6c:fb:49: +# 85:6d:f3:dc:10:8c:73:37:49:22:c3:87:dd:28:8a:b0:b2:2c: +# a3:9c:f6:15:4d:98:39:95:a1:21:72:36:ff:04:67:e5:ba:3e: +# bd:5e:d4:81:ac:f4:1c:f5:ab:8d:dd:73:e9:37:d9:d2:80:39: +# 5b:f5:ec:fe:9c:56:ec:10:f7:86:42:17:d1:f1:4b:c5:38:fe: +# 0e:85:2c:6e:ac:6f:52:e5:a8:b9:fe:af:f5:dc:35:0a:74:f8: +# 72:4f:51:d5:95:f4:fe:8f:fa:3f:d5:d2:1f:44:3b:63:60:4a: +# e2:99:37:bf:09:40:32:6c:ea:3c:61:85:77:bc:63:6e:11:f9: +# 41:5f:cb:4c:99:39:2a:37:66:79:4d:5a:7e:93:91:53:33:ce: +# b1:c0:1c:68:97:2e:5a:e1:66:59:41:52:07:cf:4a:02:24:54: +# dd:01:97:2f:f1:85:db:50:9c:3b:16:95:d2:08:ca:f6:93:9a: +# 01:33:36:40:7c:39:e3:df:f8:7b:a7:b5:ea:60:06:a5:74:3a: +# dc:ea:36:08:6b:c1:59:03:01:77:17:0e:6b:e1:9a:48:68:06: +# 31:03:28:0b:cb:dd:61:93:80:0c:f1:16:e4:87:26:86:72:b4: +# 12:32:7b:f7:85:59:9a:e3:1c:c4:d8:6e:55:a9:7e:c5:ce:8b: +# be:d2:bf:57:34:62:83:f1:d0:3a:73:e1:75:e1:f4:77:5b:a3: +# a3:35:7a:fb:b6:85:68:d5:ad:26:95:71:60:62:92:30:d3:5c: +# 7b:8e:42:14:e8:7b:27:13:e6:aa:cb:35:42:2c:db:e9:1f:ff: +# fd:4c:8f:fc:04:d8:05:16:da:a8:93:db:3b:f2:51:17:ff:dc: +# c7:11:97:14:ac:d8:5a:e7:ad:38:fa:17:bf:bd:4b:92:84:0d: +# 96:20:7d:17:ee:31:a6:56:57:5e:a4:0d:d2:cb:47:e8:45:14: +# e4:6a:4a:a1:40:da:b7:bc:e8:aa:60:59:4c:4a:3b:0c:ef:26: +# 39:fc:cb:8c:fe:79:c3:35:34:f5:3a:11:d3:e6:e7:fe:fd:bc: +# 89:6a:c5:d0:5b:a2:b9:84:9d:b4:53:d1:1f:c0:f6:fd:80:8a: +# 88:f8:aa:04:8f:5d:83:4a:91:ed:90:f0:f6:0a:bb:1a:01:d7: +# a4:bb:3c:c4:c1:e1:38:ca:03:8b:61:d8:18:ab:bc:ef:7e:18: +# aa:df:61:d1:1f:64:10:04:e9:25:7d:c3:bb:10:e0:11:55:29: +# e6:56:87:80:bf:95:20:c5 +#-----BEGIN CERTIFICATE----- +#MIIFIDCCAwigAwIBAgIBAjANBgkqhkiG9w0BAQsFADAiMQ0wCwYDVQQKDARUZXN0 +#MREwDwYDVQQDDAhUZXN0Um9vdDAeFw0xNTAyMjQwMDU5NTFaFw0xNzAyMTMwMDU5 +#NTFaMCMxDTALBgNVBAoMBFRlc3QxEjAQBgNVBAMMCVRlc3RJbnRDQTCCAiIwDQYJ +#KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL8KKQJUAJfDgeYziXQDzKf0jVQXNkiX +#ajJOuIdtYo6Hf5FkO3XVPZMZF9IA2NvDkXw1I1nUKaPh2ihmKIVr00QJOIJCLyOr +#5hsvjMMSQJmNLqaVFpx1sQe9dvYXvKSTj5/N620cjFwMKo24cSztrf577T7D5yTU +#rlNCNMWC+foVcbqeFqcexVynSLMm9Kk0cYS4e3en8aKO9ejNJfljibGYKo5N2p4t +#0qWWyjIe4iKxC7kPmAquCC+o/pAv2A0WeS3IYiJp8xgrqcfRhfdd1atEb5GaGoYi +#C35Xl5hqvbtVHuZEYhgLr6Q+uqdf8aYoXP7fGZrNOeOaXryqSQwiJLcc1CGZC8RI +#lbjerUzhOeg0XcYMTywiyOjNGbfTj9PNdnYPsbsKRb6dXypdURxHebzJ0bwwM64t +#2ye5G/8sy7KvfeWmm28jmH52dEVfQRVzwZz1iMaPypt4cO6LutG8YE8pdm0oLzsJ +#5kdTSQQVZx2vDVH4Q5LIq+rwCZ5Hhy5i2JFuQN6sG+FqR0HDfc+Q4Ok0gNBWmpKD +#GArEYbdgPZpM22EK0NBx8e7eEa367kuP/hXtbeSwunCcMOpSTTGklTWhHNkVn5yr +#BlDrrtS7F3QnRLk1+hVh4RP2HkaInNNnyrylfNu5fiMcJHf6hI84fypC1UngMwld +#KSgvkzMg+c8hAgMBAAGjYDBeMB0GA1UdDgQWBBSb+YQGavzS6wiT++TuL9jBwol6 +#pzAfBgNVHSMEGDAWgBQSucNIee19MMl4eGGUWDcHQHY4GDAPBgNVHRMBAf8EBTAD +#AQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAeSjVRpIfayXesB7i +#RNN7o0puBUPdhUdNytDZQ2U0OKDCbPtJhW3z3BCMczdJIsOH3SiKsLIso5z2FU2Y +#OZWhIXI2/wRn5bo+vV7Ugaz0HPWrjd1z6TfZ0oA5W/Xs/pxW7BD3hkIX0fFLxTj+ +#DoUsbqxvUuWouf6v9dw1CnT4ck9R1ZX0/o/6P9XSH0Q7Y2BK4pk3vwlAMmzqPGGF +#d7xjbhH5QV/LTJk5KjdmeU1afpORUzPOscAcaJcuWuFmWUFSB89KAiRU3QGXL/GF +#21CcOxaV0gjK9pOaATM2QHw549/4e6e16mAGpXQ63Oo2CGvBWQMBdxcOa+GaSGgG +#MQMoC8vdYZOADPEW5IcmhnK0EjJ794VZmuMcxNhuVal+xc6LvtK/VzRig/HQOnPh +#deH0d1ujozV6+7aFaNWtJpVxYGKSMNNce45CFOh7JxPmqss1Qizb6R///UyP/ATY +#BRbaqJPbO/JRF//cxxGXFKzYWuetOPoXv71LkoQNliB9F+4xplZXXqQN0stH6EUU +#5GpKoUDat7zoqmBZTEo7DO8mOfzLjP55wzU09ToR0+bn/v28iWrF0FuiuYSdtFPR +#H8D2/YCKiPiqBI9dg0qR7ZDw9gq7GgHXpLs8xMHhOMoDi2HYGKu8734Yqt9h0R9k +#EATpJX3DuxDgEVUp5laHgL+VIMU= +#-----END CERTIFICATE----- + +MIILcgoBAKCCC2swggtnBgkrBgEFBQcwAQEEggtYMIILVDCB1KEkMCIxDTALBgNV +BAoMBFRlc3QxETAPBgNVBAMMCFRlc3RPQ1NQGA8yMDE1MDIyODAwNDQ0M1owdjB0 +MDswCQYFKw4DAhoFAAQUEFZXi3QYEyYf2XEq2mAHf/fGHo8EFJv5hAZq/NLrCJP7 +5O4v2MHCiXqnAgIVAIAAGA8yMDE1MDIyODAwNDQ0M1qhIjAgMB4GCSsGAQUFBzAB +BgQRGA8yMDE1MDIxOTE0MDAwMFqhIzAhMB8GCSsGAQUFBzABAgQSBBCsi083qfxK +eAcltAwQc3GHMA0GCSqGSIb3DQEBBQUAA4IBAQA0iQRVDV14Cq0ZUBHrNNxJmqhd +5sH/qYNUbz4wh2p4ydEJ6bmvJwipnldiq7cn8oFh9ETfRgEy5+vG8o38VaRYhGCs +4vLx3gXyX7O8noN949RYcQG4wK7P4wcjeogD0shFzQfu1oExgX694/R6/sFJmbHZ +DXPUR7ctFGPQhyPspkaG9phOl9eT3HefoLUNGhQIM0xwNLrVHCEx+zvgeDMyEXDS +ejzkYjxQzdURX8yZUitrdUOq4kKl1qdNCUNhE1u3auuF4Z87v0n+sFRMFjo7zDxs +gggIL7/c5n7TWEEdLM2n92QwZgy4BubfmRA3/Dr/mgU3Ae51av9YBMeFGeZIoIIJ +ZTCCCWEwggQ5MIICIaADAgECAgIBATANBgkqhkiG9w0BAQsFADAjMQ0wCwYDVQQK +DARUZXN0MRIwEAYDVQQDDAlUZXN0SW50Q0EwHhcNMTUwMjI0MDEyMjI0WhcNMTYw +MjI0MDEyMjI0WjAiMQ0wCwYDVQQKDARUZXN0MREwDwYDVQQDDAhUZXN0T0NTUDCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANJcrhH2xq6XujHtK7bhx1gD +5ZvueFPLM6UV/cZJFoMOyCF9z6jrGDEyCmIMTselpXWd23KQ41quUwobWT+9Omex +v5hkpIXwlxCLDn57XtQyq7Xvw94iwBGQyDfkSLBe/BoseoUrpr0YZAjT47jYqy61 +2OgSLlhFaaxWlGLjwsQ8COqzu6SJfvuEXpVJb7kzZhrCfzZVGKch5Bt1wOjJAhuc +8YuxWLCM2lwkpfSlNlIcdtNace7wyEtlWAvW1mwjO9CP9Tpm1PT9NJDCNaFtcEk5 +pnE9DXyF09H1bjAFQqGIq5QfJfJ2hVfLd7aeowMm/7FHcWcgdY2DEBdsmpNL9jEC +AwEAAaN4MHYwHQYDVR0OBBYEFFh4gw5HYcLJ4Hen/q2cpF8A6KZsMB8GA1UdIwQY +MBaAFJv5hAZq/NLrCJP75O4v2MHCiXqnMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUE +DDAKBggrBgEFBQcDCTAPBgkrBgEFBQcwAQUEAgUAMA0GCSqGSIb3DQEBCwUAA4IC +AQBVEwwLSjUUJe82SFmGB+jAzdCcGdE2Y4XR8Eb/rzk3gL0+xIj6Zi1XCJcbIAA3 +MDgUz/9dAcTgBqqCyWQ/7Yke2ioCxR1Pi9AV8yZDsagJ9x7UDze9UGzNsYundxrp +lez8RTE25CPGY15kYaypo6h8JvWRV6oNUdPfrSnT71irdC+B3J6XNQ2UiA80XbeA +7UkqOfTJUbiNjdvm7AQ5umlVZyT+jybxHGIMrZXc3lx7bA7p1P7jz57RXdqq+ReN +kqstVGcFwnpRhHLJq/Aya4bzH8STO5uNcxJPWC1ZQzIdCgylWFnazp0StNNPKZjc +pUS9kyNlrRkwq3JEFUigep7q1fWanvpwMqpRswS2kcS412GuwEHsWpO0YrwJxATY +1DMJ+WMg1QHtuWBHFHfR98VBOzvnXXPZra2VIJxAH+RHCvZUu7gJYwBJ2y58KnmW +hhuWO1SXSLQ5RvIn74yWRs2vjlVwnWyP0RpM+uiQpCkQBNG/st4EKCqvrt3fpvlK +Zhl2eqrPsGjD74M7e+lvEpcd2x4q2gcD0LrBhwLNWb60ISI72F19tKPHKlY+CWxr +b1QiA7uy15iKL1Hs+n0+3Mhv2ypvRlYuCLlBgdhYpG4qyEbbY1I4xkUaaqMEPkgO +hD0pR4uA/O60yBLwA+97SC2UgKJRwxSSfleDzVZ+m43FwjCCBSAwggMIoAMCAQIC +AQIwDQYJKoZIhvcNAQELBQAwIjENMAsGA1UECgwEVGVzdDERMA8GA1UEAwwIVGVz +dFJvb3QwHhcNMTUwMjI0MDA1OTUxWhcNMTcwMjEzMDA1OTUxWjAjMQ0wCwYDVQQK +DARUZXN0MRIwEAYDVQQDDAlUZXN0SW50Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQC/CikCVACXw4HmM4l0A8yn9I1UFzZIl2oyTriHbWKOh3+RZDt1 +1T2TGRfSANjbw5F8NSNZ1Cmj4dooZiiFa9NECTiCQi8jq+YbL4zDEkCZjS6mlRac +dbEHvXb2F7ykk4+fzettHIxcDCqNuHEs7a3+e+0+w+ck1K5TQjTFgvn6FXG6nhan +HsVcp0izJvSpNHGEuHt3p/GijvXozSX5Y4mxmCqOTdqeLdKllsoyHuIisQu5D5gK +rggvqP6QL9gNFnktyGIiafMYK6nH0YX3XdWrRG+RmhqGIgt+V5eYar27VR7mRGIY +C6+kPrqnX/GmKFz+3xmazTnjml68qkkMIiS3HNQhmQvESJW43q1M4TnoNF3GDE8s +IsjozRm304/TzXZ2D7G7CkW+nV8qXVEcR3m8ydG8MDOuLdsnuRv/LMuyr33lpptv +I5h+dnRFX0EVc8Gc9YjGj8qbeHDui7rRvGBPKXZtKC87CeZHU0kEFWcdrw1R+EOS +yKvq8AmeR4cuYtiRbkDerBvhakdBw33PkODpNIDQVpqSgxgKxGG3YD2aTNthCtDQ +cfHu3hGt+u5Lj/4V7W3ksLpwnDDqUk0xpJU1oRzZFZ+cqwZQ667Uuxd0J0S5NfoV +YeET9h5GiJzTZ8q8pXzbuX4jHCR3+oSPOH8qQtVJ4DMJXSkoL5MzIPnPIQIDAQAB +o2AwXjAdBgNVHQ4EFgQUm/mEBmr80usIk/vk7i/YwcKJeqcwHwYDVR0jBBgwFoAU +ErnDSHntfTDJeHhhlFg3B0B2OBgwDwYDVR0TAQH/BAUwAwEB/zALBgNVHQ8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggIBAHko1UaSH2sl3rAe4kTTe6NKbgVD3YVHTcrQ +2UNlNDigwmz7SYVt89wQjHM3SSLDh90oirCyLKOc9hVNmDmVoSFyNv8EZ+W6Pr1e +1IGs9Bz1q43dc+k32dKAOVv17P6cVuwQ94ZCF9HxS8U4/g6FLG6sb1LlqLn+r/Xc +NQp0+HJPUdWV9P6P+j/V0h9EO2NgSuKZN78JQDJs6jxhhXe8Y24R+UFfy0yZOSo3 +ZnlNWn6TkVMzzrHAHGiXLlrhZllBUgfPSgIkVN0Bly/xhdtQnDsWldIIyvaTmgEz +NkB8OePf+HuntepgBqV0OtzqNghrwVkDAXcXDmvhmkhoBjEDKAvL3WGTgAzxFuSH +JoZytBIye/eFWZrjHMTYblWpfsXOi77Sv1c0YoPx0Dpz4XXh9Hdbo6M1evu2hWjV +rSaVcWBikjDTXHuOQhToeycT5qrLNUIs2+kf//1Mj/wE2AUW2qiT2zvyURf/3McR +lxSs2FrnrTj6F7+9S5KEDZYgfRfuMaZWV16kDdLLR+hFFORqSqFA2re86KpgWUxK +OwzvJjn8y4z+ecM1NPU6EdPm5/79vIlqxdBbormEnbRT0R/A9v2Aioj4qgSPXYNK +ke2Q8PYKuxoB16S7PMTB4TjKA4th2BirvO9+GKrfYdEfZBAE6SV9w7sQ4BFVKeZW +h4C/lSDF diff --git a/jdk/test/sun/security/provider/certpath/OCSP/ocsp-good-withnext.resp b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-good-withnext.resp new file mode 100644 index 00000000000..eebbd219486 --- /dev/null +++ b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-good-withnext.resp @@ -0,0 +1,317 @@ +#OCSP Response Data: +# OCSP Response Status: successful (0x0) +# Response Type: Basic OCSP Response +# Version: 1 (0x0) +# Responder Id: O = Test, CN = TestOCSP +# Produced At: Feb 28 00:42:58 2015 GMT +# Responses: +# Certificate ID: +# Hash Algorithm: sha1 +# Issuer Name Hash: 1056578B741813261FD9712ADA60077FF7C61E8F +# Issuer Key Hash: 9BF984066AFCD2EB0893FBE4EE2FD8C1C2897AA7 +# Serial Number: 1500 +# Cert Status: good +# This Update: Feb 28 00:42:58 2015 GMT +# Next Update: Mar 1 00:42:58 2015 GMT +# +# Response Extensions: +# OCSP Nonce: +# 04100F63A02D306A7951078F9E6F4C7A8A53 +# Signature Algorithm: sha1WithRSAEncryption +# 49:b4:7f:24:29:9a:31:30:16:7d:23:74:53:83:e9:4c:db:08: +# 09:20:c9:78:ea:3d:a5:df:25:fd:4e:de:88:24:35:0b:fa:6f: +# 88:b0:6f:6a:92:c6:73:29:4d:1e:70:8c:e3:b2:42:df:f5:d2: +# 0a:a1:4b:bb:77:af:97:07:05:d6:ec:6b:87:8d:ff:23:95:22: +# 58:41:9f:15:70:44:33:4a:1e:0a:50:bb:17:56:dc:19:ef:a8: +# 20:3f:71:8e:f2:04:4c:80:22:01:0b:ab:34:df:3d:ff:2e:04: +# 0f:80:66:b2:bf:d0:9c:bf:73:39:18:06:bd:46:0e:0e:78:f1: +# 40:bb:8c:59:23:0c:67:3c:bb:a9:bb:14:d9:39:fe:e8:44:87: +# ae:39:98:a3:36:83:8f:20:ad:35:c7:36:58:c7:03:78:37:6d: +# 6a:a0:5f:7d:87:6f:4f:37:04:3f:d1:fd:e4:c1:e1:70:07:4a: +# c6:69:fa:7f:1d:82:1b:1d:b1:fa:d3:9c:82:42:f5:38:cf:4b: +# 85:9b:fd:f2:4b:d1:81:7e:fc:70:41:f4:3a:7d:66:40:6b:c5: +# 76:47:2a:f1:79:ff:a0:6f:13:6b:13:fe:86:c3:cd:6b:08:28: +# 1f:64:c1:b1:23:1d:01:b0:aa:15:81:23:5b:ee:65:00:1d:ef: +# 46:45:9c:1f +#Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 257 (0x101) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: O=Test, CN=TestIntCA +# Validity +# Not Before: Feb 24 01:22:24 2015 GMT +# Not After : Feb 24 01:22:24 2016 GMT +# Subject: O=Test, CN=TestOCSP +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:d2:5c:ae:11:f6:c6:ae:97:ba:31:ed:2b:b6:e1: +# c7:58:03:e5:9b:ee:78:53:cb:33:a5:15:fd:c6:49: +# 16:83:0e:c8:21:7d:cf:a8:eb:18:31:32:0a:62:0c: +# 4e:c7:a5:a5:75:9d:db:72:90:e3:5a:ae:53:0a:1b: +# 59:3f:bd:3a:67:b1:bf:98:64:a4:85:f0:97:10:8b: +# 0e:7e:7b:5e:d4:32:ab:b5:ef:c3:de:22:c0:11:90: +# c8:37:e4:48:b0:5e:fc:1a:2c:7a:85:2b:a6:bd:18: +# 64:08:d3:e3:b8:d8:ab:2e:b5:d8:e8:12:2e:58:45: +# 69:ac:56:94:62:e3:c2:c4:3c:08:ea:b3:bb:a4:89: +# 7e:fb:84:5e:95:49:6f:b9:33:66:1a:c2:7f:36:55: +# 18:a7:21:e4:1b:75:c0:e8:c9:02:1b:9c:f1:8b:b1: +# 58:b0:8c:da:5c:24:a5:f4:a5:36:52:1c:76:d3:5a: +# 71:ee:f0:c8:4b:65:58:0b:d6:d6:6c:23:3b:d0:8f: +# f5:3a:66:d4:f4:fd:34:90:c2:35:a1:6d:70:49:39: +# a6:71:3d:0d:7c:85:d3:d1:f5:6e:30:05:42:a1:88: +# ab:94:1f:25:f2:76:85:57:cb:77:b6:9e:a3:03:26: +# ff:b1:47:71:67:20:75:8d:83:10:17:6c:9a:93:4b: +# f6:31 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# 58:78:83:0E:47:61:C2:C9:E0:77:A7:FE:AD:9C:A4:5F:00:E8:A6:6C +# X509v3 Authority Key Identifier: +# keyid:9B:F9:84:06:6A:FC:D2:EB:08:93:FB:E4:EE:2F:D8:C1:C2:89:7A:A7 +# +# X509v3 Key Usage: critical +# Digital Signature +# X509v3 Extended Key Usage: +# OCSP Signing +# OCSP No Check: +# +# Signature Algorithm: sha256WithRSAEncryption +# 55:13:0c:0b:4a:35:14:25:ef:36:48:59:86:07:e8:c0:cd:d0: +# 9c:19:d1:36:63:85:d1:f0:46:ff:af:39:37:80:bd:3e:c4:88: +# fa:66:2d:57:08:97:1b:20:00:37:30:38:14:cf:ff:5d:01:c4: +# e0:06:aa:82:c9:64:3f:ed:89:1e:da:2a:02:c5:1d:4f:8b:d0: +# 15:f3:26:43:b1:a8:09:f7:1e:d4:0f:37:bd:50:6c:cd:b1:8b: +# a7:77:1a:e9:95:ec:fc:45:31:36:e4:23:c6:63:5e:64:61:ac: +# a9:a3:a8:7c:26:f5:91:57:aa:0d:51:d3:df:ad:29:d3:ef:58: +# ab:74:2f:81:dc:9e:97:35:0d:94:88:0f:34:5d:b7:80:ed:49: +# 2a:39:f4:c9:51:b8:8d:8d:db:e6:ec:04:39:ba:69:55:67:24: +# fe:8f:26:f1:1c:62:0c:ad:95:dc:de:5c:7b:6c:0e:e9:d4:fe: +# e3:cf:9e:d1:5d:da:aa:f9:17:8d:92:ab:2d:54:67:05:c2:7a: +# 51:84:72:c9:ab:f0:32:6b:86:f3:1f:c4:93:3b:9b:8d:73:12: +# 4f:58:2d:59:43:32:1d:0a:0c:a5:58:59:da:ce:9d:12:b4:d3: +# 4f:29:98:dc:a5:44:bd:93:23:65:ad:19:30:ab:72:44:15:48: +# a0:7a:9e:ea:d5:f5:9a:9e:fa:70:32:aa:51:b3:04:b6:91:c4: +# b8:d7:61:ae:c0:41:ec:5a:93:b4:62:bc:09:c4:04:d8:d4:33: +# 09:f9:63:20:d5:01:ed:b9:60:47:14:77:d1:f7:c5:41:3b:3b: +# e7:5d:73:d9:ad:ad:95:20:9c:40:1f:e4:47:0a:f6:54:bb:b8: +# 09:63:00:49:db:2e:7c:2a:79:96:86:1b:96:3b:54:97:48:b4: +# 39:46:f2:27:ef:8c:96:46:cd:af:8e:55:70:9d:6c:8f:d1:1a: +# 4c:fa:e8:90:a4:29:10:04:d1:bf:b2:de:04:28:2a:af:ae:dd: +# df:a6:f9:4a:66:19:76:7a:aa:cf:b0:68:c3:ef:83:3b:7b:e9: +# 6f:12:97:1d:db:1e:2a:da:07:03:d0:ba:c1:87:02:cd:59:be: +# b4:21:22:3b:d8:5d:7d:b4:a3:c7:2a:56:3e:09:6c:6b:6f:54: +# 22:03:bb:b2:d7:98:8a:2f:51:ec:fa:7d:3e:dc:c8:6f:db:2a: +# 6f:46:56:2e:08:b9:41:81:d8:58:a4:6e:2a:c8:46:db:63:52: +# 38:c6:45:1a:6a:a3:04:3e:48:0e:84:3d:29:47:8b:80:fc:ee: +# b4:c8:12:f0:03:ef:7b:48:2d:94:80:a2:51:c3:14:92:7e:57: +# 83:cd:56:7e:9b:8d:c5:c2 +#-----BEGIN CERTIFICATE----- +#MIIEOTCCAiGgAwIBAgICAQEwDQYJKoZIhvcNAQELBQAwIzENMAsGA1UECgwEVGVz +#dDESMBAGA1UEAwwJVGVzdEludENBMB4XDTE1MDIyNDAxMjIyNFoXDTE2MDIyNDAx +#MjIyNFowIjENMAsGA1UECgwEVGVzdDERMA8GA1UEAwwIVGVzdE9DU1AwggEiMA0G +#CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSXK4R9saul7ox7Su24cdYA+Wb7nhT +#yzOlFf3GSRaDDsghfc+o6xgxMgpiDE7HpaV1ndtykONarlMKG1k/vTpnsb+YZKSF +#8JcQiw5+e17UMqu178PeIsARkMg35EiwXvwaLHqFK6a9GGQI0+O42KsutdjoEi5Y +#RWmsVpRi48LEPAjqs7ukiX77hF6VSW+5M2Yawn82VRinIeQbdcDoyQIbnPGLsViw +#jNpcJKX0pTZSHHbTWnHu8MhLZVgL1tZsIzvQj/U6ZtT0/TSQwjWhbXBJOaZxPQ18 +#hdPR9W4wBUKhiKuUHyXydoVXy3e2nqMDJv+xR3FnIHWNgxAXbJqTS/YxAgMBAAGj +#eDB2MB0GA1UdDgQWBBRYeIMOR2HCyeB3p/6tnKRfAOimbDAfBgNVHSMEGDAWgBSb +#+YQGavzS6wiT++TuL9jBwol6pzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYI +#KwYBBQUHAwkwDwYJKwYBBQUHMAEFBAIFADANBgkqhkiG9w0BAQsFAAOCAgEAVRMM +#C0o1FCXvNkhZhgfowM3QnBnRNmOF0fBG/685N4C9PsSI+mYtVwiXGyAANzA4FM// +#XQHE4AaqgslkP+2JHtoqAsUdT4vQFfMmQ7GoCfce1A83vVBszbGLp3ca6ZXs/EUx +#NuQjxmNeZGGsqaOofCb1kVeqDVHT360p0+9Yq3QvgdyelzUNlIgPNF23gO1JKjn0 +#yVG4jY3b5uwEObppVWck/o8m8RxiDK2V3N5ce2wO6dT+48+e0V3aqvkXjZKrLVRn +#BcJ6UYRyyavwMmuG8x/EkzubjXMST1gtWUMyHQoMpVhZ2s6dErTTTymY3KVEvZMj +#Za0ZMKtyRBVIoHqe6tX1mp76cDKqUbMEtpHEuNdhrsBB7FqTtGK8CcQE2NQzCflj +#INUB7blgRxR30ffFQTs7511z2a2tlSCcQB/kRwr2VLu4CWMASdsufCp5loYbljtU +#l0i0OUbyJ++MlkbNr45VcJ1sj9EaTProkKQpEATRv7LeBCgqr67d36b5SmYZdnqq +#z7Bow++DO3vpbxKXHdseKtoHA9C6wYcCzVm+tCEiO9hdfbSjxypWPglsa29UIgO7 +#steYii9R7Pp9PtzIb9sqb0ZWLgi5QYHYWKRuKshG22NSOMZFGmqjBD5IDoQ9KUeL +#gPzutMgS8APve0gtlICiUcMUkn5Xg81WfpuNxcI= +#-----END CERTIFICATE----- +#Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 2 (0x2) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: O=Test, CN=TestRoot +# Validity +# Not Before: Feb 24 00:59:51 2015 GMT +# Not After : Feb 13 00:59:51 2017 GMT +# Subject: O=Test, CN=TestIntCA +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (4096 bit) +# Modulus: +# 00:bf:0a:29:02:54:00:97:c3:81:e6:33:89:74:03: +# cc:a7:f4:8d:54:17:36:48:97:6a:32:4e:b8:87:6d: +# 62:8e:87:7f:91:64:3b:75:d5:3d:93:19:17:d2:00: +# d8:db:c3:91:7c:35:23:59:d4:29:a3:e1:da:28:66: +# 28:85:6b:d3:44:09:38:82:42:2f:23:ab:e6:1b:2f: +# 8c:c3:12:40:99:8d:2e:a6:95:16:9c:75:b1:07:bd: +# 76:f6:17:bc:a4:93:8f:9f:cd:eb:6d:1c:8c:5c:0c: +# 2a:8d:b8:71:2c:ed:ad:fe:7b:ed:3e:c3:e7:24:d4: +# ae:53:42:34:c5:82:f9:fa:15:71:ba:9e:16:a7:1e: +# c5:5c:a7:48:b3:26:f4:a9:34:71:84:b8:7b:77:a7: +# f1:a2:8e:f5:e8:cd:25:f9:63:89:b1:98:2a:8e:4d: +# da:9e:2d:d2:a5:96:ca:32:1e:e2:22:b1:0b:b9:0f: +# 98:0a:ae:08:2f:a8:fe:90:2f:d8:0d:16:79:2d:c8: +# 62:22:69:f3:18:2b:a9:c7:d1:85:f7:5d:d5:ab:44: +# 6f:91:9a:1a:86:22:0b:7e:57:97:98:6a:bd:bb:55: +# 1e:e6:44:62:18:0b:af:a4:3e:ba:a7:5f:f1:a6:28: +# 5c:fe:df:19:9a:cd:39:e3:9a:5e:bc:aa:49:0c:22: +# 24:b7:1c:d4:21:99:0b:c4:48:95:b8:de:ad:4c:e1: +# 39:e8:34:5d:c6:0c:4f:2c:22:c8:e8:cd:19:b7:d3: +# 8f:d3:cd:76:76:0f:b1:bb:0a:45:be:9d:5f:2a:5d: +# 51:1c:47:79:bc:c9:d1:bc:30:33:ae:2d:db:27:b9: +# 1b:ff:2c:cb:b2:af:7d:e5:a6:9b:6f:23:98:7e:76: +# 74:45:5f:41:15:73:c1:9c:f5:88:c6:8f:ca:9b:78: +# 70:ee:8b:ba:d1:bc:60:4f:29:76:6d:28:2f:3b:09: +# e6:47:53:49:04:15:67:1d:af:0d:51:f8:43:92:c8: +# ab:ea:f0:09:9e:47:87:2e:62:d8:91:6e:40:de:ac: +# 1b:e1:6a:47:41:c3:7d:cf:90:e0:e9:34:80:d0:56: +# 9a:92:83:18:0a:c4:61:b7:60:3d:9a:4c:db:61:0a: +# d0:d0:71:f1:ee:de:11:ad:fa:ee:4b:8f:fe:15:ed: +# 6d:e4:b0:ba:70:9c:30:ea:52:4d:31:a4:95:35:a1: +# 1c:d9:15:9f:9c:ab:06:50:eb:ae:d4:bb:17:74:27: +# 44:b9:35:fa:15:61:e1:13:f6:1e:46:88:9c:d3:67: +# ca:bc:a5:7c:db:b9:7e:23:1c:24:77:fa:84:8f:38: +# 7f:2a:42:d5:49:e0:33:09:5d:29:28:2f:93:33:20: +# f9:cf:21 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# 9B:F9:84:06:6A:FC:D2:EB:08:93:FB:E4:EE:2F:D8:C1:C2:89:7A:A7 +# X509v3 Authority Key Identifier: +# keyid:12:B9:C3:48:79:ED:7D:30:C9:78:78:61:94:58:37:07:40:76:38:18 +# +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Key Usage: +# Certificate Sign, CRL Sign +# Signature Algorithm: sha256WithRSAEncryption +# 79:28:d5:46:92:1f:6b:25:de:b0:1e:e2:44:d3:7b:a3:4a:6e: +# 05:43:dd:85:47:4d:ca:d0:d9:43:65:34:38:a0:c2:6c:fb:49: +# 85:6d:f3:dc:10:8c:73:37:49:22:c3:87:dd:28:8a:b0:b2:2c: +# a3:9c:f6:15:4d:98:39:95:a1:21:72:36:ff:04:67:e5:ba:3e: +# bd:5e:d4:81:ac:f4:1c:f5:ab:8d:dd:73:e9:37:d9:d2:80:39: +# 5b:f5:ec:fe:9c:56:ec:10:f7:86:42:17:d1:f1:4b:c5:38:fe: +# 0e:85:2c:6e:ac:6f:52:e5:a8:b9:fe:af:f5:dc:35:0a:74:f8: +# 72:4f:51:d5:95:f4:fe:8f:fa:3f:d5:d2:1f:44:3b:63:60:4a: +# e2:99:37:bf:09:40:32:6c:ea:3c:61:85:77:bc:63:6e:11:f9: +# 41:5f:cb:4c:99:39:2a:37:66:79:4d:5a:7e:93:91:53:33:ce: +# b1:c0:1c:68:97:2e:5a:e1:66:59:41:52:07:cf:4a:02:24:54: +# dd:01:97:2f:f1:85:db:50:9c:3b:16:95:d2:08:ca:f6:93:9a: +# 01:33:36:40:7c:39:e3:df:f8:7b:a7:b5:ea:60:06:a5:74:3a: +# dc:ea:36:08:6b:c1:59:03:01:77:17:0e:6b:e1:9a:48:68:06: +# 31:03:28:0b:cb:dd:61:93:80:0c:f1:16:e4:87:26:86:72:b4: +# 12:32:7b:f7:85:59:9a:e3:1c:c4:d8:6e:55:a9:7e:c5:ce:8b: +# be:d2:bf:57:34:62:83:f1:d0:3a:73:e1:75:e1:f4:77:5b:a3: +# a3:35:7a:fb:b6:85:68:d5:ad:26:95:71:60:62:92:30:d3:5c: +# 7b:8e:42:14:e8:7b:27:13:e6:aa:cb:35:42:2c:db:e9:1f:ff: +# fd:4c:8f:fc:04:d8:05:16:da:a8:93:db:3b:f2:51:17:ff:dc: +# c7:11:97:14:ac:d8:5a:e7:ad:38:fa:17:bf:bd:4b:92:84:0d: +# 96:20:7d:17:ee:31:a6:56:57:5e:a4:0d:d2:cb:47:e8:45:14: +# e4:6a:4a:a1:40:da:b7:bc:e8:aa:60:59:4c:4a:3b:0c:ef:26: +# 39:fc:cb:8c:fe:79:c3:35:34:f5:3a:11:d3:e6:e7:fe:fd:bc: +# 89:6a:c5:d0:5b:a2:b9:84:9d:b4:53:d1:1f:c0:f6:fd:80:8a: +# 88:f8:aa:04:8f:5d:83:4a:91:ed:90:f0:f6:0a:bb:1a:01:d7: +# a4:bb:3c:c4:c1:e1:38:ca:03:8b:61:d8:18:ab:bc:ef:7e:18: +# aa:df:61:d1:1f:64:10:04:e9:25:7d:c3:bb:10:e0:11:55:29: +# e6:56:87:80:bf:95:20:c5 +#-----BEGIN CERTIFICATE----- +#MIIFIDCCAwigAwIBAgIBAjANBgkqhkiG9w0BAQsFADAiMQ0wCwYDVQQKDARUZXN0 +#MREwDwYDVQQDDAhUZXN0Um9vdDAeFw0xNTAyMjQwMDU5NTFaFw0xNzAyMTMwMDU5 +#NTFaMCMxDTALBgNVBAoMBFRlc3QxEjAQBgNVBAMMCVRlc3RJbnRDQTCCAiIwDQYJ +#KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL8KKQJUAJfDgeYziXQDzKf0jVQXNkiX +#ajJOuIdtYo6Hf5FkO3XVPZMZF9IA2NvDkXw1I1nUKaPh2ihmKIVr00QJOIJCLyOr +#5hsvjMMSQJmNLqaVFpx1sQe9dvYXvKSTj5/N620cjFwMKo24cSztrf577T7D5yTU +#rlNCNMWC+foVcbqeFqcexVynSLMm9Kk0cYS4e3en8aKO9ejNJfljibGYKo5N2p4t +#0qWWyjIe4iKxC7kPmAquCC+o/pAv2A0WeS3IYiJp8xgrqcfRhfdd1atEb5GaGoYi +#C35Xl5hqvbtVHuZEYhgLr6Q+uqdf8aYoXP7fGZrNOeOaXryqSQwiJLcc1CGZC8RI +#lbjerUzhOeg0XcYMTywiyOjNGbfTj9PNdnYPsbsKRb6dXypdURxHebzJ0bwwM64t +#2ye5G/8sy7KvfeWmm28jmH52dEVfQRVzwZz1iMaPypt4cO6LutG8YE8pdm0oLzsJ +#5kdTSQQVZx2vDVH4Q5LIq+rwCZ5Hhy5i2JFuQN6sG+FqR0HDfc+Q4Ok0gNBWmpKD +#GArEYbdgPZpM22EK0NBx8e7eEa367kuP/hXtbeSwunCcMOpSTTGklTWhHNkVn5yr +#BlDrrtS7F3QnRLk1+hVh4RP2HkaInNNnyrylfNu5fiMcJHf6hI84fypC1UngMwld +#KSgvkzMg+c8hAgMBAAGjYDBeMB0GA1UdDgQWBBSb+YQGavzS6wiT++TuL9jBwol6 +#pzAfBgNVHSMEGDAWgBQSucNIee19MMl4eGGUWDcHQHY4GDAPBgNVHRMBAf8EBTAD +#AQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAeSjVRpIfayXesB7i +#RNN7o0puBUPdhUdNytDZQ2U0OKDCbPtJhW3z3BCMczdJIsOH3SiKsLIso5z2FU2Y +#OZWhIXI2/wRn5bo+vV7Ugaz0HPWrjd1z6TfZ0oA5W/Xs/pxW7BD3hkIX0fFLxTj+ +#DoUsbqxvUuWouf6v9dw1CnT4ck9R1ZX0/o/6P9XSH0Q7Y2BK4pk3vwlAMmzqPGGF +#d7xjbhH5QV/LTJk5KjdmeU1afpORUzPOscAcaJcuWuFmWUFSB89KAiRU3QGXL/GF +#21CcOxaV0gjK9pOaATM2QHw549/4e6e16mAGpXQ63Oo2CGvBWQMBdxcOa+GaSGgG +#MQMoC8vdYZOADPEW5IcmhnK0EjJ794VZmuMcxNhuVal+xc6LvtK/VzRig/HQOnPh +#deH0d1ujozV6+7aFaNWtJpVxYGKSMNNce45CFOh7JxPmqss1Qizb6R///UyP/ATY +#BRbaqJPbO/JRF//cxxGXFKzYWuetOPoXv71LkoQNliB9F+4xplZXXqQN0stH6EUU +#5GpKoUDat7zoqmBZTEo7DO8mOfzLjP55wzU09ToR0+bn/v28iWrF0FuiuYSdtFPR +#H8D2/YCKiPiqBI9dg0qR7ZDw9gq7GgHXpLs8xMHhOMoDi2HYGKu8734Yqt9h0R9k +#EATpJX3DuxDgEVUp5laHgL+VIMU= +#-----END CERTIFICATE----- + +MIILYQoBAKCCC1owggtWBgkrBgEFBQcwAQEEggtHMIILQzCBw6EkMCIxDTALBgNV +BAoMBFRlc3QxETAPBgNVBAMMCFRlc3RPQ1NQGA8yMDE1MDIyODAwNDI1OFowZTBj +MDswCQYFKw4DAhoFAAQUEFZXi3QYEyYf2XEq2mAHf/fGHo8EFJv5hAZq/NLrCJP7 +5O4v2MHCiXqnAgIVAIAAGA8yMDE1MDIyODAwNDI1OFqgERgPMjAxNTAzMDEwMDQy +NThaoSMwITAfBgkrBgEFBQcwAQIEEgQQD2OgLTBqeVEHj55vTHqKUzANBgkqhkiG +9w0BAQUFAAOCAQEASbR/JCmaMTAWfSN0U4PpTNsICSDJeOo9pd8l/U7eiCQ1C/pv +iLBvapLGcylNHnCM47JC3/XSCqFLu3evlwcF1uxrh43/I5UiWEGfFXBEM0oeClC7 +F1bcGe+oID9xjvIETIAiAQurNN89/y4ED4Bmsr/QnL9zORgGvUYODnjxQLuMWSMM +Zzy7qbsU2Tn+6ESHrjmYozaDjyCtNcc2WMcDeDdtaqBffYdvTzcEP9H95MHhcAdK +xmn6fx2CGx2x+tOcgkL1OM9LhZv98kvRgX78cEH0On1mQGvFdkcq8Xn/oG8TaxP+ +hsPNawgoH2TBsSMdAbCqFYEjW+5lAB3vRkWcH6CCCWUwgglhMIIEOTCCAiGgAwIB +AgICAQEwDQYJKoZIhvcNAQELBQAwIzENMAsGA1UECgwEVGVzdDESMBAGA1UEAwwJ +VGVzdEludENBMB4XDTE1MDIyNDAxMjIyNFoXDTE2MDIyNDAxMjIyNFowIjENMAsG +A1UECgwEVGVzdDERMA8GA1UEAwwIVGVzdE9DU1AwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQDSXK4R9saul7ox7Su24cdYA+Wb7nhTyzOlFf3GSRaDDsgh +fc+o6xgxMgpiDE7HpaV1ndtykONarlMKG1k/vTpnsb+YZKSF8JcQiw5+e17UMqu1 +78PeIsARkMg35EiwXvwaLHqFK6a9GGQI0+O42KsutdjoEi5YRWmsVpRi48LEPAjq +s7ukiX77hF6VSW+5M2Yawn82VRinIeQbdcDoyQIbnPGLsViwjNpcJKX0pTZSHHbT +WnHu8MhLZVgL1tZsIzvQj/U6ZtT0/TSQwjWhbXBJOaZxPQ18hdPR9W4wBUKhiKuU +HyXydoVXy3e2nqMDJv+xR3FnIHWNgxAXbJqTS/YxAgMBAAGjeDB2MB0GA1UdDgQW +BBRYeIMOR2HCyeB3p/6tnKRfAOimbDAfBgNVHSMEGDAWgBSb+YQGavzS6wiT++Tu +L9jBwol6pzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwkwDwYJ +KwYBBQUHMAEFBAIFADANBgkqhkiG9w0BAQsFAAOCAgEAVRMMC0o1FCXvNkhZhgfo +wM3QnBnRNmOF0fBG/685N4C9PsSI+mYtVwiXGyAANzA4FM//XQHE4AaqgslkP+2J +HtoqAsUdT4vQFfMmQ7GoCfce1A83vVBszbGLp3ca6ZXs/EUxNuQjxmNeZGGsqaOo +fCb1kVeqDVHT360p0+9Yq3QvgdyelzUNlIgPNF23gO1JKjn0yVG4jY3b5uwEObpp +VWck/o8m8RxiDK2V3N5ce2wO6dT+48+e0V3aqvkXjZKrLVRnBcJ6UYRyyavwMmuG +8x/EkzubjXMST1gtWUMyHQoMpVhZ2s6dErTTTymY3KVEvZMjZa0ZMKtyRBVIoHqe +6tX1mp76cDKqUbMEtpHEuNdhrsBB7FqTtGK8CcQE2NQzCfljINUB7blgRxR30ffF +QTs7511z2a2tlSCcQB/kRwr2VLu4CWMASdsufCp5loYbljtUl0i0OUbyJ++MlkbN +r45VcJ1sj9EaTProkKQpEATRv7LeBCgqr67d36b5SmYZdnqqz7Bow++DO3vpbxKX +HdseKtoHA9C6wYcCzVm+tCEiO9hdfbSjxypWPglsa29UIgO7steYii9R7Pp9PtzI +b9sqb0ZWLgi5QYHYWKRuKshG22NSOMZFGmqjBD5IDoQ9KUeLgPzutMgS8APve0gt +lICiUcMUkn5Xg81WfpuNxcIwggUgMIIDCKADAgECAgECMA0GCSqGSIb3DQEBCwUA +MCIxDTALBgNVBAoMBFRlc3QxETAPBgNVBAMMCFRlc3RSb290MB4XDTE1MDIyNDAw +NTk1MVoXDTE3MDIxMzAwNTk1MVowIzENMAsGA1UECgwEVGVzdDESMBAGA1UEAwwJ +VGVzdEludENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvwopAlQA +l8OB5jOJdAPMp/SNVBc2SJdqMk64h21ijod/kWQ7ddU9kxkX0gDY28ORfDUjWdQp +o+HaKGYohWvTRAk4gkIvI6vmGy+MwxJAmY0uppUWnHWxB7129he8pJOPn83rbRyM +XAwqjbhxLO2t/nvtPsPnJNSuU0I0xYL5+hVxup4Wpx7FXKdIsyb0qTRxhLh7d6fx +oo716M0l+WOJsZgqjk3ani3SpZbKMh7iIrELuQ+YCq4IL6j+kC/YDRZ5LchiImnz +GCupx9GF913Vq0RvkZoahiILfleXmGq9u1Ue5kRiGAuvpD66p1/xpihc/t8Zms05 +45pevKpJDCIktxzUIZkLxEiVuN6tTOE56DRdxgxPLCLI6M0Zt9OP0812dg+xuwpF +vp1fKl1RHEd5vMnRvDAzri3bJ7kb/yzLsq995aabbyOYfnZ0RV9BFXPBnPWIxo/K +m3hw7ou60bxgTyl2bSgvOwnmR1NJBBVnHa8NUfhDksir6vAJnkeHLmLYkW5A3qwb +4WpHQcN9z5Dg6TSA0FaakoMYCsRht2A9mkzbYQrQ0HHx7t4RrfruS4/+Fe1t5LC6 +cJww6lJNMaSVNaEc2RWfnKsGUOuu1LsXdCdEuTX6FWHhE/YeRoic02fKvKV827l+ +Ixwkd/qEjzh/KkLVSeAzCV0pKC+TMyD5zyECAwEAAaNgMF4wHQYDVR0OBBYEFJv5 +hAZq/NLrCJP75O4v2MHCiXqnMB8GA1UdIwQYMBaAFBK5w0h57X0wyXh4YZRYNwdA +djgYMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUA +A4ICAQB5KNVGkh9rJd6wHuJE03ujSm4FQ92FR03K0NlDZTQ4oMJs+0mFbfPcEIxz +N0kiw4fdKIqwsiyjnPYVTZg5laEhcjb/BGfluj69XtSBrPQc9auN3XPpN9nSgDlb +9ez+nFbsEPeGQhfR8UvFOP4OhSxurG9S5ai5/q/13DUKdPhyT1HVlfT+j/o/1dIf +RDtjYErimTe/CUAybOo8YYV3vGNuEflBX8tMmTkqN2Z5TVp+k5FTM86xwBxoly5a +4WZZQVIHz0oCJFTdAZcv8YXbUJw7FpXSCMr2k5oBMzZAfDnj3/h7p7XqYAaldDrc +6jYIa8FZAwF3Fw5r4ZpIaAYxAygLy91hk4AM8RbkhyaGcrQSMnv3hVma4xzE2G5V +qX7Fzou+0r9XNGKD8dA6c+F14fR3W6OjNXr7toVo1a0mlXFgYpIw01x7jkIU6Hsn +E+aqyzVCLNvpH//9TI/8BNgFFtqok9s78lEX/9zHEZcUrNha5604+he/vUuShA2W +IH0X7jGmVldepA3Sy0foRRTkakqhQNq3vOiqYFlMSjsM7yY5/MuM/nnDNTT1OhHT +5uf+/byJasXQW6K5hJ20U9EfwPb9gIqI+KoEj12DSpHtkPD2CrsaAdekuzzEweE4 +ygOLYdgYq7zvfhiq32HRH2QQBOklfcO7EOARVSnmVoeAv5UgxQ== diff --git a/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-bad-sr-tag.resp b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-bad-sr-tag.resp new file mode 100644 index 00000000000..3244266e5c4 --- /dev/null +++ b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-bad-sr-tag.resp @@ -0,0 +1,60 @@ +# This is an invalid OCSP response and cannot be displayed using openssl's +# ocsp utility. Below is an asn1parse of the BasicOCSPResponse. The bytes +# normally corresponding to a nextUpdate field have been changed from +# [CONTEXT 0] to an OCTET_STRING (see offset 170 below) +# +# 0:d=0 hl=4 l= 528 cons: SEQUENCE +# 4:d=1 hl=3 l= 249 cons: SEQUENCE +# 7:d=2 hl=2 l= 36 cons: cont [ 1 ] +# 9:d=3 hl=2 l= 34 cons: SEQUENCE +# 11:d=4 hl=2 l= 13 cons: SET +# 13:d=5 hl=2 l= 11 cons: SEQUENCE +# 15:d=6 hl=2 l= 3 prim: OBJECT :organizationName +# 20:d=6 hl=2 l= 4 prim: UTF8STRING :Test +# 26:d=4 hl=2 l= 17 cons: SET +# 28:d=5 hl=2 l= 15 cons: SEQUENCE +# 30:d=6 hl=2 l= 3 prim: OBJECT :commonName +# 35:d=6 hl=2 l= 8 prim: UTF8STRING :TestOCSP +# 45:d=2 hl=2 l= 15 prim: GENERALIZEDTIME :20150303165544Z +# 62:d=2 hl=3 l= 154 cons: SEQUENCE +# 65:d=3 hl=3 l= 151 cons: SEQUENCE +# 68:d=4 hl=2 l= 59 cons: SEQUENCE +# 70:d=5 hl=2 l= 9 cons: SEQUENCE +# 72:d=6 hl=2 l= 5 prim: OBJECT :sha1 +# 79:d=6 hl=2 l= 0 prim: NULL +# 81:d=5 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:1056578B741813261FD9712ADA60077FF7C61E8F +# 103:d=5 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:9BF984066AFCD2EB0893FBE4EE2FD8C1C2897AA7 +# 125:d=5 hl=2 l= 2 prim: INTEGER :1500 +# 129:d=4 hl=2 l= 22 cons: cont [ 1 ] +# 131:d=5 hl=2 l= 15 prim: GENERALIZEDTIME :20150219155030Z +# 148:d=5 hl=2 l= 3 cons: cont [ 0 ] +# 150:d=6 hl=2 l= 1 prim: ENUMERATED :01 +# 153:d=4 hl=2 l= 15 prim: GENERALIZEDTIME :20150303165544Z +# 170:d=4 hl=2 l= 17 prim: OCTET STRING [HEX DUMP]:180F32303135303330343136353534345A +# 189:d=4 hl=2 l= 28 cons: cont [ 1 ] +# 191:d=5 hl=2 l= 26 cons: SEQUENCE +# 193:d=6 hl=2 l= 24 cons: SEQUENCE +# 195:d=7 hl=2 l= 3 prim: OBJECT :Invalidity Date +# 200:d=7 hl=2 l= 17 prim: OCTET STRING [HEX DUMP]:180F32303135303231393134303030305A +# 219:d=2 hl=2 l= 35 cons: cont [ 1 ] +# 221:d=3 hl=2 l= 33 cons: SEQUENCE +# 223:d=4 hl=2 l= 31 cons: SEQUENCE +# 225:d=5 hl=2 l= 9 prim: OBJECT :OCSP Nonce +# 236:d=5 hl=2 l= 18 prim: OCTET STRING [HEX DUMP]:0410381EF873C4A3B4C64B22873751071B53 +# 256:d=1 hl=2 l= 13 cons: SEQUENCE +# 258:d=2 hl=2 l= 9 prim: OBJECT :sha1WithRSAEncryption +# 269:d=2 hl=2 l= 0 prim: NULL +# 271:d=1 hl=4 l= 257 prim: BIT STRING + +MIICLgoBAKCCAicwggIjBgkrBgEFBQcwAQEEggIUMIICEDCB+aEkMCIxDTALBgNV +BAoMBFRlc3QxETAPBgNVBAMMCFRlc3RPQ1NQGA8yMDE1MDMwMzE2NTU0NFowgZow +gZcwOzAJBgUrDgMCGgUABBQQVleLdBgTJh/ZcSraYAd/98YejwQUm/mEBmr80usI +k/vk7i/YwcKJeqcCAhUAoRYYDzIwMTUwMjE5MTU1MDMwWqADCgEBGA8yMDE1MDMw +MzE2NTU0NFoEERgPMjAxNTAzMDQxNjU1NDRaoRwwGjAYBgNVHRgEERgPMjAxNTAy +MTkxNDAwMDBaoSMwITAfBgkrBgEFBQcwAQIEEgQQOB74c8SjtMZLIoc3UQcbUzAN +BgkqhkiG9w0BAQUFAAOCAQEAbcY28K9+oXtDfNb2yxlzauMaeEoD477ouC7DIwCb +TgpkcjGCTjmvwg4A3sG95Z02x1xuW48XK2YkFytsBmdcfZvEnoK/WqG+qd9Aiytf +NoecsMjF8MyatHcJdQ+jq59jPWAqMGWCPmPVZ6TxHF5Ag2DAU5aL5sAjY2zvxYnl +Uc+FShl4K6Nk+mSSfu6ji8hkUEPx5rU1H0jBomMm4GMyNkxVj3NkOKSCxNWi/1Oe +utUk8Eir8Krqfd7yOn0flfroHZ2I0zf95VduxvVCsN7pgAf8Q1BAkbuq/8JRNrDr +a0kHSpO7QAv6iE7YT/SsHN5MDjtRJ780VEggV3td56R37g== diff --git a/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-nocerts.resp b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-nocerts.resp new file mode 100644 index 00000000000..5f41b69d4d3 --- /dev/null +++ b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-nocerts.resp @@ -0,0 +1,53 @@ +#OCSP Response Data: +# OCSP Response Status: successful (0x0) +# Response Type: Basic OCSP Response +# Version: 1 (0x0) +# Responder Id: O = Test, CN = TestOCSP +# Produced At: Mar 3 16:55:44 2015 GMT +# Responses: +# Certificate ID: +# Hash Algorithm: sha1 +# Issuer Name Hash: 1056578B741813261FD9712ADA60077FF7C61E8F +# Issuer Key Hash: 9BF984066AFCD2EB0893FBE4EE2FD8C1C2897AA7 +# Serial Number: 1500 +# Cert Status: revoked +# Revocation Time: Feb 19 15:50:30 2015 GMT +# Revocation Reason: keyCompromise (0x1) +# This Update: Mar 3 16:55:44 2015 GMT +# Next Update: Mar 4 16:55:44 2015 GMT +# Response Single Extensions: +# Invalidity Date: +# Feb 19 14:00:00 2015 GMT +# +# Response Extensions: +# OCSP Nonce: +# 0410381EF873C4A3B4C64B22873751071B53 +# Signature Algorithm: sha1WithRSAEncryption +# 6d:c6:36:f0:af:7e:a1:7b:43:7c:d6:f6:cb:19:73:6a:e3:1a: +# 78:4a:03:e3:be:e8:b8:2e:c3:23:00:9b:4e:0a:64:72:31:82: +# 4e:39:af:c2:0e:00:de:c1:bd:e5:9d:36:c7:5c:6e:5b:8f:17: +# 2b:66:24:17:2b:6c:06:67:5c:7d:9b:c4:9e:82:bf:5a:a1:be: +# a9:df:40:8b:2b:5f:36:87:9c:b0:c8:c5:f0:cc:9a:b4:77:09: +# 75:0f:a3:ab:9f:63:3d:60:2a:30:65:82:3e:63:d5:67:a4:f1: +# 1c:5e:40:83:60:c0:53:96:8b:e6:c0:23:63:6c:ef:c5:89:e5: +# 51:cf:85:4a:19:78:2b:a3:64:fa:64:92:7e:ee:a3:8b:c8:64: +# 50:43:f1:e6:b5:35:1f:48:c1:a2:63:26:e0:63:32:36:4c:55: +# 8f:73:64:38:a4:82:c4:d5:a2:ff:53:9e:ba:d5:24:f0:48:ab: +# f0:aa:ea:7d:de:f2:3a:7d:1f:95:fa:e8:1d:9d:88:d3:37:fd: +# e5:57:6e:c6:f5:42:b0:de:e9:80:07:fc:43:50:40:91:bb:aa: +# ff:c2:51:36:b0:eb:6b:49:07:4a:93:bb:40:0b:fa:88:4e:d8: +# 4f:f4:ac:1c:de:4c:0e:3b:51:27:bf:34:54:48:20:57:7b:5d: +# e7:a4:77:ee + +MIICLgoBAKCCAicwggIjBgkrBgEFBQcwAQEEggIUMIICEDCB+aEkMCIxDTALBgNV +BAoMBFRlc3QxETAPBgNVBAMMCFRlc3RPQ1NQGA8yMDE1MDMwMzE2NTU0NFowgZow +gZcwOzAJBgUrDgMCGgUABBQQVleLdBgTJh/ZcSraYAd/98YejwQUm/mEBmr80usI +k/vk7i/YwcKJeqcCAhUAoRYYDzIwMTUwMjE5MTU1MDMwWqADCgEBGA8yMDE1MDMw +MzE2NTU0NFqgERgPMjAxNTAzMDQxNjU1NDRaoRwwGjAYBgNVHRgEERgPMjAxNTAy +MTkxNDAwMDBaoSMwITAfBgkrBgEFBQcwAQIEEgQQOB74c8SjtMZLIoc3UQcbUzAN +BgkqhkiG9w0BAQUFAAOCAQEAbcY28K9+oXtDfNb2yxlzauMaeEoD477ouC7DIwCb +TgpkcjGCTjmvwg4A3sG95Z02x1xuW48XK2YkFytsBmdcfZvEnoK/WqG+qd9Aiytf +NoecsMjF8MyatHcJdQ+jq59jPWAqMGWCPmPVZ6TxHF5Ag2DAU5aL5sAjY2zvxYnl +Uc+FShl4K6Nk+mSSfu6ji8hkUEPx5rU1H0jBomMm4GMyNkxVj3NkOKSCxNWi/1Oe +utUk8Eir8Krqfd7yOn0flfroHZ2I0zf95VduxvVCsN7pgAf8Q1BAkbuq/8JRNrDr +a0kHSpO7QAv6iE7YT/SsHN5MDjtRJ780VEggV3td56R37g== diff --git a/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-nonext-noinv.resp b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-nonext-noinv.resp new file mode 100644 index 00000000000..7a1563bf7e0 --- /dev/null +++ b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-nonext-noinv.resp @@ -0,0 +1,317 @@ +#OCSP Response Data: +# OCSP Response Status: successful (0x0) +# Response Type: Basic OCSP Response +# Version: 1 (0x0) +# Responder Id: O = Test, CN = TestOCSP +# Produced At: Feb 28 00:45:34 2015 GMT +# Responses: +# Certificate ID: +# Hash Algorithm: sha1 +# Issuer Name Hash: 1056578B741813261FD9712ADA60077FF7C61E8F +# Issuer Key Hash: 9BF984066AFCD2EB0893FBE4EE2FD8C1C2897AA7 +# Serial Number: 1500 +# Cert Status: revoked +# Revocation Time: Feb 19 15:50:30 2015 GMT +# This Update: Feb 28 00:45:34 2015 GMT +# +# Response Extensions: +# OCSP Nonce: +# 04103E7008EC23A3AF6407E2DBADF1824550 +# Signature Algorithm: sha1WithRSAEncryption +# 80:e7:3c:82:51:51:30:56:7c:9b:10:a3:14:62:86:b7:48:5f: +# c7:18:3a:d6:a1:63:f4:8b:83:dc:87:0f:41:39:89:b6:60:40: +# 11:5e:71:2a:dd:f0:c2:3d:bb:9a:9e:d5:05:c5:6a:6b:a1:02: +# ab:1d:24:94:ae:70:77:19:ba:08:87:05:39:1a:73:82:77:bd: +# f2:58:5b:a6:94:05:2e:2d:62:99:2d:ec:0a:cc:0c:89:5b:5d: +# 94:dc:08:b4:79:96:18:4e:79:13:cd:2e:44:02:b3:af:b2:1f: +# 66:99:2a:37:0a:7d:fb:1b:60:94:97:7a:68:dd:75:15:d3:97: +# 00:6e:dc:45:b4:92:06:38:26:ce:71:e4:5a:5c:cd:67:1d:f6: +# 4f:19:b1:51:83:8a:db:9a:cd:6b:63:a1:1f:ea:e5:23:62:20: +# 73:41:28:bd:e8:51:c7:8a:79:8e:6b:dd:33:a0:a0:db:e5:23: +# 59:a3:1d:84:48:f5:b2:20:1a:04:a2:ec:07:f6:1d:e5:06:1c: +# ab:81:49:f1:ea:69:f8:34:8f:59:2a:ee:7a:97:f8:cf:c5:55: +# 37:2b:fb:ab:8d:76:4f:48:94:16:34:3c:81:61:9a:ae:4b:b5: +# 2c:39:df:d8:77:d0:02:0c:0c:51:99:1b:37:8e:6b:3f:9d:96: +# 5a:09:4c:ae +#Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 257 (0x101) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: O=Test, CN=TestIntCA +# Validity +# Not Before: Feb 24 01:22:24 2015 GMT +# Not After : Feb 24 01:22:24 2016 GMT +# Subject: O=Test, CN=TestOCSP +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:d2:5c:ae:11:f6:c6:ae:97:ba:31:ed:2b:b6:e1: +# c7:58:03:e5:9b:ee:78:53:cb:33:a5:15:fd:c6:49: +# 16:83:0e:c8:21:7d:cf:a8:eb:18:31:32:0a:62:0c: +# 4e:c7:a5:a5:75:9d:db:72:90:e3:5a:ae:53:0a:1b: +# 59:3f:bd:3a:67:b1:bf:98:64:a4:85:f0:97:10:8b: +# 0e:7e:7b:5e:d4:32:ab:b5:ef:c3:de:22:c0:11:90: +# c8:37:e4:48:b0:5e:fc:1a:2c:7a:85:2b:a6:bd:18: +# 64:08:d3:e3:b8:d8:ab:2e:b5:d8:e8:12:2e:58:45: +# 69:ac:56:94:62:e3:c2:c4:3c:08:ea:b3:bb:a4:89: +# 7e:fb:84:5e:95:49:6f:b9:33:66:1a:c2:7f:36:55: +# 18:a7:21:e4:1b:75:c0:e8:c9:02:1b:9c:f1:8b:b1: +# 58:b0:8c:da:5c:24:a5:f4:a5:36:52:1c:76:d3:5a: +# 71:ee:f0:c8:4b:65:58:0b:d6:d6:6c:23:3b:d0:8f: +# f5:3a:66:d4:f4:fd:34:90:c2:35:a1:6d:70:49:39: +# a6:71:3d:0d:7c:85:d3:d1:f5:6e:30:05:42:a1:88: +# ab:94:1f:25:f2:76:85:57:cb:77:b6:9e:a3:03:26: +# ff:b1:47:71:67:20:75:8d:83:10:17:6c:9a:93:4b: +# f6:31 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# 58:78:83:0E:47:61:C2:C9:E0:77:A7:FE:AD:9C:A4:5F:00:E8:A6:6C +# X509v3 Authority Key Identifier: +# keyid:9B:F9:84:06:6A:FC:D2:EB:08:93:FB:E4:EE:2F:D8:C1:C2:89:7A:A7 +# +# X509v3 Key Usage: critical +# Digital Signature +# X509v3 Extended Key Usage: +# OCSP Signing +# OCSP No Check: +# +# Signature Algorithm: sha256WithRSAEncryption +# 55:13:0c:0b:4a:35:14:25:ef:36:48:59:86:07:e8:c0:cd:d0: +# 9c:19:d1:36:63:85:d1:f0:46:ff:af:39:37:80:bd:3e:c4:88: +# fa:66:2d:57:08:97:1b:20:00:37:30:38:14:cf:ff:5d:01:c4: +# e0:06:aa:82:c9:64:3f:ed:89:1e:da:2a:02:c5:1d:4f:8b:d0: +# 15:f3:26:43:b1:a8:09:f7:1e:d4:0f:37:bd:50:6c:cd:b1:8b: +# a7:77:1a:e9:95:ec:fc:45:31:36:e4:23:c6:63:5e:64:61:ac: +# a9:a3:a8:7c:26:f5:91:57:aa:0d:51:d3:df:ad:29:d3:ef:58: +# ab:74:2f:81:dc:9e:97:35:0d:94:88:0f:34:5d:b7:80:ed:49: +# 2a:39:f4:c9:51:b8:8d:8d:db:e6:ec:04:39:ba:69:55:67:24: +# fe:8f:26:f1:1c:62:0c:ad:95:dc:de:5c:7b:6c:0e:e9:d4:fe: +# e3:cf:9e:d1:5d:da:aa:f9:17:8d:92:ab:2d:54:67:05:c2:7a: +# 51:84:72:c9:ab:f0:32:6b:86:f3:1f:c4:93:3b:9b:8d:73:12: +# 4f:58:2d:59:43:32:1d:0a:0c:a5:58:59:da:ce:9d:12:b4:d3: +# 4f:29:98:dc:a5:44:bd:93:23:65:ad:19:30:ab:72:44:15:48: +# a0:7a:9e:ea:d5:f5:9a:9e:fa:70:32:aa:51:b3:04:b6:91:c4: +# b8:d7:61:ae:c0:41:ec:5a:93:b4:62:bc:09:c4:04:d8:d4:33: +# 09:f9:63:20:d5:01:ed:b9:60:47:14:77:d1:f7:c5:41:3b:3b: +# e7:5d:73:d9:ad:ad:95:20:9c:40:1f:e4:47:0a:f6:54:bb:b8: +# 09:63:00:49:db:2e:7c:2a:79:96:86:1b:96:3b:54:97:48:b4: +# 39:46:f2:27:ef:8c:96:46:cd:af:8e:55:70:9d:6c:8f:d1:1a: +# 4c:fa:e8:90:a4:29:10:04:d1:bf:b2:de:04:28:2a:af:ae:dd: +# df:a6:f9:4a:66:19:76:7a:aa:cf:b0:68:c3:ef:83:3b:7b:e9: +# 6f:12:97:1d:db:1e:2a:da:07:03:d0:ba:c1:87:02:cd:59:be: +# b4:21:22:3b:d8:5d:7d:b4:a3:c7:2a:56:3e:09:6c:6b:6f:54: +# 22:03:bb:b2:d7:98:8a:2f:51:ec:fa:7d:3e:dc:c8:6f:db:2a: +# 6f:46:56:2e:08:b9:41:81:d8:58:a4:6e:2a:c8:46:db:63:52: +# 38:c6:45:1a:6a:a3:04:3e:48:0e:84:3d:29:47:8b:80:fc:ee: +# b4:c8:12:f0:03:ef:7b:48:2d:94:80:a2:51:c3:14:92:7e:57: +# 83:cd:56:7e:9b:8d:c5:c2 +#-----BEGIN CERTIFICATE----- +#MIIEOTCCAiGgAwIBAgICAQEwDQYJKoZIhvcNAQELBQAwIzENMAsGA1UECgwEVGVz +#dDESMBAGA1UEAwwJVGVzdEludENBMB4XDTE1MDIyNDAxMjIyNFoXDTE2MDIyNDAx +#MjIyNFowIjENMAsGA1UECgwEVGVzdDERMA8GA1UEAwwIVGVzdE9DU1AwggEiMA0G +#CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSXK4R9saul7ox7Su24cdYA+Wb7nhT +#yzOlFf3GSRaDDsghfc+o6xgxMgpiDE7HpaV1ndtykONarlMKG1k/vTpnsb+YZKSF +#8JcQiw5+e17UMqu178PeIsARkMg35EiwXvwaLHqFK6a9GGQI0+O42KsutdjoEi5Y +#RWmsVpRi48LEPAjqs7ukiX77hF6VSW+5M2Yawn82VRinIeQbdcDoyQIbnPGLsViw +#jNpcJKX0pTZSHHbTWnHu8MhLZVgL1tZsIzvQj/U6ZtT0/TSQwjWhbXBJOaZxPQ18 +#hdPR9W4wBUKhiKuUHyXydoVXy3e2nqMDJv+xR3FnIHWNgxAXbJqTS/YxAgMBAAGj +#eDB2MB0GA1UdDgQWBBRYeIMOR2HCyeB3p/6tnKRfAOimbDAfBgNVHSMEGDAWgBSb +#+YQGavzS6wiT++TuL9jBwol6pzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYI +#KwYBBQUHAwkwDwYJKwYBBQUHMAEFBAIFADANBgkqhkiG9w0BAQsFAAOCAgEAVRMM +#C0o1FCXvNkhZhgfowM3QnBnRNmOF0fBG/685N4C9PsSI+mYtVwiXGyAANzA4FM// +#XQHE4AaqgslkP+2JHtoqAsUdT4vQFfMmQ7GoCfce1A83vVBszbGLp3ca6ZXs/EUx +#NuQjxmNeZGGsqaOofCb1kVeqDVHT360p0+9Yq3QvgdyelzUNlIgPNF23gO1JKjn0 +#yVG4jY3b5uwEObppVWck/o8m8RxiDK2V3N5ce2wO6dT+48+e0V3aqvkXjZKrLVRn +#BcJ6UYRyyavwMmuG8x/EkzubjXMST1gtWUMyHQoMpVhZ2s6dErTTTymY3KVEvZMj +#Za0ZMKtyRBVIoHqe6tX1mp76cDKqUbMEtpHEuNdhrsBB7FqTtGK8CcQE2NQzCflj +#INUB7blgRxR30ffFQTs7511z2a2tlSCcQB/kRwr2VLu4CWMASdsufCp5loYbljtU +#l0i0OUbyJ++MlkbNr45VcJ1sj9EaTProkKQpEATRv7LeBCgqr67d36b5SmYZdnqq +#z7Bow++DO3vpbxKXHdseKtoHA9C6wYcCzVm+tCEiO9hdfbSjxypWPglsa29UIgO7 +#steYii9R7Pp9PtzIb9sqb0ZWLgi5QYHYWKRuKshG22NSOMZFGmqjBD5IDoQ9KUeL +#gPzutMgS8APve0gtlICiUcMUkn5Xg81WfpuNxcI= +#-----END CERTIFICATE----- +#Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 2 (0x2) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: O=Test, CN=TestRoot +# Validity +# Not Before: Feb 24 00:59:51 2015 GMT +# Not After : Feb 13 00:59:51 2017 GMT +# Subject: O=Test, CN=TestIntCA +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (4096 bit) +# Modulus: +# 00:bf:0a:29:02:54:00:97:c3:81:e6:33:89:74:03: +# cc:a7:f4:8d:54:17:36:48:97:6a:32:4e:b8:87:6d: +# 62:8e:87:7f:91:64:3b:75:d5:3d:93:19:17:d2:00: +# d8:db:c3:91:7c:35:23:59:d4:29:a3:e1:da:28:66: +# 28:85:6b:d3:44:09:38:82:42:2f:23:ab:e6:1b:2f: +# 8c:c3:12:40:99:8d:2e:a6:95:16:9c:75:b1:07:bd: +# 76:f6:17:bc:a4:93:8f:9f:cd:eb:6d:1c:8c:5c:0c: +# 2a:8d:b8:71:2c:ed:ad:fe:7b:ed:3e:c3:e7:24:d4: +# ae:53:42:34:c5:82:f9:fa:15:71:ba:9e:16:a7:1e: +# c5:5c:a7:48:b3:26:f4:a9:34:71:84:b8:7b:77:a7: +# f1:a2:8e:f5:e8:cd:25:f9:63:89:b1:98:2a:8e:4d: +# da:9e:2d:d2:a5:96:ca:32:1e:e2:22:b1:0b:b9:0f: +# 98:0a:ae:08:2f:a8:fe:90:2f:d8:0d:16:79:2d:c8: +# 62:22:69:f3:18:2b:a9:c7:d1:85:f7:5d:d5:ab:44: +# 6f:91:9a:1a:86:22:0b:7e:57:97:98:6a:bd:bb:55: +# 1e:e6:44:62:18:0b:af:a4:3e:ba:a7:5f:f1:a6:28: +# 5c:fe:df:19:9a:cd:39:e3:9a:5e:bc:aa:49:0c:22: +# 24:b7:1c:d4:21:99:0b:c4:48:95:b8:de:ad:4c:e1: +# 39:e8:34:5d:c6:0c:4f:2c:22:c8:e8:cd:19:b7:d3: +# 8f:d3:cd:76:76:0f:b1:bb:0a:45:be:9d:5f:2a:5d: +# 51:1c:47:79:bc:c9:d1:bc:30:33:ae:2d:db:27:b9: +# 1b:ff:2c:cb:b2:af:7d:e5:a6:9b:6f:23:98:7e:76: +# 74:45:5f:41:15:73:c1:9c:f5:88:c6:8f:ca:9b:78: +# 70:ee:8b:ba:d1:bc:60:4f:29:76:6d:28:2f:3b:09: +# e6:47:53:49:04:15:67:1d:af:0d:51:f8:43:92:c8: +# ab:ea:f0:09:9e:47:87:2e:62:d8:91:6e:40:de:ac: +# 1b:e1:6a:47:41:c3:7d:cf:90:e0:e9:34:80:d0:56: +# 9a:92:83:18:0a:c4:61:b7:60:3d:9a:4c:db:61:0a: +# d0:d0:71:f1:ee:de:11:ad:fa:ee:4b:8f:fe:15:ed: +# 6d:e4:b0:ba:70:9c:30:ea:52:4d:31:a4:95:35:a1: +# 1c:d9:15:9f:9c:ab:06:50:eb:ae:d4:bb:17:74:27: +# 44:b9:35:fa:15:61:e1:13:f6:1e:46:88:9c:d3:67: +# ca:bc:a5:7c:db:b9:7e:23:1c:24:77:fa:84:8f:38: +# 7f:2a:42:d5:49:e0:33:09:5d:29:28:2f:93:33:20: +# f9:cf:21 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# 9B:F9:84:06:6A:FC:D2:EB:08:93:FB:E4:EE:2F:D8:C1:C2:89:7A:A7 +# X509v3 Authority Key Identifier: +# keyid:12:B9:C3:48:79:ED:7D:30:C9:78:78:61:94:58:37:07:40:76:38:18 +# +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Key Usage: +# Certificate Sign, CRL Sign +# Signature Algorithm: sha256WithRSAEncryption +# 79:28:d5:46:92:1f:6b:25:de:b0:1e:e2:44:d3:7b:a3:4a:6e: +# 05:43:dd:85:47:4d:ca:d0:d9:43:65:34:38:a0:c2:6c:fb:49: +# 85:6d:f3:dc:10:8c:73:37:49:22:c3:87:dd:28:8a:b0:b2:2c: +# a3:9c:f6:15:4d:98:39:95:a1:21:72:36:ff:04:67:e5:ba:3e: +# bd:5e:d4:81:ac:f4:1c:f5:ab:8d:dd:73:e9:37:d9:d2:80:39: +# 5b:f5:ec:fe:9c:56:ec:10:f7:86:42:17:d1:f1:4b:c5:38:fe: +# 0e:85:2c:6e:ac:6f:52:e5:a8:b9:fe:af:f5:dc:35:0a:74:f8: +# 72:4f:51:d5:95:f4:fe:8f:fa:3f:d5:d2:1f:44:3b:63:60:4a: +# e2:99:37:bf:09:40:32:6c:ea:3c:61:85:77:bc:63:6e:11:f9: +# 41:5f:cb:4c:99:39:2a:37:66:79:4d:5a:7e:93:91:53:33:ce: +# b1:c0:1c:68:97:2e:5a:e1:66:59:41:52:07:cf:4a:02:24:54: +# dd:01:97:2f:f1:85:db:50:9c:3b:16:95:d2:08:ca:f6:93:9a: +# 01:33:36:40:7c:39:e3:df:f8:7b:a7:b5:ea:60:06:a5:74:3a: +# dc:ea:36:08:6b:c1:59:03:01:77:17:0e:6b:e1:9a:48:68:06: +# 31:03:28:0b:cb:dd:61:93:80:0c:f1:16:e4:87:26:86:72:b4: +# 12:32:7b:f7:85:59:9a:e3:1c:c4:d8:6e:55:a9:7e:c5:ce:8b: +# be:d2:bf:57:34:62:83:f1:d0:3a:73:e1:75:e1:f4:77:5b:a3: +# a3:35:7a:fb:b6:85:68:d5:ad:26:95:71:60:62:92:30:d3:5c: +# 7b:8e:42:14:e8:7b:27:13:e6:aa:cb:35:42:2c:db:e9:1f:ff: +# fd:4c:8f:fc:04:d8:05:16:da:a8:93:db:3b:f2:51:17:ff:dc: +# c7:11:97:14:ac:d8:5a:e7:ad:38:fa:17:bf:bd:4b:92:84:0d: +# 96:20:7d:17:ee:31:a6:56:57:5e:a4:0d:d2:cb:47:e8:45:14: +# e4:6a:4a:a1:40:da:b7:bc:e8:aa:60:59:4c:4a:3b:0c:ef:26: +# 39:fc:cb:8c:fe:79:c3:35:34:f5:3a:11:d3:e6:e7:fe:fd:bc: +# 89:6a:c5:d0:5b:a2:b9:84:9d:b4:53:d1:1f:c0:f6:fd:80:8a: +# 88:f8:aa:04:8f:5d:83:4a:91:ed:90:f0:f6:0a:bb:1a:01:d7: +# a4:bb:3c:c4:c1:e1:38:ca:03:8b:61:d8:18:ab:bc:ef:7e:18: +# aa:df:61:d1:1f:64:10:04:e9:25:7d:c3:bb:10:e0:11:55:29: +# e6:56:87:80:bf:95:20:c5 +#-----BEGIN CERTIFICATE----- +#MIIFIDCCAwigAwIBAgIBAjANBgkqhkiG9w0BAQsFADAiMQ0wCwYDVQQKDARUZXN0 +#MREwDwYDVQQDDAhUZXN0Um9vdDAeFw0xNTAyMjQwMDU5NTFaFw0xNzAyMTMwMDU5 +#NTFaMCMxDTALBgNVBAoMBFRlc3QxEjAQBgNVBAMMCVRlc3RJbnRDQTCCAiIwDQYJ +#KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL8KKQJUAJfDgeYziXQDzKf0jVQXNkiX +#ajJOuIdtYo6Hf5FkO3XVPZMZF9IA2NvDkXw1I1nUKaPh2ihmKIVr00QJOIJCLyOr +#5hsvjMMSQJmNLqaVFpx1sQe9dvYXvKSTj5/N620cjFwMKo24cSztrf577T7D5yTU +#rlNCNMWC+foVcbqeFqcexVynSLMm9Kk0cYS4e3en8aKO9ejNJfljibGYKo5N2p4t +#0qWWyjIe4iKxC7kPmAquCC+o/pAv2A0WeS3IYiJp8xgrqcfRhfdd1atEb5GaGoYi +#C35Xl5hqvbtVHuZEYhgLr6Q+uqdf8aYoXP7fGZrNOeOaXryqSQwiJLcc1CGZC8RI +#lbjerUzhOeg0XcYMTywiyOjNGbfTj9PNdnYPsbsKRb6dXypdURxHebzJ0bwwM64t +#2ye5G/8sy7KvfeWmm28jmH52dEVfQRVzwZz1iMaPypt4cO6LutG8YE8pdm0oLzsJ +#5kdTSQQVZx2vDVH4Q5LIq+rwCZ5Hhy5i2JFuQN6sG+FqR0HDfc+Q4Ok0gNBWmpKD +#GArEYbdgPZpM22EK0NBx8e7eEa367kuP/hXtbeSwunCcMOpSTTGklTWhHNkVn5yr +#BlDrrtS7F3QnRLk1+hVh4RP2HkaInNNnyrylfNu5fiMcJHf6hI84fypC1UngMwld +#KSgvkzMg+c8hAgMBAAGjYDBeMB0GA1UdDgQWBBSb+YQGavzS6wiT++TuL9jBwol6 +#pzAfBgNVHSMEGDAWgBQSucNIee19MMl4eGGUWDcHQHY4GDAPBgNVHRMBAf8EBTAD +#AQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAeSjVRpIfayXesB7i +#RNN7o0puBUPdhUdNytDZQ2U0OKDCbPtJhW3z3BCMczdJIsOH3SiKsLIso5z2FU2Y +#OZWhIXI2/wRn5bo+vV7Ugaz0HPWrjd1z6TfZ0oA5W/Xs/pxW7BD3hkIX0fFLxTj+ +#DoUsbqxvUuWouf6v9dw1CnT4ck9R1ZX0/o/6P9XSH0Q7Y2BK4pk3vwlAMmzqPGGF +#d7xjbhH5QV/LTJk5KjdmeU1afpORUzPOscAcaJcuWuFmWUFSB89KAiRU3QGXL/GF +#21CcOxaV0gjK9pOaATM2QHw549/4e6e16mAGpXQ63Oo2CGvBWQMBdxcOa+GaSGgG +#MQMoC8vdYZOADPEW5IcmhnK0EjJ794VZmuMcxNhuVal+xc6LvtK/VzRig/HQOnPh +#deH0d1ujozV6+7aFaNWtJpVxYGKSMNNce45CFOh7JxPmqss1Qizb6R///UyP/ATY +#BRbaqJPbO/JRF//cxxGXFKzYWuetOPoXv71LkoQNliB9F+4xplZXXqQN0stH6EUU +#5GpKoUDat7zoqmBZTEo7DO8mOfzLjP55wzU09ToR0+bn/v28iWrF0FuiuYSdtFPR +#H8D2/YCKiPiqBI9dg0qR7ZDw9gq7GgHXpLs8xMHhOMoDi2HYGKu8734Yqt9h0R9k +#EATpJX3DuxDgEVUp5laHgL+VIMU= +#-----END CERTIFICATE----- + +MIILXwoBAKCCC1gwggtUBgkrBgEFBQcwAQEEggtFMIILQTCBwaEkMCIxDTALBgNV +BAoMBFRlc3QxETAPBgNVBAMMCFRlc3RPQ1NQGA8yMDE1MDIyODAwNDUzNFowYzBh +MDswCQYFKw4DAhoFAAQUEFZXi3QYEyYf2XEq2mAHf/fGHo8EFJv5hAZq/NLrCJP7 +5O4v2MHCiXqnAgIVAKERGA8yMDE1MDIxOTE1NTAzMFoYDzIwMTUwMjI4MDA0NTM0 +WqEjMCEwHwYJKwYBBQUHMAECBBIEED5wCOwjo69kB+LbrfGCRVAwDQYJKoZIhvcN +AQEFBQADggEBAIDnPIJRUTBWfJsQoxRihrdIX8cYOtahY/SLg9yHD0E5ibZgQBFe +cSrd8MI9u5qe1QXFamuhAqsdJJSucHcZugiHBTkac4J3vfJYW6aUBS4tYpkt7ArM +DIlbXZTcCLR5lhhOeRPNLkQCs6+yH2aZKjcKffsbYJSXemjddRXTlwBu3EW0kgY4 +Js5x5FpczWcd9k8ZsVGDituazWtjoR/q5SNiIHNBKL3oUceKeY5r3TOgoNvlI1mj +HYRI9bIgGgSi7Af2HeUGHKuBSfHqafg0j1kq7nqX+M/FVTcr+6uNdk9IlBY0PIFh +mq5LtSw539h30AIMDFGZGzeOaz+dlloJTK6gggllMIIJYTCCBDkwggIhoAMCAQIC +AgEBMA0GCSqGSIb3DQEBCwUAMCMxDTALBgNVBAoMBFRlc3QxEjAQBgNVBAMMCVRl +c3RJbnRDQTAeFw0xNTAyMjQwMTIyMjRaFw0xNjAyMjQwMTIyMjRaMCIxDTALBgNV +BAoMBFRlc3QxETAPBgNVBAMMCFRlc3RPQ1NQMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA0lyuEfbGrpe6Me0rtuHHWAPlm+54U8szpRX9xkkWgw7IIX3P +qOsYMTIKYgxOx6WldZ3bcpDjWq5TChtZP706Z7G/mGSkhfCXEIsOfnte1DKrte/D +3iLAEZDIN+RIsF78Gix6hSumvRhkCNPjuNirLrXY6BIuWEVprFaUYuPCxDwI6rO7 +pIl++4RelUlvuTNmGsJ/NlUYpyHkG3XA6MkCG5zxi7FYsIzaXCSl9KU2Uhx201px +7vDIS2VYC9bWbCM70I/1OmbU9P00kMI1oW1wSTmmcT0NfIXT0fVuMAVCoYirlB8l +8naFV8t3tp6jAyb/sUdxZyB1jYMQF2yak0v2MQIDAQABo3gwdjAdBgNVHQ4EFgQU +WHiDDkdhwsngd6f+rZykXwDopmwwHwYDVR0jBBgwFoAUm/mEBmr80usIk/vk7i/Y +wcKJeqcwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMA8GCSsG +AQUFBzABBQQCBQAwDQYJKoZIhvcNAQELBQADggIBAFUTDAtKNRQl7zZIWYYH6MDN +0JwZ0TZjhdHwRv+vOTeAvT7EiPpmLVcIlxsgADcwOBTP/10BxOAGqoLJZD/tiR7a +KgLFHU+L0BXzJkOxqAn3HtQPN71QbM2xi6d3GumV7PxFMTbkI8ZjXmRhrKmjqHwm +9ZFXqg1R09+tKdPvWKt0L4Hcnpc1DZSIDzRdt4DtSSo59MlRuI2N2+bsBDm6aVVn +JP6PJvEcYgytldzeXHtsDunU/uPPntFd2qr5F42Sqy1UZwXCelGEcsmr8DJrhvMf +xJM7m41zEk9YLVlDMh0KDKVYWdrOnRK0008pmNylRL2TI2WtGTCrckQVSKB6nurV +9Zqe+nAyqlGzBLaRxLjXYa7AQexak7RivAnEBNjUMwn5YyDVAe25YEcUd9H3xUE7 +O+ddc9mtrZUgnEAf5EcK9lS7uAljAEnbLnwqeZaGG5Y7VJdItDlG8ifvjJZGza+O +VXCdbI/RGkz66JCkKRAE0b+y3gQoKq+u3d+m+UpmGXZ6qs+waMPvgzt76W8Slx3b +HiraBwPQusGHAs1ZvrQhIjvYXX20o8cqVj4JbGtvVCIDu7LXmIovUez6fT7cyG/b +Km9GVi4IuUGB2FikbirIRttjUjjGRRpqowQ+SA6EPSlHi4D87rTIEvAD73tILZSA +olHDFJJ+V4PNVn6bjcXCMIIFIDCCAwigAwIBAgIBAjANBgkqhkiG9w0BAQsFADAi +MQ0wCwYDVQQKDARUZXN0MREwDwYDVQQDDAhUZXN0Um9vdDAeFw0xNTAyMjQwMDU5 +NTFaFw0xNzAyMTMwMDU5NTFaMCMxDTALBgNVBAoMBFRlc3QxEjAQBgNVBAMMCVRl +c3RJbnRDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL8KKQJUAJfD +geYziXQDzKf0jVQXNkiXajJOuIdtYo6Hf5FkO3XVPZMZF9IA2NvDkXw1I1nUKaPh +2ihmKIVr00QJOIJCLyOr5hsvjMMSQJmNLqaVFpx1sQe9dvYXvKSTj5/N620cjFwM +Ko24cSztrf577T7D5yTUrlNCNMWC+foVcbqeFqcexVynSLMm9Kk0cYS4e3en8aKO +9ejNJfljibGYKo5N2p4t0qWWyjIe4iKxC7kPmAquCC+o/pAv2A0WeS3IYiJp8xgr +qcfRhfdd1atEb5GaGoYiC35Xl5hqvbtVHuZEYhgLr6Q+uqdf8aYoXP7fGZrNOeOa +XryqSQwiJLcc1CGZC8RIlbjerUzhOeg0XcYMTywiyOjNGbfTj9PNdnYPsbsKRb6d +XypdURxHebzJ0bwwM64t2ye5G/8sy7KvfeWmm28jmH52dEVfQRVzwZz1iMaPypt4 +cO6LutG8YE8pdm0oLzsJ5kdTSQQVZx2vDVH4Q5LIq+rwCZ5Hhy5i2JFuQN6sG+Fq +R0HDfc+Q4Ok0gNBWmpKDGArEYbdgPZpM22EK0NBx8e7eEa367kuP/hXtbeSwunCc +MOpSTTGklTWhHNkVn5yrBlDrrtS7F3QnRLk1+hVh4RP2HkaInNNnyrylfNu5fiMc +JHf6hI84fypC1UngMwldKSgvkzMg+c8hAgMBAAGjYDBeMB0GA1UdDgQWBBSb+YQG +avzS6wiT++TuL9jBwol6pzAfBgNVHSMEGDAWgBQSucNIee19MMl4eGGUWDcHQHY4 +GDAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsFAAOC +AgEAeSjVRpIfayXesB7iRNN7o0puBUPdhUdNytDZQ2U0OKDCbPtJhW3z3BCMczdJ +IsOH3SiKsLIso5z2FU2YOZWhIXI2/wRn5bo+vV7Ugaz0HPWrjd1z6TfZ0oA5W/Xs +/pxW7BD3hkIX0fFLxTj+DoUsbqxvUuWouf6v9dw1CnT4ck9R1ZX0/o/6P9XSH0Q7 +Y2BK4pk3vwlAMmzqPGGFd7xjbhH5QV/LTJk5KjdmeU1afpORUzPOscAcaJcuWuFm +WUFSB89KAiRU3QGXL/GF21CcOxaV0gjK9pOaATM2QHw549/4e6e16mAGpXQ63Oo2 +CGvBWQMBdxcOa+GaSGgGMQMoC8vdYZOADPEW5IcmhnK0EjJ794VZmuMcxNhuVal+ +xc6LvtK/VzRig/HQOnPhdeH0d1ujozV6+7aFaNWtJpVxYGKSMNNce45CFOh7JxPm +qss1Qizb6R///UyP/ATYBRbaqJPbO/JRF//cxxGXFKzYWuetOPoXv71LkoQNliB9 +F+4xplZXXqQN0stH6EUU5GpKoUDat7zoqmBZTEo7DO8mOfzLjP55wzU09ToR0+bn +/v28iWrF0FuiuYSdtFPRH8D2/YCKiPiqBI9dg0qR7ZDw9gq7GgHXpLs8xMHhOMoD +i2HYGKu8734Yqt9h0R9kEATpJX3DuxDgEVUp5laHgL+VIMU= diff --git a/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-nonext-withinv.resp b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-nonext-withinv.resp new file mode 100644 index 00000000000..a4d12fc7d05 --- /dev/null +++ b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-nonext-withinv.resp @@ -0,0 +1,323 @@ +#OCSP Response Data: +# OCSP Response Status: successful (0x0) +# Response Type: Basic OCSP Response +# Version: 1 (0x0) +# Responder Id: O = Test, CN = TestOCSP +# Produced At: Feb 28 00:47:40 2015 GMT +# Responses: +# Certificate ID: +# Hash Algorithm: sha1 +# Issuer Name Hash: 1056578B741813261FD9712ADA60077FF7C61E8F +# Issuer Key Hash: 9BF984066AFCD2EB0893FBE4EE2FD8C1C2897AA7 +# Serial Number: 1500 +# Cert Status: revoked +# Revocation Time: Feb 19 15:50:30 2015 GMT +# Revocation Reason: keyCompromise (0x1) +# This Update: Feb 28 00:47:40 2015 GMT +# Response Single Extensions: +# Invalidity Date: +# Feb 19 14:00:00 2015 GMT +# +# Response Extensions: +# OCSP Nonce: +# 0410DB5B1C50F6601DC4533D159DB197D8AE +# Signature Algorithm: sha1WithRSAEncryption +# c0:41:55:17:3d:df:31:a4:f6:9b:2a:24:cd:05:43:b2:e5:15: +# fb:95:cf:19:a9:70:3b:58:d0:41:14:7d:b8:53:f3:ec:d5:ba: +# e1:de:f8:a0:f8:3a:0e:b0:5c:50:81:5b:05:a5:5e:10:6f:46: +# 8f:25:17:10:5c:33:7a:e8:70:6a:93:37:f7:75:4d:69:d3:3a: +# 51:56:38:07:cd:42:70:09:92:ae:e8:8e:d8:52:b0:e9:3f:64: +# c2:0a:98:63:15:0c:d7:36:90:72:9f:fb:ac:4c:4d:cb:92:ce: +# 87:54:b6:49:3b:a8:f5:9c:cd:9f:11:69:f1:af:68:c1:76:4a: +# c0:90:58:2e:81:e2:e9:28:af:83:06:c3:ae:34:95:ad:42:75: +# cd:7b:50:12:9c:3a:50:86:b4:36:36:ac:3f:27:2a:6f:06:31: +# cd:27:7f:f0:eb:8d:c2:e6:37:dd:39:03:e5:0e:a2:83:26:71: +# bf:dd:a6:4c:a0:fe:47:94:65:82:f3:27:89:78:e0:3b:a5:30: +# a6:12:9e:1d:0d:fc:c3:41:fc:53:29:e6:04:ab:c0:00:d2:2d: +# f8:13:d8:b9:e6:64:10:d2:a7:02:e7:3e:aa:ac:52:67:69:46: +# 3b:8f:a2:96:4f:b3:55:fc:e8:c1:90:61:71:f5:a0:c8:3c:b6: +# 48:60:c8:5c +#Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 257 (0x101) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: O=Test, CN=TestIntCA +# Validity +# Not Before: Feb 24 01:22:24 2015 GMT +# Not After : Feb 24 01:22:24 2016 GMT +# Subject: O=Test, CN=TestOCSP +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:d2:5c:ae:11:f6:c6:ae:97:ba:31:ed:2b:b6:e1: +# c7:58:03:e5:9b:ee:78:53:cb:33:a5:15:fd:c6:49: +# 16:83:0e:c8:21:7d:cf:a8:eb:18:31:32:0a:62:0c: +# 4e:c7:a5:a5:75:9d:db:72:90:e3:5a:ae:53:0a:1b: +# 59:3f:bd:3a:67:b1:bf:98:64:a4:85:f0:97:10:8b: +# 0e:7e:7b:5e:d4:32:ab:b5:ef:c3:de:22:c0:11:90: +# c8:37:e4:48:b0:5e:fc:1a:2c:7a:85:2b:a6:bd:18: +# 64:08:d3:e3:b8:d8:ab:2e:b5:d8:e8:12:2e:58:45: +# 69:ac:56:94:62:e3:c2:c4:3c:08:ea:b3:bb:a4:89: +# 7e:fb:84:5e:95:49:6f:b9:33:66:1a:c2:7f:36:55: +# 18:a7:21:e4:1b:75:c0:e8:c9:02:1b:9c:f1:8b:b1: +# 58:b0:8c:da:5c:24:a5:f4:a5:36:52:1c:76:d3:5a: +# 71:ee:f0:c8:4b:65:58:0b:d6:d6:6c:23:3b:d0:8f: +# f5:3a:66:d4:f4:fd:34:90:c2:35:a1:6d:70:49:39: +# a6:71:3d:0d:7c:85:d3:d1:f5:6e:30:05:42:a1:88: +# ab:94:1f:25:f2:76:85:57:cb:77:b6:9e:a3:03:26: +# ff:b1:47:71:67:20:75:8d:83:10:17:6c:9a:93:4b: +# f6:31 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# 58:78:83:0E:47:61:C2:C9:E0:77:A7:FE:AD:9C:A4:5F:00:E8:A6:6C +# X509v3 Authority Key Identifier: +# keyid:9B:F9:84:06:6A:FC:D2:EB:08:93:FB:E4:EE:2F:D8:C1:C2:89:7A:A7 +# +# X509v3 Key Usage: critical +# Digital Signature +# X509v3 Extended Key Usage: +# OCSP Signing +# OCSP No Check: +# +# Signature Algorithm: sha256WithRSAEncryption +# 55:13:0c:0b:4a:35:14:25:ef:36:48:59:86:07:e8:c0:cd:d0: +# 9c:19:d1:36:63:85:d1:f0:46:ff:af:39:37:80:bd:3e:c4:88: +# fa:66:2d:57:08:97:1b:20:00:37:30:38:14:cf:ff:5d:01:c4: +# e0:06:aa:82:c9:64:3f:ed:89:1e:da:2a:02:c5:1d:4f:8b:d0: +# 15:f3:26:43:b1:a8:09:f7:1e:d4:0f:37:bd:50:6c:cd:b1:8b: +# a7:77:1a:e9:95:ec:fc:45:31:36:e4:23:c6:63:5e:64:61:ac: +# a9:a3:a8:7c:26:f5:91:57:aa:0d:51:d3:df:ad:29:d3:ef:58: +# ab:74:2f:81:dc:9e:97:35:0d:94:88:0f:34:5d:b7:80:ed:49: +# 2a:39:f4:c9:51:b8:8d:8d:db:e6:ec:04:39:ba:69:55:67:24: +# fe:8f:26:f1:1c:62:0c:ad:95:dc:de:5c:7b:6c:0e:e9:d4:fe: +# e3:cf:9e:d1:5d:da:aa:f9:17:8d:92:ab:2d:54:67:05:c2:7a: +# 51:84:72:c9:ab:f0:32:6b:86:f3:1f:c4:93:3b:9b:8d:73:12: +# 4f:58:2d:59:43:32:1d:0a:0c:a5:58:59:da:ce:9d:12:b4:d3: +# 4f:29:98:dc:a5:44:bd:93:23:65:ad:19:30:ab:72:44:15:48: +# a0:7a:9e:ea:d5:f5:9a:9e:fa:70:32:aa:51:b3:04:b6:91:c4: +# b8:d7:61:ae:c0:41:ec:5a:93:b4:62:bc:09:c4:04:d8:d4:33: +# 09:f9:63:20:d5:01:ed:b9:60:47:14:77:d1:f7:c5:41:3b:3b: +# e7:5d:73:d9:ad:ad:95:20:9c:40:1f:e4:47:0a:f6:54:bb:b8: +# 09:63:00:49:db:2e:7c:2a:79:96:86:1b:96:3b:54:97:48:b4: +# 39:46:f2:27:ef:8c:96:46:cd:af:8e:55:70:9d:6c:8f:d1:1a: +# 4c:fa:e8:90:a4:29:10:04:d1:bf:b2:de:04:28:2a:af:ae:dd: +# df:a6:f9:4a:66:19:76:7a:aa:cf:b0:68:c3:ef:83:3b:7b:e9: +# 6f:12:97:1d:db:1e:2a:da:07:03:d0:ba:c1:87:02:cd:59:be: +# b4:21:22:3b:d8:5d:7d:b4:a3:c7:2a:56:3e:09:6c:6b:6f:54: +# 22:03:bb:b2:d7:98:8a:2f:51:ec:fa:7d:3e:dc:c8:6f:db:2a: +# 6f:46:56:2e:08:b9:41:81:d8:58:a4:6e:2a:c8:46:db:63:52: +# 38:c6:45:1a:6a:a3:04:3e:48:0e:84:3d:29:47:8b:80:fc:ee: +# b4:c8:12:f0:03:ef:7b:48:2d:94:80:a2:51:c3:14:92:7e:57: +# 83:cd:56:7e:9b:8d:c5:c2 +#-----BEGIN CERTIFICATE----- +#MIIEOTCCAiGgAwIBAgICAQEwDQYJKoZIhvcNAQELBQAwIzENMAsGA1UECgwEVGVz +#dDESMBAGA1UEAwwJVGVzdEludENBMB4XDTE1MDIyNDAxMjIyNFoXDTE2MDIyNDAx +#MjIyNFowIjENMAsGA1UECgwEVGVzdDERMA8GA1UEAwwIVGVzdE9DU1AwggEiMA0G +#CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSXK4R9saul7ox7Su24cdYA+Wb7nhT +#yzOlFf3GSRaDDsghfc+o6xgxMgpiDE7HpaV1ndtykONarlMKG1k/vTpnsb+YZKSF +#8JcQiw5+e17UMqu178PeIsARkMg35EiwXvwaLHqFK6a9GGQI0+O42KsutdjoEi5Y +#RWmsVpRi48LEPAjqs7ukiX77hF6VSW+5M2Yawn82VRinIeQbdcDoyQIbnPGLsViw +#jNpcJKX0pTZSHHbTWnHu8MhLZVgL1tZsIzvQj/U6ZtT0/TSQwjWhbXBJOaZxPQ18 +#hdPR9W4wBUKhiKuUHyXydoVXy3e2nqMDJv+xR3FnIHWNgxAXbJqTS/YxAgMBAAGj +#eDB2MB0GA1UdDgQWBBRYeIMOR2HCyeB3p/6tnKRfAOimbDAfBgNVHSMEGDAWgBSb +#+YQGavzS6wiT++TuL9jBwol6pzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYI +#KwYBBQUHAwkwDwYJKwYBBQUHMAEFBAIFADANBgkqhkiG9w0BAQsFAAOCAgEAVRMM +#C0o1FCXvNkhZhgfowM3QnBnRNmOF0fBG/685N4C9PsSI+mYtVwiXGyAANzA4FM// +#XQHE4AaqgslkP+2JHtoqAsUdT4vQFfMmQ7GoCfce1A83vVBszbGLp3ca6ZXs/EUx +#NuQjxmNeZGGsqaOofCb1kVeqDVHT360p0+9Yq3QvgdyelzUNlIgPNF23gO1JKjn0 +#yVG4jY3b5uwEObppVWck/o8m8RxiDK2V3N5ce2wO6dT+48+e0V3aqvkXjZKrLVRn +#BcJ6UYRyyavwMmuG8x/EkzubjXMST1gtWUMyHQoMpVhZ2s6dErTTTymY3KVEvZMj +#Za0ZMKtyRBVIoHqe6tX1mp76cDKqUbMEtpHEuNdhrsBB7FqTtGK8CcQE2NQzCflj +#INUB7blgRxR30ffFQTs7511z2a2tlSCcQB/kRwr2VLu4CWMASdsufCp5loYbljtU +#l0i0OUbyJ++MlkbNr45VcJ1sj9EaTProkKQpEATRv7LeBCgqr67d36b5SmYZdnqq +#z7Bow++DO3vpbxKXHdseKtoHA9C6wYcCzVm+tCEiO9hdfbSjxypWPglsa29UIgO7 +#steYii9R7Pp9PtzIb9sqb0ZWLgi5QYHYWKRuKshG22NSOMZFGmqjBD5IDoQ9KUeL +#gPzutMgS8APve0gtlICiUcMUkn5Xg81WfpuNxcI= +#-----END CERTIFICATE----- +#Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 2 (0x2) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: O=Test, CN=TestRoot +# Validity +# Not Before: Feb 24 00:59:51 2015 GMT +# Not After : Feb 13 00:59:51 2017 GMT +# Subject: O=Test, CN=TestIntCA +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (4096 bit) +# Modulus: +# 00:bf:0a:29:02:54:00:97:c3:81:e6:33:89:74:03: +# cc:a7:f4:8d:54:17:36:48:97:6a:32:4e:b8:87:6d: +# 62:8e:87:7f:91:64:3b:75:d5:3d:93:19:17:d2:00: +# d8:db:c3:91:7c:35:23:59:d4:29:a3:e1:da:28:66: +# 28:85:6b:d3:44:09:38:82:42:2f:23:ab:e6:1b:2f: +# 8c:c3:12:40:99:8d:2e:a6:95:16:9c:75:b1:07:bd: +# 76:f6:17:bc:a4:93:8f:9f:cd:eb:6d:1c:8c:5c:0c: +# 2a:8d:b8:71:2c:ed:ad:fe:7b:ed:3e:c3:e7:24:d4: +# ae:53:42:34:c5:82:f9:fa:15:71:ba:9e:16:a7:1e: +# c5:5c:a7:48:b3:26:f4:a9:34:71:84:b8:7b:77:a7: +# f1:a2:8e:f5:e8:cd:25:f9:63:89:b1:98:2a:8e:4d: +# da:9e:2d:d2:a5:96:ca:32:1e:e2:22:b1:0b:b9:0f: +# 98:0a:ae:08:2f:a8:fe:90:2f:d8:0d:16:79:2d:c8: +# 62:22:69:f3:18:2b:a9:c7:d1:85:f7:5d:d5:ab:44: +# 6f:91:9a:1a:86:22:0b:7e:57:97:98:6a:bd:bb:55: +# 1e:e6:44:62:18:0b:af:a4:3e:ba:a7:5f:f1:a6:28: +# 5c:fe:df:19:9a:cd:39:e3:9a:5e:bc:aa:49:0c:22: +# 24:b7:1c:d4:21:99:0b:c4:48:95:b8:de:ad:4c:e1: +# 39:e8:34:5d:c6:0c:4f:2c:22:c8:e8:cd:19:b7:d3: +# 8f:d3:cd:76:76:0f:b1:bb:0a:45:be:9d:5f:2a:5d: +# 51:1c:47:79:bc:c9:d1:bc:30:33:ae:2d:db:27:b9: +# 1b:ff:2c:cb:b2:af:7d:e5:a6:9b:6f:23:98:7e:76: +# 74:45:5f:41:15:73:c1:9c:f5:88:c6:8f:ca:9b:78: +# 70:ee:8b:ba:d1:bc:60:4f:29:76:6d:28:2f:3b:09: +# e6:47:53:49:04:15:67:1d:af:0d:51:f8:43:92:c8: +# ab:ea:f0:09:9e:47:87:2e:62:d8:91:6e:40:de:ac: +# 1b:e1:6a:47:41:c3:7d:cf:90:e0:e9:34:80:d0:56: +# 9a:92:83:18:0a:c4:61:b7:60:3d:9a:4c:db:61:0a: +# d0:d0:71:f1:ee:de:11:ad:fa:ee:4b:8f:fe:15:ed: +# 6d:e4:b0:ba:70:9c:30:ea:52:4d:31:a4:95:35:a1: +# 1c:d9:15:9f:9c:ab:06:50:eb:ae:d4:bb:17:74:27: +# 44:b9:35:fa:15:61:e1:13:f6:1e:46:88:9c:d3:67: +# ca:bc:a5:7c:db:b9:7e:23:1c:24:77:fa:84:8f:38: +# 7f:2a:42:d5:49:e0:33:09:5d:29:28:2f:93:33:20: +# f9:cf:21 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# 9B:F9:84:06:6A:FC:D2:EB:08:93:FB:E4:EE:2F:D8:C1:C2:89:7A:A7 +# X509v3 Authority Key Identifier: +# keyid:12:B9:C3:48:79:ED:7D:30:C9:78:78:61:94:58:37:07:40:76:38:18 +# +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Key Usage: +# Certificate Sign, CRL Sign +# Signature Algorithm: sha256WithRSAEncryption +# 79:28:d5:46:92:1f:6b:25:de:b0:1e:e2:44:d3:7b:a3:4a:6e: +# 05:43:dd:85:47:4d:ca:d0:d9:43:65:34:38:a0:c2:6c:fb:49: +# 85:6d:f3:dc:10:8c:73:37:49:22:c3:87:dd:28:8a:b0:b2:2c: +# a3:9c:f6:15:4d:98:39:95:a1:21:72:36:ff:04:67:e5:ba:3e: +# bd:5e:d4:81:ac:f4:1c:f5:ab:8d:dd:73:e9:37:d9:d2:80:39: +# 5b:f5:ec:fe:9c:56:ec:10:f7:86:42:17:d1:f1:4b:c5:38:fe: +# 0e:85:2c:6e:ac:6f:52:e5:a8:b9:fe:af:f5:dc:35:0a:74:f8: +# 72:4f:51:d5:95:f4:fe:8f:fa:3f:d5:d2:1f:44:3b:63:60:4a: +# e2:99:37:bf:09:40:32:6c:ea:3c:61:85:77:bc:63:6e:11:f9: +# 41:5f:cb:4c:99:39:2a:37:66:79:4d:5a:7e:93:91:53:33:ce: +# b1:c0:1c:68:97:2e:5a:e1:66:59:41:52:07:cf:4a:02:24:54: +# dd:01:97:2f:f1:85:db:50:9c:3b:16:95:d2:08:ca:f6:93:9a: +# 01:33:36:40:7c:39:e3:df:f8:7b:a7:b5:ea:60:06:a5:74:3a: +# dc:ea:36:08:6b:c1:59:03:01:77:17:0e:6b:e1:9a:48:68:06: +# 31:03:28:0b:cb:dd:61:93:80:0c:f1:16:e4:87:26:86:72:b4: +# 12:32:7b:f7:85:59:9a:e3:1c:c4:d8:6e:55:a9:7e:c5:ce:8b: +# be:d2:bf:57:34:62:83:f1:d0:3a:73:e1:75:e1:f4:77:5b:a3: +# a3:35:7a:fb:b6:85:68:d5:ad:26:95:71:60:62:92:30:d3:5c: +# 7b:8e:42:14:e8:7b:27:13:e6:aa:cb:35:42:2c:db:e9:1f:ff: +# fd:4c:8f:fc:04:d8:05:16:da:a8:93:db:3b:f2:51:17:ff:dc: +# c7:11:97:14:ac:d8:5a:e7:ad:38:fa:17:bf:bd:4b:92:84:0d: +# 96:20:7d:17:ee:31:a6:56:57:5e:a4:0d:d2:cb:47:e8:45:14: +# e4:6a:4a:a1:40:da:b7:bc:e8:aa:60:59:4c:4a:3b:0c:ef:26: +# 39:fc:cb:8c:fe:79:c3:35:34:f5:3a:11:d3:e6:e7:fe:fd:bc: +# 89:6a:c5:d0:5b:a2:b9:84:9d:b4:53:d1:1f:c0:f6:fd:80:8a: +# 88:f8:aa:04:8f:5d:83:4a:91:ed:90:f0:f6:0a:bb:1a:01:d7: +# a4:bb:3c:c4:c1:e1:38:ca:03:8b:61:d8:18:ab:bc:ef:7e:18: +# aa:df:61:d1:1f:64:10:04:e9:25:7d:c3:bb:10:e0:11:55:29: +# e6:56:87:80:bf:95:20:c5 +#-----BEGIN CERTIFICATE----- +#MIIFIDCCAwigAwIBAgIBAjANBgkqhkiG9w0BAQsFADAiMQ0wCwYDVQQKDARUZXN0 +#MREwDwYDVQQDDAhUZXN0Um9vdDAeFw0xNTAyMjQwMDU5NTFaFw0xNzAyMTMwMDU5 +#NTFaMCMxDTALBgNVBAoMBFRlc3QxEjAQBgNVBAMMCVRlc3RJbnRDQTCCAiIwDQYJ +#KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL8KKQJUAJfDgeYziXQDzKf0jVQXNkiX +#ajJOuIdtYo6Hf5FkO3XVPZMZF9IA2NvDkXw1I1nUKaPh2ihmKIVr00QJOIJCLyOr +#5hsvjMMSQJmNLqaVFpx1sQe9dvYXvKSTj5/N620cjFwMKo24cSztrf577T7D5yTU +#rlNCNMWC+foVcbqeFqcexVynSLMm9Kk0cYS4e3en8aKO9ejNJfljibGYKo5N2p4t +#0qWWyjIe4iKxC7kPmAquCC+o/pAv2A0WeS3IYiJp8xgrqcfRhfdd1atEb5GaGoYi +#C35Xl5hqvbtVHuZEYhgLr6Q+uqdf8aYoXP7fGZrNOeOaXryqSQwiJLcc1CGZC8RI +#lbjerUzhOeg0XcYMTywiyOjNGbfTj9PNdnYPsbsKRb6dXypdURxHebzJ0bwwM64t +#2ye5G/8sy7KvfeWmm28jmH52dEVfQRVzwZz1iMaPypt4cO6LutG8YE8pdm0oLzsJ +#5kdTSQQVZx2vDVH4Q5LIq+rwCZ5Hhy5i2JFuQN6sG+FqR0HDfc+Q4Ok0gNBWmpKD +#GArEYbdgPZpM22EK0NBx8e7eEa367kuP/hXtbeSwunCcMOpSTTGklTWhHNkVn5yr +#BlDrrtS7F3QnRLk1+hVh4RP2HkaInNNnyrylfNu5fiMcJHf6hI84fypC1UngMwld +#KSgvkzMg+c8hAgMBAAGjYDBeMB0GA1UdDgQWBBSb+YQGavzS6wiT++TuL9jBwol6 +#pzAfBgNVHSMEGDAWgBQSucNIee19MMl4eGGUWDcHQHY4GDAPBgNVHRMBAf8EBTAD +#AQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAeSjVRpIfayXesB7i +#RNN7o0puBUPdhUdNytDZQ2U0OKDCbPtJhW3z3BCMczdJIsOH3SiKsLIso5z2FU2Y +#OZWhIXI2/wRn5bo+vV7Ugaz0HPWrjd1z6TfZ0oA5W/Xs/pxW7BD3hkIX0fFLxTj+ +#DoUsbqxvUuWouf6v9dw1CnT4ck9R1ZX0/o/6P9XSH0Q7Y2BK4pk3vwlAMmzqPGGF +#d7xjbhH5QV/LTJk5KjdmeU1afpORUzPOscAcaJcuWuFmWUFSB89KAiRU3QGXL/GF +#21CcOxaV0gjK9pOaATM2QHw549/4e6e16mAGpXQ63Oo2CGvBWQMBdxcOa+GaSGgG +#MQMoC8vdYZOADPEW5IcmhnK0EjJ794VZmuMcxNhuVal+xc6LvtK/VzRig/HQOnPh +#deH0d1ujozV6+7aFaNWtJpVxYGKSMNNce45CFOh7JxPmqss1Qizb6R///UyP/ATY +#BRbaqJPbO/JRF//cxxGXFKzYWuetOPoXv71LkoQNliB9F+4xplZXXqQN0stH6EUU +#5GpKoUDat7zoqmBZTEo7DO8mOfzLjP55wzU09ToR0+bn/v28iWrF0FuiuYSdtFPR +#H8D2/YCKiPiqBI9dg0qR7ZDw9gq7GgHXpLs8xMHhOMoDi2HYGKu8734Yqt9h0R9k +#EATpJX3DuxDgEVUp5laHgL+VIMU= +#-----END CERTIFICATE----- + + +MIILhAoBAKCCC30wggt5BgkrBgEFBQcwAQEEggtqMIILZjCB5qEkMCIxDTALBgNV +BAoMBFRlc3QxETAPBgNVBAMMCFRlc3RPQ1NQGA8yMDE1MDIyODAwNDc0MFowgYcw +gYQwOzAJBgUrDgMCGgUABBQQVleLdBgTJh/ZcSraYAd/98YejwQUm/mEBmr80usI +k/vk7i/YwcKJeqcCAhUAoRYYDzIwMTUwMjE5MTU1MDMwWqADCgEBGA8yMDE1MDIy +ODAwNDc0MFqhHDAaMBgGA1UdGAQRGA8yMDE1MDIxOTE0MDAwMFqhIzAhMB8GCSsG +AQUFBzABAgQSBBDbWxxQ9mAdxFM9FZ2xl9iuMA0GCSqGSIb3DQEBBQUAA4IBAQDA +QVUXPd8xpPabKiTNBUOy5RX7lc8ZqXA7WNBBFH24U/Ps1brh3vig+DoOsFxQgVsF +pV4Qb0aPJRcQXDN66HBqkzf3dU1p0zpRVjgHzUJwCZKu6I7YUrDpP2TCCphjFQzX +NpByn/usTE3Lks6HVLZJO6j1nM2fEWnxr2jBdkrAkFgugeLpKK+DBsOuNJWtQnXN +e1ASnDpQhrQ2Nqw/JypvBjHNJ3/w643C5jfdOQPlDqKDJnG/3aZMoP5HlGWC8yeJ +eOA7pTCmEp4dDfzDQfxTKeYEq8AA0i34E9i55mQQ0qcC5z6qrFJnaUY7j6KWT7NV +/OjBkGFx9aDIPLZIYMhcoIIJZTCCCWEwggQ5MIICIaADAgECAgIBATANBgkqhkiG +9w0BAQsFADAjMQ0wCwYDVQQKDARUZXN0MRIwEAYDVQQDDAlUZXN0SW50Q0EwHhcN +MTUwMjI0MDEyMjI0WhcNMTYwMjI0MDEyMjI0WjAiMQ0wCwYDVQQKDARUZXN0MREw +DwYDVQQDDAhUZXN0T0NTUDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANJcrhH2xq6XujHtK7bhx1gD5ZvueFPLM6UV/cZJFoMOyCF9z6jrGDEyCmIMTsel +pXWd23KQ41quUwobWT+9Omexv5hkpIXwlxCLDn57XtQyq7Xvw94iwBGQyDfkSLBe +/BoseoUrpr0YZAjT47jYqy612OgSLlhFaaxWlGLjwsQ8COqzu6SJfvuEXpVJb7kz +ZhrCfzZVGKch5Bt1wOjJAhuc8YuxWLCM2lwkpfSlNlIcdtNace7wyEtlWAvW1mwj +O9CP9Tpm1PT9NJDCNaFtcEk5pnE9DXyF09H1bjAFQqGIq5QfJfJ2hVfLd7aeowMm +/7FHcWcgdY2DEBdsmpNL9jECAwEAAaN4MHYwHQYDVR0OBBYEFFh4gw5HYcLJ4Hen +/q2cpF8A6KZsMB8GA1UdIwQYMBaAFJv5hAZq/NLrCJP75O4v2MHCiXqnMA4GA1Ud +DwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDCTAPBgkrBgEFBQcwAQUEAgUA +MA0GCSqGSIb3DQEBCwUAA4ICAQBVEwwLSjUUJe82SFmGB+jAzdCcGdE2Y4XR8Eb/ +rzk3gL0+xIj6Zi1XCJcbIAA3MDgUz/9dAcTgBqqCyWQ/7Yke2ioCxR1Pi9AV8yZD +sagJ9x7UDze9UGzNsYundxrplez8RTE25CPGY15kYaypo6h8JvWRV6oNUdPfrSnT +71irdC+B3J6XNQ2UiA80XbeA7UkqOfTJUbiNjdvm7AQ5umlVZyT+jybxHGIMrZXc +3lx7bA7p1P7jz57RXdqq+ReNkqstVGcFwnpRhHLJq/Aya4bzH8STO5uNcxJPWC1Z +QzIdCgylWFnazp0StNNPKZjcpUS9kyNlrRkwq3JEFUigep7q1fWanvpwMqpRswS2 +kcS412GuwEHsWpO0YrwJxATY1DMJ+WMg1QHtuWBHFHfR98VBOzvnXXPZra2VIJxA +H+RHCvZUu7gJYwBJ2y58KnmWhhuWO1SXSLQ5RvIn74yWRs2vjlVwnWyP0RpM+uiQ +pCkQBNG/st4EKCqvrt3fpvlKZhl2eqrPsGjD74M7e+lvEpcd2x4q2gcD0LrBhwLN +Wb60ISI72F19tKPHKlY+CWxrb1QiA7uy15iKL1Hs+n0+3Mhv2ypvRlYuCLlBgdhY +pG4qyEbbY1I4xkUaaqMEPkgOhD0pR4uA/O60yBLwA+97SC2UgKJRwxSSfleDzVZ+ +m43FwjCCBSAwggMIoAMCAQICAQIwDQYJKoZIhvcNAQELBQAwIjENMAsGA1UECgwE +VGVzdDERMA8GA1UEAwwIVGVzdFJvb3QwHhcNMTUwMjI0MDA1OTUxWhcNMTcwMjEz +MDA1OTUxWjAjMQ0wCwYDVQQKDARUZXN0MRIwEAYDVQQDDAlUZXN0SW50Q0EwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/CikCVACXw4HmM4l0A8yn9I1U +FzZIl2oyTriHbWKOh3+RZDt11T2TGRfSANjbw5F8NSNZ1Cmj4dooZiiFa9NECTiC +Qi8jq+YbL4zDEkCZjS6mlRacdbEHvXb2F7ykk4+fzettHIxcDCqNuHEs7a3+e+0+ +w+ck1K5TQjTFgvn6FXG6nhanHsVcp0izJvSpNHGEuHt3p/GijvXozSX5Y4mxmCqO +TdqeLdKllsoyHuIisQu5D5gKrggvqP6QL9gNFnktyGIiafMYK6nH0YX3XdWrRG+R +mhqGIgt+V5eYar27VR7mRGIYC6+kPrqnX/GmKFz+3xmazTnjml68qkkMIiS3HNQh +mQvESJW43q1M4TnoNF3GDE8sIsjozRm304/TzXZ2D7G7CkW+nV8qXVEcR3m8ydG8 +MDOuLdsnuRv/LMuyr33lpptvI5h+dnRFX0EVc8Gc9YjGj8qbeHDui7rRvGBPKXZt +KC87CeZHU0kEFWcdrw1R+EOSyKvq8AmeR4cuYtiRbkDerBvhakdBw33PkODpNIDQ +VpqSgxgKxGG3YD2aTNthCtDQcfHu3hGt+u5Lj/4V7W3ksLpwnDDqUk0xpJU1oRzZ +FZ+cqwZQ667Uuxd0J0S5NfoVYeET9h5GiJzTZ8q8pXzbuX4jHCR3+oSPOH8qQtVJ +4DMJXSkoL5MzIPnPIQIDAQABo2AwXjAdBgNVHQ4EFgQUm/mEBmr80usIk/vk7i/Y +wcKJeqcwHwYDVR0jBBgwFoAUErnDSHntfTDJeHhhlFg3B0B2OBgwDwYDVR0TAQH/ +BAUwAwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHko1UaSH2sl +3rAe4kTTe6NKbgVD3YVHTcrQ2UNlNDigwmz7SYVt89wQjHM3SSLDh90oirCyLKOc +9hVNmDmVoSFyNv8EZ+W6Pr1e1IGs9Bz1q43dc+k32dKAOVv17P6cVuwQ94ZCF9Hx +S8U4/g6FLG6sb1LlqLn+r/XcNQp0+HJPUdWV9P6P+j/V0h9EO2NgSuKZN78JQDJs +6jxhhXe8Y24R+UFfy0yZOSo3ZnlNWn6TkVMzzrHAHGiXLlrhZllBUgfPSgIkVN0B +ly/xhdtQnDsWldIIyvaTmgEzNkB8OePf+HuntepgBqV0OtzqNghrwVkDAXcXDmvh +mkhoBjEDKAvL3WGTgAzxFuSHJoZytBIye/eFWZrjHMTYblWpfsXOi77Sv1c0YoPx +0Dpz4XXh9Hdbo6M1evu2hWjVrSaVcWBikjDTXHuOQhToeycT5qrLNUIs2+kf//1M +j/wE2AUW2qiT2zvyURf/3McRlxSs2FrnrTj6F7+9S5KEDZYgfRfuMaZWV16kDdLL +R+hFFORqSqFA2re86KpgWUxKOwzvJjn8y4z+ecM1NPU6EdPm5/79vIlqxdBbormE +nbRT0R/A9v2Aioj4qgSPXYNKke2Q8PYKuxoB16S7PMTB4TjKA4th2BirvO9+GKrf +YdEfZBAE6SV9w7sQ4BFVKeZWh4C/lSDF diff --git a/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-sr-cont-reverse.resp b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-sr-cont-reverse.resp new file mode 100644 index 00000000000..a54259d86c1 --- /dev/null +++ b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-sr-cont-reverse.resp @@ -0,0 +1,61 @@ +# This is an invalid OCSP response and cannot be displayed using openssl's +# ocsp utility. Below is an asn1parse of the BasicOCSPResponse. In this +# case the singleExtensions field (offset 170) precedes the nextUpdate +# (offset 200). +# +# 0:d=0 hl=4 l= 528 cons: SEQUENCE +# 4:d=1 hl=3 l= 249 cons: SEQUENCE +# 7:d=2 hl=2 l= 36 cons: cont [ 1 ] +# 9:d=3 hl=2 l= 34 cons: SEQUENCE +# 11:d=4 hl=2 l= 13 cons: SET +# 13:d=5 hl=2 l= 11 cons: SEQUENCE +# 15:d=6 hl=2 l= 3 prim: OBJECT :organizationName +# 20:d=6 hl=2 l= 4 prim: UTF8STRING :Test +# 26:d=4 hl=2 l= 17 cons: SET +# 28:d=5 hl=2 l= 15 cons: SEQUENCE +# 30:d=6 hl=2 l= 3 prim: OBJECT :commonName +# 35:d=6 hl=2 l= 8 prim: UTF8STRING :TestOCSP +# 45:d=2 hl=2 l= 15 prim: GENERALIZEDTIME :20150303165544Z +# 62:d=2 hl=3 l= 154 cons: SEQUENCE +# 65:d=3 hl=3 l= 151 cons: SEQUENCE +# 68:d=4 hl=2 l= 59 cons: SEQUENCE +# 70:d=5 hl=2 l= 9 cons: SEQUENCE +# 72:d=6 hl=2 l= 5 prim: OBJECT :sha1 +# 79:d=6 hl=2 l= 0 prim: NULL +# 81:d=5 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:1056578B741813261FD9712ADA60077FF7C61E8F +# 103:d=5 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:9BF984066AFCD2EB0893FBE4EE2FD8C1C2897AA7 +# 125:d=5 hl=2 l= 2 prim: INTEGER :1500 +# 129:d=4 hl=2 l= 22 cons: cont [ 1 ] +# 131:d=5 hl=2 l= 15 prim: GENERALIZEDTIME :20150219155030Z +# 148:d=5 hl=2 l= 3 cons: cont [ 0 ] +# 150:d=6 hl=2 l= 1 prim: ENUMERATED :01 +# 153:d=4 hl=2 l= 15 prim: GENERALIZEDTIME :20150303165544Z +# 170:d=4 hl=2 l= 28 cons: cont [ 1 ] +# 172:d=5 hl=2 l= 26 cons: SEQUENCE +# 174:d=6 hl=2 l= 24 cons: SEQUENCE +# 176:d=7 hl=2 l= 3 prim: OBJECT :Invalidity Date +# 181:d=7 hl=2 l= 17 prim: OCTET STRING [HEX DUMP]:180F32303135303231393134303030305A +# 200:d=4 hl=2 l= 17 cons: cont [ 0 ] +# 202:d=5 hl=2 l= 15 prim: GENERALIZEDTIME :20150304165544Z +# 219:d=2 hl=2 l= 35 cons: cont [ 1 ] +# 221:d=3 hl=2 l= 33 cons: SEQUENCE +# 223:d=4 hl=2 l= 31 cons: SEQUENCE +# 225:d=5 hl=2 l= 9 prim: OBJECT :OCSP Nonce +# 236:d=5 hl=2 l= 18 prim: OCTET STRING [HEX DUMP]:0410381EF873C4A3B4C64B22873751071B53 +# 256:d=1 hl=2 l= 13 cons: SEQUENCE +# 258:d=2 hl=2 l= 9 prim: OBJECT :sha1WithRSAEncryption +# 269:d=2 hl=2 l= 0 prim: NULL +# 271:d=1 hl=4 l= 257 prim: BIT STRING + +MIICLgoBAKCCAicwggIjBgkrBgEFBQcwAQEEggIUMIICEDCB+aEkMCIxDTALBgNV +BAoMBFRlc3QxETAPBgNVBAMMCFRlc3RPQ1NQGA8yMDE1MDMwMzE2NTU0NFowgZow +gZcwOzAJBgUrDgMCGgUABBQQVleLdBgTJh/ZcSraYAd/98YejwQUm/mEBmr80usI +k/vk7i/YwcKJeqcCAhUAoRYYDzIwMTUwMjE5MTU1MDMwWqADCgEBGA8yMDE1MDMw +MzE2NTU0NFqhHDAaMBgGA1UdGAQRGA8yMDE1MDIxOTE0MDAwMFqgERgPMjAxNTAz +MDQxNjU1NDRaoSMwITAfBgkrBgEFBQcwAQIEEgQQOB74c8SjtMZLIoc3UQcbUzAN +BgkqhkiG9w0BAQUFAAOCAQEAbcY28K9+oXtDfNb2yxlzauMaeEoD477ouC7DIwCb +TgpkcjGCTjmvwg4A3sG95Z02x1xuW48XK2YkFytsBmdcfZvEnoK/WqG+qd9Aiytf +NoecsMjF8MyatHcJdQ+jq59jPWAqMGWCPmPVZ6TxHF5Ag2DAU5aL5sAjY2zvxYnl +Uc+FShl4K6Nk+mSSfu6ji8hkUEPx5rU1H0jBomMm4GMyNkxVj3NkOKSCxNWi/1Oe +utUk8Eir8Krqfd7yOn0flfroHZ2I0zf95VduxvVCsN7pgAf8Q1BAkbuq/8JRNrDr +a0kHSpO7QAv6iE7YT/SsHN5MDjtRJ780VEggV3td56R37g== diff --git a/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-twonext.resp b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-twonext.resp new file mode 100644 index 00000000000..dc289c250f3 --- /dev/null +++ b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-twonext.resp @@ -0,0 +1,58 @@ +# This is an invalid OCSP response and cannot be displayed using openssl's +# ocsp utility. Below is an asn1parse of the BasicOCSPResponse. Additional +# bytes have been inserted into the SingleResponse which add a second +# nextUpdate field (beginning at offset 189) +# +# 0:d=0 hl=4 l= 517 cons: SEQUENCE +# 4:d=1 hl=3 l= 238 cons: SEQUENCE +# 7:d=2 hl=2 l= 36 cons: cont [ 1 ] +# 9:d=3 hl=2 l= 34 cons: SEQUENCE +# 11:d=4 hl=2 l= 13 cons: SET +# 13:d=5 hl=2 l= 11 cons: SEQUENCE +# 15:d=6 hl=2 l= 3 prim: OBJECT :organizationName +# 20:d=6 hl=2 l= 4 prim: UTF8STRING :Test +# 26:d=4 hl=2 l= 17 cons: SET +# 28:d=5 hl=2 l= 15 cons: SEQUENCE +# 30:d=6 hl=2 l= 3 prim: OBJECT :commonName +# 35:d=6 hl=2 l= 8 prim: UTF8STRING :TestOCSP +# 45:d=2 hl=2 l= 15 prim: GENERALIZEDTIME :20150303165544Z +# 62:d=2 hl=3 l= 143 cons: SEQUENCE +# 65:d=3 hl=3 l= 140 cons: SEQUENCE +# 68:d=4 hl=2 l= 59 cons: SEQUENCE +# 70:d=5 hl=2 l= 9 cons: SEQUENCE +# 72:d=6 hl=2 l= 5 prim: OBJECT :sha1 +# 79:d=6 hl=2 l= 0 prim: NULL +# 81:d=5 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:1056578B741813261FD9712ADA60077FF7C61E8F +# 103:d=5 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:9BF984066AFCD2EB0893FBE4EE2FD8C1C2897AA7 +# 125:d=5 hl=2 l= 2 prim: INTEGER :1500 +# 129:d=4 hl=2 l= 22 cons: cont [ 1 ] +# 131:d=5 hl=2 l= 15 prim: GENERALIZEDTIME :20150219155030Z +# 148:d=5 hl=2 l= 3 cons: cont [ 0 ] +# 150:d=6 hl=2 l= 1 prim: ENUMERATED :01 +# 153:d=4 hl=2 l= 15 prim: GENERALIZEDTIME :20150303165544Z +# 170:d=4 hl=2 l= 17 cons: cont [ 0 ] +# 172:d=5 hl=2 l= 15 prim: GENERALIZEDTIME :20150304165544Z +# 189:d=4 hl=2 l= 17 cons: cont [ 0 ] +# 191:d=5 hl=2 l= 15 prim: GENERALIZEDTIME :20150304165544Z +# 208:d=2 hl=2 l= 35 cons: cont [ 1 ] +# 210:d=3 hl=2 l= 33 cons: SEQUENCE +# 212:d=4 hl=2 l= 31 cons: SEQUENCE +# 214:d=5 hl=2 l= 9 prim: OBJECT :OCSP Nonce +# 225:d=5 hl=2 l= 18 prim: OCTET STRING [HEX DUMP]:0410381EF873C4A3B4C64B22873751071B53 +# 245:d=1 hl=2 l= 13 cons: SEQUENCE +# 247:d=2 hl=2 l= 9 prim: OBJECT :sha1WithRSAEncryption +# 258:d=2 hl=2 l= 0 prim: NULL +# 260:d=1 hl=4 l= 257 prim: BIT STRING + +MIICIwoBAKCCAhwwggIYBgkrBgEFBQcwAQEEggIJMIICBTCB7qEkMCIxDTALBgNV +BAoMBFRlc3QxETAPBgNVBAMMCFRlc3RPQ1NQGA8yMDE1MDMwMzE2NTU0NFowgY8w +gYwwOzAJBgUrDgMCGgUABBQQVleLdBgTJh/ZcSraYAd/98YejwQUm/mEBmr80usI +k/vk7i/YwcKJeqcCAhUAoRYYDzIwMTUwMjE5MTU1MDMwWqADCgEBGA8yMDE1MDMw +MzE2NTU0NFqgERgPMjAxNTAzMDQxNjU1NDRaoBEYDzIwMTUwMzA0MTY1NTQ0WqEj +MCEwHwYJKwYBBQUHMAECBBIEEDge+HPEo7TGSyKHN1EHG1MwDQYJKoZIhvcNAQEF +BQADggEBAG3GNvCvfqF7Q3zW9ssZc2rjGnhKA+O+6LguwyMAm04KZHIxgk45r8IO +AN7BveWdNsdcbluPFytmJBcrbAZnXH2bxJ6Cv1qhvqnfQIsrXzaHnLDIxfDMmrR3 +CXUPo6ufYz1gKjBlgj5j1Wek8RxeQINgwFOWi+bAI2Ns78WJ5VHPhUoZeCujZPpk +kn7uo4vIZFBD8ea1NR9IwaJjJuBjMjZMVY9zZDikgsTVov9TnrrVJPBIq/Cq6n3e +8jp9H5X66B2diNM3/eVXbsb1QrDe6YAH/ENQQJG7qv/CUTaw62tJB0qTu0AL+ohO +2E/0rBzeTA47USe/NFRIIFd7Xeekd+4= diff --git a/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-withnext-noinv.resp b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-withnext-noinv.resp new file mode 100644 index 00000000000..3145186e581 --- /dev/null +++ b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-withnext-noinv.resp @@ -0,0 +1,319 @@ +#OCSP Response Data: +# OCSP Response Status: successful (0x0) +# Response Type: Basic OCSP Response +# Version: 1 (0x0) +# Responder Id: O = Test, CN = TestOCSP +# Produced At: Feb 28 00:46:08 2015 GMT +# Responses: +# Certificate ID: +# Hash Algorithm: sha1 +# Issuer Name Hash: 1056578B741813261FD9712ADA60077FF7C61E8F +# Issuer Key Hash: 9BF984066AFCD2EB0893FBE4EE2FD8C1C2897AA7 +# Serial Number: 1500 +# Cert Status: revoked +# Revocation Time: Feb 19 15:50:30 2015 GMT +# This Update: Feb 28 00:46:08 2015 GMT +# Next Update: Mar 1 00:46:08 2015 GMT +# +# Response Extensions: +# OCSP Nonce: +# 041024C5D6772FC53AE6DE208A1C1D6F0913 +# Signature Algorithm: sha1WithRSAEncryption +# a6:dd:66:77:7d:99:3a:0d:41:21:1a:d6:5a:67:8c:51:88:6f: +# 77:44:f8:fc:35:99:14:b9:ef:67:c1:fe:5e:36:a1:b8:78:93: +# 6e:c6:11:08:96:fc:a3:37:55:3c:b3:08:c5:d2:ce:c4:c8:59: +# 32:1b:05:7c:33:65:66:41:2e:71:2b:d0:25:8d:f4:91:ef:f1: +# c5:1e:16:55:6a:60:df:28:c8:3c:fe:44:74:4e:2f:80:36:58: +# 62:56:d4:9a:00:82:49:81:b6:d7:ce:0a:b2:70:ae:69:8f:38: +# 64:ff:c4:b4:52:34:ad:9d:50:d2:0a:d5:d0:93:2b:61:03:12: +# 05:28:4f:91:b7:4c:f5:26:c3:a6:76:f9:62:d4:42:e1:ea:c1: +# 13:e7:d8:a1:3a:49:fd:12:96:9d:c2:d0:45:fc:c1:fe:30:19: +# fe:ff:73:b4:e4:03:0b:dc:6f:bf:41:b2:fe:23:20:c9:02:d8: +# 11:3c:8b:f4:a3:07:3a:fe:c2:3d:d9:54:b2:b6:36:5b:3a:24: +# cb:f3:e8:a7:97:de:62:5c:80:79:0d:cd:68:73:31:c8:ba:bc: +# 7a:d3:26:04:2b:f0:08:45:ba:d3:21:2f:60:fc:c9:4b:24:8f: +# ff:e6:6c:11:81:69:87:5f:f9:28:b7:65:6b:f4:ee:f3:ed:6c: +# b4:c8:ae:0b +#Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 257 (0x101) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: O=Test, CN=TestIntCA +# Validity +# Not Before: Feb 24 01:22:24 2015 GMT +# Not After : Feb 24 01:22:24 2016 GMT +# Subject: O=Test, CN=TestOCSP +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:d2:5c:ae:11:f6:c6:ae:97:ba:31:ed:2b:b6:e1: +# c7:58:03:e5:9b:ee:78:53:cb:33:a5:15:fd:c6:49: +# 16:83:0e:c8:21:7d:cf:a8:eb:18:31:32:0a:62:0c: +# 4e:c7:a5:a5:75:9d:db:72:90:e3:5a:ae:53:0a:1b: +# 59:3f:bd:3a:67:b1:bf:98:64:a4:85:f0:97:10:8b: +# 0e:7e:7b:5e:d4:32:ab:b5:ef:c3:de:22:c0:11:90: +# c8:37:e4:48:b0:5e:fc:1a:2c:7a:85:2b:a6:bd:18: +# 64:08:d3:e3:b8:d8:ab:2e:b5:d8:e8:12:2e:58:45: +# 69:ac:56:94:62:e3:c2:c4:3c:08:ea:b3:bb:a4:89: +# 7e:fb:84:5e:95:49:6f:b9:33:66:1a:c2:7f:36:55: +# 18:a7:21:e4:1b:75:c0:e8:c9:02:1b:9c:f1:8b:b1: +# 58:b0:8c:da:5c:24:a5:f4:a5:36:52:1c:76:d3:5a: +# 71:ee:f0:c8:4b:65:58:0b:d6:d6:6c:23:3b:d0:8f: +# f5:3a:66:d4:f4:fd:34:90:c2:35:a1:6d:70:49:39: +# a6:71:3d:0d:7c:85:d3:d1:f5:6e:30:05:42:a1:88: +# ab:94:1f:25:f2:76:85:57:cb:77:b6:9e:a3:03:26: +# ff:b1:47:71:67:20:75:8d:83:10:17:6c:9a:93:4b: +# f6:31 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# 58:78:83:0E:47:61:C2:C9:E0:77:A7:FE:AD:9C:A4:5F:00:E8:A6:6C +# X509v3 Authority Key Identifier: +# keyid:9B:F9:84:06:6A:FC:D2:EB:08:93:FB:E4:EE:2F:D8:C1:C2:89:7A:A7 +# +# X509v3 Key Usage: critical +# Digital Signature +# X509v3 Extended Key Usage: +# OCSP Signing +# OCSP No Check: +# +# Signature Algorithm: sha256WithRSAEncryption +# 55:13:0c:0b:4a:35:14:25:ef:36:48:59:86:07:e8:c0:cd:d0: +# 9c:19:d1:36:63:85:d1:f0:46:ff:af:39:37:80:bd:3e:c4:88: +# fa:66:2d:57:08:97:1b:20:00:37:30:38:14:cf:ff:5d:01:c4: +# e0:06:aa:82:c9:64:3f:ed:89:1e:da:2a:02:c5:1d:4f:8b:d0: +# 15:f3:26:43:b1:a8:09:f7:1e:d4:0f:37:bd:50:6c:cd:b1:8b: +# a7:77:1a:e9:95:ec:fc:45:31:36:e4:23:c6:63:5e:64:61:ac: +# a9:a3:a8:7c:26:f5:91:57:aa:0d:51:d3:df:ad:29:d3:ef:58: +# ab:74:2f:81:dc:9e:97:35:0d:94:88:0f:34:5d:b7:80:ed:49: +# 2a:39:f4:c9:51:b8:8d:8d:db:e6:ec:04:39:ba:69:55:67:24: +# fe:8f:26:f1:1c:62:0c:ad:95:dc:de:5c:7b:6c:0e:e9:d4:fe: +# e3:cf:9e:d1:5d:da:aa:f9:17:8d:92:ab:2d:54:67:05:c2:7a: +# 51:84:72:c9:ab:f0:32:6b:86:f3:1f:c4:93:3b:9b:8d:73:12: +# 4f:58:2d:59:43:32:1d:0a:0c:a5:58:59:da:ce:9d:12:b4:d3: +# 4f:29:98:dc:a5:44:bd:93:23:65:ad:19:30:ab:72:44:15:48: +# a0:7a:9e:ea:d5:f5:9a:9e:fa:70:32:aa:51:b3:04:b6:91:c4: +# b8:d7:61:ae:c0:41:ec:5a:93:b4:62:bc:09:c4:04:d8:d4:33: +# 09:f9:63:20:d5:01:ed:b9:60:47:14:77:d1:f7:c5:41:3b:3b: +# e7:5d:73:d9:ad:ad:95:20:9c:40:1f:e4:47:0a:f6:54:bb:b8: +# 09:63:00:49:db:2e:7c:2a:79:96:86:1b:96:3b:54:97:48:b4: +# 39:46:f2:27:ef:8c:96:46:cd:af:8e:55:70:9d:6c:8f:d1:1a: +# 4c:fa:e8:90:a4:29:10:04:d1:bf:b2:de:04:28:2a:af:ae:dd: +# df:a6:f9:4a:66:19:76:7a:aa:cf:b0:68:c3:ef:83:3b:7b:e9: +# 6f:12:97:1d:db:1e:2a:da:07:03:d0:ba:c1:87:02:cd:59:be: +# b4:21:22:3b:d8:5d:7d:b4:a3:c7:2a:56:3e:09:6c:6b:6f:54: +# 22:03:bb:b2:d7:98:8a:2f:51:ec:fa:7d:3e:dc:c8:6f:db:2a: +# 6f:46:56:2e:08:b9:41:81:d8:58:a4:6e:2a:c8:46:db:63:52: +# 38:c6:45:1a:6a:a3:04:3e:48:0e:84:3d:29:47:8b:80:fc:ee: +# b4:c8:12:f0:03:ef:7b:48:2d:94:80:a2:51:c3:14:92:7e:57: +# 83:cd:56:7e:9b:8d:c5:c2 +#-----BEGIN CERTIFICATE----- +#MIIEOTCCAiGgAwIBAgICAQEwDQYJKoZIhvcNAQELBQAwIzENMAsGA1UECgwEVGVz +#dDESMBAGA1UEAwwJVGVzdEludENBMB4XDTE1MDIyNDAxMjIyNFoXDTE2MDIyNDAx +#MjIyNFowIjENMAsGA1UECgwEVGVzdDERMA8GA1UEAwwIVGVzdE9DU1AwggEiMA0G +#CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSXK4R9saul7ox7Su24cdYA+Wb7nhT +#yzOlFf3GSRaDDsghfc+o6xgxMgpiDE7HpaV1ndtykONarlMKG1k/vTpnsb+YZKSF +#8JcQiw5+e17UMqu178PeIsARkMg35EiwXvwaLHqFK6a9GGQI0+O42KsutdjoEi5Y +#RWmsVpRi48LEPAjqs7ukiX77hF6VSW+5M2Yawn82VRinIeQbdcDoyQIbnPGLsViw +#jNpcJKX0pTZSHHbTWnHu8MhLZVgL1tZsIzvQj/U6ZtT0/TSQwjWhbXBJOaZxPQ18 +#hdPR9W4wBUKhiKuUHyXydoVXy3e2nqMDJv+xR3FnIHWNgxAXbJqTS/YxAgMBAAGj +#eDB2MB0GA1UdDgQWBBRYeIMOR2HCyeB3p/6tnKRfAOimbDAfBgNVHSMEGDAWgBSb +#+YQGavzS6wiT++TuL9jBwol6pzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYI +#KwYBBQUHAwkwDwYJKwYBBQUHMAEFBAIFADANBgkqhkiG9w0BAQsFAAOCAgEAVRMM +#C0o1FCXvNkhZhgfowM3QnBnRNmOF0fBG/685N4C9PsSI+mYtVwiXGyAANzA4FM// +#XQHE4AaqgslkP+2JHtoqAsUdT4vQFfMmQ7GoCfce1A83vVBszbGLp3ca6ZXs/EUx +#NuQjxmNeZGGsqaOofCb1kVeqDVHT360p0+9Yq3QvgdyelzUNlIgPNF23gO1JKjn0 +#yVG4jY3b5uwEObppVWck/o8m8RxiDK2V3N5ce2wO6dT+48+e0V3aqvkXjZKrLVRn +#BcJ6UYRyyavwMmuG8x/EkzubjXMST1gtWUMyHQoMpVhZ2s6dErTTTymY3KVEvZMj +#Za0ZMKtyRBVIoHqe6tX1mp76cDKqUbMEtpHEuNdhrsBB7FqTtGK8CcQE2NQzCflj +#INUB7blgRxR30ffFQTs7511z2a2tlSCcQB/kRwr2VLu4CWMASdsufCp5loYbljtU +#l0i0OUbyJ++MlkbNr45VcJ1sj9EaTProkKQpEATRv7LeBCgqr67d36b5SmYZdnqq +#z7Bow++DO3vpbxKXHdseKtoHA9C6wYcCzVm+tCEiO9hdfbSjxypWPglsa29UIgO7 +#steYii9R7Pp9PtzIb9sqb0ZWLgi5QYHYWKRuKshG22NSOMZFGmqjBD5IDoQ9KUeL +#gPzutMgS8APve0gtlICiUcMUkn5Xg81WfpuNxcI= +#-----END CERTIFICATE----- +#Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 2 (0x2) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: O=Test, CN=TestRoot +# Validity +# Not Before: Feb 24 00:59:51 2015 GMT +# Not After : Feb 13 00:59:51 2017 GMT +# Subject: O=Test, CN=TestIntCA +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (4096 bit) +# Modulus: +# 00:bf:0a:29:02:54:00:97:c3:81:e6:33:89:74:03: +# cc:a7:f4:8d:54:17:36:48:97:6a:32:4e:b8:87:6d: +# 62:8e:87:7f:91:64:3b:75:d5:3d:93:19:17:d2:00: +# d8:db:c3:91:7c:35:23:59:d4:29:a3:e1:da:28:66: +# 28:85:6b:d3:44:09:38:82:42:2f:23:ab:e6:1b:2f: +# 8c:c3:12:40:99:8d:2e:a6:95:16:9c:75:b1:07:bd: +# 76:f6:17:bc:a4:93:8f:9f:cd:eb:6d:1c:8c:5c:0c: +# 2a:8d:b8:71:2c:ed:ad:fe:7b:ed:3e:c3:e7:24:d4: +# ae:53:42:34:c5:82:f9:fa:15:71:ba:9e:16:a7:1e: +# c5:5c:a7:48:b3:26:f4:a9:34:71:84:b8:7b:77:a7: +# f1:a2:8e:f5:e8:cd:25:f9:63:89:b1:98:2a:8e:4d: +# da:9e:2d:d2:a5:96:ca:32:1e:e2:22:b1:0b:b9:0f: +# 98:0a:ae:08:2f:a8:fe:90:2f:d8:0d:16:79:2d:c8: +# 62:22:69:f3:18:2b:a9:c7:d1:85:f7:5d:d5:ab:44: +# 6f:91:9a:1a:86:22:0b:7e:57:97:98:6a:bd:bb:55: +# 1e:e6:44:62:18:0b:af:a4:3e:ba:a7:5f:f1:a6:28: +# 5c:fe:df:19:9a:cd:39:e3:9a:5e:bc:aa:49:0c:22: +# 24:b7:1c:d4:21:99:0b:c4:48:95:b8:de:ad:4c:e1: +# 39:e8:34:5d:c6:0c:4f:2c:22:c8:e8:cd:19:b7:d3: +# 8f:d3:cd:76:76:0f:b1:bb:0a:45:be:9d:5f:2a:5d: +# 51:1c:47:79:bc:c9:d1:bc:30:33:ae:2d:db:27:b9: +# 1b:ff:2c:cb:b2:af:7d:e5:a6:9b:6f:23:98:7e:76: +# 74:45:5f:41:15:73:c1:9c:f5:88:c6:8f:ca:9b:78: +# 70:ee:8b:ba:d1:bc:60:4f:29:76:6d:28:2f:3b:09: +# e6:47:53:49:04:15:67:1d:af:0d:51:f8:43:92:c8: +# ab:ea:f0:09:9e:47:87:2e:62:d8:91:6e:40:de:ac: +# 1b:e1:6a:47:41:c3:7d:cf:90:e0:e9:34:80:d0:56: +# 9a:92:83:18:0a:c4:61:b7:60:3d:9a:4c:db:61:0a: +# d0:d0:71:f1:ee:de:11:ad:fa:ee:4b:8f:fe:15:ed: +# 6d:e4:b0:ba:70:9c:30:ea:52:4d:31:a4:95:35:a1: +# 1c:d9:15:9f:9c:ab:06:50:eb:ae:d4:bb:17:74:27: +# 44:b9:35:fa:15:61:e1:13:f6:1e:46:88:9c:d3:67: +# ca:bc:a5:7c:db:b9:7e:23:1c:24:77:fa:84:8f:38: +# 7f:2a:42:d5:49:e0:33:09:5d:29:28:2f:93:33:20: +# f9:cf:21 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# 9B:F9:84:06:6A:FC:D2:EB:08:93:FB:E4:EE:2F:D8:C1:C2:89:7A:A7 +# X509v3 Authority Key Identifier: +# keyid:12:B9:C3:48:79:ED:7D:30:C9:78:78:61:94:58:37:07:40:76:38:18 +# +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Key Usage: +# Certificate Sign, CRL Sign +# Signature Algorithm: sha256WithRSAEncryption +# 79:28:d5:46:92:1f:6b:25:de:b0:1e:e2:44:d3:7b:a3:4a:6e: +# 05:43:dd:85:47:4d:ca:d0:d9:43:65:34:38:a0:c2:6c:fb:49: +# 85:6d:f3:dc:10:8c:73:37:49:22:c3:87:dd:28:8a:b0:b2:2c: +# a3:9c:f6:15:4d:98:39:95:a1:21:72:36:ff:04:67:e5:ba:3e: +# bd:5e:d4:81:ac:f4:1c:f5:ab:8d:dd:73:e9:37:d9:d2:80:39: +# 5b:f5:ec:fe:9c:56:ec:10:f7:86:42:17:d1:f1:4b:c5:38:fe: +# 0e:85:2c:6e:ac:6f:52:e5:a8:b9:fe:af:f5:dc:35:0a:74:f8: +# 72:4f:51:d5:95:f4:fe:8f:fa:3f:d5:d2:1f:44:3b:63:60:4a: +# e2:99:37:bf:09:40:32:6c:ea:3c:61:85:77:bc:63:6e:11:f9: +# 41:5f:cb:4c:99:39:2a:37:66:79:4d:5a:7e:93:91:53:33:ce: +# b1:c0:1c:68:97:2e:5a:e1:66:59:41:52:07:cf:4a:02:24:54: +# dd:01:97:2f:f1:85:db:50:9c:3b:16:95:d2:08:ca:f6:93:9a: +# 01:33:36:40:7c:39:e3:df:f8:7b:a7:b5:ea:60:06:a5:74:3a: +# dc:ea:36:08:6b:c1:59:03:01:77:17:0e:6b:e1:9a:48:68:06: +# 31:03:28:0b:cb:dd:61:93:80:0c:f1:16:e4:87:26:86:72:b4: +# 12:32:7b:f7:85:59:9a:e3:1c:c4:d8:6e:55:a9:7e:c5:ce:8b: +# be:d2:bf:57:34:62:83:f1:d0:3a:73:e1:75:e1:f4:77:5b:a3: +# a3:35:7a:fb:b6:85:68:d5:ad:26:95:71:60:62:92:30:d3:5c: +# 7b:8e:42:14:e8:7b:27:13:e6:aa:cb:35:42:2c:db:e9:1f:ff: +# fd:4c:8f:fc:04:d8:05:16:da:a8:93:db:3b:f2:51:17:ff:dc: +# c7:11:97:14:ac:d8:5a:e7:ad:38:fa:17:bf:bd:4b:92:84:0d: +# 96:20:7d:17:ee:31:a6:56:57:5e:a4:0d:d2:cb:47:e8:45:14: +# e4:6a:4a:a1:40:da:b7:bc:e8:aa:60:59:4c:4a:3b:0c:ef:26: +# 39:fc:cb:8c:fe:79:c3:35:34:f5:3a:11:d3:e6:e7:fe:fd:bc: +# 89:6a:c5:d0:5b:a2:b9:84:9d:b4:53:d1:1f:c0:f6:fd:80:8a: +# 88:f8:aa:04:8f:5d:83:4a:91:ed:90:f0:f6:0a:bb:1a:01:d7: +# a4:bb:3c:c4:c1:e1:38:ca:03:8b:61:d8:18:ab:bc:ef:7e:18: +# aa:df:61:d1:1f:64:10:04:e9:25:7d:c3:bb:10:e0:11:55:29: +# e6:56:87:80:bf:95:20:c5 +#-----BEGIN CERTIFICATE----- +#MIIFIDCCAwigAwIBAgIBAjANBgkqhkiG9w0BAQsFADAiMQ0wCwYDVQQKDARUZXN0 +#MREwDwYDVQQDDAhUZXN0Um9vdDAeFw0xNTAyMjQwMDU5NTFaFw0xNzAyMTMwMDU5 +#NTFaMCMxDTALBgNVBAoMBFRlc3QxEjAQBgNVBAMMCVRlc3RJbnRDQTCCAiIwDQYJ +#KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL8KKQJUAJfDgeYziXQDzKf0jVQXNkiX +#ajJOuIdtYo6Hf5FkO3XVPZMZF9IA2NvDkXw1I1nUKaPh2ihmKIVr00QJOIJCLyOr +#5hsvjMMSQJmNLqaVFpx1sQe9dvYXvKSTj5/N620cjFwMKo24cSztrf577T7D5yTU +#rlNCNMWC+foVcbqeFqcexVynSLMm9Kk0cYS4e3en8aKO9ejNJfljibGYKo5N2p4t +#0qWWyjIe4iKxC7kPmAquCC+o/pAv2A0WeS3IYiJp8xgrqcfRhfdd1atEb5GaGoYi +#C35Xl5hqvbtVHuZEYhgLr6Q+uqdf8aYoXP7fGZrNOeOaXryqSQwiJLcc1CGZC8RI +#lbjerUzhOeg0XcYMTywiyOjNGbfTj9PNdnYPsbsKRb6dXypdURxHebzJ0bwwM64t +#2ye5G/8sy7KvfeWmm28jmH52dEVfQRVzwZz1iMaPypt4cO6LutG8YE8pdm0oLzsJ +#5kdTSQQVZx2vDVH4Q5LIq+rwCZ5Hhy5i2JFuQN6sG+FqR0HDfc+Q4Ok0gNBWmpKD +#GArEYbdgPZpM22EK0NBx8e7eEa367kuP/hXtbeSwunCcMOpSTTGklTWhHNkVn5yr +#BlDrrtS7F3QnRLk1+hVh4RP2HkaInNNnyrylfNu5fiMcJHf6hI84fypC1UngMwld +#KSgvkzMg+c8hAgMBAAGjYDBeMB0GA1UdDgQWBBSb+YQGavzS6wiT++TuL9jBwol6 +#pzAfBgNVHSMEGDAWgBQSucNIee19MMl4eGGUWDcHQHY4GDAPBgNVHRMBAf8EBTAD +#AQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAeSjVRpIfayXesB7i +#RNN7o0puBUPdhUdNytDZQ2U0OKDCbPtJhW3z3BCMczdJIsOH3SiKsLIso5z2FU2Y +#OZWhIXI2/wRn5bo+vV7Ugaz0HPWrjd1z6TfZ0oA5W/Xs/pxW7BD3hkIX0fFLxTj+ +#DoUsbqxvUuWouf6v9dw1CnT4ck9R1ZX0/o/6P9XSH0Q7Y2BK4pk3vwlAMmzqPGGF +#d7xjbhH5QV/LTJk5KjdmeU1afpORUzPOscAcaJcuWuFmWUFSB89KAiRU3QGXL/GF +#21CcOxaV0gjK9pOaATM2QHw549/4e6e16mAGpXQ63Oo2CGvBWQMBdxcOa+GaSGgG +#MQMoC8vdYZOADPEW5IcmhnK0EjJ794VZmuMcxNhuVal+xc6LvtK/VzRig/HQOnPh +#deH0d1ujozV6+7aFaNWtJpVxYGKSMNNce45CFOh7JxPmqss1Qizb6R///UyP/ATY +#BRbaqJPbO/JRF//cxxGXFKzYWuetOPoXv71LkoQNliB9F+4xplZXXqQN0stH6EUU +#5GpKoUDat7zoqmBZTEo7DO8mOfzLjP55wzU09ToR0+bn/v28iWrF0FuiuYSdtFPR +#H8D2/YCKiPiqBI9dg0qR7ZDw9gq7GgHXpLs8xMHhOMoDi2HYGKu8734Yqt9h0R9k +#EATpJX3DuxDgEVUp5laHgL+VIMU= +#-----END CERTIFICATE----- + +MIILcgoBAKCCC2swggtnBgkrBgEFBQcwAQEEggtYMIILVDCB1KEkMCIxDTALBgNV +BAoMBFRlc3QxETAPBgNVBAMMCFRlc3RPQ1NQGA8yMDE1MDIyODAwNDYwOFowdjB0 +MDswCQYFKw4DAhoFAAQUEFZXi3QYEyYf2XEq2mAHf/fGHo8EFJv5hAZq/NLrCJP7 +5O4v2MHCiXqnAgIVAKERGA8yMDE1MDIxOTE1NTAzMFoYDzIwMTUwMjI4MDA0NjA4 +WqARGA8yMDE1MDMwMTAwNDYwOFqhIzAhMB8GCSsGAQUFBzABAgQSBBAkxdZ3L8U6 +5t4gihwdbwkTMA0GCSqGSIb3DQEBBQUAA4IBAQCm3WZ3fZk6DUEhGtZaZ4xRiG93 +RPj8NZkUue9nwf5eNqG4eJNuxhEIlvyjN1U8swjF0s7EyFkyGwV8M2VmQS5xK9Al +jfSR7/HFHhZVamDfKMg8/kR0Ti+ANlhiVtSaAIJJgbbXzgqycK5pjzhk/8S0UjSt +nVDSCtXQkythAxIFKE+Rt0z1JsOmdvli1ELh6sET59ihOkn9EpadwtBF/MH+MBn+ +/3O05AML3G+/QbL+IyDJAtgRPIv0owc6/sI92VSytjZbOiTL8+inl95iXIB5Dc1o +czHIurx60yYEK/AIRbrTIS9g/MlLJI//5mwRgWmHX/kot2Vr9O7z7Wy0yK4LoIIJ +ZTCCCWEwggQ5MIICIaADAgECAgIBATANBgkqhkiG9w0BAQsFADAjMQ0wCwYDVQQK +DARUZXN0MRIwEAYDVQQDDAlUZXN0SW50Q0EwHhcNMTUwMjI0MDEyMjI0WhcNMTYw +MjI0MDEyMjI0WjAiMQ0wCwYDVQQKDARUZXN0MREwDwYDVQQDDAhUZXN0T0NTUDCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANJcrhH2xq6XujHtK7bhx1gD +5ZvueFPLM6UV/cZJFoMOyCF9z6jrGDEyCmIMTselpXWd23KQ41quUwobWT+9Omex +v5hkpIXwlxCLDn57XtQyq7Xvw94iwBGQyDfkSLBe/BoseoUrpr0YZAjT47jYqy61 +2OgSLlhFaaxWlGLjwsQ8COqzu6SJfvuEXpVJb7kzZhrCfzZVGKch5Bt1wOjJAhuc +8YuxWLCM2lwkpfSlNlIcdtNace7wyEtlWAvW1mwjO9CP9Tpm1PT9NJDCNaFtcEk5 +pnE9DXyF09H1bjAFQqGIq5QfJfJ2hVfLd7aeowMm/7FHcWcgdY2DEBdsmpNL9jEC +AwEAAaN4MHYwHQYDVR0OBBYEFFh4gw5HYcLJ4Hen/q2cpF8A6KZsMB8GA1UdIwQY +MBaAFJv5hAZq/NLrCJP75O4v2MHCiXqnMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUE +DDAKBggrBgEFBQcDCTAPBgkrBgEFBQcwAQUEAgUAMA0GCSqGSIb3DQEBCwUAA4IC +AQBVEwwLSjUUJe82SFmGB+jAzdCcGdE2Y4XR8Eb/rzk3gL0+xIj6Zi1XCJcbIAA3 +MDgUz/9dAcTgBqqCyWQ/7Yke2ioCxR1Pi9AV8yZDsagJ9x7UDze9UGzNsYundxrp +lez8RTE25CPGY15kYaypo6h8JvWRV6oNUdPfrSnT71irdC+B3J6XNQ2UiA80XbeA +7UkqOfTJUbiNjdvm7AQ5umlVZyT+jybxHGIMrZXc3lx7bA7p1P7jz57RXdqq+ReN +kqstVGcFwnpRhHLJq/Aya4bzH8STO5uNcxJPWC1ZQzIdCgylWFnazp0StNNPKZjc +pUS9kyNlrRkwq3JEFUigep7q1fWanvpwMqpRswS2kcS412GuwEHsWpO0YrwJxATY +1DMJ+WMg1QHtuWBHFHfR98VBOzvnXXPZra2VIJxAH+RHCvZUu7gJYwBJ2y58KnmW +hhuWO1SXSLQ5RvIn74yWRs2vjlVwnWyP0RpM+uiQpCkQBNG/st4EKCqvrt3fpvlK +Zhl2eqrPsGjD74M7e+lvEpcd2x4q2gcD0LrBhwLNWb60ISI72F19tKPHKlY+CWxr +b1QiA7uy15iKL1Hs+n0+3Mhv2ypvRlYuCLlBgdhYpG4qyEbbY1I4xkUaaqMEPkgO +hD0pR4uA/O60yBLwA+97SC2UgKJRwxSSfleDzVZ+m43FwjCCBSAwggMIoAMCAQIC +AQIwDQYJKoZIhvcNAQELBQAwIjENMAsGA1UECgwEVGVzdDERMA8GA1UEAwwIVGVz +dFJvb3QwHhcNMTUwMjI0MDA1OTUxWhcNMTcwMjEzMDA1OTUxWjAjMQ0wCwYDVQQK +DARUZXN0MRIwEAYDVQQDDAlUZXN0SW50Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQC/CikCVACXw4HmM4l0A8yn9I1UFzZIl2oyTriHbWKOh3+RZDt1 +1T2TGRfSANjbw5F8NSNZ1Cmj4dooZiiFa9NECTiCQi8jq+YbL4zDEkCZjS6mlRac +dbEHvXb2F7ykk4+fzettHIxcDCqNuHEs7a3+e+0+w+ck1K5TQjTFgvn6FXG6nhan +HsVcp0izJvSpNHGEuHt3p/GijvXozSX5Y4mxmCqOTdqeLdKllsoyHuIisQu5D5gK +rggvqP6QL9gNFnktyGIiafMYK6nH0YX3XdWrRG+RmhqGIgt+V5eYar27VR7mRGIY +C6+kPrqnX/GmKFz+3xmazTnjml68qkkMIiS3HNQhmQvESJW43q1M4TnoNF3GDE8s +IsjozRm304/TzXZ2D7G7CkW+nV8qXVEcR3m8ydG8MDOuLdsnuRv/LMuyr33lpptv +I5h+dnRFX0EVc8Gc9YjGj8qbeHDui7rRvGBPKXZtKC87CeZHU0kEFWcdrw1R+EOS +yKvq8AmeR4cuYtiRbkDerBvhakdBw33PkODpNIDQVpqSgxgKxGG3YD2aTNthCtDQ +cfHu3hGt+u5Lj/4V7W3ksLpwnDDqUk0xpJU1oRzZFZ+cqwZQ667Uuxd0J0S5NfoV +YeET9h5GiJzTZ8q8pXzbuX4jHCR3+oSPOH8qQtVJ4DMJXSkoL5MzIPnPIQIDAQAB +o2AwXjAdBgNVHQ4EFgQUm/mEBmr80usIk/vk7i/YwcKJeqcwHwYDVR0jBBgwFoAU +ErnDSHntfTDJeHhhlFg3B0B2OBgwDwYDVR0TAQH/BAUwAwEB/zALBgNVHQ8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggIBAHko1UaSH2sl3rAe4kTTe6NKbgVD3YVHTcrQ +2UNlNDigwmz7SYVt89wQjHM3SSLDh90oirCyLKOc9hVNmDmVoSFyNv8EZ+W6Pr1e +1IGs9Bz1q43dc+k32dKAOVv17P6cVuwQ94ZCF9HxS8U4/g6FLG6sb1LlqLn+r/Xc +NQp0+HJPUdWV9P6P+j/V0h9EO2NgSuKZN78JQDJs6jxhhXe8Y24R+UFfy0yZOSo3 +ZnlNWn6TkVMzzrHAHGiXLlrhZllBUgfPSgIkVN0Bly/xhdtQnDsWldIIyvaTmgEz +NkB8OePf+HuntepgBqV0OtzqNghrwVkDAXcXDmvhmkhoBjEDKAvL3WGTgAzxFuSH +JoZytBIye/eFWZrjHMTYblWpfsXOi77Sv1c0YoPx0Dpz4XXh9Hdbo6M1evu2hWjV +rSaVcWBikjDTXHuOQhToeycT5qrLNUIs2+kf//1Mj/wE2AUW2qiT2zvyURf/3McR +lxSs2FrnrTj6F7+9S5KEDZYgfRfuMaZWV16kDdLLR+hFFORqSqFA2re86KpgWUxK +OwzvJjn8y4z+ecM1NPU6EdPm5/79vIlqxdBbormEnbRT0R/A9v2Aioj4qgSPXYNK +ke2Q8PYKuxoB16S7PMTB4TjKA4th2BirvO9+GKrfYdEfZBAE6SV9w7sQ4BFVKeZW +h4C/lSDF diff --git a/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-withnext-withinv.resp b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-withnext-withinv.resp new file mode 100644 index 00000000000..6122889c5ac --- /dev/null +++ b/jdk/test/sun/security/provider/certpath/OCSP/ocsp-rev-withnext-withinv.resp @@ -0,0 +1,323 @@ +#OCSP Response Data: +# OCSP Response Status: successful (0x0) +# Response Type: Basic OCSP Response +# Version: 1 (0x0) +# Responder Id: O = Test, CN = TestOCSP +# Produced At: Feb 28 00:46:49 2015 GMT +# Responses: +# Certificate ID: +# Hash Algorithm: sha1 +# Issuer Name Hash: 1056578B741813261FD9712ADA60077FF7C61E8F +# Issuer Key Hash: 9BF984066AFCD2EB0893FBE4EE2FD8C1C2897AA7 +# Serial Number: 1500 +# Cert Status: revoked +# Revocation Time: Feb 19 15:50:30 2015 GMT +# Revocation Reason: keyCompromise (0x1) +# This Update: Feb 28 00:46:49 2015 GMT +# Next Update: Mar 1 00:46:49 2015 GMT +# Response Single Extensions: +# Invalidity Date: +# Feb 19 14:00:00 2015 GMT +# +# Response Extensions: +# OCSP Nonce: +# 0410F17C49C52CC233FD13FDF79DE32B162D +# Signature Algorithm: sha1WithRSAEncryption +# 54:58:00:0a:36:2e:f5:4e:ba:1c:aa:72:e0:be:40:7a:c8:84: +# 62:5e:2c:ce:bd:e9:7f:fb:fc:f8:e6:d4:e5:19:d2:a5:cd:5b: +# 31:a5:bf:52:d7:89:29:73:98:e9:1e:c2:dc:e5:e2:6d:18:f1: +# 18:8a:03:c5:01:e9:c3:3c:d1:a6:22:d4:77:42:83:7b:82:27: +# f8:eb:89:b8:3f:50:10:fd:0b:59:6f:37:d4:2c:ef:cd:8f:83: +# 4c:e1:92:e2:3b:cf:5c:b3:86:ed:c6:88:62:e1:53:3c:0f:e3: +# 14:bb:3f:ad:53:de:d6:e3:4b:ab:e0:3f:c5:b9:2e:00:ec:67: +# 01:6e:f4:3a:1f:e6:c3:78:b2:61:bd:7d:62:12:35:0e:ab:87: +# ce:5d:0e:9d:5b:96:21:67:66:da:e4:48:b6:aa:0d:bc:d1:78: +# ec:41:25:87:ee:d2:48:c1:d1:f5:59:17:1c:fb:43:89:df:4f: +# 5a:d7:7a:62:a5:ef:aa:f4:b9:99:a5:34:f9:aa:15:d9:89:b2: +# d4:38:c1:cd:f8:2d:fc:07:dd:10:7a:20:75:bd:1a:0d:23:24: +# f8:59:0a:9b:56:ae:50:11:f6:b7:c6:8e:4a:c6:e5:f4:3f:5b: +# 4b:a0:72:91:06:3e:a4:f1:6e:73:6f:d6:f3:3f:2b:6e:49:fb: +# b0:bc:8a:91 +#Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 257 (0x101) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: O=Test, CN=TestIntCA +# Validity +# Not Before: Feb 24 01:22:24 2015 GMT +# Not After : Feb 24 01:22:24 2016 GMT +# Subject: O=Test, CN=TestOCSP +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:d2:5c:ae:11:f6:c6:ae:97:ba:31:ed:2b:b6:e1: +# c7:58:03:e5:9b:ee:78:53:cb:33:a5:15:fd:c6:49: +# 16:83:0e:c8:21:7d:cf:a8:eb:18:31:32:0a:62:0c: +# 4e:c7:a5:a5:75:9d:db:72:90:e3:5a:ae:53:0a:1b: +# 59:3f:bd:3a:67:b1:bf:98:64:a4:85:f0:97:10:8b: +# 0e:7e:7b:5e:d4:32:ab:b5:ef:c3:de:22:c0:11:90: +# c8:37:e4:48:b0:5e:fc:1a:2c:7a:85:2b:a6:bd:18: +# 64:08:d3:e3:b8:d8:ab:2e:b5:d8:e8:12:2e:58:45: +# 69:ac:56:94:62:e3:c2:c4:3c:08:ea:b3:bb:a4:89: +# 7e:fb:84:5e:95:49:6f:b9:33:66:1a:c2:7f:36:55: +# 18:a7:21:e4:1b:75:c0:e8:c9:02:1b:9c:f1:8b:b1: +# 58:b0:8c:da:5c:24:a5:f4:a5:36:52:1c:76:d3:5a: +# 71:ee:f0:c8:4b:65:58:0b:d6:d6:6c:23:3b:d0:8f: +# f5:3a:66:d4:f4:fd:34:90:c2:35:a1:6d:70:49:39: +# a6:71:3d:0d:7c:85:d3:d1:f5:6e:30:05:42:a1:88: +# ab:94:1f:25:f2:76:85:57:cb:77:b6:9e:a3:03:26: +# ff:b1:47:71:67:20:75:8d:83:10:17:6c:9a:93:4b: +# f6:31 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# 58:78:83:0E:47:61:C2:C9:E0:77:A7:FE:AD:9C:A4:5F:00:E8:A6:6C +# X509v3 Authority Key Identifier: +# keyid:9B:F9:84:06:6A:FC:D2:EB:08:93:FB:E4:EE:2F:D8:C1:C2:89:7A:A7 +# +# X509v3 Key Usage: critical +# Digital Signature +# X509v3 Extended Key Usage: +# OCSP Signing +# OCSP No Check: +# +# Signature Algorithm: sha256WithRSAEncryption +# 55:13:0c:0b:4a:35:14:25:ef:36:48:59:86:07:e8:c0:cd:d0: +# 9c:19:d1:36:63:85:d1:f0:46:ff:af:39:37:80:bd:3e:c4:88: +# fa:66:2d:57:08:97:1b:20:00:37:30:38:14:cf:ff:5d:01:c4: +# e0:06:aa:82:c9:64:3f:ed:89:1e:da:2a:02:c5:1d:4f:8b:d0: +# 15:f3:26:43:b1:a8:09:f7:1e:d4:0f:37:bd:50:6c:cd:b1:8b: +# a7:77:1a:e9:95:ec:fc:45:31:36:e4:23:c6:63:5e:64:61:ac: +# a9:a3:a8:7c:26:f5:91:57:aa:0d:51:d3:df:ad:29:d3:ef:58: +# ab:74:2f:81:dc:9e:97:35:0d:94:88:0f:34:5d:b7:80:ed:49: +# 2a:39:f4:c9:51:b8:8d:8d:db:e6:ec:04:39:ba:69:55:67:24: +# fe:8f:26:f1:1c:62:0c:ad:95:dc:de:5c:7b:6c:0e:e9:d4:fe: +# e3:cf:9e:d1:5d:da:aa:f9:17:8d:92:ab:2d:54:67:05:c2:7a: +# 51:84:72:c9:ab:f0:32:6b:86:f3:1f:c4:93:3b:9b:8d:73:12: +# 4f:58:2d:59:43:32:1d:0a:0c:a5:58:59:da:ce:9d:12:b4:d3: +# 4f:29:98:dc:a5:44:bd:93:23:65:ad:19:30:ab:72:44:15:48: +# a0:7a:9e:ea:d5:f5:9a:9e:fa:70:32:aa:51:b3:04:b6:91:c4: +# b8:d7:61:ae:c0:41:ec:5a:93:b4:62:bc:09:c4:04:d8:d4:33: +# 09:f9:63:20:d5:01:ed:b9:60:47:14:77:d1:f7:c5:41:3b:3b: +# e7:5d:73:d9:ad:ad:95:20:9c:40:1f:e4:47:0a:f6:54:bb:b8: +# 09:63:00:49:db:2e:7c:2a:79:96:86:1b:96:3b:54:97:48:b4: +# 39:46:f2:27:ef:8c:96:46:cd:af:8e:55:70:9d:6c:8f:d1:1a: +# 4c:fa:e8:90:a4:29:10:04:d1:bf:b2:de:04:28:2a:af:ae:dd: +# df:a6:f9:4a:66:19:76:7a:aa:cf:b0:68:c3:ef:83:3b:7b:e9: +# 6f:12:97:1d:db:1e:2a:da:07:03:d0:ba:c1:87:02:cd:59:be: +# b4:21:22:3b:d8:5d:7d:b4:a3:c7:2a:56:3e:09:6c:6b:6f:54: +# 22:03:bb:b2:d7:98:8a:2f:51:ec:fa:7d:3e:dc:c8:6f:db:2a: +# 6f:46:56:2e:08:b9:41:81:d8:58:a4:6e:2a:c8:46:db:63:52: +# 38:c6:45:1a:6a:a3:04:3e:48:0e:84:3d:29:47:8b:80:fc:ee: +# b4:c8:12:f0:03:ef:7b:48:2d:94:80:a2:51:c3:14:92:7e:57: +# 83:cd:56:7e:9b:8d:c5:c2 +#-----BEGIN CERTIFICATE----- +#MIIEOTCCAiGgAwIBAgICAQEwDQYJKoZIhvcNAQELBQAwIzENMAsGA1UECgwEVGVz +#dDESMBAGA1UEAwwJVGVzdEludENBMB4XDTE1MDIyNDAxMjIyNFoXDTE2MDIyNDAx +#MjIyNFowIjENMAsGA1UECgwEVGVzdDERMA8GA1UEAwwIVGVzdE9DU1AwggEiMA0G +#CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSXK4R9saul7ox7Su24cdYA+Wb7nhT +#yzOlFf3GSRaDDsghfc+o6xgxMgpiDE7HpaV1ndtykONarlMKG1k/vTpnsb+YZKSF +#8JcQiw5+e17UMqu178PeIsARkMg35EiwXvwaLHqFK6a9GGQI0+O42KsutdjoEi5Y +#RWmsVpRi48LEPAjqs7ukiX77hF6VSW+5M2Yawn82VRinIeQbdcDoyQIbnPGLsViw +#jNpcJKX0pTZSHHbTWnHu8MhLZVgL1tZsIzvQj/U6ZtT0/TSQwjWhbXBJOaZxPQ18 +#hdPR9W4wBUKhiKuUHyXydoVXy3e2nqMDJv+xR3FnIHWNgxAXbJqTS/YxAgMBAAGj +#eDB2MB0GA1UdDgQWBBRYeIMOR2HCyeB3p/6tnKRfAOimbDAfBgNVHSMEGDAWgBSb +#+YQGavzS6wiT++TuL9jBwol6pzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYI +#KwYBBQUHAwkwDwYJKwYBBQUHMAEFBAIFADANBgkqhkiG9w0BAQsFAAOCAgEAVRMM +#C0o1FCXvNkhZhgfowM3QnBnRNmOF0fBG/685N4C9PsSI+mYtVwiXGyAANzA4FM// +#XQHE4AaqgslkP+2JHtoqAsUdT4vQFfMmQ7GoCfce1A83vVBszbGLp3ca6ZXs/EUx +#NuQjxmNeZGGsqaOofCb1kVeqDVHT360p0+9Yq3QvgdyelzUNlIgPNF23gO1JKjn0 +#yVG4jY3b5uwEObppVWck/o8m8RxiDK2V3N5ce2wO6dT+48+e0V3aqvkXjZKrLVRn +#BcJ6UYRyyavwMmuG8x/EkzubjXMST1gtWUMyHQoMpVhZ2s6dErTTTymY3KVEvZMj +#Za0ZMKtyRBVIoHqe6tX1mp76cDKqUbMEtpHEuNdhrsBB7FqTtGK8CcQE2NQzCflj +#INUB7blgRxR30ffFQTs7511z2a2tlSCcQB/kRwr2VLu4CWMASdsufCp5loYbljtU +#l0i0OUbyJ++MlkbNr45VcJ1sj9EaTProkKQpEATRv7LeBCgqr67d36b5SmYZdnqq +#z7Bow++DO3vpbxKXHdseKtoHA9C6wYcCzVm+tCEiO9hdfbSjxypWPglsa29UIgO7 +#steYii9R7Pp9PtzIb9sqb0ZWLgi5QYHYWKRuKshG22NSOMZFGmqjBD5IDoQ9KUeL +#gPzutMgS8APve0gtlICiUcMUkn5Xg81WfpuNxcI= +#-----END CERTIFICATE----- +#Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 2 (0x2) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: O=Test, CN=TestRoot +# Validity +# Not Before: Feb 24 00:59:51 2015 GMT +# Not After : Feb 13 00:59:51 2017 GMT +# Subject: O=Test, CN=TestIntCA +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (4096 bit) +# Modulus: +# 00:bf:0a:29:02:54:00:97:c3:81:e6:33:89:74:03: +# cc:a7:f4:8d:54:17:36:48:97:6a:32:4e:b8:87:6d: +# 62:8e:87:7f:91:64:3b:75:d5:3d:93:19:17:d2:00: +# d8:db:c3:91:7c:35:23:59:d4:29:a3:e1:da:28:66: +# 28:85:6b:d3:44:09:38:82:42:2f:23:ab:e6:1b:2f: +# 8c:c3:12:40:99:8d:2e:a6:95:16:9c:75:b1:07:bd: +# 76:f6:17:bc:a4:93:8f:9f:cd:eb:6d:1c:8c:5c:0c: +# 2a:8d:b8:71:2c:ed:ad:fe:7b:ed:3e:c3:e7:24:d4: +# ae:53:42:34:c5:82:f9:fa:15:71:ba:9e:16:a7:1e: +# c5:5c:a7:48:b3:26:f4:a9:34:71:84:b8:7b:77:a7: +# f1:a2:8e:f5:e8:cd:25:f9:63:89:b1:98:2a:8e:4d: +# da:9e:2d:d2:a5:96:ca:32:1e:e2:22:b1:0b:b9:0f: +# 98:0a:ae:08:2f:a8:fe:90:2f:d8:0d:16:79:2d:c8: +# 62:22:69:f3:18:2b:a9:c7:d1:85:f7:5d:d5:ab:44: +# 6f:91:9a:1a:86:22:0b:7e:57:97:98:6a:bd:bb:55: +# 1e:e6:44:62:18:0b:af:a4:3e:ba:a7:5f:f1:a6:28: +# 5c:fe:df:19:9a:cd:39:e3:9a:5e:bc:aa:49:0c:22: +# 24:b7:1c:d4:21:99:0b:c4:48:95:b8:de:ad:4c:e1: +# 39:e8:34:5d:c6:0c:4f:2c:22:c8:e8:cd:19:b7:d3: +# 8f:d3:cd:76:76:0f:b1:bb:0a:45:be:9d:5f:2a:5d: +# 51:1c:47:79:bc:c9:d1:bc:30:33:ae:2d:db:27:b9: +# 1b:ff:2c:cb:b2:af:7d:e5:a6:9b:6f:23:98:7e:76: +# 74:45:5f:41:15:73:c1:9c:f5:88:c6:8f:ca:9b:78: +# 70:ee:8b:ba:d1:bc:60:4f:29:76:6d:28:2f:3b:09: +# e6:47:53:49:04:15:67:1d:af:0d:51:f8:43:92:c8: +# ab:ea:f0:09:9e:47:87:2e:62:d8:91:6e:40:de:ac: +# 1b:e1:6a:47:41:c3:7d:cf:90:e0:e9:34:80:d0:56: +# 9a:92:83:18:0a:c4:61:b7:60:3d:9a:4c:db:61:0a: +# d0:d0:71:f1:ee:de:11:ad:fa:ee:4b:8f:fe:15:ed: +# 6d:e4:b0:ba:70:9c:30:ea:52:4d:31:a4:95:35:a1: +# 1c:d9:15:9f:9c:ab:06:50:eb:ae:d4:bb:17:74:27: +# 44:b9:35:fa:15:61:e1:13:f6:1e:46:88:9c:d3:67: +# ca:bc:a5:7c:db:b9:7e:23:1c:24:77:fa:84:8f:38: +# 7f:2a:42:d5:49:e0:33:09:5d:29:28:2f:93:33:20: +# f9:cf:21 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# 9B:F9:84:06:6A:FC:D2:EB:08:93:FB:E4:EE:2F:D8:C1:C2:89:7A:A7 +# X509v3 Authority Key Identifier: +# keyid:12:B9:C3:48:79:ED:7D:30:C9:78:78:61:94:58:37:07:40:76:38:18 +# +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Key Usage: +# Certificate Sign, CRL Sign +# Signature Algorithm: sha256WithRSAEncryption +# 79:28:d5:46:92:1f:6b:25:de:b0:1e:e2:44:d3:7b:a3:4a:6e: +# 05:43:dd:85:47:4d:ca:d0:d9:43:65:34:38:a0:c2:6c:fb:49: +# 85:6d:f3:dc:10:8c:73:37:49:22:c3:87:dd:28:8a:b0:b2:2c: +# a3:9c:f6:15:4d:98:39:95:a1:21:72:36:ff:04:67:e5:ba:3e: +# bd:5e:d4:81:ac:f4:1c:f5:ab:8d:dd:73:e9:37:d9:d2:80:39: +# 5b:f5:ec:fe:9c:56:ec:10:f7:86:42:17:d1:f1:4b:c5:38:fe: +# 0e:85:2c:6e:ac:6f:52:e5:a8:b9:fe:af:f5:dc:35:0a:74:f8: +# 72:4f:51:d5:95:f4:fe:8f:fa:3f:d5:d2:1f:44:3b:63:60:4a: +# e2:99:37:bf:09:40:32:6c:ea:3c:61:85:77:bc:63:6e:11:f9: +# 41:5f:cb:4c:99:39:2a:37:66:79:4d:5a:7e:93:91:53:33:ce: +# b1:c0:1c:68:97:2e:5a:e1:66:59:41:52:07:cf:4a:02:24:54: +# dd:01:97:2f:f1:85:db:50:9c:3b:16:95:d2:08:ca:f6:93:9a: +# 01:33:36:40:7c:39:e3:df:f8:7b:a7:b5:ea:60:06:a5:74:3a: +# dc:ea:36:08:6b:c1:59:03:01:77:17:0e:6b:e1:9a:48:68:06: +# 31:03:28:0b:cb:dd:61:93:80:0c:f1:16:e4:87:26:86:72:b4: +# 12:32:7b:f7:85:59:9a:e3:1c:c4:d8:6e:55:a9:7e:c5:ce:8b: +# be:d2:bf:57:34:62:83:f1:d0:3a:73:e1:75:e1:f4:77:5b:a3: +# a3:35:7a:fb:b6:85:68:d5:ad:26:95:71:60:62:92:30:d3:5c: +# 7b:8e:42:14:e8:7b:27:13:e6:aa:cb:35:42:2c:db:e9:1f:ff: +# fd:4c:8f:fc:04:d8:05:16:da:a8:93:db:3b:f2:51:17:ff:dc: +# c7:11:97:14:ac:d8:5a:e7:ad:38:fa:17:bf:bd:4b:92:84:0d: +# 96:20:7d:17:ee:31:a6:56:57:5e:a4:0d:d2:cb:47:e8:45:14: +# e4:6a:4a:a1:40:da:b7:bc:e8:aa:60:59:4c:4a:3b:0c:ef:26: +# 39:fc:cb:8c:fe:79:c3:35:34:f5:3a:11:d3:e6:e7:fe:fd:bc: +# 89:6a:c5:d0:5b:a2:b9:84:9d:b4:53:d1:1f:c0:f6:fd:80:8a: +# 88:f8:aa:04:8f:5d:83:4a:91:ed:90:f0:f6:0a:bb:1a:01:d7: +# a4:bb:3c:c4:c1:e1:38:ca:03:8b:61:d8:18:ab:bc:ef:7e:18: +# aa:df:61:d1:1f:64:10:04:e9:25:7d:c3:bb:10:e0:11:55:29: +# e6:56:87:80:bf:95:20:c5 +#-----BEGIN CERTIFICATE----- +#MIIFIDCCAwigAwIBAgIBAjANBgkqhkiG9w0BAQsFADAiMQ0wCwYDVQQKDARUZXN0 +#MREwDwYDVQQDDAhUZXN0Um9vdDAeFw0xNTAyMjQwMDU5NTFaFw0xNzAyMTMwMDU5 +#NTFaMCMxDTALBgNVBAoMBFRlc3QxEjAQBgNVBAMMCVRlc3RJbnRDQTCCAiIwDQYJ +#KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL8KKQJUAJfDgeYziXQDzKf0jVQXNkiX +#ajJOuIdtYo6Hf5FkO3XVPZMZF9IA2NvDkXw1I1nUKaPh2ihmKIVr00QJOIJCLyOr +#5hsvjMMSQJmNLqaVFpx1sQe9dvYXvKSTj5/N620cjFwMKo24cSztrf577T7D5yTU +#rlNCNMWC+foVcbqeFqcexVynSLMm9Kk0cYS4e3en8aKO9ejNJfljibGYKo5N2p4t +#0qWWyjIe4iKxC7kPmAquCC+o/pAv2A0WeS3IYiJp8xgrqcfRhfdd1atEb5GaGoYi +#C35Xl5hqvbtVHuZEYhgLr6Q+uqdf8aYoXP7fGZrNOeOaXryqSQwiJLcc1CGZC8RI +#lbjerUzhOeg0XcYMTywiyOjNGbfTj9PNdnYPsbsKRb6dXypdURxHebzJ0bwwM64t +#2ye5G/8sy7KvfeWmm28jmH52dEVfQRVzwZz1iMaPypt4cO6LutG8YE8pdm0oLzsJ +#5kdTSQQVZx2vDVH4Q5LIq+rwCZ5Hhy5i2JFuQN6sG+FqR0HDfc+Q4Ok0gNBWmpKD +#GArEYbdgPZpM22EK0NBx8e7eEa367kuP/hXtbeSwunCcMOpSTTGklTWhHNkVn5yr +#BlDrrtS7F3QnRLk1+hVh4RP2HkaInNNnyrylfNu5fiMcJHf6hI84fypC1UngMwld +#KSgvkzMg+c8hAgMBAAGjYDBeMB0GA1UdDgQWBBSb+YQGavzS6wiT++TuL9jBwol6 +#pzAfBgNVHSMEGDAWgBQSucNIee19MMl4eGGUWDcHQHY4GDAPBgNVHRMBAf8EBTAD +#AQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAeSjVRpIfayXesB7i +#RNN7o0puBUPdhUdNytDZQ2U0OKDCbPtJhW3z3BCMczdJIsOH3SiKsLIso5z2FU2Y +#OZWhIXI2/wRn5bo+vV7Ugaz0HPWrjd1z6TfZ0oA5W/Xs/pxW7BD3hkIX0fFLxTj+ +#DoUsbqxvUuWouf6v9dw1CnT4ck9R1ZX0/o/6P9XSH0Q7Y2BK4pk3vwlAMmzqPGGF +#d7xjbhH5QV/LTJk5KjdmeU1afpORUzPOscAcaJcuWuFmWUFSB89KAiRU3QGXL/GF +#21CcOxaV0gjK9pOaATM2QHw549/4e6e16mAGpXQ63Oo2CGvBWQMBdxcOa+GaSGgG +#MQMoC8vdYZOADPEW5IcmhnK0EjJ794VZmuMcxNhuVal+xc6LvtK/VzRig/HQOnPh +#deH0d1ujozV6+7aFaNWtJpVxYGKSMNNce45CFOh7JxPmqss1Qizb6R///UyP/ATY +#BRbaqJPbO/JRF//cxxGXFKzYWuetOPoXv71LkoQNliB9F+4xplZXXqQN0stH6EUU +#5GpKoUDat7zoqmBZTEo7DO8mOfzLjP55wzU09ToR0+bn/v28iWrF0FuiuYSdtFPR +#H8D2/YCKiPiqBI9dg0qR7ZDw9gq7GgHXpLs8xMHhOMoDi2HYGKu8734Yqt9h0R9k +#EATpJX3DuxDgEVUp5laHgL+VIMU= +#-----END CERTIFICATE----- + +MIILlwoBAKCCC5AwgguMBgkrBgEFBQcwAQEEggt9MIILeTCB+aEkMCIxDTALBgNV +BAoMBFRlc3QxETAPBgNVBAMMCFRlc3RPQ1NQGA8yMDE1MDIyODAwNDY0OVowgZow +gZcwOzAJBgUrDgMCGgUABBQQVleLdBgTJh/ZcSraYAd/98YejwQUm/mEBmr80usI +k/vk7i/YwcKJeqcCAhUAoRYYDzIwMTUwMjE5MTU1MDMwWqADCgEBGA8yMDE1MDIy +ODAwNDY0OVqgERgPMjAxNTAzMDEwMDQ2NDlaoRwwGjAYBgNVHRgEERgPMjAxNTAy +MTkxNDAwMDBaoSMwITAfBgkrBgEFBQcwAQIEEgQQ8XxJxSzCM/0T/fed4ysWLTAN +BgkqhkiG9w0BAQUFAAOCAQEAVFgACjYu9U66HKpy4L5AesiEYl4szr3pf/v8+ObU +5RnSpc1bMaW/UteJKXOY6R7C3OXibRjxGIoDxQHpwzzRpiLUd0KDe4In+OuJuD9Q +EP0LWW831CzvzY+DTOGS4jvPXLOG7caIYuFTPA/jFLs/rVPe1uNLq+A/xbkuAOxn +AW70Oh/mw3iyYb19YhI1DquHzl0OnVuWIWdm2uRItqoNvNF47EElh+7SSMHR9VkX +HPtDid9PWtd6YqXvqvS5maU0+aoV2Ymy1DjBzfgt/AfdEHogdb0aDSMk+FkKm1au +UBH2t8aOSsbl9D9bS6BykQY+pPFuc2/W8z8rbkn7sLyKkaCCCWUwgglhMIIEOTCC +AiGgAwIBAgICAQEwDQYJKoZIhvcNAQELBQAwIzENMAsGA1UECgwEVGVzdDESMBAG +A1UEAwwJVGVzdEludENBMB4XDTE1MDIyNDAxMjIyNFoXDTE2MDIyNDAxMjIyNFow +IjENMAsGA1UECgwEVGVzdDERMA8GA1UEAwwIVGVzdE9DU1AwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDSXK4R9saul7ox7Su24cdYA+Wb7nhTyzOlFf3G +SRaDDsghfc+o6xgxMgpiDE7HpaV1ndtykONarlMKG1k/vTpnsb+YZKSF8JcQiw5+ +e17UMqu178PeIsARkMg35EiwXvwaLHqFK6a9GGQI0+O42KsutdjoEi5YRWmsVpRi +48LEPAjqs7ukiX77hF6VSW+5M2Yawn82VRinIeQbdcDoyQIbnPGLsViwjNpcJKX0 +pTZSHHbTWnHu8MhLZVgL1tZsIzvQj/U6ZtT0/TSQwjWhbXBJOaZxPQ18hdPR9W4w +BUKhiKuUHyXydoVXy3e2nqMDJv+xR3FnIHWNgxAXbJqTS/YxAgMBAAGjeDB2MB0G +A1UdDgQWBBRYeIMOR2HCyeB3p/6tnKRfAOimbDAfBgNVHSMEGDAWgBSb+YQGavzS +6wiT++TuL9jBwol6pzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUH +AwkwDwYJKwYBBQUHMAEFBAIFADANBgkqhkiG9w0BAQsFAAOCAgEAVRMMC0o1FCXv +NkhZhgfowM3QnBnRNmOF0fBG/685N4C9PsSI+mYtVwiXGyAANzA4FM//XQHE4Aaq +gslkP+2JHtoqAsUdT4vQFfMmQ7GoCfce1A83vVBszbGLp3ca6ZXs/EUxNuQjxmNe +ZGGsqaOofCb1kVeqDVHT360p0+9Yq3QvgdyelzUNlIgPNF23gO1JKjn0yVG4jY3b +5uwEObppVWck/o8m8RxiDK2V3N5ce2wO6dT+48+e0V3aqvkXjZKrLVRnBcJ6UYRy +yavwMmuG8x/EkzubjXMST1gtWUMyHQoMpVhZ2s6dErTTTymY3KVEvZMjZa0ZMKty +RBVIoHqe6tX1mp76cDKqUbMEtpHEuNdhrsBB7FqTtGK8CcQE2NQzCfljINUB7blg +RxR30ffFQTs7511z2a2tlSCcQB/kRwr2VLu4CWMASdsufCp5loYbljtUl0i0OUby +J++MlkbNr45VcJ1sj9EaTProkKQpEATRv7LeBCgqr67d36b5SmYZdnqqz7Bow++D +O3vpbxKXHdseKtoHA9C6wYcCzVm+tCEiO9hdfbSjxypWPglsa29UIgO7steYii9R +7Pp9PtzIb9sqb0ZWLgi5QYHYWKRuKshG22NSOMZFGmqjBD5IDoQ9KUeLgPzutMgS +8APve0gtlICiUcMUkn5Xg81WfpuNxcIwggUgMIIDCKADAgECAgECMA0GCSqGSIb3 +DQEBCwUAMCIxDTALBgNVBAoMBFRlc3QxETAPBgNVBAMMCFRlc3RSb290MB4XDTE1 +MDIyNDAwNTk1MVoXDTE3MDIxMzAwNTk1MVowIzENMAsGA1UECgwEVGVzdDESMBAG +A1UEAwwJVGVzdEludENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +vwopAlQAl8OB5jOJdAPMp/SNVBc2SJdqMk64h21ijod/kWQ7ddU9kxkX0gDY28OR +fDUjWdQpo+HaKGYohWvTRAk4gkIvI6vmGy+MwxJAmY0uppUWnHWxB7129he8pJOP +n83rbRyMXAwqjbhxLO2t/nvtPsPnJNSuU0I0xYL5+hVxup4Wpx7FXKdIsyb0qTRx +hLh7d6fxoo716M0l+WOJsZgqjk3ani3SpZbKMh7iIrELuQ+YCq4IL6j+kC/YDRZ5 +LchiImnzGCupx9GF913Vq0RvkZoahiILfleXmGq9u1Ue5kRiGAuvpD66p1/xpihc +/t8Zms0545pevKpJDCIktxzUIZkLxEiVuN6tTOE56DRdxgxPLCLI6M0Zt9OP0812 +dg+xuwpFvp1fKl1RHEd5vMnRvDAzri3bJ7kb/yzLsq995aabbyOYfnZ0RV9BFXPB +nPWIxo/Km3hw7ou60bxgTyl2bSgvOwnmR1NJBBVnHa8NUfhDksir6vAJnkeHLmLY +kW5A3qwb4WpHQcN9z5Dg6TSA0FaakoMYCsRht2A9mkzbYQrQ0HHx7t4RrfruS4/+ +Fe1t5LC6cJww6lJNMaSVNaEc2RWfnKsGUOuu1LsXdCdEuTX6FWHhE/YeRoic02fK +vKV827l+Ixwkd/qEjzh/KkLVSeAzCV0pKC+TMyD5zyECAwEAAaNgMF4wHQYDVR0O +BBYEFJv5hAZq/NLrCJP75O4v2MHCiXqnMB8GA1UdIwQYMBaAFBK5w0h57X0wyXh4 +YZRYNwdAdjgYMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3 +DQEBCwUAA4ICAQB5KNVGkh9rJd6wHuJE03ujSm4FQ92FR03K0NlDZTQ4oMJs+0mF +bfPcEIxzN0kiw4fdKIqwsiyjnPYVTZg5laEhcjb/BGfluj69XtSBrPQc9auN3XPp +N9nSgDlb9ez+nFbsEPeGQhfR8UvFOP4OhSxurG9S5ai5/q/13DUKdPhyT1HVlfT+ +j/o/1dIfRDtjYErimTe/CUAybOo8YYV3vGNuEflBX8tMmTkqN2Z5TVp+k5FTM86x +wBxoly5a4WZZQVIHz0oCJFTdAZcv8YXbUJw7FpXSCMr2k5oBMzZAfDnj3/h7p7Xq +YAaldDrc6jYIa8FZAwF3Fw5r4ZpIaAYxAygLy91hk4AM8RbkhyaGcrQSMnv3hVma +4xzE2G5VqX7Fzou+0r9XNGKD8dA6c+F14fR3W6OjNXr7toVo1a0mlXFgYpIw01x7 +jkIU6HsnE+aqyzVCLNvpH//9TI/8BNgFFtqok9s78lEX/9zHEZcUrNha5604+he/ +vUuShA2WIH0X7jGmVldepA3Sy0foRRTkakqhQNq3vOiqYFlMSjsM7yY5/MuM/nnD +NTT1OhHT5uf+/byJasXQW6K5hJ20U9EfwPb9gIqI+KoEj12DSpHtkPD2CrsaAdek +uzzEweE4ygOLYdgYq7zvfhiq32HRH2QQBOklfcO7EOARVSnmVoeAv5UgxQ== From 10b38fe9aec027fe35fcf82a6c33175f49f5bf07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Walln=C3=B6fer?= Date: Fri, 13 Mar 2015 18:40:07 +0100 Subject: [PATCH 42/82] 8075006: Threads spinning infinitely in WeakHashMap.get running test262parallel Reviewed-by: lagergren, attila --- .../nashorn/internal/runtime/PropertyMap.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java index 2014c643796..db7c5c992ce 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java @@ -330,12 +330,15 @@ public final class PropertyMap implements Iterable, Serializable { * Indicate that proto itself has changed in hierarchy somewhere. */ synchronized void invalidateAllProtoGetSwitchPoints() { - if (protoGetSwitches != null && !protoGetSwitches.isEmpty()) { - if (Context.DEBUG) { - protoInvalidations += protoGetSwitches.size(); + if (protoGetSwitches != null) { + final int size = protoGetSwitches.size(); + if (size > 0) { + if (Context.DEBUG) { + protoInvalidations += size; + } + SwitchPoint.invalidateAll(protoGetSwitches.values().toArray(new SwitchPoint[size])); + protoGetSwitches.clear(); } - SwitchPoint.invalidateAll(protoGetSwitches.values().toArray(new SwitchPoint[protoGetSwitches.values().size()])); - protoGetSwitches.clear(); } } @@ -375,7 +378,8 @@ public final class PropertyMap implements Iterable, Serializable { } } - // Update the free slots bitmap for a property that has been deleted and/or added. + // Update the free slots bitmap for a property that has been deleted and/or added. This method is not synchronized + // as it is always invoked on a newly created instance. private void updateFreeSlots(final Property oldProperty, final Property newProperty) { // Free slots bitset is possibly shared with parent map, so we must clone it before making modifications. boolean freeSlotsCloned = false; @@ -425,7 +429,7 @@ public final class PropertyMap implements Iterable, Serializable { * * @return New {@link PropertyMap} with {@link Property} added. */ - public PropertyMap addProperty(final Property property) { + public synchronized PropertyMap addProperty(final Property property) { if (listeners != null) { listeners.propertyAdded(property); } @@ -434,9 +438,9 @@ public final class PropertyMap implements Iterable, Serializable { if (newMap == null) { final PropertyHashMap newProperties = properties.immutableAdd(property); newMap = new PropertyMap(this, newProperties); - addToHistory(property, newMap); newMap.updateFlagsAndBoundaries(property); newMap.updateFreeSlots(null, property); + addToHistory(property, newMap); } return newMap; @@ -449,7 +453,7 @@ public final class PropertyMap implements Iterable, Serializable { * * @return New {@link PropertyMap} with {@link Property} removed or {@code null} if not found. */ - public PropertyMap deleteProperty(final Property property) { + public synchronized PropertyMap deleteProperty(final Property property) { if (listeners != null) { listeners.propertyDeleted(property); } @@ -881,8 +885,7 @@ public final class PropertyMap implements Iterable, Serializable { * @param newProto New prototype object to replace oldProto. * @return New {@link PropertyMap} with prototype changed. */ - public PropertyMap changeProto(final ScriptObject newProto) { - + public synchronized PropertyMap changeProto(final ScriptObject newProto) { final PropertyMap nextMap = checkProtoHistory(newProto); if (nextMap != null) { return nextMap; From 1382affe60f0cab6ea8c159255ddb6d6d79e27cd Mon Sep 17 00:00:00 2001 From: Joe Darcy Date: Fri, 13 Mar 2015 11:34:37 -0700 Subject: [PATCH 43/82] 8075160: Add javadoc to serialver class Reviewed-by: lancea --- .../share/classes/sun/tools/serialver/SerialVer.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/jdk/src/jdk.compiler/share/classes/sun/tools/serialver/SerialVer.java b/jdk/src/jdk.compiler/share/classes/sun/tools/serialver/SerialVer.java index f031e110b46..268ed516474 100644 --- a/jdk/src/jdk.compiler/share/classes/sun/tools/serialver/SerialVer.java +++ b/jdk/src/jdk.compiler/share/classes/sun/tools/serialver/SerialVer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2015, Oracle and/or its affiliates. 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 @@ -37,6 +37,9 @@ import java.net.MalformedURLException; import java.util.StringTokenizer; import sun.net.www.ParseUtil; +/** + * Supporting class for the serialver tool. + */ public class SerialVer { /* @@ -117,6 +120,10 @@ public class SerialVer { } } + /** + * Entry point for serialver tool. + * @param args the arguments + */ public static void main(String[] args) { String envcp = null; int i = 0; From fe068291e19e0ad9c87b8a9b1c08cca2984b7cd8 Mon Sep 17 00:00:00 2001 From: Joe Darcy Date: Fri, 13 Mar 2015 13:41:29 -0700 Subject: [PATCH 44/82] 8075035: Turn on doclint checking of modules in the langtools repo Reviewed-by: ihse --- make/CompileJavaModules.gmk | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/make/CompileJavaModules.gmk b/make/CompileJavaModules.gmk index 23188129d3b..066802688e7 100644 --- a/make/CompileJavaModules.gmk +++ b/make/CompileJavaModules.gmk @@ -90,12 +90,16 @@ endif ################################################################################ +java.compiler_ADD_JAVAC_FLAGS := -Xdoclint:all/protected,-reference '-Xdoclint/package:java.*,javax.*' + +################################################################################ + java.datatransfer_ADD_JAVAC_FLAGS := -Xdoclint:all/protected,-reference '-Xdoclint/package:java.*,javax.*' java.datatransfer_COPY := flavormap.properties ################################################################################ -java.desktop_ADD_JAVAC_FLAGS := -Xdoclint:all/protected,-missing,-reference '-Xdoclint/package:java.*,javax.*' +java.desktop_ADD_JAVAC_FLAGS := -Xdoclint:all/protected,-missing,-reference '-Xdoclint/package:java.*,javax.*' java.desktop_COPY := .gif .png .wav .txt .xml .css .pf java.desktop_CLEAN := iio-plugin.properties cursors.properties @@ -336,6 +340,7 @@ jdk.charsets_COPY := .dat ################################################################################ +jdk.compiler_ADD_JAVAC_FLAGS := -Xdoclint:all/protected '-Xdoclint/package:-com.sun.tools.*' jdk.compiler_COPY := javax.tools.JavaCompilerTool jdk.compiler_CLEAN_FILES := $(wildcard \ $(patsubst %, $(JDK_TOPDIR)/src/jdk.compiler/share/classes/%/*.properties, \ From 17f8ee8cf0ec64b243c634151a69c8370b28bce9 Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Fri, 13 Mar 2015 14:54:40 -0700 Subject: [PATCH 45/82] 8073214: javadoc of Properties methods should specify NullPointerExceptions Add test for null parameter and corresponding throws clause to load() methods Reviewed-by: darcy --- .../share/classes/java/util/Properties.java | 8 +- jdk/test/java/util/Properties/Basic.java | 75 +++++++++++++++++++ 2 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 jdk/test/java/util/Properties/Basic.java diff --git a/jdk/src/java.base/share/classes/java/util/Properties.java b/jdk/src/java.base/share/classes/java/util/Properties.java index e313c9716d0..04397c3f9f2 100644 --- a/jdk/src/java.base/share/classes/java/util/Properties.java +++ b/jdk/src/java.base/share/classes/java/util/Properties.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2015, Oracle and/or its affiliates. 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 @@ -34,8 +34,6 @@ import java.io.Reader; import java.io.Writer; import java.io.OutputStreamWriter; import java.io.BufferedWriter; -import java.security.AccessController; -import java.security.PrivilegedAction; import jdk.internal.util.xml.PropertiesDefaultHandler; @@ -311,9 +309,11 @@ class Properties extends Hashtable { * input stream. * @throws IllegalArgumentException if a malformed Unicode escape * appears in the input. + * @throws NullPointerException if {@code reader} is null. * @since 1.6 */ public synchronized void load(Reader reader) throws IOException { + Objects.requireNonNull(reader, "reader parameter is null"); load0(new LineReader(reader)); } @@ -335,9 +335,11 @@ class Properties extends Hashtable { * input stream. * @throws IllegalArgumentException if the input stream contains a * malformed Unicode escape sequence. + * @throws NullPointerException if {@code inStream} is null. * @since 1.2 */ public synchronized void load(InputStream inStream) throws IOException { + Objects.requireNonNull(inStream, "inStream parameter is null"); load0(new LineReader(inStream)); } diff --git a/jdk/test/java/util/Properties/Basic.java b/jdk/test/java/util/Properties/Basic.java new file mode 100644 index 00000000000..7827ed02957 --- /dev/null +++ b/jdk/test/java/util/Properties/Basic.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Reader; +import java.io.Writer; +import java.util.Properties; + +/* + * @test + * @bug 8073214 + * @summary Basic tests of Properties methods. + */ +public class Basic +{ + public static void main(String[] args) throws Exception + { + int failures = 0; + + Properties props = new Properties(); + + try { + props.store((OutputStream)null, "comments"); + failures++; + } catch (NullPointerException e) { + // do nothing + } + + try { + props.store((Writer)null, "comments"); + failures++; + } catch (NullPointerException e) { + // do nothing + } + + try { + props.load((InputStream)null); + failures++; + } catch (NullPointerException e) { + // do nothing + } + + try { + props.load((Reader)null); + failures++; + } catch (NullPointerException e) { + // do nothing + } + + if (failures != 0) { + throw new RuntimeException("Basic failed with " + + failures + " errors!"); + } + } +} From 6290291b273e047a8a0fed33ff039842236030b8 Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Fri, 13 Mar 2015 15:03:42 -0700 Subject: [PATCH 46/82] 8075110: (prefs) CodePointZeroPrefsTest fails on certain platforms Contrain test to the Linux and Solaris OS families Reviewed-by: darcy --- jdk/test/java/util/prefs/CodePointZeroPrefsTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/test/java/util/prefs/CodePointZeroPrefsTest.java b/jdk/test/java/util/prefs/CodePointZeroPrefsTest.java index 8a63b86caf9..eb7299b4d98 100644 --- a/jdk/test/java/util/prefs/CodePointZeroPrefsTest.java +++ b/jdk/test/java/util/prefs/CodePointZeroPrefsTest.java @@ -27,6 +27,7 @@ import java.util.prefs.PreferencesFactory; /* * @test * @bug 8068373 + * @requires os.family == "linux" | os.family == "solaris" * @summary Ensure writing a code point U+0000 null control character is detected. */ public class CodePointZeroPrefsTest From 2349ff99bc1e696aafdde8c8d82eb0bb75f8219f Mon Sep 17 00:00:00 2001 From: Jamil Nimeh Date: Sat, 14 Mar 2015 09:38:52 -0700 Subject: [PATCH 47/82] 6996366: convert MacAlg to an enum Reviewed-by: xuelei --- .../classes/sun/security/ssl/CipherBox.java | 4 +- .../classes/sun/security/ssl/CipherSuite.java | 495 ++++++++---------- .../share/classes/sun/security/ssl/MAC.java | 3 +- .../security/ssl/SSLAlgorithmConstraints.java | 10 +- 4 files changed, 241 insertions(+), 271 deletions(-) diff --git a/jdk/src/java.base/share/classes/sun/security/ssl/CipherBox.java b/jdk/src/java.base/share/classes/sun/security/ssl/CipherBox.java index e9f22055bb9..92f12ce9b67 100644 --- a/jdk/src/java.base/share/classes/sun/security/ssl/CipherBox.java +++ b/jdk/src/java.base/share/classes/sun/security/ssl/CipherBox.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2015, Oracle and/or its affiliates. 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 @@ -257,7 +257,7 @@ final class CipherBox { throw new NoSuchAlgorithmException("Unsupported cipher " + cipher); } - if (cipher == B_NULL) { + if (cipher == BulkCipher.B_NULL) { return NULL; } else { return new CipherBox(version, cipher, key, iv, random, encrypt); diff --git a/jdk/src/java.base/share/classes/sun/security/ssl/CipherSuite.java b/jdk/src/java.base/share/classes/sun/security/ssl/CipherSuite.java index 6d52cc68435..09e7afcae26 100644 --- a/jdk/src/java.base/share/classes/sun/security/ssl/CipherSuite.java +++ b/jdk/src/java.base/share/classes/sun/security/ssl/CipherSuite.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2015, Oracle and/or its affiliates. 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 @@ -41,6 +41,8 @@ import javax.crypto.spec.SecretKeySpec; import static sun.security.ssl.CipherSuite.KeyExchange.*; import static sun.security.ssl.CipherSuite.PRF.*; import static sun.security.ssl.CipherSuite.CipherType.*; +import static sun.security.ssl.CipherSuite.MacAlg.*; +import static sun.security.ssl.CipherSuite.BulkCipher.*; import static sun.security.ssl.JsseJce.*; /** @@ -129,33 +131,15 @@ final class CipherSuite implements Comparable { * Constructor for implemented CipherSuites. */ private CipherSuite(String name, int id, int priority, - KeyExchange keyExchange, BulkCipher cipher, + KeyExchange keyExchange, BulkCipher cipher, MacAlg mac, boolean allowed, int obsoleted, int supported, PRF prfAlg) { this.name = name; this.id = id; this.priority = priority; this.keyExchange = keyExchange; this.cipher = cipher; + this.macAlg = mac; this.exportable = cipher.exportable; - if (cipher.cipherType == CipherType.AEAD_CIPHER) { - macAlg = M_NULL; - } else if (name.endsWith("_MD5")) { - macAlg = M_MD5; - } else if (name.endsWith("_SHA")) { - macAlg = M_SHA; - } else if (name.endsWith("_SHA256")) { - macAlg = M_SHA256; - } else if (name.endsWith("_SHA384")) { - macAlg = M_SHA384; - } else if (name.endsWith("_NULL")) { - macAlg = M_NULL; - } else if (name.endsWith("_SCSV")) { - macAlg = M_NULL; - } else { - throw new IllegalArgumentException - ("Unknown MAC algorithm for ciphersuite " + name); - } - allowed &= keyExchange.allowed; allowed &= cipher.allowed; this.allowed = allowed; @@ -269,11 +253,11 @@ final class CipherSuite implements Comparable { * TLS 1.2+ that doesn't use the "default" PRF. */ private static void add(String name, int id, int priority, - KeyExchange keyExchange, BulkCipher cipher, + KeyExchange keyExchange, BulkCipher cipher, MacAlg mac, boolean allowed, int obsoleted, int supported, PRF prf) { CipherSuite c = new CipherSuite(name, id, priority, keyExchange, - cipher, allowed, obsoleted, supported, prf); + cipher, mac, allowed, obsoleted, supported, prf); if (idMap.put(id, c) != null) { throw new RuntimeException("Duplicate ciphersuite definition: " + id + ", " + name); @@ -294,16 +278,13 @@ final class CipherSuite implements Comparable { * All cipher suites in this document use P_SHA256. */ private static void add(String name, int id, int priority, - KeyExchange keyExchange, BulkCipher cipher, + KeyExchange keyExchange, BulkCipher cipher, MacAlg mac, boolean allowed, int obsoleted) { // If this is an obsoleted suite, then don't let the TLS 1.2 // protocol have a valid PRF value. - PRF prf = P_SHA256; - if (obsoleted < ProtocolVersion.TLS12.v) { - prf = P_NONE; - } + PRF prf = obsoleted < ProtocolVersion.TLS12.v ? P_NONE : P_SHA256; - add(name, id, priority, keyExchange, cipher, allowed, obsoleted, + add(name, id, priority, keyExchange, cipher, mac, allowed, obsoleted, ProtocolVersion.LIMIT_MIN_VALUE, prf); } @@ -312,9 +293,10 @@ final class CipherSuite implements Comparable { * suites which have not been obsoleted. */ private static void add(String name, int id, int priority, - KeyExchange keyExchange, BulkCipher cipher, boolean allowed) { - add(name, id, priority, keyExchange, - cipher, allowed, ProtocolVersion.LIMIT_MAX_VALUE); + KeyExchange keyExchange, BulkCipher cipher, MacAlg mac, + boolean allowed) { + add(name, id, priority, keyExchange, cipher, mac, allowed, + ProtocolVersion.LIMIT_MAX_VALUE); } /* @@ -402,7 +384,23 @@ final class CipherSuite implements Comparable { * Also contains a factory method to obtain in initialized CipherBox * for this algorithm. */ - final static class BulkCipher { + static enum BulkCipher { + + // export strength ciphers + B_NULL("NULL", STREAM_CIPHER, 0, 0, 0, 0, true), + B_RC4_40(CIPHER_RC4, STREAM_CIPHER, 5, 16, 0, 0, true), + B_RC2_40("RC2", BLOCK_CIPHER, 5, 16, 8, 0, false), + B_DES_40(CIPHER_DES, BLOCK_CIPHER, 5, 8, 8, 0, true), + + // domestic strength ciphers + B_RC4_128(CIPHER_RC4, STREAM_CIPHER, 16, 0, 0, true), + B_DES(CIPHER_DES, BLOCK_CIPHER, 8, 8, 0, true), + B_3DES(CIPHER_3DES, BLOCK_CIPHER, 24, 8, 0, true), + B_IDEA("IDEA", BLOCK_CIPHER, 16, 8, 0, false), + B_AES_128(CIPHER_AES, BLOCK_CIPHER, 16, 16, 0, true), + B_AES_256(CIPHER_AES, BLOCK_CIPHER, 32, 16, 0, true), + B_AES_128_GCM(CIPHER_AES_GCM, AEAD_CIPHER, 16, 12, 4, true), + B_AES_256_GCM(CIPHER_AES_GCM, AEAD_CIPHER, 32, 12, 4, true); // Map BulkCipher -> Boolean(available) private final static Map availableCache = @@ -600,7 +598,13 @@ final class CipherSuite implements Comparable { * Also contains a factory method to obtain an initialized MAC * for this algorithm. */ - final static class MacAlg { + static enum MacAlg { + // MACs + M_NULL ("NULL", 0, 0, 0), + M_MD5 ("MD5", 16, 64, 9), + M_SHA ("SHA", 20, 64, 9), + M_SHA256 ("SHA256", 32, 64, 9), + M_SHA384 ("SHA384", 48, 128, 17); // descriptive name, e.g. MD5 final String name; @@ -639,41 +643,6 @@ final class CipherSuite implements Comparable { } } - // export strength ciphers - final static BulkCipher B_NULL = - new BulkCipher("NULL", STREAM_CIPHER, 0, 0, 0, 0, true); - final static BulkCipher B_RC4_40 = - new BulkCipher(CIPHER_RC4, STREAM_CIPHER, 5, 16, 0, 0, true); - final static BulkCipher B_RC2_40 = - new BulkCipher("RC2", BLOCK_CIPHER, 5, 16, 8, 0, false); - final static BulkCipher B_DES_40 = - new BulkCipher(CIPHER_DES, BLOCK_CIPHER, 5, 8, 8, 0, true); - - // domestic strength ciphers - final static BulkCipher B_RC4_128 = - new BulkCipher(CIPHER_RC4, STREAM_CIPHER, 16, 0, 0, true); - final static BulkCipher B_DES = - new BulkCipher(CIPHER_DES, BLOCK_CIPHER, 8, 8, 0, true); - final static BulkCipher B_3DES = - new BulkCipher(CIPHER_3DES, BLOCK_CIPHER, 24, 8, 0, true); - final static BulkCipher B_IDEA = - new BulkCipher("IDEA", BLOCK_CIPHER, 16, 8, 0, false); - final static BulkCipher B_AES_128 = - new BulkCipher(CIPHER_AES, BLOCK_CIPHER, 16, 16, 0, true); - final static BulkCipher B_AES_256 = - new BulkCipher(CIPHER_AES, BLOCK_CIPHER, 32, 16, 0, true); - final static BulkCipher B_AES_128_GCM = - new BulkCipher(CIPHER_AES_GCM, AEAD_CIPHER, 16, 12, 4, true); - final static BulkCipher B_AES_256_GCM = - new BulkCipher(CIPHER_AES_GCM, AEAD_CIPHER, 32, 12, 4, true); - - // MACs - final static MacAlg M_NULL = new MacAlg("NULL", 0, 0, 0); - final static MacAlg M_MD5 = new MacAlg("MD5", 16, 64, 9); - final static MacAlg M_SHA = new MacAlg("SHA", 20, 64, 9); - final static MacAlg M_SHA256 = new MacAlg("SHA256", 32, 64, 9); - final static MacAlg M_SHA384 = new MacAlg("SHA384", 48, 128, 17); - /** * PRFs (PseudoRandom Function) from TLS specifications. * @@ -958,8 +927,8 @@ final class CipherSuite implements Comparable { * 0xFF,0x00-FF Reserved for Private Use [RFC5246] */ - add("SSL_NULL_WITH_NULL_NULL", - 0x0000, 1, K_NULL, B_NULL, F); + add("SSL_NULL_WITH_NULL_NULL", 0x0000, + 1, K_NULL, B_NULL, M_NULL, F); /* * Definition of the CipherSuites that are enabled by default. @@ -992,134 +961,134 @@ final class CipherSuite implements Comparable { // of RFC 6460. In this section, only two cipher suites are listed // so that applications can make use of Suite-B compliant cipher // suite firstly. - add("TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", - 0xc02c, --p, K_ECDHE_ECDSA, B_AES_256_GCM, T, max, tls12, P_SHA384); - add("TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", - 0xc02b, --p, K_ECDHE_ECDSA, B_AES_128_GCM, T, max, tls12, P_SHA256); + add("TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", 0xc02c, --p, + K_ECDHE_ECDSA, B_AES_256_GCM, M_NULL, T, max, tls12, P_SHA384); + add("TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", 0xc02b, --p, + K_ECDHE_ECDSA, B_AES_128_GCM, M_NULL, T, max, tls12, P_SHA256); // AES_256(GCM) - add("TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", - 0xc030, --p, K_ECDHE_RSA, B_AES_256_GCM, T, max, tls12, P_SHA384); - add("TLS_RSA_WITH_AES_256_GCM_SHA384", - 0x009d, --p, K_RSA, B_AES_256_GCM, T, max, tls12, P_SHA384); - add("TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384", - 0xc02e, --p, K_ECDH_ECDSA, B_AES_256_GCM, T, max, tls12, P_SHA384); - add("TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384", - 0xc032, --p, K_ECDH_RSA, B_AES_256_GCM, T, max, tls12, P_SHA384); - add("TLS_DHE_RSA_WITH_AES_256_GCM_SHA384", - 0x009f, --p, K_DHE_RSA, B_AES_256_GCM, T, max, tls12, P_SHA384); - add("TLS_DHE_DSS_WITH_AES_256_GCM_SHA384", - 0x00a3, --p, K_DHE_DSS, B_AES_256_GCM, T, max, tls12, P_SHA384); + add("TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", 0xc030, --p, + K_ECDHE_RSA, B_AES_256_GCM, M_NULL, T, max, tls12, P_SHA384); + add("TLS_RSA_WITH_AES_256_GCM_SHA384", 0x009d, --p, + K_RSA, B_AES_256_GCM, M_NULL, T, max, tls12, P_SHA384); + add("TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384", 0xc02e, --p, + K_ECDH_ECDSA, B_AES_256_GCM, M_NULL, T, max, tls12, P_SHA384); + add("TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384", 0xc032, --p, + K_ECDH_RSA, B_AES_256_GCM, M_NULL, T, max, tls12, P_SHA384); + add("TLS_DHE_RSA_WITH_AES_256_GCM_SHA384", 0x009f, --p, + K_DHE_RSA, B_AES_256_GCM, M_NULL, T, max, tls12, P_SHA384); + add("TLS_DHE_DSS_WITH_AES_256_GCM_SHA384", 0x00a3, --p, + K_DHE_DSS, B_AES_256_GCM, M_NULL, T, max, tls12, P_SHA384); // AES_128(GCM) - add("TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", - 0xc02f, --p, K_ECDHE_RSA, B_AES_128_GCM, T, max, tls12, P_SHA256); - add("TLS_RSA_WITH_AES_128_GCM_SHA256", - 0x009c, --p, K_RSA, B_AES_128_GCM, T, max, tls12, P_SHA256); - add("TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256", - 0xc02d, --p, K_ECDH_ECDSA, B_AES_128_GCM, T, max, tls12, P_SHA256); - add("TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256", - 0xc031, --p, K_ECDH_RSA, B_AES_128_GCM, T, max, tls12, P_SHA256); - add("TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", - 0x009e, --p, K_DHE_RSA, B_AES_128_GCM, T, max, tls12, P_SHA256); - add("TLS_DHE_DSS_WITH_AES_128_GCM_SHA256", - 0x00a2, --p, K_DHE_DSS, B_AES_128_GCM, T, max, tls12, P_SHA256); + add("TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", 0xc02f, --p, + K_ECDHE_RSA, B_AES_128_GCM, M_NULL, T, max, tls12, P_SHA256); + add("TLS_RSA_WITH_AES_128_GCM_SHA256", 0x009c, --p, + K_RSA, B_AES_128_GCM, M_NULL, T, max, tls12, P_SHA256); + add("TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256", 0xc02d, --p, + K_ECDH_ECDSA, B_AES_128_GCM, M_NULL, T, max, tls12, P_SHA256); + add("TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256", 0xc031, --p, + K_ECDH_RSA, B_AES_128_GCM, M_NULL, T, max, tls12, P_SHA256); + add("TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", 0x009e, --p, + K_DHE_RSA, B_AES_128_GCM, M_NULL, T, max, tls12, P_SHA256); + add("TLS_DHE_DSS_WITH_AES_128_GCM_SHA256", 0x00a2, --p, + K_DHE_DSS, B_AES_128_GCM, M_NULL, T, max, tls12, P_SHA256); // AES_256(CBC) - add("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", - 0xc024, --p, K_ECDHE_ECDSA, B_AES_256, T, max, tls12, P_SHA384); - add("TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", - 0xc028, --p, K_ECDHE_RSA, B_AES_256, T, max, tls12, P_SHA384); - add("TLS_RSA_WITH_AES_256_CBC_SHA256", - 0x003d, --p, K_RSA, B_AES_256, T, max, tls12, P_SHA256); - add("TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384", - 0xc026, --p, K_ECDH_ECDSA, B_AES_256, T, max, tls12, P_SHA384); - add("TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384", - 0xc02a, --p, K_ECDH_RSA, B_AES_256, T, max, tls12, P_SHA384); - add("TLS_DHE_RSA_WITH_AES_256_CBC_SHA256", - 0x006b, --p, K_DHE_RSA, B_AES_256, T, max, tls12, P_SHA256); - add("TLS_DHE_DSS_WITH_AES_256_CBC_SHA256", - 0x006a, --p, K_DHE_DSS, B_AES_256, T, max, tls12, P_SHA256); + add("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", 0xc024, --p, + K_ECDHE_ECDSA, B_AES_256, M_SHA384, T, max, tls12, P_SHA384); + add("TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", 0xc028, --p, + K_ECDHE_RSA, B_AES_256, M_SHA384, T, max, tls12, P_SHA384); + add("TLS_RSA_WITH_AES_256_CBC_SHA256", 0x003d, --p, + K_RSA, B_AES_256, M_SHA256, T, max, tls12, P_SHA256); + add("TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384", 0xc026, --p, + K_ECDH_ECDSA, B_AES_256, M_SHA384, T, max, tls12, P_SHA384); + add("TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384", 0xc02a, --p, + K_ECDH_RSA, B_AES_256, M_SHA384, T, max, tls12, P_SHA384); + add("TLS_DHE_RSA_WITH_AES_256_CBC_SHA256", 0x006b, --p, + K_DHE_RSA, B_AES_256, M_SHA256, T, max, tls12, P_SHA256); + add("TLS_DHE_DSS_WITH_AES_256_CBC_SHA256", 0x006a, --p, + K_DHE_DSS, B_AES_256, M_SHA256, T, max, tls12, P_SHA256); - add("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", - 0xC00A, --p, K_ECDHE_ECDSA, B_AES_256, T); - add("TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", - 0xC014, --p, K_ECDHE_RSA, B_AES_256, T); - add("TLS_RSA_WITH_AES_256_CBC_SHA", - 0x0035, --p, K_RSA, B_AES_256, T); - add("TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA", - 0xC005, --p, K_ECDH_ECDSA, B_AES_256, T); - add("TLS_ECDH_RSA_WITH_AES_256_CBC_SHA", - 0xC00F, --p, K_ECDH_RSA, B_AES_256, T); - add("TLS_DHE_RSA_WITH_AES_256_CBC_SHA", - 0x0039, --p, K_DHE_RSA, B_AES_256, T); - add("TLS_DHE_DSS_WITH_AES_256_CBC_SHA", - 0x0038, --p, K_DHE_DSS, B_AES_256, T); + add("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", 0xC00A, --p, + K_ECDHE_ECDSA, B_AES_256, M_SHA, T); + add("TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", 0xC014, --p, + K_ECDHE_RSA, B_AES_256, M_SHA, T); + add("TLS_RSA_WITH_AES_256_CBC_SHA", 0x0035, --p, + K_RSA, B_AES_256, M_SHA, T); + add("TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA", 0xC005, --p, + K_ECDH_ECDSA, B_AES_256, M_SHA, T); + add("TLS_ECDH_RSA_WITH_AES_256_CBC_SHA", 0xC00F, --p, + K_ECDH_RSA, B_AES_256, M_SHA, T); + add("TLS_DHE_RSA_WITH_AES_256_CBC_SHA", 0x0039, --p, + K_DHE_RSA, B_AES_256, M_SHA, T); + add("TLS_DHE_DSS_WITH_AES_256_CBC_SHA", 0x0038, --p, + K_DHE_DSS, B_AES_256, M_SHA, T); // AES_128(CBC) - add("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", - 0xc023, --p, K_ECDHE_ECDSA, B_AES_128, T, max, tls12, P_SHA256); - add("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", - 0xc027, --p, K_ECDHE_RSA, B_AES_128, T, max, tls12, P_SHA256); - add("TLS_RSA_WITH_AES_128_CBC_SHA256", - 0x003c, --p, K_RSA, B_AES_128, T, max, tls12, P_SHA256); - add("TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256", - 0xc025, --p, K_ECDH_ECDSA, B_AES_128, T, max, tls12, P_SHA256); - add("TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256", - 0xc029, --p, K_ECDH_RSA, B_AES_128, T, max, tls12, P_SHA256); - add("TLS_DHE_RSA_WITH_AES_128_CBC_SHA256", - 0x0067, --p, K_DHE_RSA, B_AES_128, T, max, tls12, P_SHA256); - add("TLS_DHE_DSS_WITH_AES_128_CBC_SHA256", - 0x0040, --p, K_DHE_DSS, B_AES_128, T, max, tls12, P_SHA256); + add("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", 0xc023, --p, + K_ECDHE_ECDSA, B_AES_128, M_SHA256, T, max, tls12, P_SHA256); + add("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", 0xc027, --p, + K_ECDHE_RSA, B_AES_128, M_SHA256, T, max, tls12, P_SHA256); + add("TLS_RSA_WITH_AES_128_CBC_SHA256", 0x003c, --p, + K_RSA, B_AES_128, M_SHA256, T, max, tls12, P_SHA256); + add("TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256", 0xc025, --p, + K_ECDH_ECDSA, B_AES_128, M_SHA256, T, max, tls12, P_SHA256); + add("TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256", 0xc029, --p, + K_ECDH_RSA, B_AES_128, M_SHA256, T, max, tls12, P_SHA256); + add("TLS_DHE_RSA_WITH_AES_128_CBC_SHA256", 0x0067, --p, + K_DHE_RSA, B_AES_128, M_SHA256, T, max, tls12, P_SHA256); + add("TLS_DHE_DSS_WITH_AES_128_CBC_SHA256", 0x0040, --p, + K_DHE_DSS, B_AES_128, M_SHA256, T, max, tls12, P_SHA256); - add("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", - 0xC009, --p, K_ECDHE_ECDSA, B_AES_128, T); - add("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", - 0xC013, --p, K_ECDHE_RSA, B_AES_128, T); - add("TLS_RSA_WITH_AES_128_CBC_SHA", - 0x002f, --p, K_RSA, B_AES_128, T); - add("TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA", - 0xC004, --p, K_ECDH_ECDSA, B_AES_128, T); - add("TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", - 0xC00E, --p, K_ECDH_RSA, B_AES_128, T); - add("TLS_DHE_RSA_WITH_AES_128_CBC_SHA", - 0x0033, --p, K_DHE_RSA, B_AES_128, T); - add("TLS_DHE_DSS_WITH_AES_128_CBC_SHA", - 0x0032, --p, K_DHE_DSS, B_AES_128, T); + add("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", 0xC009, --p, + K_ECDHE_ECDSA, B_AES_128, M_SHA, T); + add("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", 0xC013, --p, + K_ECDHE_RSA, B_AES_128, M_SHA, T); + add("TLS_RSA_WITH_AES_128_CBC_SHA", 0x002f, --p, + K_RSA, B_AES_128, M_SHA, T); + add("TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA", 0xC004, --p, + K_ECDH_ECDSA, B_AES_128, M_SHA, T); + add("TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", 0xC00E, --p, + K_ECDH_RSA, B_AES_128, M_SHA, T); + add("TLS_DHE_RSA_WITH_AES_128_CBC_SHA", 0x0033, --p, + K_DHE_RSA, B_AES_128, M_SHA, T); + add("TLS_DHE_DSS_WITH_AES_128_CBC_SHA", 0x0032, --p, + K_DHE_DSS, B_AES_128, M_SHA, T); // 3DES_EDE - add("TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", - 0xC008, --p, K_ECDHE_ECDSA, B_3DES, T); - add("TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", - 0xC012, --p, K_ECDHE_RSA, B_3DES, T); - add("SSL_RSA_WITH_3DES_EDE_CBC_SHA", - 0x000a, --p, K_RSA, B_3DES, T); - add("TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", - 0xC003, --p, K_ECDH_ECDSA, B_3DES, T); - add("TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", - 0xC00D, --p, K_ECDH_RSA, B_3DES, T); - add("SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA", - 0x0016, --p, K_DHE_RSA, B_3DES, T); - add("SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA", - 0x0013, --p, K_DHE_DSS, B_3DES, N); + add("TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", 0xC008, --p, + K_ECDHE_ECDSA, B_3DES, M_SHA, T); + add("TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", 0xC012, --p, + K_ECDHE_RSA, B_3DES, M_SHA, T); + add("SSL_RSA_WITH_3DES_EDE_CBC_SHA", 0x000a, --p, + K_RSA, B_3DES, M_SHA, T); + add("TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", 0xC003, --p, + K_ECDH_ECDSA, B_3DES, M_SHA, T); + add("TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", 0xC00D, --p, + K_ECDH_RSA, B_3DES, M_SHA, T); + add("SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA", 0x0016, --p, + K_DHE_RSA, B_3DES, M_SHA, T); + add("SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA", 0x0013, --p, + K_DHE_DSS, B_3DES, M_SHA, N); // RC-4 - add("TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", - 0xC007, --p, K_ECDHE_ECDSA, B_RC4_128, N); - add("TLS_ECDHE_RSA_WITH_RC4_128_SHA", - 0xC011, --p, K_ECDHE_RSA, B_RC4_128, N); - add("SSL_RSA_WITH_RC4_128_SHA", - 0x0005, --p, K_RSA, B_RC4_128, N); - add("TLS_ECDH_ECDSA_WITH_RC4_128_SHA", - 0xC002, --p, K_ECDH_ECDSA, B_RC4_128, N); - add("TLS_ECDH_RSA_WITH_RC4_128_SHA", - 0xC00C, --p, K_ECDH_RSA, B_RC4_128, N); - add("SSL_RSA_WITH_RC4_128_MD5", - 0x0004, --p, K_RSA, B_RC4_128, N); + add("TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", 0xC007, --p, + K_ECDHE_ECDSA, B_RC4_128, M_SHA, N); + add("TLS_ECDHE_RSA_WITH_RC4_128_SHA", 0xC011, --p, + K_ECDHE_RSA, B_RC4_128, M_SHA, N); + add("SSL_RSA_WITH_RC4_128_SHA", 0x0005, --p, + K_RSA, B_RC4_128, M_SHA, N); + add("TLS_ECDH_ECDSA_WITH_RC4_128_SHA", 0xC002, --p, + K_ECDH_ECDSA, B_RC4_128, M_SHA, N); + add("TLS_ECDH_RSA_WITH_RC4_128_SHA", 0xC00C, --p, + K_ECDH_RSA, B_RC4_128, M_SHA, N); + add("SSL_RSA_WITH_RC4_128_MD5", 0x0004, --p, + K_RSA, B_RC4_128, M_MD5, N); // Renegotiation protection request Signalling Cipher Suite Value (SCSV) - add("TLS_EMPTY_RENEGOTIATION_INFO_SCSV", - 0x00ff, --p, K_SCSV, B_NULL, T); + add("TLS_EMPTY_RENEGOTIATION_INFO_SCSV", 0x00ff, --p, + K_SCSV, B_NULL, M_NULL, T); /* * Definition of the CipherSuites that are supported but not enabled @@ -1142,98 +1111,98 @@ final class CipherSuite implements Comparable { */ p = DEFAULT_SUITES_PRIORITY; - add("TLS_DH_anon_WITH_AES_256_GCM_SHA384", - 0x00a7, --p, K_DH_ANON, B_AES_256_GCM, N, max, tls12, P_SHA384); - add("TLS_DH_anon_WITH_AES_128_GCM_SHA256", - 0x00a6, --p, K_DH_ANON, B_AES_128_GCM, N, max, tls12, P_SHA256); + add("TLS_DH_anon_WITH_AES_256_GCM_SHA384", 0x00a7, --p, + K_DH_ANON, B_AES_256_GCM, M_NULL, N, max, tls12, P_SHA384); + add("TLS_DH_anon_WITH_AES_128_GCM_SHA256", 0x00a6, --p, + K_DH_ANON, B_AES_128_GCM, M_NULL, N, max, tls12, P_SHA256); - add("TLS_DH_anon_WITH_AES_256_CBC_SHA256", - 0x006d, --p, K_DH_ANON, B_AES_256, N, max, tls12, P_SHA256); - add("TLS_ECDH_anon_WITH_AES_256_CBC_SHA", - 0xC019, --p, K_ECDH_ANON, B_AES_256, N); - add("TLS_DH_anon_WITH_AES_256_CBC_SHA", - 0x003a, --p, K_DH_ANON, B_AES_256, N); + add("TLS_DH_anon_WITH_AES_256_CBC_SHA256", 0x006d, --p, + K_DH_ANON, B_AES_256, M_SHA256, N, max, tls12, P_SHA256); + add("TLS_ECDH_anon_WITH_AES_256_CBC_SHA", 0xC019, --p, + K_ECDH_ANON, B_AES_256, M_SHA, N); + add("TLS_DH_anon_WITH_AES_256_CBC_SHA", 0x003a, --p, + K_DH_ANON, B_AES_256, M_SHA, N); - add("TLS_DH_anon_WITH_AES_128_CBC_SHA256", - 0x006c, --p, K_DH_ANON, B_AES_128, N, max, tls12, P_SHA256); - add("TLS_ECDH_anon_WITH_AES_128_CBC_SHA", - 0xC018, --p, K_ECDH_ANON, B_AES_128, N); - add("TLS_DH_anon_WITH_AES_128_CBC_SHA", - 0x0034, --p, K_DH_ANON, B_AES_128, N); + add("TLS_DH_anon_WITH_AES_128_CBC_SHA256", 0x006c, --p, + K_DH_ANON, B_AES_128, M_SHA256, N, max, tls12, P_SHA256); + add("TLS_ECDH_anon_WITH_AES_128_CBC_SHA", 0xC018, --p, + K_ECDH_ANON, B_AES_128, M_SHA, N); + add("TLS_DH_anon_WITH_AES_128_CBC_SHA", 0x0034, --p, + K_DH_ANON, B_AES_128, M_SHA, N); - add("TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", - 0xC017, --p, K_ECDH_ANON, B_3DES, N); - add("SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", - 0x001b, --p, K_DH_ANON, B_3DES, N); + add("TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", 0xC017, --p, + K_ECDH_ANON, B_3DES, M_SHA, N); + add("SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", 0x001b, --p, + K_DH_ANON, B_3DES, M_SHA, N); - add("TLS_ECDH_anon_WITH_RC4_128_SHA", - 0xC016, --p, K_ECDH_ANON, B_RC4_128, N); - add("SSL_DH_anon_WITH_RC4_128_MD5", - 0x0018, --p, K_DH_ANON, B_RC4_128, N); + add("TLS_ECDH_anon_WITH_RC4_128_SHA", 0xC016, --p, + K_ECDH_ANON, B_RC4_128, M_SHA, N); + add("SSL_DH_anon_WITH_RC4_128_MD5", 0x0018, --p, + K_DH_ANON, B_RC4_128, M_MD5, N); // weak cipher suites obsoleted in TLS 1.2 - add("SSL_RSA_WITH_DES_CBC_SHA", - 0x0009, --p, K_RSA, B_DES, N, tls12); - add("SSL_DHE_RSA_WITH_DES_CBC_SHA", - 0x0015, --p, K_DHE_RSA, B_DES, N, tls12); - add("SSL_DHE_DSS_WITH_DES_CBC_SHA", - 0x0012, --p, K_DHE_DSS, B_DES, N, tls12); - add("SSL_DH_anon_WITH_DES_CBC_SHA", - 0x001a, --p, K_DH_ANON, B_DES, N, tls12); + add("SSL_RSA_WITH_DES_CBC_SHA", 0x0009, --p, + K_RSA, B_DES, M_SHA, N, tls12); + add("SSL_DHE_RSA_WITH_DES_CBC_SHA", 0x0015, --p, + K_DHE_RSA, B_DES, M_SHA, N, tls12); + add("SSL_DHE_DSS_WITH_DES_CBC_SHA", 0x0012, --p, + K_DHE_DSS, B_DES, M_SHA, N, tls12); + add("SSL_DH_anon_WITH_DES_CBC_SHA", 0x001a, --p, + K_DH_ANON, B_DES, M_SHA, N, tls12); // weak cipher suites obsoleted in TLS 1.1 - add("SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", - 0x0008, --p, K_RSA_EXPORT, B_DES_40, N, tls11); - add("SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", - 0x0014, --p, K_DHE_RSA, B_DES_40, N, tls11); - add("SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", - 0x0011, --p, K_DHE_DSS, B_DES_40, N, tls11); - add("SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", - 0x0019, --p, K_DH_ANON, B_DES_40, N, tls11); + add("SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", 0x0008, --p, + K_RSA_EXPORT, B_DES_40, M_SHA, N, tls11); + add("SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", 0x0014, --p, + K_DHE_RSA, B_DES_40, M_SHA, N, tls11); + add("SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", 0x0011, --p, + K_DHE_DSS, B_DES_40, M_SHA, N, tls11); + add("SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", 0x0019, --p, + K_DH_ANON, B_DES_40, M_SHA, N, tls11); - add("SSL_RSA_EXPORT_WITH_RC4_40_MD5", - 0x0003, --p, K_RSA_EXPORT, B_RC4_40, N, tls11); - add("SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", - 0x0017, --p, K_DH_ANON, B_RC4_40, N, tls11); + add("SSL_RSA_EXPORT_WITH_RC4_40_MD5", 0x0003, --p, + K_RSA_EXPORT, B_RC4_40, M_MD5, N, tls11); + add("SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", 0x0017, --p, + K_DH_ANON, B_RC4_40, M_MD5, N, tls11); - add("TLS_RSA_WITH_NULL_SHA256", - 0x003b, --p, K_RSA, B_NULL, N, max, tls12, P_SHA256); - add("TLS_ECDHE_ECDSA_WITH_NULL_SHA", - 0xC006, --p, K_ECDHE_ECDSA, B_NULL, N); - add("TLS_ECDHE_RSA_WITH_NULL_SHA", - 0xC010, --p, K_ECDHE_RSA, B_NULL, N); - add("SSL_RSA_WITH_NULL_SHA", - 0x0002, --p, K_RSA, B_NULL, N); - add("TLS_ECDH_ECDSA_WITH_NULL_SHA", - 0xC001, --p, K_ECDH_ECDSA, B_NULL, N); - add("TLS_ECDH_RSA_WITH_NULL_SHA", - 0xC00B, --p, K_ECDH_RSA, B_NULL, N); - add("TLS_ECDH_anon_WITH_NULL_SHA", - 0xC015, --p, K_ECDH_ANON, B_NULL, N); - add("SSL_RSA_WITH_NULL_MD5", - 0x0001, --p, K_RSA, B_NULL, N); + add("TLS_RSA_WITH_NULL_SHA256", 0x003b, --p, + K_RSA, B_NULL, M_SHA256, N, max, tls12, P_SHA256); + add("TLS_ECDHE_ECDSA_WITH_NULL_SHA", 0xC006, --p, + K_ECDHE_ECDSA, B_NULL, M_SHA, N); + add("TLS_ECDHE_RSA_WITH_NULL_SHA", 0xC010, --p, + K_ECDHE_RSA, B_NULL, M_SHA, N); + add("SSL_RSA_WITH_NULL_SHA", 0x0002, --p, + K_RSA, B_NULL, M_SHA, N); + add("TLS_ECDH_ECDSA_WITH_NULL_SHA", 0xC001, --p, + K_ECDH_ECDSA, B_NULL, M_SHA, N); + add("TLS_ECDH_RSA_WITH_NULL_SHA", 0xC00B, --p, + K_ECDH_RSA, B_NULL, M_SHA, N); + add("TLS_ECDH_anon_WITH_NULL_SHA", 0xC015, --p, + K_ECDH_ANON, B_NULL, M_SHA, N); + add("SSL_RSA_WITH_NULL_MD5", 0x0001, --p, + K_RSA, B_NULL, M_MD5, N); // Supported Kerberos ciphersuites from RFC2712 - add("TLS_KRB5_WITH_3DES_EDE_CBC_SHA", - 0x001f, --p, K_KRB5, B_3DES, N); - add("TLS_KRB5_WITH_3DES_EDE_CBC_MD5", - 0x0023, --p, K_KRB5, B_3DES, N); - add("TLS_KRB5_WITH_RC4_128_SHA", - 0x0020, --p, K_KRB5, B_RC4_128, N); - add("TLS_KRB5_WITH_RC4_128_MD5", - 0x0024, --p, K_KRB5, B_RC4_128, N); - add("TLS_KRB5_WITH_DES_CBC_SHA", - 0x001e, --p, K_KRB5, B_DES, N, tls12); - add("TLS_KRB5_WITH_DES_CBC_MD5", - 0x0022, --p, K_KRB5, B_DES, N, tls12); - add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", - 0x0026, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); - add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5", - 0x0029, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); - add("TLS_KRB5_EXPORT_WITH_RC4_40_SHA", - 0x0028, --p, K_KRB5_EXPORT, B_RC4_40, N, tls11); - add("TLS_KRB5_EXPORT_WITH_RC4_40_MD5", - 0x002b, --p, K_KRB5_EXPORT, B_RC4_40, N, tls11); + add("TLS_KRB5_WITH_3DES_EDE_CBC_SHA", 0x001f, --p, + K_KRB5, B_3DES, M_SHA, N); + add("TLS_KRB5_WITH_3DES_EDE_CBC_MD5", 0x0023, --p, + K_KRB5, B_3DES, M_MD5, N); + add("TLS_KRB5_WITH_RC4_128_SHA", 0x0020, --p, + K_KRB5, B_RC4_128, M_SHA, N); + add("TLS_KRB5_WITH_RC4_128_MD5", 0x0024, --p, + K_KRB5, B_RC4_128, M_MD5, N); + add("TLS_KRB5_WITH_DES_CBC_SHA", 0x001e, --p, + K_KRB5, B_DES, M_SHA, N, tls12); + add("TLS_KRB5_WITH_DES_CBC_MD5", 0x0022, --p, + K_KRB5, B_DES, M_MD5, N, tls12); + add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", 0x0026, --p, + K_KRB5_EXPORT, B_DES_40, M_SHA, N, tls11); + add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5", 0x0029, --p, + K_KRB5_EXPORT, B_DES_40, M_MD5, N, tls11); + add("TLS_KRB5_EXPORT_WITH_RC4_40_SHA", 0x0028, --p, + K_KRB5_EXPORT, B_RC4_40, M_SHA, N, tls11); + add("TLS_KRB5_EXPORT_WITH_RC4_40_MD5", 0x002b, --p, + K_KRB5_EXPORT, B_RC4_40, M_MD5, N, tls11); /* * Other values from the TLS Cipher Suite Registry, as of August 2010. diff --git a/jdk/src/java.base/share/classes/sun/security/ssl/MAC.java b/jdk/src/java.base/share/classes/sun/security/ssl/MAC.java index dc03a3a2bb0..f1d9b9e635b 100644 --- a/jdk/src/java.base/share/classes/sun/security/ssl/MAC.java +++ b/jdk/src/java.base/share/classes/sun/security/ssl/MAC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2015, Oracle and/or its affiliates. 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 @@ -36,6 +36,7 @@ import javax.crypto.SecretKey; import sun.security.ssl.CipherSuite.MacAlg; import static sun.security.ssl.CipherSuite.*; +import static sun.security.ssl.CipherSuite.MacAlg.*; /** * This class computes the "Message Authentication Code" (MAC) for each diff --git a/jdk/src/java.base/share/classes/sun/security/ssl/SSLAlgorithmConstraints.java b/jdk/src/java.base/share/classes/sun/security/ssl/SSLAlgorithmConstraints.java index 14d76d8a8f5..80cc7a5fae6 100644 --- a/jdk/src/java.base/share/classes/sun/security/ssl/SSLAlgorithmConstraints.java +++ b/jdk/src/java.base/share/classes/sun/security/ssl/SSLAlgorithmConstraints.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2015, Oracle and/or its affiliates. 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 @@ -382,18 +382,18 @@ final class SSLAlgorithmConstraints implements AlgorithmConstraints { protected Set decomposes(MacAlg macAlg) { Set components = new HashSet<>(); - if (macAlg == CipherSuite.M_MD5) { + if (macAlg == CipherSuite.MacAlg.M_MD5) { components.add("MD5"); components.add("HmacMD5"); - } else if (macAlg == CipherSuite.M_SHA) { + } else if (macAlg == CipherSuite.MacAlg.M_SHA) { components.add("SHA1"); components.add("SHA-1"); components.add("HmacSHA1"); - } else if (macAlg == CipherSuite.M_SHA256) { + } else if (macAlg == CipherSuite.MacAlg.M_SHA256) { components.add("SHA256"); components.add("SHA-256"); components.add("HmacSHA256"); - } else if (macAlg == CipherSuite.M_SHA384) { + } else if (macAlg == CipherSuite.MacAlg.M_SHA384) { components.add("SHA384"); components.add("SHA-384"); components.add("HmacSHA384"); From cb566c6ce55ddeacbf7e3284113a8717a576c1da Mon Sep 17 00:00:00 2001 From: Aggelos Biboudis Date: Mon, 16 Mar 2015 10:19:49 +0100 Subject: [PATCH 48/82] 8067969: Optimize Stream.count for SIZED Streams Reviewed-by: psandoz, chegar --- .../java/util/stream/DoublePipeline.java | 4 +- .../java/util/stream/DoubleStream.java | 18 ++ .../classes/java/util/stream/IntPipeline.java | 4 +- .../classes/java/util/stream/IntStream.java | 18 ++ .../java/util/stream/LongPipeline.java | 4 +- .../classes/java/util/stream/LongStream.java | 18 ++ .../classes/java/util/stream/ReduceOps.java | 189 +++++++++++++++++- .../java/util/stream/ReferencePipeline.java | 5 +- .../classes/java/util/stream/Stream.java | 19 ++ .../java/util/stream/CountLargeTest.java | 68 +++++-- .../tests/java/util/stream/CountTest.java | 52 ++++- 11 files changed, 368 insertions(+), 31 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/util/stream/DoublePipeline.java b/jdk/src/java.base/share/classes/java/util/stream/DoublePipeline.java index 3e9cddbd324..eb1d97195e5 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/DoublePipeline.java +++ b/jdk/src/java.base/share/classes/java/util/stream/DoublePipeline.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2015, Oracle and/or its affiliates. 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 @@ -447,7 +447,7 @@ abstract class DoublePipeline @Override public final long count() { - return mapToLong(e -> 1L).sum(); + return evaluate(ReduceOps.makeDoubleCounting()); } @Override diff --git a/jdk/src/java.base/share/classes/java/util/stream/DoubleStream.java b/jdk/src/java.base/share/classes/java/util/stream/DoubleStream.java index be6cc98aa60..8f272bf4b1d 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/DoubleStream.java +++ b/jdk/src/java.base/share/classes/java/util/stream/DoubleStream.java @@ -581,6 +581,24 @@ public interface DoubleStream extends BaseStream { * *

    This is a terminal operation. * + * @apiNote + * An implementation may choose to not execute the stream pipeline (either + * sequentially or in parallel) if it is capable of computing the count + * directly from the stream source. In such cases no source elements will + * be traversed and no intermediate operations will be evaluated. + * Behavioral parameters with side-effects, which are strongly discouraged + * except for harmless cases such as debugging, may be affected. For + * example, consider the following stream: + *

    {@code
    +     *     DoubleStream s = DoubleStream.of(1, 2, 3, 4);
    +     *     long count = s.peek(System.out::println).count();
    +     * }
    + * The number of elements covered by the stream source is known and the + * intermediate operation, {@code peek}, does not inject into or remove + * elements from the stream (as may be the case for {@code flatMap} or + * {@code filter} operations). Thus the count is 4 and there is no need to + * execute the pipeline and, as a side-effect, print out the elements. + * * @return the count of elements in this stream */ long count(); diff --git a/jdk/src/java.base/share/classes/java/util/stream/IntPipeline.java b/jdk/src/java.base/share/classes/java/util/stream/IntPipeline.java index 313045f96c7..9c0162f1ce3 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/IntPipeline.java +++ b/jdk/src/java.base/share/classes/java/util/stream/IntPipeline.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. 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 @@ -427,7 +427,7 @@ abstract class IntPipeline @Override public final long count() { - return mapToLong(e -> 1L).sum(); + return evaluate(ReduceOps.makeIntCounting()); } @Override diff --git a/jdk/src/java.base/share/classes/java/util/stream/IntStream.java b/jdk/src/java.base/share/classes/java/util/stream/IntStream.java index b68084b5d40..4bb1ab5b97e 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/IntStream.java +++ b/jdk/src/java.base/share/classes/java/util/stream/IntStream.java @@ -504,6 +504,24 @@ public interface IntStream extends BaseStream { * *

    This is a terminal operation. * + * @apiNote + * An implementation may choose to not execute the stream pipeline (either + * sequentially or in parallel) if it is capable of computing the count + * directly from the stream source. In such cases no source elements will + * be traversed and no intermediate operations will be evaluated. + * Behavioral parameters with side-effects, which are strongly discouraged + * except for harmless cases such as debugging, may be affected. For + * example, consider the following stream: + *

    {@code
    +     *     IntStream s = IntStream.of(1, 2, 3, 4);
    +     *     long count = s.peek(System.out::println).count();
    +     * }
    + * The number of elements covered by the stream source is known and the + * intermediate operation, {@code peek}, does not inject into or remove + * elements from the stream (as may be the case for {@code flatMap} or + * {@code filter} operations). Thus the count is 4 and there is no need to + * execute the pipeline and, as a side-effect, print out the elements. + * * @return the count of elements in this stream */ long count(); diff --git a/jdk/src/java.base/share/classes/java/util/stream/LongPipeline.java b/jdk/src/java.base/share/classes/java/util/stream/LongPipeline.java index fab01a21118..7a84ff997e7 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/LongPipeline.java +++ b/jdk/src/java.base/share/classes/java/util/stream/LongPipeline.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2015, Oracle and/or its affiliates. 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 @@ -425,7 +425,7 @@ abstract class LongPipeline @Override public final long count() { - return map(e -> 1L).sum(); + return evaluate(ReduceOps.makeLongCounting()); } @Override diff --git a/jdk/src/java.base/share/classes/java/util/stream/LongStream.java b/jdk/src/java.base/share/classes/java/util/stream/LongStream.java index 14d6d0b5eb9..4f9c72bef42 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/LongStream.java +++ b/jdk/src/java.base/share/classes/java/util/stream/LongStream.java @@ -509,6 +509,24 @@ public interface LongStream extends BaseStream { * *

    This is a terminal operation. * + * @apiNote + * An implementation may choose to not execute the stream pipeline (either + * sequentially or in parallel) if it is capable of computing the count + * directly from the stream source. In such cases no source elements will + * be traversed and no intermediate operations will be evaluated. + * Behavioral parameters with side-effects, which are strongly discouraged + * except for harmless cases such as debugging, may be affected. For + * example, consider the following stream: + *

    {@code
    +     *     LongStream s = LongStream.of(1, 2, 3, 4);
    +     *     long count = s.peek(System.out::println).count();
    +     * }
    + * The number of elements covered by the stream source is known and the + * intermediate operation, {@code peek}, does not inject into or remove + * elements from the stream (as may be the case for {@code flatMap} or + * {@code filter} operations). Thus the count is 4 and there is no need to + * execute the pipeline and, as a side-effect, print out the elements. + * * @return the count of elements in this stream */ long count(); diff --git a/jdk/src/java.base/share/classes/java/util/stream/ReduceOps.java b/jdk/src/java.base/share/classes/java/util/stream/ReduceOps.java index 3a0f81a0f72..97433010ec3 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/ReduceOps.java +++ b/jdk/src/java.base/share/classes/java/util/stream/ReduceOps.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. 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 @@ -233,6 +233,40 @@ final class ReduceOps { }; } + /** + * Constructs a {@code TerminalOp} that counts the number of stream + * elements. If the size of the pipeline is known then count is the size + * and there is no need to evaluate the pipeline. If the size of the + * pipeline is non known then count is produced, via reduction, using a + * {@link CountingSink}. + * + * @param the type of the input elements + * @return a {@code TerminalOp} implementing the counting + */ + public static TerminalOp + makeRefCounting() { + return new ReduceOp>(StreamShape.REFERENCE) { + @Override + public CountingSink makeSink() { return new CountingSink.OfRef<>(); } + + @Override + public Long evaluateSequential(PipelineHelper helper, + Spliterator spliterator) { + if (StreamOpFlag.SIZED.isKnown(helper.getStreamAndOpFlags())) + return spliterator.getExactSizeIfKnown(); + return super.evaluateSequential(helper, spliterator); + } + + @Override + public Long evaluateParallel(PipelineHelper helper, + Spliterator spliterator) { + if (StreamOpFlag.SIZED.isKnown(helper.getStreamAndOpFlags())) + return spliterator.getExactSizeIfKnown(); + return super.evaluateParallel(helper, spliterator); + } + }; + } + /** * Constructs a {@code TerminalOp} that implements a functional reduce on * {@code int} values. @@ -369,6 +403,39 @@ final class ReduceOps { }; } + /** + * Constructs a {@code TerminalOp} that counts the number of stream + * elements. If the size of the pipeline is known then count is the size + * and there is no need to evaluate the pipeline. If the size of the + * pipeline is non known then count is produced, via reduction, using a + * {@link CountingSink}. + * + * @return a {@code TerminalOp} implementing the counting + */ + public static TerminalOp + makeIntCounting() { + return new ReduceOp>(StreamShape.REFERENCE) { + @Override + public CountingSink makeSink() { return new CountingSink.OfInt(); } + + @Override + public Long evaluateSequential(PipelineHelper helper, + Spliterator spliterator) { + if (StreamOpFlag.SIZED.isKnown(helper.getStreamAndOpFlags())) + return spliterator.getExactSizeIfKnown(); + return super.evaluateSequential(helper, spliterator); + } + + @Override + public Long evaluateParallel(PipelineHelper helper, + Spliterator spliterator) { + if (StreamOpFlag.SIZED.isKnown(helper.getStreamAndOpFlags())) + return spliterator.getExactSizeIfKnown(); + return super.evaluateParallel(helper, spliterator); + } + }; + } + /** * Constructs a {@code TerminalOp} that implements a functional reduce on * {@code long} values. @@ -505,6 +572,39 @@ final class ReduceOps { }; } + /** + * Constructs a {@code TerminalOp} that counts the number of stream + * elements. If the size of the pipeline is known then count is the size + * and there is no need to evaluate the pipeline. If the size of the + * pipeline is non known then count is produced, via reduction, using a + * {@link CountingSink}. + * + * @return a {@code TerminalOp} implementing the counting + */ + public static TerminalOp + makeLongCounting() { + return new ReduceOp>(StreamShape.REFERENCE) { + @Override + public CountingSink makeSink() { return new CountingSink.OfLong(); } + + @Override + public Long evaluateSequential(PipelineHelper helper, + Spliterator spliterator) { + if (StreamOpFlag.SIZED.isKnown(helper.getStreamAndOpFlags())) + return spliterator.getExactSizeIfKnown(); + return super.evaluateSequential(helper, spliterator); + } + + @Override + public Long evaluateParallel(PipelineHelper helper, + Spliterator spliterator) { + if (StreamOpFlag.SIZED.isKnown(helper.getStreamAndOpFlags())) + return spliterator.getExactSizeIfKnown(); + return super.evaluateParallel(helper, spliterator); + } + }; + } + /** * Constructs a {@code TerminalOp} that implements a functional reduce on * {@code double} values. @@ -641,6 +741,91 @@ final class ReduceOps { }; } + /** + * Constructs a {@code TerminalOp} that counts the number of stream + * elements. If the size of the pipeline is known then count is the size + * and there is no need to evaluate the pipeline. If the size of the + * pipeline is non known then count is produced, via reduction, using a + * {@link CountingSink}. + * + * @return a {@code TerminalOp} implementing the counting + */ + public static TerminalOp + makeDoubleCounting() { + return new ReduceOp>(StreamShape.REFERENCE) { + @Override + public CountingSink makeSink() { return new CountingSink.OfDouble(); } + + @Override + public Long evaluateSequential(PipelineHelper helper, + Spliterator spliterator) { + if (StreamOpFlag.SIZED.isKnown(helper.getStreamAndOpFlags())) + return spliterator.getExactSizeIfKnown(); + return super.evaluateSequential(helper, spliterator); + } + + @Override + public Long evaluateParallel(PipelineHelper helper, + Spliterator spliterator) { + if (StreamOpFlag.SIZED.isKnown(helper.getStreamAndOpFlags())) + return spliterator.getExactSizeIfKnown(); + return super.evaluateParallel(helper, spliterator); + } + }; + } + + /** + * A sink that counts elements + */ + static abstract class CountingSink + extends Box + implements AccumulatingSink> { + long count; + + @Override + public void begin(long size) { + count = 0L; + } + + @Override + public Long get() { + return count; + } + + @Override + public void combine(CountingSink other) { + count += other.count; + } + + static final class OfRef extends CountingSink { + @Override + public void accept(T t) { + count++; + } + } + + static final class OfInt extends CountingSink implements Sink.OfInt { + @Override + public void accept(int t) { + count++; + } + } + + static final class OfLong extends CountingSink implements Sink.OfLong { + @Override + public void accept(long t) { + count++; + } + } + + static final class OfDouble extends CountingSink implements Sink.OfDouble { + @Override + public void accept(double t) { + count++; + } + } + } + /** * A type of {@code TerminalSink} that implements an associative reducing * operation on elements of type {@code T} and producing a result of type @@ -652,7 +837,7 @@ final class ReduceOps { */ private interface AccumulatingSink> extends TerminalSink { - public void combine(K other); + void combine(K other); } /** diff --git a/jdk/src/java.base/share/classes/java/util/stream/ReferencePipeline.java b/jdk/src/java.base/share/classes/java/util/stream/ReferencePipeline.java index 8f5da0e55e7..4402997958b 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/ReferencePipeline.java +++ b/jdk/src/java.base/share/classes/java/util/stream/ReferencePipeline.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. 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 @@ -523,10 +523,9 @@ abstract class ReferencePipeline @Override public final long count() { - return mapToLong(e -> 1L).sum(); + return evaluate(ReduceOps.makeRefCounting()); } - // /** diff --git a/jdk/src/java.base/share/classes/java/util/stream/Stream.java b/jdk/src/java.base/share/classes/java/util/stream/Stream.java index b5eb2c9f566..e0e26ff385f 100644 --- a/jdk/src/java.base/share/classes/java/util/stream/Stream.java +++ b/jdk/src/java.base/share/classes/java/util/stream/Stream.java @@ -851,6 +851,25 @@ public interface Stream extends BaseStream> { * *

    This is a terminal operation. * + * @apiNote + * An implementation may choose to not execute the stream pipeline (either + * sequentially or in parallel) if it is capable of computing the count + * directly from the stream source. In such cases no source elements will + * be traversed and no intermediate operations will be evaluated. + * Behavioral parameters with side-effects, which are strongly discouraged + * except for harmless cases such as debugging, may be affected. For + * example, consider the following stream: + *

    {@code
    +     *     List l = Arrays.asList("A", "B", "C", "D");
    +     *     long count = l.stream().peek(System.out::println).count();
    +     * }
    + * The number of elements covered by the stream source, a {@code List}, is + * known and the intermediate operation, {@code peek}, does not inject into + * or remove elements from the stream (as may be the case for + * {@code flatMap} or {@code filter} operations). Thus the count is the + * size of the {@code List} and there is no need to execute the pipeline + * and, as a side-effect, print out the list elements. + * * @return the count of elements in this stream */ long count(); diff --git a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/CountLargeTest.java b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/CountLargeTest.java index 9b87a09f344..8ddb3fc6890 100644 --- a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/CountLargeTest.java +++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/CountLargeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, Oracle and/or its affiliates. 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 @@ -24,7 +24,7 @@ /** * @test * @summary Tests counting of streams containing Integer.MAX_VALUE + 1 elements - * @bug 8031187 + * @bug 8031187 8067969 */ package org.openjdk.tests.java.util.stream; @@ -41,30 +41,62 @@ public class CountLargeTest { static final long EXPECTED_LARGE_COUNT = 1L + Integer.MAX_VALUE; public void testRefLarge() { - long count = LongStream.range(0, EXPECTED_LARGE_COUNT) - .mapToObj(e -> null).count(); - - assertEquals(count, EXPECTED_LARGE_COUNT); + // Test known sized stream + { + long count = LongStream.range(0, EXPECTED_LARGE_COUNT) + .mapToObj(e -> null).count(); + assertEquals(count, EXPECTED_LARGE_COUNT); + } + // Test unknown sized stream + { + long count = LongStream.range(0, EXPECTED_LARGE_COUNT) + .mapToObj(e -> null).filter(e -> true).count(); + assertEquals(count, EXPECTED_LARGE_COUNT); + } } public void testIntLarge() { - long count = LongStream.range(0, EXPECTED_LARGE_COUNT) - .mapToInt(e -> 0).count(); - - assertEquals(count, EXPECTED_LARGE_COUNT); + // Test known sized stream + { + long count = LongStream.range(0, EXPECTED_LARGE_COUNT) + .mapToInt(e -> 0).count(); + assertEquals(count, EXPECTED_LARGE_COUNT); + } + // Test unknown sized stream + { + long count = LongStream.range(0, EXPECTED_LARGE_COUNT) + .mapToInt(e -> 0).filter(e -> true).count(); + assertEquals(count, EXPECTED_LARGE_COUNT); + } } public void testLongLarge() { - long count = LongStream.range(0, EXPECTED_LARGE_COUNT) - .count(); - - assertEquals(count, EXPECTED_LARGE_COUNT); + // Test known sized stream + { + long count = LongStream.range(0, EXPECTED_LARGE_COUNT) + .count(); + assertEquals(count, EXPECTED_LARGE_COUNT); + } + // Test unknown sized stream + { + long count = LongStream.range(0, EXPECTED_LARGE_COUNT) + .filter(e -> true).count(); + assertEquals(count, EXPECTED_LARGE_COUNT); + } } public void testDoubleLarge() { - long count = LongStream.range(0, EXPECTED_LARGE_COUNT) - .mapToDouble(e -> 0.0).count(); - - assertEquals(count, EXPECTED_LARGE_COUNT); + // Test known sized stream + { + long count = LongStream.range(0, EXPECTED_LARGE_COUNT) + .mapToDouble(e -> 0.0).count(); + assertEquals(count, EXPECTED_LARGE_COUNT); + } + // Test unknown sized stream + { + long count = LongStream.range(0, EXPECTED_LARGE_COUNT) + .mapToDouble(e -> 0.0).filter(e -> true).count(); + assertEquals(count, EXPECTED_LARGE_COUNT); + } } } diff --git a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/CountTest.java b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/CountTest.java index c5d337e8539..0ed5ddc1a17 100644 --- a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/CountTest.java +++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/CountTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, Oracle and/or its affiliates. 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 @@ -24,11 +24,12 @@ /** * @test * @summary Tests counting of streams - * @bug 8031187 + * @bug 8031187 8067969 */ package org.openjdk.tests.java.util.stream; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.DoubleStream; import java.util.stream.DoubleStreamTestDataProvider; import java.util.stream.IntStream; @@ -52,6 +53,12 @@ public class CountTest extends OpTestCase { terminal(Stream::count). expectedResult(expectedCount). exercise(); + + // Test with an unknown sized stream + withData(data). + terminal(s -> s.filter(e -> true), Stream::count). + expectedResult(expectedCount). + exercise(); } @Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class) @@ -62,6 +69,11 @@ public class CountTest extends OpTestCase { terminal(IntStream::count). expectedResult(expectedCount). exercise(); + + withData(data). + terminal(s -> s.filter(e -> true), IntStream::count). + expectedResult(expectedCount). + exercise(); } @Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class) @@ -72,6 +84,11 @@ public class CountTest extends OpTestCase { terminal(LongStream::count). expectedResult(expectedCount). exercise(); + + withData(data). + terminal(s -> s.filter(e -> true), LongStream::count). + expectedResult(expectedCount). + exercise(); } @Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class) @@ -82,5 +99,36 @@ public class CountTest extends OpTestCase { terminal(DoubleStream::count). expectedResult(expectedCount). exercise(); + + withData(data). + terminal(s -> s.filter(e -> true), DoubleStream::count). + expectedResult(expectedCount). + exercise(); + } + + public void testNoEvaluationForSizedStream() { + { + AtomicInteger ai = new AtomicInteger(); + Stream.of(1, 2, 3, 4).peek(e -> ai.getAndIncrement()).count(); + assertEquals(ai.get(), 0); + } + + { + AtomicInteger ai = new AtomicInteger(); + IntStream.of(1, 2, 3, 4).peek(e -> ai.getAndIncrement()).count(); + assertEquals(ai.get(), 0); + } + + { + AtomicInteger ai = new AtomicInteger(); + LongStream.of(1, 2, 3, 4).peek(e -> ai.getAndIncrement()).count(); + assertEquals(ai.get(), 0); + } + + { + AtomicInteger ai = new AtomicInteger(); + DoubleStream.of(1, 2, 3, 4).peek(e -> ai.getAndIncrement()).count(); + assertEquals(ai.get(), 0); + } } } From b8770ac0354afdffa97016d9fb90f9cc5a8abd87 Mon Sep 17 00:00:00 2001 From: Amy Lu Date: Mon, 16 Mar 2015 10:24:16 +0100 Subject: [PATCH 49/82] 8075111: Mark testFlatMappingClose (from CollectorsTest) as serialization hostile Reviewed-by: psandoz --- .../test/org/openjdk/tests/java/util/stream/CollectorsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/CollectorsTest.java b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/CollectorsTest.java index 18ba487edec..08d731dc96e 100644 --- a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/CollectorsTest.java +++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/CollectorsTest.java @@ -517,7 +517,7 @@ public class CollectorsTest extends OpTestCase { new ToListAssertion<>()))); } - @Test + @Test(groups = { "serialization-hostile" }) public void testFlatMappingClose() { Function classifier = i -> i; AtomicInteger ai = new AtomicInteger(); From 4c6eb2b310dafd757470ef4514d0552b5fd56adb Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Mon, 16 Mar 2015 11:00:07 +0100 Subject: [PATCH 50/82] 8075090: Add tests for the basic failure of try/finally compilation Reviewed-by: hannesw, lagergren --- nashorn/test/script/basic/JDK-8075090.js | 72 ++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 nashorn/test/script/basic/JDK-8075090.js diff --git a/nashorn/test/script/basic/JDK-8075090.js b/nashorn/test/script/basic/JDK-8075090.js new file mode 100644 index 00000000000..e39b4f2c777 --- /dev/null +++ b/nashorn/test/script/basic/JDK-8075090.js @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2015 Oracle and/or its affiliates. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * JDK-8075090: Add tests for the basic failure of try/finally compilation + * + * @test + * @run + */ + +(function() { + var finallyExpected = false; + try { + for(var i = 0; i < 2; ++i) { + if(i == 1) { + continue; + } + } + finallyExpected = true; + } finally { + Assert.assertTrue(finallyExpected); + } +})(); + +(function() { + var finallyExpected = false; + try { + for(var i = 0; i < 2; ++i) { + if(i == 1) { + break; + } + } + finallyExpected = true; + } finally { + Assert.assertTrue(finallyExpected); + } +})(); + +(function() { + var finallyExpected = false; + try { + L1: { + if ((function(){return true})()) { + break L1; + } + Assert.fail(); // unreachable + } + finallyExpected = true; + } finally { + Assert.assertTrue(finallyExpected); + } +})(); From d5d207d635691e83ae9b96b0504f40c2d39d536c Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Mon, 16 Mar 2015 18:08:01 +0800 Subject: [PATCH 51/82] 8074836: Resolve disabled warnings for libosxkrb5 8074835: Resolve disabled warnings for libj2gss Reviewed-by: erikj --- jdk/make/lib/Lib-java.security.jgss.gmk | 5 +++-- .../macosx/native/libosxkrb5/nativeccache.c | 2 ++ .../java.security.jgss/share/native/libj2gss/GSSLibStub.c | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/jdk/make/lib/Lib-java.security.jgss.gmk b/jdk/make/lib/Lib-java.security.jgss.gmk index a92212f4b0e..c2cee4e109b 100644 --- a/jdk/make/lib/Lib-java.security.jgss.gmk +++ b/jdk/make/lib/Lib-java.security.jgss.gmk @@ -41,7 +41,6 @@ ifneq ($(OPENJDK_TARGET_OS), windows) CFLAGS := $(CFLAGS_JDKLIB) $(addprefix -I, $(LIBJ2GSS_SRC)) \ $(LIBJAVA_HEADER_FLAGS) \ -I$(SUPPORT_OUTPUTDIR)/headers/java.security.jgss, \ - DISABLED_WARNINGS_gcc := pointer-to-int-cast, \ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libj2gss/mapfile-vers, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ @@ -74,6 +73,8 @@ ifneq ($(BUILD_CRYPTO), no) endif ifneq ($(BUILD_LIBKRB5_NAME), ) + # libosxkrb5 needs to call deprecated krb5 APIs so that java + # can use the native credentials cache. $(eval $(call SetupNativeCompilation,BUILD_LIBKRB5, \ LIBRARY := $(BUILD_LIBKRB5_NAME), \ OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \ @@ -83,7 +84,7 @@ ifneq ($(BUILD_CRYPTO), no) CFLAGS := $(CFLAGS_JDKLIB) \ $(addprefix -I, $(BUILD_LIBKRB5_SRC)) \ -I$(SUPPORT_OUTPUTDIR)/headers/java.security.jgss, \ - DISABLED_WARNINGS_clang := implicit-function-declaration, \ + DISABLED_WARNINGS_clang := deprecated-declarations, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ LDFLAGS_SUFFIX := $(BUILD_LIBKRB5_LIBS), \ diff --git a/jdk/src/java.security.jgss/macosx/native/libosxkrb5/nativeccache.c b/jdk/src/java.security.jgss/macosx/native/libosxkrb5/nativeccache.c index 667313dcee1..518462e6ae2 100644 --- a/jdk/src/java.security.jgss/macosx/native/libosxkrb5/nativeccache.c +++ b/jdk/src/java.security.jgss/macosx/native/libosxkrb5/nativeccache.c @@ -25,6 +25,8 @@ #import "sun_security_krb5_Credentials.h" #import +#import +#import /* * Based largely on klist.c, diff --git a/jdk/src/java.security.jgss/share/native/libj2gss/GSSLibStub.c b/jdk/src/java.security.jgss/share/native/libj2gss/GSSLibStub.c index b9bfb929830..b5abb9c0860 100644 --- a/jdk/src/java.security.jgss/share/native/libj2gss/GSSLibStub.c +++ b/jdk/src/java.security.jgss/share/native/libj2gss/GSSLibStub.c @@ -430,11 +430,11 @@ Java_sun_security_jgss_wrapper_GSSLibStub_canonicalizeName(JNIEnv *env, checkStatus(env, jobj, major, minor, "[GSSLibStub_canonicalizeName]"); if ((*env)->ExceptionCheck(env)) { - return (jlong) GSS_C_NO_NAME; + return ptr_to_jlong(GSS_C_NO_NAME); } return ptr_to_jlong(mnNameHdl); } - return (jlong) GSS_C_NO_NAME; + return ptr_to_jlong(GSS_C_NO_NAME); } /* From cf37646b3f4f6a06951b7c686f1769923d11031d Mon Sep 17 00:00:00 2001 From: Athijegannathan Sundararajan Date: Mon, 16 Mar 2015 17:01:47 +0530 Subject: [PATCH 52/82] 8075207: Nashorn parser API returns StatementTree objects in out of order Reviewed-by: lagergren, forax, hannesw --- nashorn/samples/findwith.js | 5 - .../jdk/nashorn/api/tree/DoWhileLoopTree.java | 2 + .../jdk/nashorn/api/tree/ForInLoopTree.java | 1 + .../jdk/nashorn/api/tree/IRTranslator.java | 68 +- .../jdk/nashorn/api/tree/ParserImpl.java | 2 +- .../jdk/nashorn/api/tree/WhileLoopTree.java | 2 + nashorn/test/script/basic/JDK-8075207.js | 76 + .../script/nosecurity/parserapi.js.EXPECTED | 1690 ++++++++--------- 8 files changed, 971 insertions(+), 875 deletions(-) create mode 100644 nashorn/test/script/basic/JDK-8075207.js diff --git a/nashorn/samples/findwith.js b/nashorn/samples/findwith.js index 1d82d712669..31d1f1d7ac0 100644 --- a/nashorn/samples/findwith.js +++ b/nashorn/samples/findwith.js @@ -52,7 +52,6 @@ var Parser = Java.type("jdk.nashorn.api.tree.Parser"); var SimpleTreeVisitor = Java.type("jdk.nashorn.api.tree.SimpleTreeVisitorES5_1"); var parser = Parser.create("-scripting", "--const-as-var"); -var protoFound = false; function checkFile(file) { // print("checking " + file); @@ -92,7 +91,3 @@ if (file.isDirectory()) { } else { checkFile(file); } - -if (protoFound) { - print("__proto__ is non-standard. Use Object.get/setPrototypeOf instead"); -} diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/DoWhileLoopTree.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/DoWhileLoopTree.java index f410cb7a899..80632ed09a0 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/DoWhileLoopTree.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/DoWhileLoopTree.java @@ -44,6 +44,7 @@ public interface DoWhileLoopTree extends ConditionalLoopTree { * * @return the condition expression */ + @Override ExpressionTree getCondition(); /** @@ -51,5 +52,6 @@ public interface DoWhileLoopTree extends ConditionalLoopTree { * * @return the statement */ + @Override StatementTree getStatement(); } diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ForInLoopTree.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ForInLoopTree.java index a1e1d04ebd0..0e28497ec2d 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ForInLoopTree.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ForInLoopTree.java @@ -57,6 +57,7 @@ public interface ForInLoopTree extends LoopTree { * * @return the statement */ + @Override StatementTree getStatement(); /** diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IRTranslator.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IRTranslator.java index f923cc8bd2e..cc0093e372c 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IRTranslator.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IRTranslator.java @@ -25,6 +25,7 @@ package jdk.nashorn.api.tree; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import jdk.nashorn.internal.ir.AccessNode; import jdk.nashorn.internal.ir.BinaryNode; @@ -92,7 +93,7 @@ final class IRTranslator extends NodeVisitor { final Block body = node.getBody(); return new CompilationUnitTreeImpl(node, - translateStats(body != null? body.getStatements() : null)); + translateStats(body != null? getOrderedStatements(body.getStatements()) : null)); } @Override @@ -103,25 +104,7 @@ final class IRTranslator extends NodeVisitor { @Override public boolean enterBlock(final Block block) { - // FIXME: revisit this! - if (block.isSynthetic()) { - final int statCount = block.getStatementCount(); - switch (statCount) { - case 0: { - final EmptyNode emptyNode = new EmptyNode(-1, block.getToken(), block.getFinish()); - curStat = new EmptyStatementTreeImpl(emptyNode); - return false; - } - case 1: { - curStat = translateStat(block.getStatements().get(0)); - return false; - } - } - } - - curStat = new BlockTreeImpl(block, - translateStats(block.getStatements())); - return false; + return handleBlock(block, false); } @Override @@ -245,7 +228,7 @@ final class IRTranslator extends NodeVisitor { final List paramTrees = translateExprs(functionNode.getParameters()); - final BlockTree blockTree = (BlockTree) translateBlock(functionNode.getBody()); + final BlockTree blockTree = (BlockTree) translateBlock(functionNode.getBody(), true); curExpr = new FunctionExpressionTreeImpl(functionNode, paramTrees, blockTree); return false; @@ -420,7 +403,7 @@ final class IRTranslator extends NodeVisitor { final List paramTrees = translateExprs(funcNode.getParameters()); - final BlockTree blockTree = (BlockTree) translateBlock(funcNode.getBody()); + final BlockTree blockTree = (BlockTree) translateBlock(funcNode.getBody(), true); curStat = new FunctionDeclarationTreeImpl(varNode, paramTrees, blockTree); } else { curStat = new VariableTreeImpl(varNode, translateExpr(initNode)); @@ -453,14 +436,51 @@ final class IRTranslator extends NodeVisitor { } private StatementTree translateBlock(final Block blockNode) { + return translateBlock(blockNode, false); + } + + private StatementTree translateBlock(final Block blockNode, final boolean sortStats) { if (blockNode == null) { return null; } curStat = null; - blockNode.accept(this); + handleBlock(blockNode, sortStats); return curStat; } + private boolean handleBlock(final Block block, final boolean sortStats) { + // FIXME: revisit this! + if (block.isSynthetic()) { + final int statCount = block.getStatementCount(); + switch (statCount) { + case 0: { + final EmptyNode emptyNode = new EmptyNode(-1, block.getToken(), block.getFinish()); + curStat = new EmptyStatementTreeImpl(emptyNode); + return false; + } + case 1: { + curStat = translateStat(block.getStatements().get(0)); + return false; + } + default: { + // fall through + break; + } + } + } + + final List stats = block.getStatements(); + curStat = new BlockTreeImpl(block, + translateStats(sortStats? getOrderedStatements(stats) : stats)); + return false; + } + + private List getOrderedStatements(final List stats) { + final List statList = new ArrayList<>(stats); + statList.sort(Comparator.comparingInt(Node::getStart)); + return statList; + } + private List translateStats(final List stats) { if (stats == null) { return null; @@ -511,7 +531,7 @@ final class IRTranslator extends NodeVisitor { return curStat; } - private IdentifierTree translateIdent(final IdentNode ident) { + private static IdentifierTree translateIdent(final IdentNode ident) { return new IdentifierTreeImpl(ident); } } diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ParserImpl.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ParserImpl.java index e265cf0c064..e40b84c1c77 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ParserImpl.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ParserImpl.java @@ -139,7 +139,7 @@ final class ParserImpl implements Parser { } } - private CompilationUnitTree translate(final FunctionNode node) { + private static CompilationUnitTree translate(final FunctionNode node) { return new IRTranslator().translate(node); } } diff --git a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/WhileLoopTree.java b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/WhileLoopTree.java index 9e89dd3a95d..5910caf9a0a 100644 --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/WhileLoopTree.java +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/WhileLoopTree.java @@ -43,6 +43,7 @@ public interface WhileLoopTree extends ConditionalLoopTree { * * @return the condition expression */ + @Override ExpressionTree getCondition(); /** @@ -50,5 +51,6 @@ public interface WhileLoopTree extends ConditionalLoopTree { * * @return the statement contained */ + @Override StatementTree getStatement(); } diff --git a/nashorn/test/script/basic/JDK-8075207.js b/nashorn/test/script/basic/JDK-8075207.js new file mode 100644 index 00000000000..d44fc5512b9 --- /dev/null +++ b/nashorn/test/script/basic/JDK-8075207.js @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * JDK-8075207: Nashorn parser API returns StatementTree objects in out of order + * + * @test + * @option -scripting + * @run + */ + +var Parser = Java.type("jdk.nashorn.api.tree.Parser"); +var ExpressionStatementTree = Java.type("jdk.nashorn.api.tree.ExpressionStatementTree"); +var FunctionDeclarationTree = Java.type("jdk.nashorn.api.tree.FunctionDeclarationTree"); +var VariableTree = Java.type("jdk.nashorn.api.tree.VariableTree"); + +var parser = Parser.create(); + +var ast = parser.parse("hello.js", < Date: Mon, 16 Mar 2015 19:09:13 +0400 Subject: [PATCH 53/82] 8028266: Tidy warnings cleanup for packages java.security/javax.security Some tidy warnings in docs were fixed Reviewed-by: mullan, wetmore --- .../java/security/AccessControlContext.java | 12 ++--- .../classes/java/security/AllPermission.java | 5 +- .../java/security/BasicPermission.java | 14 ++--- .../classes/java/security/DomainCombiner.java | 6 +-- .../share/classes/java/security/KeyRep.java | 6 +-- .../share/classes/java/security/KeyStore.java | 5 +- .../classes/java/security/KeyStoreSpi.java | 3 +- .../classes/java/security/Permissions.java | 6 +-- .../java/security/ProtectionDomain.java | 3 -- .../java/security/SecureClassLoader.java | 10 ++-- .../java/security/UnresolvedPermission.java | 6 +-- .../java/security/cert/Certificate.java | 10 ++-- .../javax/crypto/CipherInputStream.java | 3 +- .../share/classes/javax/crypto/package.html | 10 ++-- .../javax/net/ssl/KeyManagerFactory.java | 3 +- .../classes/javax/net/ssl/SSLParameters.java | 3 +- .../javax/security/auth/AuthPermission.java | 10 ++-- .../security/auth/DestroyFailedException.java | 4 +- .../javax/security/auth/Destroyable.java | 4 +- .../classes/javax/security/auth/Policy.java | 14 ++--- .../auth/PrivateCredentialPermission.java | 24 ++------- .../security/auth/RefreshFailedException.java | 4 +- .../javax/security/auth/Refreshable.java | 8 +-- .../classes/javax/security/auth/Subject.java | 4 +- .../security/auth/SubjectDomainCombiner.java | 22 +++----- .../auth/callback/CallbackHandler.java | 4 +- .../auth/callback/ChoiceCallback.java | 23 ++------ .../auth/callback/ConfirmationCallback.java | 44 ++++------------ .../auth/callback/LanguageCallback.java | 6 +-- .../security/auth/callback/NameCallback.java | 16 +----- .../auth/callback/PasswordCallback.java | 16 ++---- .../auth/callback/TextInputCallback.java | 16 +----- .../auth/callback/TextOutputCallback.java | 12 ++--- .../UnsupportedCallbackException.java | 10 +--- .../security/auth/login/AccountException.java | 4 +- .../auth/login/AccountExpiredException.java | 4 +- .../auth/login/AccountLockedException.java | 4 +- .../auth/login/AccountNotFoundException.java | 4 +- .../auth/login/AppConfigurationEntry.java | 6 +-- .../security/auth/login/Configuration.java | 14 ++--- .../security/auth/login/ConfigurationSpi.java | 8 ++- .../auth/login/CredentialException.java | 4 +- .../login/CredentialExpiredException.java | 4 +- .../login/CredentialNotFoundException.java | 4 +- .../auth/login/FailedLoginException.java | 4 +- .../security/auth/login/LoginContext.java | 52 ++++++------------- .../security/auth/login/LoginException.java | 4 +- .../javax/security/auth/spi/LoginModule.java | 18 ++----- .../auth/x500/X500PrivateCredential.java | 14 ++--- .../auth/kerberos/DelegationPermission.java | 9 ++-- .../security/auth/kerberos/EncryptionKey.java | 4 +- .../auth/kerberos/KerberosCredMessage.java | 4 +- .../security/auth/kerberos/KerberosKey.java | 4 +- .../javax/security/auth/kerberos/KeyTab.java | 4 +- .../auth/kerberos/ServicePermission.java | 8 +-- .../security/auth/kerberos/package-info.java | 2 +- 56 files changed, 159 insertions(+), 370 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/security/AccessControlContext.java b/jdk/src/java.base/share/classes/java/security/AccessControlContext.java index 22cb1005ed7..feed0cf11e1 100644 --- a/jdk/src/java.base/share/classes/java/security/AccessControlContext.java +++ b/jdk/src/java.base/share/classes/java/security/AccessControlContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -153,8 +153,6 @@ public final class AccessControlContext { * {@code DomainCombiner} with the provided * {@code AccessControlContext}. * - *

    - * * @param acc the {@code AccessControlContext} associated * with the provided {@code DomainCombiner}. * @@ -338,8 +336,6 @@ public final class AccessControlContext { * Get the {@code DomainCombiner} associated with this * {@code AccessControlContext}. * - *

    - * * @return the {@code DomainCombiner} associated with this * {@code AccessControlContext}, or {@code null} * if there is none. @@ -738,12 +734,12 @@ public final class AccessControlContext { /** * Checks two AccessControlContext objects for equality. - * Checks that obj is + * Checks that {@code obj} is * an AccessControlContext and has the same set of ProtectionDomains * as this context. - *

    + * * @param obj the object we are testing for equality with this object. - * @return true if obj is an AccessControlContext, and has the + * @return true if {@code obj} is an AccessControlContext, and has the * same set of ProtectionDomains as this context, false otherwise. */ public boolean equals(Object obj) { diff --git a/jdk/src/java.base/share/classes/java/security/AllPermission.java b/jdk/src/java.base/share/classes/java/security/AllPermission.java index c01b134f074..b830b884c59 100644 --- a/jdk/src/java.base/share/classes/java/security/AllPermission.java +++ b/jdk/src/java.base/share/classes/java/security/AllPermission.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2015, Oracle and/or its affiliates. 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 @@ -96,7 +96,7 @@ public final class AllPermission extends Permission { * objects are always equal. * * @param obj the object we are testing for equality with this object. - * @return true if obj is an AllPermission, false otherwise. + * @return true if {@code obj} is an AllPermission, false otherwise. */ public boolean equals(Object obj) { return (obj instanceof AllPermission); @@ -124,7 +124,6 @@ public final class AllPermission extends Permission { /** * Returns a new PermissionCollection object for storing AllPermission * objects. - *

    * * @return a new PermissionCollection object suitable for * storing AllPermissions. diff --git a/jdk/src/java.base/share/classes/java/security/BasicPermission.java b/jdk/src/java.base/share/classes/java/security/BasicPermission.java index 0abbfa7c047..7e0f4fb85b4 100644 --- a/jdk/src/java.base/share/classes/java/security/BasicPermission.java +++ b/jdk/src/java.base/share/classes/java/security/BasicPermission.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -56,7 +56,7 @@ import java.io.IOException; * named permission or you don't.) * Subclasses may implement actions on top of BasicPermission, * if desired. - *

    + * * @see java.security.Permission * @see java.security.Permissions * @see java.security.PermissionCollection @@ -154,8 +154,8 @@ public abstract class BasicPermission extends Permission *

    * More specifically, this method returns true if: *

      - *
    • p's class is the same as this object's class, and - *
    • p's name equals or (in the case of wildcards) + *
    • {@code p}'s class is the same as this object's class, and + *
    • {@code p}'s name equals or (in the case of wildcards) * is implied by this object's * name. For example, "a.b.*" implies "a.b.c". *
    @@ -193,11 +193,11 @@ public abstract class BasicPermission extends Permission /** * Checks two BasicPermission objects for equality. - * Checks that obj's class is the same as this object's class + * Checks that {@code obj}'s class is the same as this object's class * and has the same name as this object. - *

    + * * @param obj the object we are testing for equality with this object. - * @return true if obj's class is the same as this object's class + * @return true if {@code obj}'s class is the same as this object's class * and has the same name as this BasicPermission object, false otherwise. */ public boolean equals(Object obj) { diff --git a/jdk/src/java.base/share/classes/java/security/DomainCombiner.java b/jdk/src/java.base/share/classes/java/security/DomainCombiner.java index 4785df4cd80..0e1ccf9112f 100644 --- a/jdk/src/java.base/share/classes/java/security/DomainCombiner.java +++ b/jdk/src/java.base/share/classes/java/security/DomainCombiner.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2015, Oracle and/or its affiliates. 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 @@ -87,8 +87,6 @@ public interface DomainCombiner { * Individual ProtectionDomains may be modified (with a new * set of Permissions, for example). * - *

    - * * @param currentDomains the ProtectionDomains associated with the * current execution Thread, up to the most recent * privileged {@code ProtectionDomain}. @@ -96,7 +94,7 @@ public interface DomainCombiner { * with the most recently executing {@code ProtectionDomain} * residing at the beginning of the array. This parameter may * be {@code null} if the current execution Thread - * has no associated ProtectionDomains.

    + * has no associated ProtectionDomains. * * @param assignedDomains an array of inherited ProtectionDomains. * ProtectionDomains may be inherited from a parent Thread, diff --git a/jdk/src/java.base/share/classes/java/security/KeyRep.java b/jdk/src/java.base/share/classes/java/security/KeyRep.java index 0b1412c1563..f97208f1083 100644 --- a/jdk/src/java.base/share/classes/java/security/KeyRep.java +++ b/jdk/src/java.base/share/classes/java/security/KeyRep.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, Oracle and/or its affiliates. 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 @@ -112,8 +112,6 @@ public class KeyRep implements Serializable { /** * Construct the alternate Key class. * - *

    - * * @param type either one of Type.SECRET, Type.PUBLIC, or Type.PRIVATE * @param algorithm the algorithm returned from * {@code Key.getAlgorithm()} @@ -157,8 +155,6 @@ public class KeyRep implements Serializable { * encoded key bytes, and generates a private key from the spec * * - *

    - * * @return the resolved Key object * * @exception ObjectStreamException if the Type/format diff --git a/jdk/src/java.base/share/classes/java/security/KeyStore.java b/jdk/src/java.base/share/classes/java/security/KeyStore.java index 71df7dbd5a2..8fde796e041 100644 --- a/jdk/src/java.base/share/classes/java/security/KeyStore.java +++ b/jdk/src/java.base/share/classes/java/security/KeyStore.java @@ -120,7 +120,7 @@ import sun.security.util.Debug; * KeyStore ks = KeyStore.getInstance("JKS"); * * The system will return the most preferred implementation of the - * specified keystore type available in the environment.

    + * specified keystore type available in the environment. * * *

    Before a keystore can be accessed, it must be @@ -617,7 +617,6 @@ public class KeyStore { /** * Retrieves the attributes associated with an entry. - *

    * * @return an unmodifiable {@code Set} of attributes, possibly empty * @@ -708,7 +707,6 @@ public class KeyStore { /** * Retrieves the attributes associated with an entry. - *

    * * @return an unmodifiable {@code Set} of attributes, possibly empty * @@ -792,7 +790,6 @@ public class KeyStore { /** * Retrieves the attributes associated with an entry. - *

    * * @return an unmodifiable {@code Set} of attributes, possibly empty * diff --git a/jdk/src/java.base/share/classes/java/security/KeyStoreSpi.java b/jdk/src/java.base/share/classes/java/security/KeyStoreSpi.java index ceb41d87063..ea11dab2e9a 100644 --- a/jdk/src/java.base/share/classes/java/security/KeyStoreSpi.java +++ b/jdk/src/java.base/share/classes/java/security/KeyStoreSpi.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2015, Oracle and/or its affiliates. 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 @@ -595,7 +595,6 @@ public abstract class KeyStoreSpi { * Probes the specified input stream to determine whether it contains a * keystore that is supported by this implementation, or not. * - *

    * @implSpec * This method returns false by default. Keystore implementations should * override this method to peek at the data stream directly or to use other diff --git a/jdk/src/java.base/share/classes/java/security/Permissions.java b/jdk/src/java.base/share/classes/java/security/Permissions.java index cce9f5f56f3..cc9c69358ee 100644 --- a/jdk/src/java.base/share/classes/java/security/Permissions.java +++ b/jdk/src/java.base/share/classes/java/security/Permissions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -111,7 +111,7 @@ implements Serializable * * This method creates * a new PermissionCollection object (and adds the permission to it) - * if an appropriate collection does not yet exist.

    + * if an appropriate collection does not yet exist. * * @param permission the Permission object to add. * @@ -162,7 +162,7 @@ implements Serializable * *

    Additionally, if this PermissionCollection contains the * AllPermission, this method will always return true. - *

    + * * @param permission the Permission object to check. * * @return true if "permission" is implied by the permissions in the diff --git a/jdk/src/java.base/share/classes/java/security/ProtectionDomain.java b/jdk/src/java.base/share/classes/java/security/ProtectionDomain.java index 2e505d74554..6e7056ddc92 100644 --- a/jdk/src/java.base/share/classes/java/security/ProtectionDomain.java +++ b/jdk/src/java.base/share/classes/java/security/ProtectionDomain.java @@ -51,7 +51,6 @@ import sun.misc.SharedSecrets; * ProtectionDomain can also be constructed such that it is dynamically * mapped to a set of permissions by the current Policy whenever a permission * is checked. - *

    * * @author Li Gong * @author Roland Schemers @@ -168,7 +167,6 @@ public class ProtectionDomain { * this domain. This constructor affords the * Policy provider the opportunity to augment the supplied * PermissionCollection to reflect policy changes. - *

    * * @param codesource the CodeSource associated with this domain * @param permissions the permissions granted to this domain @@ -263,7 +261,6 @@ public class ProtectionDomain { * permissions, then the permission will be checked against the * combination of the PermissionCollection supplied at construction and * the current Policy binding. - *

    * * @param permission the Permission object to check. * diff --git a/jdk/src/java.base/share/classes/java/security/SecureClassLoader.java b/jdk/src/java.base/share/classes/java/security/SecureClassLoader.java index 145f4fc482b..41b84dbe683 100644 --- a/jdk/src/java.base/share/classes/java/security/SecureClassLoader.java +++ b/jdk/src/java.base/share/classes/java/security/SecureClassLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -65,7 +65,7 @@ public class SecureClassLoader extends ClassLoader { *

    If there is a security manager, this method first * calls the security manager's {@code checkCreateClassLoader} * method to ensure creation of a class loader is allowed. - *

    + * * @param parent the parent ClassLoader * @exception SecurityException if a security manager exists and its * {@code checkCreateClassLoader} method doesn't allow @@ -112,7 +112,7 @@ public class SecureClassLoader extends ClassLoader { *

    * If a non-null CodeSource is supplied a ProtectionDomain is * constructed and associated with the class being defined. - *

    + * * @param name the expected name of the class, or {@code null} * if not known, using '.' and not '/' as the separator * and without a trailing ".class" suffix. @@ -149,7 +149,7 @@ public class SecureClassLoader extends ClassLoader { *

    * If a non-null CodeSource is supplied a ProtectionDomain is * constructed and associated with the class being defined. - *

    + * * @param name the expected name of the class, or {@code null} * if not known, using '.' and not '/' as the separator * and without a trailing ".class" suffix. @@ -180,7 +180,7 @@ public class SecureClassLoader extends ClassLoader { * This method is invoked by the defineClass method which takes * a CodeSource as an argument when it is constructing the * ProtectionDomain for the class being defined. - *

    + * * @param codesource the codesource. * * @return the permissions granted to the codesource. diff --git a/jdk/src/java.base/share/classes/java/security/UnresolvedPermission.java b/jdk/src/java.base/share/classes/java/security/UnresolvedPermission.java index 98ab2d13f9f..9dff324920e 100644 --- a/jdk/src/java.base/share/classes/java/security/UnresolvedPermission.java +++ b/jdk/src/java.base/share/classes/java/security/UnresolvedPermission.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -310,7 +310,7 @@ implements java.io.Serializable /** * Checks two UnresolvedPermission objects for equality. - * Checks that obj is an UnresolvedPermission, and has + * Checks that {@code obj} is an UnresolvedPermission, and has * the same type (class) name, permission name, actions, and * certificates as this object. * @@ -491,7 +491,7 @@ implements java.io.Serializable /** * Returns a new PermissionCollection object for storing * UnresolvedPermission objects. - *

    + * * @return a new PermissionCollection object suitable for * storing UnresolvedPermissions. */ diff --git a/jdk/src/java.base/share/classes/java/security/cert/Certificate.java b/jdk/src/java.base/share/classes/java/security/cert/Certificate.java index 10544983d2c..6923627ce7b 100644 --- a/jdk/src/java.base/share/classes/java/security/cert/Certificate.java +++ b/jdk/src/java.base/share/classes/java/security/cert/Certificate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -41,7 +41,7 @@ import sun.security.x509.X509CertImpl; * An identity certificate is a binding of a principal to a public key which * is vouched for by another principal. (A principal represents * an entity such as an individual user, a group, or a corporation.) - *

    + *

    * This class is an abstraction for certificates that have different * formats but important common uses. For example, different types of * certificates, such as X.509 and PGP, share general certificate @@ -248,9 +248,7 @@ public abstract class Certificate implements java.io.Serializable { * Construct the alternate Certificate class with the Certificate * type and Certificate encoding bytes. * - *

    - * - * @param type the standard name of the Certificate type.

    + * @param type the standard name of the Certificate type. * * @param data the Certificate data. */ @@ -262,8 +260,6 @@ public abstract class Certificate implements java.io.Serializable { /** * Resolve the Certificate Object. * - *

    - * * @return the resolved Certificate Object * * @throws java.io.ObjectStreamException if the Certificate diff --git a/jdk/src/java.base/share/classes/javax/crypto/CipherInputStream.java b/jdk/src/java.base/share/classes/javax/crypto/CipherInputStream.java index 37520a1b5ec..691ce46078f 100644 --- a/jdk/src/java.base/share/classes/javax/crypto/CipherInputStream.java +++ b/jdk/src/java.base/share/classes/javax/crypto/CipherInputStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. 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 @@ -172,7 +172,6 @@ public class CipherInputStream extends FilterInputStream { * -1 is returned. This method blocks until input data * is available, the end of the stream is detected, or an exception * is thrown. - *

    * * @return the next byte of data, or -1 if the end of the * stream is reached. diff --git a/jdk/src/java.base/share/classes/javax/crypto/package.html b/jdk/src/java.base/share/classes/javax/crypto/package.html index 15185738e59..c1d46ff528c 100644 --- a/jdk/src/java.base/share/classes/javax/crypto/package.html +++ b/jdk/src/java.base/share/classes/javax/crypto/package.html @@ -1,5 +1,5 @@