0N/A/*
1879N/A * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
0N/A * published by the Free Software Foundation.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
1472N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1472N/A * or visit www.oracle.com if you need additional information or have any
1472N/A * questions.
0N/A *
0N/A */
0N/A
1879N/A#ifndef CPU_SPARC_VM_JAVAFRAMEANCHOR_SPARC_HPP
1879N/A#define CPU_SPARC_VM_JAVAFRAMEANCHOR_SPARC_HPP
1879N/A
0N/Aprivate:
0N/A volatile int _flags;
0N/A
0N/Apublic:
0N/A
0N/A enum pd_Constants {
0N/A flushed = 1 // winodows have flushed
0N/A };
0N/A
0N/A int flags(void) { return _flags; }
0N/A void set_flags(int flags) { _flags = flags; }
0N/A
0N/A static ByteSize flags_offset() { return byte_offset_of(JavaFrameAnchor, _flags); }
0N/A
0N/A // Each arch must define clear, copy
0N/A // These are used by objects that only care about:
0N/A // 1 - initializing a new state (thread creation, javaCalls)
0N/A // 2 - saving a current state (javaCalls)
0N/A // 3 - restoring an old state (javaCalls)
0N/A
0N/A void clear(void) {
0N/A // clearing _last_Java_sp must be first
0N/A _last_Java_sp = NULL;
0N/A // fence?
0N/A _flags = 0;
0N/A _last_Java_pc = NULL;
0N/A }
0N/A
0N/A void copy(JavaFrameAnchor* src) {
0N/A // In order to make sure the transition state is valid for "this"
0N/A // We must clear _last_Java_sp before copying the rest of the new data
0N/A //
0N/A // Hack Alert: Temporary bugfix for 4717480/4721647
0N/A // To act like previous version (pd_cache_state) don't NULL _last_Java_sp
0N/A // unless the value is changing
0N/A //
0N/A if (_last_Java_sp != src->_last_Java_sp)
0N/A _last_Java_sp = NULL;
0N/A
0N/A _flags = src->_flags;
0N/A _last_Java_pc = src->_last_Java_pc;
0N/A // Must be last so profiler will always see valid frame if has_last_frame() is true
0N/A _last_Java_sp = src->_last_Java_sp;
0N/A }
0N/A
0N/A // Is stack walkable
0N/A inline bool walkable( void) {
0N/A return _flags & flushed;
0N/A }
0N/A
0N/A void make_walkable(JavaThread* thread);
0N/A
0N/A void set_last_Java_sp(intptr_t* sp) { _last_Java_sp = sp; }
0N/A
1601N/A address last_Java_pc(void) { return _last_Java_pc; }
1601N/A
0N/A // These are only used by friends
0N/Aprivate:
0N/A
0N/A intptr_t* last_Java_sp() const {
0N/A // _last_Java_sp will always be a an unbiased stack pointer
0N/A // if is is biased then some setter screwed up. This is
0N/A // deadly.
0N/A#ifdef _LP64
0N/A assert(((intptr_t)_last_Java_sp & 0xF) == 0, "Biased last_Java_sp");
0N/A#endif
0N/A return _last_Java_sp;
0N/A }
0N/A
0N/A void capture_last_Java_pc(intptr_t* sp);
0N/A
0N/A void set_window_flushed( void) {
0N/A _flags |= flushed;
0N/A OrderAccess::fence();
0N/A }
1879N/A
1879N/A#endif // CPU_SPARC_VM_JAVAFRAMEANCHOR_SPARC_HPP