6890308: integrate zero assembler hotspot changes
Reviewed-by: never
Contributed-by: gbenson@redhat.com
--- a/hotspot/make/Makefile Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/make/Makefile Tue Oct 13 12:04:21 2009 -0700
@@ -84,6 +84,7 @@
C1_VM_TARGETS=product1 fastdebug1 optimized1 jvmg1
C2_VM_TARGETS=product fastdebug optimized jvmg
KERNEL_VM_TARGETS=productkernel fastdebugkernel optimizedkernel jvmgkernel
+ZERO_VM_TARGETS=productzero fastdebugzero optimizedzero jvmgzero
# JDK directory list
JDK_DIRS=bin include jre lib demo
@@ -94,6 +95,12 @@
all_debug: jvmg jvmg1 jvmgkernel docs export_debug
all_optimized: optimized optimized1 optimizedkernel docs export_optimized
+allzero: all_productzero all_fastdebugzero
+all_productzero: productzero docs export_product
+all_fastdebugzero: fastdebugzero docs export_fastdebug
+all_debugzero: jvmgzero docs export_debug
+all_optimizedzero: optimizedzero docs export_optimized
+
# Do everything
world: all create_jdk
@@ -120,6 +127,10 @@
$(CD) $(GAMMADIR)/make; \
$(MAKE) VM_TARGET=$@ generic_buildkernel $(ALT_OUT)
+$(ZERO_VM_TARGETS):
+ $(CD) $(GAMMADIR)/make; \
+ $(MAKE) VM_TARGET=$@ generic_buildzero $(ALT_OUT)
+
# Build compiler1 (client) rule, different for platforms
generic_build1:
$(MKDIR) -p $(OUTPUTDIR)
@@ -180,6 +191,12 @@
@$(ECHO) "No kernel ($(VM_TARGET)) for OS_NAME=$(OSNAME)"
endif
+generic_buildzero:
+ $(MKDIR) -p $(OUTPUTDIR)
+ $(CD) $(OUTPUTDIR); \
+ $(MAKE) -f $(ABS_OS_MAKEFILE) \
+ $(MAKE_ARGS) $(VM_TARGET)
+
# Export file rule
generic_export: $(EXPORT_LIST)
export_product:
@@ -210,11 +227,17 @@
C1_BASE_DIR=$(OUTPUTDIR)/$(VM_PLATFORM)_compiler1
C2_BASE_DIR=$(OUTPUTDIR)/$(VM_PLATFORM)_compiler2
KERNEL_BASE_DIR=$(OUTPUTDIR)/$(VM_PLATFORM)_kernel
+ZERO_BASE_DIR=$(OUTPUTDIR)/$(VM_PLATFORM)_zero
C1_DIR=$(C1_BASE_DIR)/$(VM_SUBDIR)
C2_DIR=$(C2_BASE_DIR)/$(VM_SUBDIR)
KERNEL_DIR=$(KERNEL_BASE_DIR)/$(VM_SUBDIR)
+ZERO_DIR=$(ZERO_BASE_DIR)/$(VM_SUBDIR)
# Misc files and generated files need to come from C1 or C2 area
+ifeq ($(ZERO_BUILD), true)
+ MISC_DIR=$(ZERO_DIR)
+ GEN_DIR=$(ZERO_BASE_DIR)/generated
+else
ifeq ($(ARCH_DATA_MODEL), 32)
MISC_DIR=$(C1_DIR)
GEN_DIR=$(C1_BASE_DIR)/generated
@@ -222,6 +245,7 @@
MISC_DIR=$(C2_DIR)
GEN_DIR=$(C2_BASE_DIR)/generated
endif
+endif
# Bin files (windows)
ifeq ($(OSNAME),windows)
@@ -265,6 +289,12 @@
# Shared Library
ifneq ($(OSNAME),windows)
+ ifeq ($(ZERO_BUILD), true)
+$(EXPORT_JRE_LIB_ARCH_DIR)/%.so: $(ZERO_DIR)/%.so
+ $(install-file)
+$(EXPORT_SERVER_DIR)/%.so: $(ZERO_DIR)/%.so
+ $(install-file)
+ else
$(EXPORT_JRE_LIB_ARCH_DIR)/%.so: $(C2_DIR)/%.so
$(install-file)
$(EXPORT_CLIENT_DIR)/%.so: $(C1_DIR)/%.so
@@ -275,6 +305,7 @@
$(install-file)
$(EXPORT_SERVER_DIR)/64/%.so: $(C2_DIR)/%.so
$(install-file)
+ endif
endif
# Jar file (sa-jdi.jar)
@@ -313,6 +344,7 @@
$(RM) -r $(C1_DIR)
$(RM) -r $(C2_DIR)
$(RM) -r $(KERNEL_DIR)
+ $(RM) -r $(ZERO_DIR)
clean_export:
$(RM) -r $(EXPORT_PATH)
clean_jdk:
@@ -335,8 +367,10 @@
($(CD) $(JDK_IMAGE_DIR) && $(TAR) -xf -)
test_jdk:
- ifeq ($(ARCH_DATA_MODEL), 32)
+ ifneq ($(ZERO_BUILD), true)
+ ifeq ($(ARCH_DATA_MODEL), 32)
$(JDK_IMAGE_DIR)/bin/java -client -version
+ endif
endif
$(JDK_IMAGE_DIR)/bin/java -server -version
--- a/hotspot/make/defs.make Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/make/defs.make Tue Oct 13 12:04:21 2009 -0700
@@ -192,13 +192,14 @@
# 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,$(ARCH)))
+ SRCARCH = $(ARCH/$(filter sparc sparc64 ia64 amd64 x86_64 zero,$(ARCH)))
ARCH/ = x86
ARCH/sparc = sparc
ARCH/sparc64= sparc
ARCH/ia64 = ia64
ARCH/amd64 = x86
ARCH/x86_64 = x86
+ ARCH/zero = zero
# BUILDARCH is usually the same as SRCARCH, except for sparcv9
BUILDARCH = $(SRCARCH)
@@ -222,8 +223,9 @@
LIBARCH/sparc = sparc
LIBARCH/sparcv9 = sparcv9
LIBARCH/ia64 = ia64
+ LIBARCH/zero = $(ZERO_LIBARCH)
- LP64_ARCH = sparcv9 amd64 ia64
+ LP64_ARCH = sparcv9 amd64 ia64 zero
endif
# Required make macro settings for all platforms
--- a/hotspot/make/linux/Makefile Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/make/linux/Makefile Tue Oct 13 12:04:21 2009 -0700
@@ -132,6 +132,9 @@
endif
+# BUILDARCH is set to "zero" for Zero builds. VARIANTARCH
+# is used to give the build directories meaningful names.
+VARIANTARCH = $(subst i386,i486,$(ZERO_LIBARCH))
# There is a (semi-) regular correspondence between make targets and actions:
#
@@ -158,6 +161,13 @@
# profiledcore core <os>_<arch>_core/profiled
# productcore core <os>_<arch>_core/product
#
+# debugzero zero <os>_<arch>_zero/debug
+# fastdebugzero zero <os>_<arch>_zero/fastdebug
+# jvmgzero zero <os>_<arch>_zero/jvmg
+# optimizedzero zero <os>_<arch>_zero/optimized
+# profiledzero zero <os>_<arch>_zero/profiled
+# productzero zero <os>_<arch>_zero/product
+#
# What you get with each target:
#
# debug* - "thin" libjvm_g - debug info linked into the gamma_g launcher
@@ -171,16 +181,22 @@
# in the build.sh script:
TARGETS = debug jvmg fastdebug optimized profiled product
-SUBDIR_DOCS = $(OSNAME)_$(BUILDARCH)_docs
+ifeq ($(ZERO_BUILD), true)
+ SUBDIR_DOCS = $(OSNAME)_$(VARIANTARCH)_docs
+else
+ SUBDIR_DOCS = $(OSNAME)_$(BUILDARCH)_docs
+endif
SUBDIRS_C1 = $(addprefix $(OSNAME)_$(BUILDARCH)_compiler1/,$(TARGETS))
SUBDIRS_C2 = $(addprefix $(OSNAME)_$(BUILDARCH)_compiler2/,$(TARGETS))
SUBDIRS_TIERED = $(addprefix $(OSNAME)_$(BUILDARCH)_tiered/,$(TARGETS))
SUBDIRS_CORE = $(addprefix $(OSNAME)_$(BUILDARCH)_core/,$(TARGETS))
+SUBDIRS_ZERO = $(addprefix $(OSNAME)_$(VARIANTARCH)_zero/,$(TARGETS))
TARGETS_C2 = $(TARGETS)
TARGETS_C1 = $(addsuffix 1,$(TARGETS))
TARGETS_TIERED = $(addsuffix tiered,$(TARGETS))
TARGETS_CORE = $(addsuffix core,$(TARGETS))
+TARGETS_ZERO = $(addsuffix zero,$(TARGETS))
BUILDTREE_MAKE = $(GAMMADIR)/make/$(OSNAME)/makefiles/buildtree.make
BUILDTREE_VARS = GAMMADIR=$(GAMMADIR) OS_FAMILY=$(OSNAME) ARCH=$(SRCARCH) BUILDARCH=$(BUILDARCH) LIBARCH=$(LIBARCH)
@@ -196,6 +212,7 @@
@echo " $(TARGETS_C2)"
@echo " $(TARGETS_C1)"
@echo " $(TARGETS_CORE)"
+ @echo " $(TARGETS_ZERO)"
checks: check_os_version check_j2se_version
@@ -245,6 +262,13 @@
$(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks
$(BUILDTREE) VARIANT=core
+$(SUBDIRS_ZERO): $(BUILDTREE_MAKE) platform_zero
+ $(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks
+ $(BUILDTREE) VARIANT=zero VARIANTARCH=$(VARIANTARCH)
+
+platform_zero: $(GAMMADIR)/make/$(OSNAME)/platform_zero.in
+ $(SED) 's/@ZERO_ARCHDEF@/$(ZERO_ARCHDEF)/g;s/@ZERO_LIBARCH@/$(ZERO_LIBARCH)/g;' < $< > $@
+
# Define INSTALL=y at command line to automatically copy JVM into JAVA_HOME
$(TARGETS_C2): $(SUBDIRS_C2)
@@ -275,10 +299,18 @@
cd $(OSNAME)_$(BUILDARCH)_core/$(patsubst %core,%,$@) && $(MAKE) $(MFLAGS) install
endif
+$(TARGETS_ZERO): $(SUBDIRS_ZERO)
+ cd $(OSNAME)_$(VARIANTARCH)_zero/$(patsubst %zero,%,$@) && $(MAKE) $(MFLAGS)
+ cd $(OSNAME)_$(VARIANTARCH)_zero/$(patsubst %zero,%,$@) && ./test_gamma
+ifdef INSTALL
+ cd $(OSNAME)_$(VARIANTARCH)_zero/$(patsubst %zero,%,$@) && $(MAKE) $(MFLAGS) install
+endif
+
# Just build the tree, and nothing else:
tree: $(SUBDIRS_C2)
tree1: $(SUBDIRS_C1)
treecore: $(SUBDIRS_CORE)
+treezero: $(SUBDIRS_ZERO)
# Doc target. This is the same for all build options.
# Hence create a docs directory beside ...$(ARCH)_[...]
@@ -293,20 +325,22 @@
core: jvmgcore productcore
+zero: jvmgzero productzero
+
clean_docs:
rm -rf $(SUBDIR_DOCS)
-clean_compiler1 clean_compiler2 clean_core:
+clean_compiler1 clean_compiler2 clean_core clean_zero:
rm -rf $(OSNAME)_$(BUILDARCH)_$(subst clean_,,$@)
-clean: clean_compiler2 clean_compiler1 clean_core clean_docs
+clean: clean_compiler2 clean_compiler1 clean_core clean_zero clean_docs
include $(GAMMADIR)/make/$(OSNAME)/makefiles/cscope.make
#-------------------------------------------------------------------------------
-.PHONY: $(TARGETS_C2) $(TARGETS_C1) $(TARGETS_CORE)
-.PHONY: tree tree1 treecore
-.PHONY: all compiler1 compiler2 core
-.PHONY: clean clean_compiler1 clean_compiler2 clean_core docs clean_docs
+.PHONY: $(TARGETS_C2) $(TARGETS_C1) $(TARGETS_CORE) $(TARGETS_ZERO)
+.PHONY: tree tree1 treecore treezero
+.PHONY: all compiler1 compiler2 core zero
+.PHONY: clean clean_compiler1 clean_compiler2 clean_core clean_zero docs clean_docs
.PHONY: checks check_os_version check_j2se_version
--- a/hotspot/make/linux/makefiles/buildtree.make Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/make/linux/makefiles/buildtree.make Tue Oct 13 12:04:21 2009 -0700
@@ -63,20 +63,30 @@
# For now, until the compiler is less wobbly:
TESTFLAGS = -Xbatch -showversion
-ifdef USE_SUNCC
-PLATFORM_FILE = $(GAMMADIR)/make/$(OS_FAMILY)/platform_$(BUILDARCH).suncc
+ifeq ($(ZERO_BUILD), true)
+ PLATFORM_FILE = $(shell dirname $(shell dirname $(shell pwd)))/platform_zero
else
-PLATFORM_FILE = $(GAMMADIR)/make/$(OS_FAMILY)/platform_$(BUILDARCH)
+ ifdef USE_SUNCC
+ PLATFORM_FILE = $(GAMMADIR)/make/$(OS_FAMILY)/platform_$(BUILDARCH).suncc
+ else
+ PLATFORM_FILE = $(GAMMADIR)/make/$(OS_FAMILY)/platform_$(BUILDARCH)
+ endif
+endif
+
+# Allow overriding of the arch part of the directory but default
+# to BUILDARCH if nothing is specified
+ifeq ($(VARIANTARCH),)
+ VARIANTARCH=$(BUILDARCH)
endif
ifdef FORCE_TIERED
ifeq ($(VARIANT),tiered)
-PLATFORM_DIR = $(OS_FAMILY)_$(BUILDARCH)_compiler2
+PLATFORM_DIR = $(OS_FAMILY)_$(VARIANTARCH)_compiler2
else
-PLATFORM_DIR = $(OS_FAMILY)_$(BUILDARCH)_$(VARIANT)
+PLATFORM_DIR = $(OS_FAMILY)_$(VARIANTARCH)_$(VARIANT)
endif
else
-PLATFORM_DIR = $(OS_FAMILY)_$(BUILDARCH)_$(VARIANT)
+PLATFORM_DIR = $(OS_FAMILY)_$(VARIANTARCH)_$(VARIANT)
endif
#
@@ -321,6 +331,7 @@
DATA_MODE/sparcv9 = 64
DATA_MODE/amd64 = 64
DATA_MODE/ia64 = 64
+DATA_MODE/zero = $(ARCH_DATA_MODEL)
JAVA_FLAG/32 = -d32
JAVA_FLAG/64 = -d64
--- a/hotspot/make/linux/makefiles/defs.make Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/make/linux/makefiles/defs.make Tue Oct 13 12:04:21 2009 -0700
@@ -37,6 +37,17 @@
ARCH_DATA_MODEL ?= 32
endif
+# zero
+ifeq ($(ZERO_BUILD), true)
+ ifeq ($(ARCH_DATA_MODEL), 64)
+ MAKE_ARGS += LP64=1
+ endif
+ PLATFORM = linux-zero
+ VM_PLATFORM = linux_$(subst i386,i486,$(ZERO_LIBARCH))
+ HS_ARCH = zero
+ ARCH = zero
+endif
+
# ia64
ifeq ($(ARCH), ia64)
ARCH_DATA_MODEL = 64
@@ -97,17 +108,19 @@
EXPORT_LIST += $(EXPORT_SERVER_DIR)/Xusage.txt
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjsig.so
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.so
-ifeq ($(ARCH_DATA_MODEL), 32)
- EXPORT_CLIENT_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/client
- EXPORT_LIST += $(EXPORT_CLIENT_DIR)/Xusage.txt
- EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjsig.so
- EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.so
- EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.so
- EXPORT_LIST += $(EXPORT_LIB_DIR)/sa-jdi.jar
-else
- ifeq ($(ARCH),ia64)
- else
- EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.so
- EXPORT_LIST += $(EXPORT_LIB_DIR)/sa-jdi.jar
+ifneq ($(ZERO_BUILD), true)
+ ifeq ($(ARCH_DATA_MODEL), 32)
+ EXPORT_CLIENT_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/client
+ EXPORT_LIST += $(EXPORT_CLIENT_DIR)/Xusage.txt
+ EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjsig.so
+ EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.so
+ EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.so
+ EXPORT_LIST += $(EXPORT_LIB_DIR)/sa-jdi.jar
+ else
+ ifeq ($(ARCH),ia64)
+ else
+ EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.so
+ EXPORT_LIST += $(EXPORT_LIB_DIR)/sa-jdi.jar
endif
+ endif
endif
--- a/hotspot/make/linux/makefiles/gcc.make Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/make/linux/makefiles/gcc.make Tue Oct 13 12:04:21 2009 -0700
@@ -52,6 +52,9 @@
VM_PICFLAG/AOUT =
VM_PICFLAG = $(VM_PICFLAG/$(LINK_INTO))
+ifeq ($(ZERO_BUILD), true)
+CFLAGS += $(LIBFFI_CFLAGS)
+endif
CFLAGS += $(VM_PICFLAG)
CFLAGS += -fno-rtti
CFLAGS += -fno-exceptions
@@ -64,6 +67,7 @@
ARCHFLAG/ia64 =
ARCHFLAG/sparc = -m32 -mcpu=v9
ARCHFLAG/sparcv9 = -m64 -mcpu=v9
+ARCHFLAG/zero = $(ZERO_ARCHFLAG)
CFLAGS += $(ARCHFLAG)
AOUT_FLAGS += $(ARCHFLAG)
--- a/hotspot/make/linux/makefiles/sa.make Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/make/linux/makefiles/sa.make Tue Oct 13 12:04:21 2009 -0700
@@ -52,10 +52,10 @@
SA_PROPERTIES = $(SA_CLASSDIR)/sa.properties
# if $(AGENT_DIR) does not exist, we don't build SA
-# also, we don't build SA on Itanium.
+# also, we don't build SA on Itanium or zero.
all:
- if [ -d $(AGENT_DIR) -a "$(SRCARCH)" != "ia64" ] ; then \
+ if [ -d $(AGENT_DIR) -a "$(SRCARCH)" != "ia64" -a "$(SRCARCH)" != "zero" ] ; then \
$(MAKE) -f sa.make $(GENERATED)/sa-jdi.jar; \
fi
--- a/hotspot/make/linux/makefiles/saproc.make Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/make/linux/makefiles/saproc.make Tue Oct 13 12:04:21 2009 -0700
@@ -49,10 +49,10 @@
endif
# if $(AGENT_DIR) does not exist, we don't build SA
-# also, we don't build SA on Itanium.
+# also, we don't build SA on Itanium or zero.
checkAndBuildSA:
- $(QUIETLY) if [ -d $(AGENT_DIR) -a "$(SRCARCH)" != "ia64" ] ; then \
+ $(QUIETLY) if [ -d $(AGENT_DIR) -a "$(SRCARCH)" != "ia64" -a "$(SRCARCH)" != "zero" ] ; then \
$(MAKE) -f vm.make $(LIBSAPROC); \
fi
--- a/hotspot/make/linux/makefiles/top.make Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/make/linux/makefiles/top.make Tue Oct 13 12:04:21 2009 -0700
@@ -74,6 +74,7 @@
Include_DBs/COMPILER1 = $(Include_DBs/CORE) $(VM)/includeDB_compiler1
Include_DBs/COMPILER2 = $(Include_DBs/CORE) $(VM)/includeDB_compiler2
Include_DBs/TIERED = $(Include_DBs/CORE) $(VM)/includeDB_compiler1 $(VM)/includeDB_compiler2
+Include_DBs/ZERO = $(Include_DBs/CORE) $(VM)/includeDB_zero
Include_DBs = $(Include_DBs/$(TYPE))
Cached_plat = $(GENERATED)/platform.current
--- a/hotspot/make/linux/makefiles/vm.make Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/make/linux/makefiles/vm.make Tue Oct 13 12:04:21 2009 -0700
@@ -40,7 +40,11 @@
include $(GENERATED)/Dependencies
# read machine-specific adjustments (%%% should do this via buildtree.make?)
-include $(MAKEFILES_DIR)/$(BUILDARCH).make
+ifeq ($(ZERO_BUILD), true)
+ include $(MAKEFILES_DIR)/zeroshark.make
+else
+ include $(MAKEFILES_DIR)/$(BUILDARCH).make
+endif
# set VPATH so make knows where to look for source files
# Src_Dirs is everything in src/share/vm/*, plus the right os/*/vm and cpu/*/vm
@@ -124,7 +128,11 @@
rm -f $@
cat $^ > $@
-STATIC_CXX = true
+ifeq ($(ZERO_LIBARCH), ppc64)
+ STATIC_CXX = false
+else
+ STATIC_CXX = true
+endif
ifeq ($(LINK_INTO),AOUT)
LIBJVM.o =
@@ -148,6 +156,9 @@
LIBS_VM += $(LIBS)
endif
+ifeq ($(ZERO_BUILD), true)
+ LIBS_VM += $(LIBFFI_LIBS)
+endif
LINK_VM = $(LINK_LIB.c)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/make/linux/makefiles/zero.make Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,32 @@
+#
+# Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 2009 Red Hat, Inc.
+# 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+
+# Setup for Zero (non-Shark) version of VM
+
+# Select which includeDB files to use (in top.make)
+TYPE = ZERO
+
+# Install libjvm.so, etc in in server directory.
+VM_SUBDIR = server
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/make/linux/makefiles/zeroshark.make Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,43 @@
+#
+# Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 2007, 2008 Red Hat, Inc.
+# 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+#
+
+# Setup common to Zero (non-Shark) and Shark versions of VM
+
+# The copied fdlibm routines in sharedRuntimeTrig.o must not be optimized
+OPT_CFLAGS/sharedRuntimeTrig.o = $(OPT_CFLAGS/NOOPT)
+# The copied fdlibm routines in sharedRuntimeTrans.o must not be optimized
+OPT_CFLAGS/sharedRuntimeTrans.o = $(OPT_CFLAGS/NOOPT)
+
+# Specify that the CPU is little endian, if necessary
+ifeq ($(ZERO_ENDIANNESS), little)
+ CFLAGS += -DVM_LITTLE_ENDIAN
+endif
+
+# Specify that the CPU is 64 bit, if necessary
+ifeq ($(ARCH_DATA_MODEL), 64)
+ CFLAGS += -D_LP64=1
+endif
+
+OPT_CFLAGS/compactingPermGenGen.o = -O1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/make/linux/platform_zero.in Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,17 @@
+os_family = linux
+
+arch = zero
+
+arch_model = zero
+
+os_arch = linux_zero
+
+os_arch_model = linux_zero
+
+lib_arch = zero
+
+compiler = gcc
+
+gnu_dis_arch = zero
+
+sysdefs = -DLINUX -D_GNU_SOURCE -DCC_INTERP -DZERO -D@ZERO_ARCHDEF@ -DZERO_LIBARCH=\"@ZERO_LIBARCH@\"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/assembler_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_assembler_zero.cpp.incl"
+
+int AbstractAssembler::code_fill_byte() {
+ return 0;
+}
+
+void Assembler::pd_patch_instruction(address branch, address target) {
+ ShouldNotCallThis();
+}
+
+#ifndef PRODUCT
+void Assembler::pd_print_patched_instruction(address branch) {
+ ShouldNotCallThis();
+}
+#endif // PRODUCT
+
+void MacroAssembler::align(int modulus) {
+ while (offset() % modulus != 0)
+ emit_byte(AbstractAssembler::code_fill_byte());
+}
+
+void MacroAssembler::bang_stack_with_offset(int offset) {
+ ShouldNotCallThis();
+}
+
+void MacroAssembler::advance(int bytes) {
+ _code_pos += bytes;
+ sync();
+}
+
+RegisterOrConstant MacroAssembler::delayed_value_impl(
+ intptr_t* delayed_value_addr, Register tmpl, int offset) {
+ ShouldNotCallThis();
+}
+
+void MacroAssembler::store_oop(jobject obj) {
+ code_section()->relocate(pc(), oop_Relocation::spec_for_immediate());
+ emit_address((address) obj);
+}
+
+static void should_not_call() {
+ report_should_not_call(__FILE__, __LINE__);
+}
+
+address ShouldNotCallThisStub() {
+ return (address) should_not_call;
+}
+
+address ShouldNotCallThisEntry() {
+ return (address) should_not_call;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/assembler_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,64 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// In normal, CPU-specific ports of HotSpot these two classes are used
+// for generating assembly language. We don't do any of this in zero,
+// of course, but we do sneak entry points around in CodeBuffers so we
+// generate those here.
+
+class Assembler : public AbstractAssembler {
+ public:
+ Assembler(CodeBuffer* code) : AbstractAssembler(code) {}
+
+ public:
+ void pd_patch_instruction(address branch, address target);
+#ifndef PRODUCT
+ static void pd_print_patched_instruction(address branch);
+#endif // PRODUCT
+};
+
+class MacroAssembler : public Assembler {
+ public:
+ MacroAssembler(CodeBuffer* code) : Assembler(code) {}
+
+ public:
+ void align(int modulus);
+ void bang_stack_with_offset(int offset);
+ bool needs_explicit_null_check(intptr_t offset);
+ RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr,
+ Register tmp, int offset);
+ public:
+ void advance(int bytes);
+ void store_oop(jobject obj);
+};
+
+#ifdef ASSERT
+inline bool AbstractAssembler::pd_check_instruction_mark() {
+ ShouldNotCallThis();
+}
+#endif
+
+address ShouldNotCallThisStub();
+address ShouldNotCallThisEntry();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/assembler_zero.inline.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/bytecodeInterpreter_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_cppInterpreter_zero.cpp.incl"
+
+#ifdef CC_INTERP
+
+const char *BytecodeInterpreter::name_of_field_at_address(address addr) {
+#define DO(member) {if (addr == (address) &(member)) return XSTR(member);}
+ DO(_thread);
+ DO(_bcp);
+ DO(_locals);
+ DO(_constants);
+ DO(_method);
+ DO(_mdx);
+ DO(_stack);
+ DO(_msg);
+ DO(_result);
+ DO(_prev_link);
+ DO(_oop_temp);
+ DO(_stack_base);
+ DO(_stack_limit);
+ DO(_monitor_base);
+ DO(_self_link);
+#undef DO
+ if (addr > (address) &_result && addr < (address) (&_result + 1))
+ return "_result)";
+ return NULL;
+}
+
+#endif // CC_INTERP
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/bytecodeInterpreter_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2002 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// Platform specific for C++ based Interpreter
+
+#if defined(PPC) || defined(SPARC) || defined(IA64)
+#define LOTS_OF_REGS // Use plenty of registers
+#else
+#undef LOTS_OF_REGS // Loser platforms
+#endif
+
+ private:
+ interpreterState _self_link;
+
+ public:
+ inline void set_locals(intptr_t* new_locals) {
+ _locals = new_locals;
+ }
+ inline void set_method(methodOop new_method) {
+ _method = new_method;
+ }
+ inline interpreterState self_link() {
+ return _self_link;
+ }
+ inline void set_self_link(interpreterState new_self_link) {
+ _self_link = new_self_link;
+ }
+ inline interpreterState prev_link() {
+ return _prev_link;
+ }
+ inline void set_prev_link(interpreterState new_prev_link) {
+ _prev_link = new_prev_link;
+ }
+ inline void set_stack_limit(intptr_t* new_stack_limit) {
+ _stack_limit = new_stack_limit;
+ }
+ inline void set_stack_base(intptr_t* new_stack_base) {
+ _stack_base = new_stack_base;
+ }
+ inline void set_monitor_base(BasicObjectLock *new_monitor_base) {
+ _monitor_base = new_monitor_base;
+ }
+ inline void set_thread(JavaThread* new_thread) {
+ _thread = new_thread;
+ }
+ inline void set_constants(constantPoolCacheOop new_constants) {
+ _constants = new_constants;
+ }
+ inline oop oop_temp() {
+ return _oop_temp;
+ }
+ inline oop *oop_temp_addr() {
+ return &_oop_temp;
+ }
+ inline void set_oop_temp(oop new_oop_temp) {
+ _oop_temp = new_oop_temp;
+ }
+ inline address callee_entry_point() {
+ return _result._to_call._callee_entry_point;
+ }
+ inline address osr_buf() {
+ return _result._osr._osr_buf;
+ }
+ inline address osr_entry() {
+ return _result._osr._osr_entry;
+ }
+
+ public:
+ const char *name_of_field_at_address(address addr);
+
+// The frame manager handles this
+#define SET_LAST_JAVA_FRAME()
+#define RESET_LAST_JAVA_FRAME()
+
+// ZeroStack Implementation
+
+#undef STACK_INT
+#undef STACK_FLOAT
+#undef STACK_ADDR
+#undef STACK_OBJECT
+#undef STACK_DOUBLE
+#undef STACK_LONG
+
+#define GET_STACK_SLOT(offset) (*((intptr_t*) &topOfStack[-(offset)]))
+#define STACK_SLOT(offset) ((address) &topOfStack[-(offset)])
+#define STACK_ADDR(offset) (*((address *) &topOfStack[-(offset)]))
+#define STACK_INT(offset) (*((jint*) &topOfStack[-(offset)]))
+#define STACK_FLOAT(offset) (*((jfloat *) &topOfStack[-(offset)]))
+#define STACK_OBJECT(offset) (*((oop *) &topOfStack [-(offset)]))
+#define STACK_DOUBLE(offset) (((VMJavaVal64*) &topOfStack[-(offset)])->d)
+#define STACK_LONG(offset) (((VMJavaVal64 *) &topOfStack[-(offset)])->l)
+
+#define SET_STACK_SLOT(value, offset) (*(intptr_t*)&topOfStack[-(offset)] = *(intptr_t*)(value))
+#define SET_STACK_ADDR(value, offset) (*((address *)&topOfStack[-(offset)]) = (value))
+#define SET_STACK_INT(value, offset) (*((jint *)&topOfStack[-(offset)]) = (value))
+#define SET_STACK_FLOAT(value, offset) (*((jfloat *)&topOfStack[-(offset)]) = (value))
+#define SET_STACK_OBJECT(value, offset) (*((oop *)&topOfStack[-(offset)]) = (value))
+#define SET_STACK_DOUBLE(value, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->d = (value))
+#define SET_STACK_DOUBLE_FROM_ADDR(addr, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->d = \
+ ((VMJavaVal64*)(addr))->d)
+#define SET_STACK_LONG(value, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->l = (value))
+#define SET_STACK_LONG_FROM_ADDR(addr, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->l = \
+ ((VMJavaVal64*)(addr))->l)
+// JavaLocals implementation
+
+#define LOCALS_SLOT(offset) ((intptr_t*)&locals[-(offset)])
+#define LOCALS_ADDR(offset) ((address)locals[-(offset)])
+#define LOCALS_INT(offset) (*((jint*)&locals[-(offset)]))
+#define LOCALS_FLOAT(offset) (*((jfloat*)&locals[-(offset)]))
+#define LOCALS_OBJECT(offset) ((oop)locals[-(offset)])
+#define LOCALS_DOUBLE(offset) (((VMJavaVal64*)&locals[-((offset) + 1)])->d)
+#define LOCALS_LONG(offset) (((VMJavaVal64*)&locals[-((offset) + 1)])->l)
+#define LOCALS_LONG_AT(offset) (((address)&locals[-((offset) + 1)]))
+#define LOCALS_DOUBLE_AT(offset) (((address)&locals[-((offset) + 1)]))
+
+#define SET_LOCALS_SLOT(value, offset) (*(intptr_t*)&locals[-(offset)] = *(intptr_t *)(value))
+#define SET_LOCALS_ADDR(value, offset) (*((address *)&locals[-(offset)]) = (value))
+#define SET_LOCALS_INT(value, offset) (*((jint *)&locals[-(offset)]) = (value))
+#define SET_LOCALS_FLOAT(value, offset) (*((jfloat *)&locals[-(offset)]) = (value))
+#define SET_LOCALS_OBJECT(value, offset) (*((oop *)&locals[-(offset)]) = (value))
+#define SET_LOCALS_DOUBLE(value, offset) (((VMJavaVal64*)&locals[-((offset)+1)])->d = (value))
+#define SET_LOCALS_LONG(value, offset) (((VMJavaVal64*)&locals[-((offset)+1)])->l = (value))
+#define SET_LOCALS_DOUBLE_FROM_ADDR(addr, offset) (((VMJavaVal64*)&locals[-((offset)+1)])->d = \
+ ((VMJavaVal64*)(addr))->d)
+#define SET_LOCALS_LONG_FROM_ADDR(addr, offset) (((VMJavaVal64*)&locals[-((offset)+1)])->l = \
+ ((VMJavaVal64*)(addr))->l)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/bytecodeInterpreter_zero.inline.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,301 @@
+/*
+ * Copyright 2002 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// Inline interpreter functions for zero
+
+inline jfloat BytecodeInterpreter::VMfloatAdd(jfloat op1, jfloat op2) {
+ return op1 + op2;
+}
+
+inline jfloat BytecodeInterpreter::VMfloatSub(jfloat op1, jfloat op2) {
+ return op1 - op2;
+}
+
+inline jfloat BytecodeInterpreter::VMfloatMul(jfloat op1, jfloat op2) {
+ return op1 * op2;
+}
+
+inline jfloat BytecodeInterpreter::VMfloatDiv(jfloat op1, jfloat op2) {
+ return op1 / op2;
+}
+
+inline jfloat BytecodeInterpreter::VMfloatRem(jfloat op1, jfloat op2) {
+ return fmod(op1, op2);
+}
+
+inline jfloat BytecodeInterpreter::VMfloatNeg(jfloat op) {
+ return -op;
+}
+
+inline int32_t BytecodeInterpreter::VMfloatCompare(jfloat op1,
+ jfloat op2,
+ int32_t direction) {
+ return ( op1 < op2 ? -1 :
+ op1 > op2 ? 1 :
+ op1 == op2 ? 0 :
+ (direction == -1 || direction == 1) ? direction : 0);
+
+}
+
+inline void BytecodeInterpreter::VMmemCopy64(uint32_t to[2],
+ const uint32_t from[2]) {
+ *(uint64_t *) to = *(uint64_t *) from;
+}
+
+inline jlong BytecodeInterpreter::VMlongAdd(jlong op1, jlong op2) {
+ return op1 + op2;
+}
+
+inline jlong BytecodeInterpreter::VMlongAnd(jlong op1, jlong op2) {
+ return op1 & op2;
+}
+
+inline jlong BytecodeInterpreter::VMlongDiv(jlong op1, jlong op2) {
+ /* it's possible we could catch this special case implicitly */
+ if (op1 == (jlong) 0x8000000000000000LL && op2 == -1) return op1;
+ else return op1 / op2;
+}
+
+inline jlong BytecodeInterpreter::VMlongMul(jlong op1, jlong op2) {
+ return op1 * op2;
+}
+
+inline jlong BytecodeInterpreter::VMlongOr(jlong op1, jlong op2) {
+ return op1 | op2;
+}
+
+inline jlong BytecodeInterpreter::VMlongSub(jlong op1, jlong op2) {
+ return op1 - op2;
+}
+
+inline jlong BytecodeInterpreter::VMlongXor(jlong op1, jlong op2) {
+ return op1 ^ op2;
+}
+
+inline jlong BytecodeInterpreter::VMlongRem(jlong op1, jlong op2) {
+ /* it's possible we could catch this special case implicitly */
+ if (op1 == (jlong) 0x8000000000000000LL && op2 == -1) return 0;
+ else return op1 % op2;
+}
+
+inline jlong BytecodeInterpreter::VMlongUshr(jlong op1, jint op2) {
+ return ((unsigned long long) op1) >> (op2 & 0x3F);
+}
+
+inline jlong BytecodeInterpreter::VMlongShr(jlong op1, jint op2) {
+ return op1 >> (op2 & 0x3F);
+}
+
+inline jlong BytecodeInterpreter::VMlongShl(jlong op1, jint op2) {
+ return op1 << (op2 & 0x3F);
+}
+
+inline jlong BytecodeInterpreter::VMlongNeg(jlong op) {
+ return -op;
+}
+
+inline jlong BytecodeInterpreter::VMlongNot(jlong op) {
+ return ~op;
+}
+
+inline int32_t BytecodeInterpreter::VMlongLtz(jlong op) {
+ return (op <= 0);
+}
+
+inline int32_t BytecodeInterpreter::VMlongGez(jlong op) {
+ return (op >= 0);
+}
+
+inline int32_t BytecodeInterpreter::VMlongEqz(jlong op) {
+ return (op == 0);
+}
+
+inline int32_t BytecodeInterpreter::VMlongEq(jlong op1, jlong op2) {
+ return (op1 == op2);
+}
+
+inline int32_t BytecodeInterpreter::VMlongNe(jlong op1, jlong op2) {
+ return (op1 != op2);
+}
+
+inline int32_t BytecodeInterpreter::VMlongGe(jlong op1, jlong op2) {
+ return (op1 >= op2);
+}
+
+inline int32_t BytecodeInterpreter::VMlongLe(jlong op1, jlong op2) {
+ return (op1 <= op2);
+}
+
+inline int32_t BytecodeInterpreter::VMlongLt(jlong op1, jlong op2) {
+ return (op1 < op2);
+}
+
+inline int32_t BytecodeInterpreter::VMlongGt(jlong op1, jlong op2) {
+ return (op1 > op2);
+}
+
+inline int32_t BytecodeInterpreter::VMlongCompare(jlong op1, jlong op2) {
+ return (VMlongLt(op1, op2) ? -1 : VMlongGt(op1, op2) ? 1 : 0);
+}
+
+// Long conversions
+
+inline jdouble BytecodeInterpreter::VMlong2Double(jlong val) {
+ return (jdouble) val;
+}
+
+inline jfloat BytecodeInterpreter::VMlong2Float(jlong val) {
+ return (jfloat) val;
+}
+
+inline jint BytecodeInterpreter::VMlong2Int(jlong val) {
+ return (jint) val;
+}
+
+// Double Arithmetic
+
+inline jdouble BytecodeInterpreter::VMdoubleAdd(jdouble op1, jdouble op2) {
+ return op1 + op2;
+}
+
+inline jdouble BytecodeInterpreter::VMdoubleDiv(jdouble op1, jdouble op2) {
+ // Divide by zero... QQQ
+ return op1 / op2;
+}
+
+inline jdouble BytecodeInterpreter::VMdoubleMul(jdouble op1, jdouble op2) {
+ return op1 * op2;
+}
+
+inline jdouble BytecodeInterpreter::VMdoubleNeg(jdouble op) {
+ return -op;
+}
+
+inline jdouble BytecodeInterpreter::VMdoubleRem(jdouble op1, jdouble op2) {
+ return fmod(op1, op2);
+}
+
+inline jdouble BytecodeInterpreter::VMdoubleSub(jdouble op1, jdouble op2) {
+ return op1 - op2;
+}
+
+inline int32_t BytecodeInterpreter::VMdoubleCompare(jdouble op1,
+ jdouble op2,
+ int32_t direction) {
+ return ( op1 < op2 ? -1 :
+ op1 > op2 ? 1 :
+ op1 == op2 ? 0 :
+ (direction == -1 || direction == 1) ? direction : 0);
+}
+
+// Double Conversions
+
+inline jfloat BytecodeInterpreter::VMdouble2Float(jdouble val) {
+ return (jfloat) val;
+}
+
+// Float Conversions
+
+inline jdouble BytecodeInterpreter::VMfloat2Double(jfloat op) {
+ return (jdouble) op;
+}
+
+// Integer Arithmetic
+
+inline jint BytecodeInterpreter::VMintAdd(jint op1, jint op2) {
+ return op1 + op2;
+}
+
+inline jint BytecodeInterpreter::VMintAnd(jint op1, jint op2) {
+ return op1 & op2;
+}
+
+inline jint BytecodeInterpreter::VMintDiv(jint op1, jint op2) {
+ /* it's possible we could catch this special case implicitly */
+ if (op1 == (jint) 0x80000000 && op2 == -1) return op1;
+ else return op1 / op2;
+}
+
+inline jint BytecodeInterpreter::VMintMul(jint op1, jint op2) {
+ return op1 * op2;
+}
+
+inline jint BytecodeInterpreter::VMintNeg(jint op) {
+ return -op;
+}
+
+inline jint BytecodeInterpreter::VMintOr(jint op1, jint op2) {
+ return op1 | op2;
+}
+
+inline jint BytecodeInterpreter::VMintRem(jint op1, jint op2) {
+ /* it's possible we could catch this special case implicitly */
+ if (op1 == (jint) 0x80000000 && op2 == -1) return 0;
+ else return op1 % op2;
+}
+
+inline jint BytecodeInterpreter::VMintShl(jint op1, jint op2) {
+ return op1 << (op2 & 0x1F);
+}
+
+inline jint BytecodeInterpreter::VMintShr(jint op1, jint op2) {
+ return op1 >> (op2 & 0x1F);
+}
+
+inline jint BytecodeInterpreter::VMintSub(jint op1, jint op2) {
+ return op1 - op2;
+}
+
+inline jint BytecodeInterpreter::VMintUshr(jint op1, jint op2) {
+ return ((juint) op1) >> (op2 & 0x1F);
+}
+
+inline jint BytecodeInterpreter::VMintXor(jint op1, jint op2) {
+ return op1 ^ op2;
+}
+
+inline jdouble BytecodeInterpreter::VMint2Double(jint val) {
+ return (jdouble) val;
+}
+
+inline jfloat BytecodeInterpreter::VMint2Float(jint val) {
+ return (jfloat) val;
+}
+
+inline jlong BytecodeInterpreter::VMint2Long(jint val) {
+ return (jlong) val;
+}
+
+inline jchar BytecodeInterpreter::VMint2Char(jint val) {
+ return (jchar) val;
+}
+
+inline jshort BytecodeInterpreter::VMint2Short(jint val) {
+ return (jshort) val;
+}
+
+inline jbyte BytecodeInterpreter::VMint2Byte(jint val) {
+ return (jbyte) val;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/bytecodes_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_bytecodes_zero.cpp.incl"
+
+void Bytecodes::pd_initialize() {
+ // No zero specific initialization
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/bytecodes_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/bytes_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,164 @@
+/*
+ * Copyright 1997-2002 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+typedef union unaligned {
+ u4 u;
+ u2 us;
+ u8 ul;
+} __attribute__((packed)) unaligned;
+
+class Bytes: AllStatic {
+ public:
+ // Returns true if the byte ordering used by Java is different
+ // from the native byte ordering of the underlying machine.
+ static inline bool is_Java_byte_ordering_different() {
+#ifdef VM_LITTLE_ENDIAN
+ return true;
+#else
+ return false;
+#endif
+ }
+
+ // Efficient reading and writing of unaligned unsigned data in
+ // platform-specific byte ordering.
+ static inline u2 get_native_u2(address p){
+ unaligned *up = (unaligned *) p;
+ return up->us;
+ }
+
+ static inline u4 get_native_u4(address p) {
+ unaligned *up = (unaligned *) p;
+ return up->u;
+ }
+
+ static inline u8 get_native_u8(address p) {
+ unaligned *up = (unaligned *) p;
+ return up->ul;
+ }
+
+ static inline void put_native_u2(address p, u2 x) {
+ unaligned *up = (unaligned *) p;
+ up->us = x;
+ }
+
+ static inline void put_native_u4(address p, u4 x) {
+ unaligned *up = (unaligned *) p;
+ up->u = x;
+ }
+
+ static inline void put_native_u8(address p, u8 x) {
+ unaligned *up = (unaligned *) p;
+ up->ul = x;
+ }
+
+ // Efficient reading and writing of unaligned unsigned data in Java
+ // byte ordering (i.e. big-endian ordering).
+#ifdef VM_LITTLE_ENDIAN
+ // Byte-order reversal is needed
+ static inline u2 get_Java_u2(address p) {
+ return (u2(p[0]) << 8) |
+ (u2(p[1]) );
+ }
+ static inline u4 get_Java_u4(address p) {
+ return (u4(p[0]) << 24) |
+ (u4(p[1]) << 16) |
+ (u4(p[2]) << 8) |
+ (u4(p[3]) );
+ }
+ static inline u8 get_Java_u8(address p) {
+ u4 hi, lo;
+ hi = (u4(p[0]) << 24) |
+ (u4(p[1]) << 16) |
+ (u4(p[2]) << 8) |
+ (u4(p[3]) );
+ lo = (u4(p[4]) << 24) |
+ (u4(p[5]) << 16) |
+ (u4(p[6]) << 8) |
+ (u4(p[7]) );
+ return u8(lo) | (u8(hi) << 32);
+ }
+
+ static inline void put_Java_u2(address p, u2 x) {
+ p[0] = x >> 8;
+ p[1] = x;
+ }
+ static inline void put_Java_u4(address p, u4 x) {
+ p[0] = x >> 24;
+ p[1] = x >> 16;
+ p[2] = x >> 8;
+ p[3] = x;
+ }
+ static inline void put_Java_u8(address p, u8 x) {
+ u4 hi, lo;
+ lo = x;
+ hi = x >> 32;
+ p[0] = hi >> 24;
+ p[1] = hi >> 16;
+ p[2] = hi >> 8;
+ p[3] = hi;
+ p[4] = lo >> 24;
+ p[5] = lo >> 16;
+ p[6] = lo >> 8;
+ p[7] = lo;
+ }
+
+ // Efficient swapping of byte ordering
+ static inline u2 swap_u2(u2 x);
+ static inline u4 swap_u4(u4 x);
+ static inline u8 swap_u8(u8 x);
+#else
+ // No byte-order reversal is needed
+ static inline u2 get_Java_u2(address p) {
+ return get_native_u2(p);
+ }
+ static inline u4 get_Java_u4(address p) {
+ return get_native_u4(p);
+ }
+ static inline u8 get_Java_u8(address p) {
+ return get_native_u8(p);
+ }
+
+ static inline void put_Java_u2(address p, u2 x) {
+ put_native_u2(p, x);
+ }
+ static inline void put_Java_u4(address p, u4 x) {
+ put_native_u4(p, x);
+ }
+ static inline void put_Java_u8(address p, u8 x) {
+ put_native_u8(p, x);
+ }
+
+ // No byte-order reversal is needed
+ static inline u2 swap_u2(u2 x) { return x; }
+ static inline u4 swap_u4(u4 x) { return x; }
+ static inline u8 swap_u8(u8 x) { return x; }
+#endif // VM_LITTLE_ENDIAN
+};
+
+#ifdef VM_LITTLE_ENDIAN
+// The following header contains the implementations of swap_u2,
+// swap_u4, and swap_u8
+#include "incls/_bytes_pd.inline.hpp.incl"
+#endif // VM_LITTLE_ENDIAN
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/codeBuffer_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+ private:
+ void pd_initialize() {}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/copy_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,178 @@
+/*
+ * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// Inline functions for memory copy and fill.
+
+static void pd_conjoint_words(HeapWord* from, HeapWord* to, size_t count) {
+ memmove(to, from, count * HeapWordSize);
+}
+
+static void pd_disjoint_words(HeapWord* from, HeapWord* to, size_t count) {
+ switch (count) {
+ case 8: to[7] = from[7];
+ case 7: to[6] = from[6];
+ case 6: to[5] = from[5];
+ case 5: to[4] = from[4];
+ case 4: to[3] = from[3];
+ case 3: to[2] = from[2];
+ case 2: to[1] = from[1];
+ case 1: to[0] = from[0];
+ case 0: break;
+ default:
+ memcpy(to, from, count * HeapWordSize);
+ break;
+ }
+}
+
+static void pd_disjoint_words_atomic(HeapWord* from,
+ HeapWord* to,
+ size_t count) {
+ switch (count) {
+ case 8: to[7] = from[7];
+ case 7: to[6] = from[6];
+ case 6: to[5] = from[5];
+ case 5: to[4] = from[4];
+ case 4: to[3] = from[3];
+ case 3: to[2] = from[2];
+ case 2: to[1] = from[1];
+ case 1: to[0] = from[0];
+ case 0: break;
+ default:
+ while (count-- > 0) {
+ *to++ = *from++;
+ }
+ break;
+ }
+}
+
+static void pd_aligned_conjoint_words(HeapWord* from,
+ HeapWord* to,
+ size_t count) {
+ memmove(to, from, count * HeapWordSize);
+}
+
+static void pd_aligned_disjoint_words(HeapWord* from,
+ HeapWord* to,
+ size_t count) {
+ pd_disjoint_words(from, to, count);
+}
+
+static void pd_conjoint_bytes(void* from, void* to, size_t count) {
+ memmove(to, from, count);
+}
+
+static void pd_conjoint_bytes_atomic(void* from, void* to, size_t count) {
+ memmove(to, from, count);
+}
+
+static void pd_conjoint_jshorts_atomic(jshort* from, jshort* to, size_t count) {
+ _Copy_conjoint_jshorts_atomic(from, to, count);
+}
+
+static void pd_conjoint_jints_atomic(jint* from, jint* to, size_t count) {
+ _Copy_conjoint_jints_atomic(from, to, count);
+}
+
+static void pd_conjoint_jlongs_atomic(jlong* from, jlong* to, size_t count) {
+ _Copy_conjoint_jlongs_atomic(from, to, count);
+}
+
+static void pd_conjoint_oops_atomic(oop* from, oop* to, size_t count) {
+#ifdef _LP64
+ assert(BytesPerLong == BytesPerOop, "jlongs and oops must be the same size");
+ _Copy_conjoint_jlongs_atomic((jlong*)from, (jlong*)to, count);
+#else
+ assert(BytesPerInt == BytesPerOop, "jints and oops must be the same size");
+ _Copy_conjoint_jints_atomic((jint*)from, (jint*)to, count);
+#endif // _LP64
+}
+
+static void pd_arrayof_conjoint_bytes(HeapWord* from,
+ HeapWord* to,
+ size_t count) {
+ _Copy_arrayof_conjoint_bytes(from, to, count);
+}
+
+static void pd_arrayof_conjoint_jshorts(HeapWord* from,
+ HeapWord* to,
+ size_t count) {
+ _Copy_arrayof_conjoint_jshorts(from, to, count);
+}
+
+static void pd_arrayof_conjoint_jints(HeapWord* from,
+ HeapWord* to,
+ size_t count) {
+ _Copy_arrayof_conjoint_jints(from, to, count);
+}
+
+static void pd_arrayof_conjoint_jlongs(HeapWord* from,
+ HeapWord* to,
+ size_t count) {
+ _Copy_arrayof_conjoint_jlongs(from, to, count);
+}
+
+static void pd_arrayof_conjoint_oops(HeapWord* from,
+ HeapWord* to,
+ size_t count) {
+#ifdef _LP64
+ assert(BytesPerLong == BytesPerOop, "jlongs and oops must be the same size");
+ _Copy_arrayof_conjoint_jlongs(from, to, count);
+#else
+ assert(BytesPerInt == BytesPerOop, "jints and oops must be the same size");
+ _Copy_arrayof_conjoint_jints(from, to, count);
+#endif // _LP64
+}
+
+static void pd_fill_to_words(HeapWord* tohw, size_t count, juint value) {
+#ifdef _LP64
+ julong* to = (julong*) tohw;
+ julong v = ((julong) value << 32) | value;
+#else
+ juint* to = (juint*) tohw;
+ juint v = value;
+#endif // _LP64
+
+ while (count-- > 0) {
+ *to++ = v;
+ }
+}
+
+static void pd_fill_to_aligned_words(HeapWord* tohw,
+ size_t count,
+ juint value) {
+ pd_fill_to_words(tohw, count, value);
+}
+
+static void pd_fill_to_bytes(void* to, size_t count, jubyte value) {
+ memset(to, value, count);
+}
+
+static void pd_zero_to_words(HeapWord* tohw, size_t count) {
+ pd_fill_to_words(tohw, count, 0);
+}
+
+static void pd_zero_to_bytes(void* to, size_t count) {
+ memset(to, 0, count);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/cppInterpreterGenerator_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2008, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+ protected:
+ MacroAssembler* assembler() const {
+ return _masm;
+ }
+
+ protected:
+ address generate_entry(address entry_point) {
+ ZeroEntry *entry = (ZeroEntry *) assembler()->pc();
+ assembler()->advance(sizeof(ZeroEntry));
+ entry->set_entry_point(entry_point);
+ return (address) entry;
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,946 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_cppInterpreter_zero.cpp.incl"
+
+#ifdef CC_INTERP
+
+#define fixup_after_potential_safepoint() \
+ method = istate->method()
+
+#define CALL_VM_NOCHECK(func) \
+ thread->set_last_Java_frame(); \
+ func; \
+ thread->reset_last_Java_frame(); \
+ fixup_after_potential_safepoint()
+
+void CppInterpreter::normal_entry(methodOop method, intptr_t UNUSED, TRAPS) {
+ JavaThread *thread = (JavaThread *) THREAD;
+ ZeroStack *stack = thread->zero_stack();
+
+ // Adjust the caller's stack frame to accomodate any additional
+ // local variables we have contiguously with our parameters.
+ int extra_locals = method->max_locals() - method->size_of_parameters();
+ if (extra_locals > 0) {
+ if (extra_locals > stack->available_words()) {
+ Unimplemented();
+ }
+ for (int i = 0; i < extra_locals; i++)
+ stack->push(0);
+ }
+
+ // Allocate and initialize our frame.
+ InterpreterFrame *frame = InterpreterFrame::build(stack, method, thread);
+ thread->push_zero_frame(frame);
+
+ // Execute those bytecodes!
+ main_loop(0, THREAD);
+}
+
+void CppInterpreter::main_loop(int recurse, TRAPS) {
+ JavaThread *thread = (JavaThread *) THREAD;
+ ZeroStack *stack = thread->zero_stack();
+
+ // If we are entering from a deopt we may need to call
+ // ourself a few times in order to get to our frame.
+ if (recurse)
+ main_loop(recurse - 1, THREAD);
+
+ InterpreterFrame *frame = thread->top_zero_frame()->as_interpreter_frame();
+ interpreterState istate = frame->interpreter_state();
+ methodOop method = istate->method();
+
+ intptr_t *result = NULL;
+ int result_slots = 0;
+
+ // Check we're not about to run out of stack
+ if (stack_overflow_imminent(thread)) {
+ CALL_VM_NOCHECK(InterpreterRuntime::throw_StackOverflowError(thread));
+ goto unwind_and_return;
+ }
+
+ while (true) {
+ // We can set up the frame anchor with everything we want at
+ // this point as we are thread_in_Java and no safepoints can
+ // occur until we go to vm mode. We do have to clear flags
+ // on return from vm but that is it.
+ thread->set_last_Java_frame();
+
+ // Call the interpreter
+ if (JvmtiExport::can_post_interpreter_events())
+ BytecodeInterpreter::runWithChecks(istate);
+ else
+ BytecodeInterpreter::run(istate);
+ fixup_after_potential_safepoint();
+
+ // Clear the frame anchor
+ thread->reset_last_Java_frame();
+
+ // Examine the message from the interpreter to decide what to do
+ if (istate->msg() == BytecodeInterpreter::call_method) {
+ methodOop callee = istate->callee();
+
+ // Trim back the stack to put the parameters at the top
+ stack->set_sp(istate->stack() + 1);
+
+ // Make the call
+ Interpreter::invoke_method(callee, istate->callee_entry_point(), THREAD);
+ fixup_after_potential_safepoint();
+
+ // Convert the result
+ istate->set_stack(stack->sp() - 1);
+
+ // Restore the stack
+ stack->set_sp(istate->stack_limit() + 1);
+
+ // Resume the interpreter
+ istate->set_msg(BytecodeInterpreter::method_resume);
+ }
+ else if (istate->msg() == BytecodeInterpreter::more_monitors) {
+ int monitor_words = frame::interpreter_frame_monitor_size();
+
+ // Allocate the space
+ if (monitor_words > stack->available_words()) {
+ Unimplemented();
+ }
+ stack->alloc(monitor_words * wordSize);
+
+ // Move the expression stack contents
+ for (intptr_t *p = istate->stack() + 1; p < istate->stack_base(); p++)
+ *(p - monitor_words) = *p;
+
+ // Move the expression stack pointers
+ istate->set_stack_limit(istate->stack_limit() - monitor_words);
+ istate->set_stack(istate->stack() - monitor_words);
+ istate->set_stack_base(istate->stack_base() - monitor_words);
+
+ // Zero the new monitor so the interpreter can find it.
+ ((BasicObjectLock *) istate->stack_base())->set_obj(NULL);
+
+ // Resume the interpreter
+ istate->set_msg(BytecodeInterpreter::got_monitors);
+ }
+ else if (istate->msg() == BytecodeInterpreter::return_from_method) {
+ // Copy the result into the caller's frame
+ result_slots = type2size[method->result_type()];
+ assert(result_slots >= 0 && result_slots <= 2, "what?");
+ result = istate->stack() + result_slots;
+ break;
+ }
+ else if (istate->msg() == BytecodeInterpreter::throwing_exception) {
+ assert(HAS_PENDING_EXCEPTION, "should do");
+ break;
+ }
+ else if (istate->msg() == BytecodeInterpreter::do_osr) {
+ // Unwind the current frame
+ thread->pop_zero_frame();
+
+ // Remove any extension of the previous frame
+ int extra_locals = method->max_locals() - method->size_of_parameters();
+ stack->set_sp(stack->sp() + extra_locals);
+
+ // Jump into the OSR method
+ Interpreter::invoke_osr(
+ method, istate->osr_entry(), istate->osr_buf(), THREAD);
+ return;
+ }
+ else {
+ ShouldNotReachHere();
+ }
+ }
+
+ unwind_and_return:
+
+ // Unwind the current frame
+ thread->pop_zero_frame();
+
+ // Pop our local variables
+ stack->set_sp(stack->sp() + method->max_locals());
+
+ // Push our result
+ for (int i = 0; i < result_slots; i++)
+ stack->push(result[-i]);
+}
+
+void CppInterpreter::native_entry(methodOop method, intptr_t UNUSED, TRAPS) {
+ // Make sure method is native and not abstract
+ assert(method->is_native() && !method->is_abstract(), "should be");
+
+ JavaThread *thread = (JavaThread *) THREAD;
+ ZeroStack *stack = thread->zero_stack();
+
+ // Allocate and initialize our frame
+ InterpreterFrame *frame = InterpreterFrame::build(stack, method, thread);
+ thread->push_zero_frame(frame);
+ interpreterState istate = frame->interpreter_state();
+ intptr_t *locals = istate->locals();
+
+ // Check we're not about to run out of stack
+ if (stack_overflow_imminent(thread)) {
+ CALL_VM_NOCHECK(InterpreterRuntime::throw_StackOverflowError(thread));
+ goto unwind_and_return;
+ }
+
+ // Lock if necessary
+ BasicObjectLock *monitor;
+ monitor = NULL;
+ if (method->is_synchronized()) {
+ monitor = (BasicObjectLock*) istate->stack_base();
+ oop lockee = monitor->obj();
+ markOop disp = lockee->mark()->set_unlocked();
+
+ monitor->lock()->set_displaced_header(disp);
+ if (Atomic::cmpxchg_ptr(monitor, lockee->mark_addr(), disp) != disp) {
+ if (thread->is_lock_owned((address) disp->clear_lock_bits())) {
+ monitor->lock()->set_displaced_header(NULL);
+ }
+ else {
+ CALL_VM_NOCHECK(InterpreterRuntime::monitorenter(thread, monitor));
+ if (HAS_PENDING_EXCEPTION)
+ goto unwind_and_return;
+ }
+ }
+ }
+
+ // Get the signature handler
+ InterpreterRuntime::SignatureHandler *handler; {
+ address handlerAddr = method->signature_handler();
+ if (handlerAddr == NULL) {
+ CALL_VM_NOCHECK(InterpreterRuntime::prepare_native_call(thread, method));
+ if (HAS_PENDING_EXCEPTION)
+ goto unwind_and_return;
+
+ handlerAddr = method->signature_handler();
+ assert(handlerAddr != NULL, "eh?");
+ }
+ if (handlerAddr == (address) InterpreterRuntime::slow_signature_handler) {
+ CALL_VM_NOCHECK(handlerAddr =
+ InterpreterRuntime::slow_signature_handler(thread, method, NULL,NULL));
+ if (HAS_PENDING_EXCEPTION)
+ goto unwind_and_return;
+ }
+ handler = \
+ InterpreterRuntime::SignatureHandler::from_handlerAddr(handlerAddr);
+ }
+
+ // Get the native function entry point
+ address function;
+ function = method->native_function();
+ assert(function != NULL, "should be set if signature handler is");
+
+ // Build the argument list
+ if (handler->argument_count() * 2 > stack->available_words()) {
+ Unimplemented();
+ }
+ void **arguments;
+ void *mirror; {
+ arguments =
+ (void **) stack->alloc(handler->argument_count() * sizeof(void **));
+ void **dst = arguments;
+
+ void *env = thread->jni_environment();
+ *(dst++) = &env;
+
+ if (method->is_static()) {
+ istate->set_oop_temp(
+ method->constants()->pool_holder()->klass_part()->java_mirror());
+ mirror = istate->oop_temp_addr();
+ *(dst++) = &mirror;
+ }
+
+ intptr_t *src = locals;
+ for (int i = dst - arguments; i < handler->argument_count(); i++) {
+ ffi_type *type = handler->argument_type(i);
+ if (type == &ffi_type_pointer) {
+ if (*src) {
+ stack->push((intptr_t) src);
+ *(dst++) = stack->sp();
+ }
+ else {
+ *(dst++) = src;
+ }
+ src--;
+ }
+ else if (type->size == 4) {
+ *(dst++) = src--;
+ }
+ else if (type->size == 8) {
+ src--;
+ *(dst++) = src--;
+ }
+ else {
+ ShouldNotReachHere();
+ }
+ }
+ }
+
+ // Set up the Java frame anchor
+ thread->set_last_Java_frame();
+
+ // Change the thread state to _thread_in_native
+ ThreadStateTransition::transition_from_java(thread, _thread_in_native);
+
+ // Make the call
+ intptr_t result[4 - LogBytesPerWord];
+ ffi_call(handler->cif(), (void (*)()) function, result, arguments);
+
+ // Change the thread state back to _thread_in_Java.
+ // ThreadStateTransition::transition_from_native() cannot be used
+ // here because it does not check for asynchronous exceptions.
+ // We have to manage the transition ourself.
+ thread->set_thread_state(_thread_in_native_trans);
+
+ // Make sure new state is visible in the GC thread
+ if (os::is_MP()) {
+ if (UseMembar) {
+ OrderAccess::fence();
+ }
+ else {
+ InterfaceSupport::serialize_memory(thread);
+ }
+ }
+
+ // Handle safepoint operations, pending suspend requests,
+ // and pending asynchronous exceptions.
+ if (SafepointSynchronize::do_call_back() ||
+ thread->has_special_condition_for_native_trans()) {
+ JavaThread::check_special_condition_for_native_trans(thread);
+ CHECK_UNHANDLED_OOPS_ONLY(thread->clear_unhandled_oops());
+ }
+
+ // Finally we can change the thread state to _thread_in_Java.
+ thread->set_thread_state(_thread_in_Java);
+ fixup_after_potential_safepoint();
+
+ // Clear the frame anchor
+ thread->reset_last_Java_frame();
+
+ // If the result was an oop then unbox it and store it in
+ // oop_temp where the garbage collector can see it before
+ // we release the handle it might be protected by.
+ if (handler->result_type() == &ffi_type_pointer) {
+ if (result[0])
+ istate->set_oop_temp(*(oop *) result[0]);
+ else
+ istate->set_oop_temp(NULL);
+ }
+
+ // Reset handle block
+ thread->active_handles()->clear();
+
+ // Unlock if necessary. It seems totally wrong that this
+ // is skipped in the event of an exception but apparently
+ // the template interpreter does this so we do too.
+ if (monitor && !HAS_PENDING_EXCEPTION) {
+ BasicLock *lock = monitor->lock();
+ markOop header = lock->displaced_header();
+ oop rcvr = monitor->obj();
+ monitor->set_obj(NULL);
+
+ if (header != NULL) {
+ if (Atomic::cmpxchg_ptr(header, rcvr->mark_addr(), lock) != lock) {
+ monitor->set_obj(rcvr); {
+ HandleMark hm(thread);
+ CALL_VM_NOCHECK(InterpreterRuntime::monitorexit(thread, monitor));
+ }
+ }
+ }
+ }
+
+ unwind_and_return:
+
+ // Unwind the current activation
+ thread->pop_zero_frame();
+
+ // Pop our parameters
+ stack->set_sp(stack->sp() + method->size_of_parameters());
+
+ // Push our result
+ if (!HAS_PENDING_EXCEPTION) {
+ stack->set_sp(stack->sp() - type2size[method->result_type()]);
+
+ switch (method->result_type()) {
+ case T_VOID:
+ break;
+
+ case T_BOOLEAN:
+#ifndef VM_LITTLE_ENDIAN
+ result[0] <<= (BitsPerWord - BitsPerByte);
+#endif
+ SET_LOCALS_INT(*(jboolean *) result != 0, 0);
+ break;
+
+ case T_CHAR:
+#ifndef VM_LITTLE_ENDIAN
+ result[0] <<= (BitsPerWord - BitsPerShort);
+#endif
+ SET_LOCALS_INT(*(jchar *) result, 0);
+ break;
+
+ case T_BYTE:
+#ifndef VM_LITTLE_ENDIAN
+ result[0] <<= (BitsPerWord - BitsPerByte);
+#endif
+ SET_LOCALS_INT(*(jbyte *) result, 0);
+ break;
+
+ case T_SHORT:
+#ifndef VM_LITTLE_ENDIAN
+ result[0] <<= (BitsPerWord - BitsPerShort);
+#endif
+ SET_LOCALS_INT(*(jshort *) result, 0);
+ break;
+
+ case T_INT:
+#ifndef VM_LITTLE_ENDIAN
+ result[0] <<= (BitsPerWord - BitsPerInt);
+#endif
+ SET_LOCALS_INT(*(jint *) result, 0);
+ break;
+
+ case T_LONG:
+ SET_LOCALS_LONG(*(jlong *) result, 0);
+ break;
+
+ case T_FLOAT:
+ SET_LOCALS_FLOAT(*(jfloat *) result, 0);
+ break;
+
+ case T_DOUBLE:
+ SET_LOCALS_DOUBLE(*(jdouble *) result, 0);
+ break;
+
+ case T_OBJECT:
+ case T_ARRAY:
+ SET_LOCALS_OBJECT(istate->oop_temp(), 0);
+ break;
+
+ default:
+ ShouldNotReachHere();
+ }
+ }
+}
+
+void CppInterpreter::accessor_entry(methodOop method, intptr_t UNUSED, TRAPS) {
+ JavaThread *thread = (JavaThread *) THREAD;
+ ZeroStack *stack = thread->zero_stack();
+ intptr_t *locals = stack->sp();
+
+ // Drop into the slow path if we need a safepoint check
+ if (SafepointSynchronize::do_call_back()) {
+ normal_entry(method, 0, THREAD);
+ return;
+ }
+
+ // Load the object pointer and drop into the slow path
+ // if we have a NullPointerException
+ oop object = LOCALS_OBJECT(0);
+ if (object == NULL) {
+ normal_entry(method, 0, THREAD);
+ return;
+ }
+
+ // Read the field index from the bytecode, which looks like this:
+ // 0: aload_0
+ // 1: getfield
+ // 2: index
+ // 3: index
+ // 4: ireturn/areturn
+ // NB this is not raw bytecode: index is in machine order
+ u1 *code = method->code_base();
+ assert(code[0] == Bytecodes::_aload_0 &&
+ code[1] == Bytecodes::_getfield &&
+ (code[4] == Bytecodes::_ireturn ||
+ code[4] == Bytecodes::_areturn), "should do");
+ u2 index = Bytes::get_native_u2(&code[2]);
+
+ // Get the entry from the constant pool cache, and drop into
+ // the slow path if it has not been resolved
+ constantPoolCacheOop cache = method->constants()->cache();
+ ConstantPoolCacheEntry* entry = cache->entry_at(index);
+ if (!entry->is_resolved(Bytecodes::_getfield)) {
+ normal_entry(method, 0, THREAD);
+ return;
+ }
+
+ // Get the result and push it onto the stack
+ switch (entry->flag_state()) {
+ case ltos:
+ case dtos:
+ if (stack->available_words() < 1) {
+ Unimplemented();
+ }
+ stack->alloc(wordSize);
+ break;
+ }
+ if (entry->is_volatile()) {
+ switch (entry->flag_state()) {
+ case ctos:
+ SET_LOCALS_INT(object->char_field_acquire(entry->f2()), 0);
+ break;
+
+ case btos:
+ SET_LOCALS_INT(object->byte_field_acquire(entry->f2()), 0);
+ break;
+
+ case stos:
+ SET_LOCALS_INT(object->short_field_acquire(entry->f2()), 0);
+ break;
+
+ case itos:
+ SET_LOCALS_INT(object->int_field_acquire(entry->f2()), 0);
+ break;
+
+ case ltos:
+ SET_LOCALS_LONG(object->long_field_acquire(entry->f2()), 0);
+ break;
+
+ case ftos:
+ SET_LOCALS_FLOAT(object->float_field_acquire(entry->f2()), 0);
+ break;
+
+ case dtos:
+ SET_LOCALS_DOUBLE(object->double_field_acquire(entry->f2()), 0);
+ break;
+
+ case atos:
+ SET_LOCALS_OBJECT(object->obj_field_acquire(entry->f2()), 0);
+ break;
+
+ default:
+ ShouldNotReachHere();
+ }
+ }
+ else {
+ switch (entry->flag_state()) {
+ case ctos:
+ SET_LOCALS_INT(object->char_field(entry->f2()), 0);
+ break;
+
+ case btos:
+ SET_LOCALS_INT(object->byte_field(entry->f2()), 0);
+ break;
+
+ case stos:
+ SET_LOCALS_INT(object->short_field(entry->f2()), 0);
+ break;
+
+ case itos:
+ SET_LOCALS_INT(object->int_field(entry->f2()), 0);
+ break;
+
+ case ltos:
+ SET_LOCALS_LONG(object->long_field(entry->f2()), 0);
+ break;
+
+ case ftos:
+ SET_LOCALS_FLOAT(object->float_field(entry->f2()), 0);
+ break;
+
+ case dtos:
+ SET_LOCALS_DOUBLE(object->double_field(entry->f2()), 0);
+ break;
+
+ case atos:
+ SET_LOCALS_OBJECT(object->obj_field(entry->f2()), 0);
+ break;
+
+ default:
+ ShouldNotReachHere();
+ }
+ }
+}
+
+void CppInterpreter::empty_entry(methodOop method, intptr_t UNUSED, TRAPS) {
+ JavaThread *thread = (JavaThread *) THREAD;
+ ZeroStack *stack = thread->zero_stack();
+
+ // Drop into the slow path if we need a safepoint check
+ if (SafepointSynchronize::do_call_back()) {
+ normal_entry(method, 0, THREAD);
+ return;
+ }
+
+ // Pop our parameters
+ stack->set_sp(stack->sp() + method->size_of_parameters());
+}
+
+bool CppInterpreter::stack_overflow_imminent(JavaThread *thread) {
+ // How is the ABI stack?
+ address stack_top = thread->stack_base() - thread->stack_size();
+ int free_stack = os::current_stack_pointer() - stack_top;
+ if (free_stack < StackShadowPages * os::vm_page_size()) {
+ return true;
+ }
+
+ // How is the Zero stack?
+ // Throwing a StackOverflowError involves a VM call, which means
+ // we need a frame on the stack. We should be checking here to
+ // ensure that methods we call have enough room to install the
+ // largest possible frame, but that's more than twice the size
+ // of the entire Zero stack we get by default, so we just check
+ // we have *some* space instead...
+ free_stack = thread->zero_stack()->available_words() * wordSize;
+ if (free_stack < StackShadowPages * os::vm_page_size()) {
+ return true;
+ }
+
+ return false;
+}
+
+InterpreterFrame *InterpreterFrame::build(ZeroStack* stack,
+ const methodOop method,
+ JavaThread* thread) {
+ int monitor_words =
+ method->is_synchronized() ? frame::interpreter_frame_monitor_size() : 0;
+ int stack_words = method->is_native() ? 0 : method->max_stack();
+
+ if (header_words + monitor_words + stack_words > stack->available_words()) {
+ Unimplemented();
+ }
+
+ intptr_t *locals;
+ if (method->is_native())
+ locals = stack->sp() + (method->size_of_parameters() - 1);
+ else
+ locals = stack->sp() + (method->max_locals() - 1);
+
+ stack->push(0); // next_frame, filled in later
+ intptr_t *fp = stack->sp();
+ assert(fp - stack->sp() == next_frame_off, "should be");
+
+ stack->push(INTERPRETER_FRAME);
+ assert(fp - stack->sp() == frame_type_off, "should be");
+
+ interpreterState istate =
+ (interpreterState) stack->alloc(sizeof(BytecodeInterpreter));
+ assert(fp - stack->sp() == istate_off, "should be");
+
+ istate->set_locals(locals);
+ istate->set_method(method);
+ istate->set_self_link(istate);
+ istate->set_prev_link(NULL);
+ istate->set_thread(thread);
+ istate->set_bcp(method->is_native() ? NULL : method->code_base());
+ istate->set_constants(method->constants()->cache());
+ istate->set_msg(BytecodeInterpreter::method_entry);
+ istate->set_oop_temp(NULL);
+ istate->set_mdx(NULL);
+ istate->set_callee(NULL);
+
+ istate->set_monitor_base((BasicObjectLock *) stack->sp());
+ if (method->is_synchronized()) {
+ BasicObjectLock *monitor =
+ (BasicObjectLock *) stack->alloc(monitor_words * wordSize);
+ oop object;
+ if (method->is_static())
+ object = method->constants()->pool_holder()->klass_part()->java_mirror();
+ else
+ object = (oop) locals[0];
+ monitor->set_obj(object);
+ }
+
+ istate->set_stack_base(stack->sp());
+ istate->set_stack(stack->sp() - 1);
+ if (stack_words)
+ stack->alloc(stack_words * wordSize);
+ istate->set_stack_limit(stack->sp() - 1);
+
+ return (InterpreterFrame *) fp;
+}
+
+int AbstractInterpreter::BasicType_as_index(BasicType type) {
+ int i = 0;
+ switch (type) {
+ case T_BOOLEAN: i = 0; break;
+ case T_CHAR : i = 1; break;
+ case T_BYTE : i = 2; break;
+ case T_SHORT : i = 3; break;
+ case T_INT : i = 4; break;
+ case T_LONG : i = 5; break;
+ case T_VOID : i = 6; break;
+ case T_FLOAT : i = 7; break;
+ case T_DOUBLE : i = 8; break;
+ case T_OBJECT : i = 9; break;
+ case T_ARRAY : i = 9; break;
+ default : ShouldNotReachHere();
+ }
+ assert(0 <= i && i < AbstractInterpreter::number_of_result_handlers,
+ "index out of bounds");
+ return i;
+}
+
+address InterpreterGenerator::generate_empty_entry() {
+ if (!UseFastEmptyMethods)
+ return NULL;
+
+ return generate_entry((address) CppInterpreter::empty_entry);
+}
+
+address InterpreterGenerator::generate_accessor_entry() {
+ if (!UseFastAccessorMethods)
+ return NULL;
+
+ return generate_entry((address) CppInterpreter::accessor_entry);
+}
+
+address InterpreterGenerator::generate_native_entry(bool synchronized) {
+ assert(synchronized == false, "should be");
+
+ return generate_entry((address) CppInterpreter::native_entry);
+}
+
+address InterpreterGenerator::generate_normal_entry(bool synchronized) {
+ assert(synchronized == false, "should be");
+
+ return generate_entry((address) CppInterpreter::normal_entry);
+}
+
+address AbstractInterpreterGenerator::generate_method_entry(
+ AbstractInterpreter::MethodKind kind) {
+ address entry_point = NULL;
+
+ switch (kind) {
+ case Interpreter::zerolocals:
+ case Interpreter::zerolocals_synchronized:
+ break;
+
+ case Interpreter::native:
+ entry_point = ((InterpreterGenerator*) this)->generate_native_entry(false);
+ break;
+
+ case Interpreter::native_synchronized:
+ entry_point = ((InterpreterGenerator*) this)->generate_native_entry(false);
+ break;
+
+ case Interpreter::empty:
+ entry_point = ((InterpreterGenerator*) this)->generate_empty_entry();
+ break;
+
+ case Interpreter::accessor:
+ entry_point = ((InterpreterGenerator*) this)->generate_accessor_entry();
+ break;
+
+ case Interpreter::abstract:
+ entry_point = ((InterpreterGenerator*) this)->generate_abstract_entry();
+ break;
+
+ case Interpreter::method_handle:
+ entry_point = ((InterpreterGenerator*) this)->generate_method_handle_entry();
+ break;
+
+ case Interpreter::java_lang_math_sin:
+ case Interpreter::java_lang_math_cos:
+ case Interpreter::java_lang_math_tan:
+ case Interpreter::java_lang_math_abs:
+ case Interpreter::java_lang_math_log:
+ case Interpreter::java_lang_math_log10:
+ case Interpreter::java_lang_math_sqrt:
+ entry_point = ((InterpreterGenerator*) this)->generate_math_entry(kind);
+ break;
+
+ default:
+ ShouldNotReachHere();
+ }
+
+ if (entry_point == NULL)
+ entry_point = ((InterpreterGenerator*) this)->generate_normal_entry(false);
+
+ return entry_point;
+}
+
+InterpreterGenerator::InterpreterGenerator(StubQueue* code)
+ : CppInterpreterGenerator(code) {
+ generate_all();
+}
+
+// Deoptimization helpers
+
+InterpreterFrame *InterpreterFrame::build(ZeroStack* stack, int size) {
+ int size_in_words = size >> LogBytesPerWord;
+ assert(size_in_words * wordSize == size, "unaligned");
+ assert(size_in_words >= header_words, "too small");
+
+ if (size_in_words > stack->available_words()) {
+ Unimplemented();
+ }
+
+ stack->push(0); // next_frame, filled in later
+ intptr_t *fp = stack->sp();
+ assert(fp - stack->sp() == next_frame_off, "should be");
+
+ stack->push(INTERPRETER_FRAME);
+ assert(fp - stack->sp() == frame_type_off, "should be");
+
+ interpreterState istate =
+ (interpreterState) stack->alloc(sizeof(BytecodeInterpreter));
+ assert(fp - stack->sp() == istate_off, "should be");
+ istate->set_self_link(NULL); // mark invalid
+
+ stack->alloc((size_in_words - header_words) * wordSize);
+
+ return (InterpreterFrame *) fp;
+}
+
+int AbstractInterpreter::layout_activation(methodOop method,
+ int tempcount,
+ int popframe_extra_args,
+ int moncount,
+ int callee_param_count,
+ int callee_locals,
+ frame* caller,
+ frame* interpreter_frame,
+ bool is_top_frame) {
+ assert(popframe_extra_args == 0, "what to do?");
+ assert(!is_top_frame || (!callee_locals && !callee_param_count),
+ "top frame should have no caller")
+
+ // This code must exactly match what InterpreterFrame::build
+ // does (the full InterpreterFrame::build, that is, not the
+ // one that creates empty frames for the deoptimizer).
+ //
+ // If interpreter_frame is not NULL then it will be filled in.
+ // It's size is determined by a previous call to this method,
+ // so it should be correct.
+ //
+ // Note that tempcount is the current size of the expression
+ // stack. For top most frames we will allocate a full sized
+ // expression stack and not the trimmed version that non-top
+ // frames have.
+
+ int header_words = InterpreterFrame::header_words;
+ int monitor_words = moncount * frame::interpreter_frame_monitor_size();
+ int stack_words = is_top_frame ? method->max_stack() : tempcount;
+ int callee_extra_locals = callee_locals - callee_param_count;
+
+ if (interpreter_frame) {
+ intptr_t *locals = interpreter_frame->sp() + method->max_locals();
+ interpreterState istate = interpreter_frame->get_interpreterState();
+ intptr_t *monitor_base = (intptr_t*) istate;
+ intptr_t *stack_base = monitor_base - monitor_words;
+ intptr_t *stack = stack_base - tempcount - 1;
+
+ BytecodeInterpreter::layout_interpreterState(istate,
+ caller,
+ NULL,
+ method,
+ locals,
+ stack,
+ stack_base,
+ monitor_base,
+ NULL,
+ is_top_frame);
+ }
+ return header_words + monitor_words + stack_words + callee_extra_locals;
+}
+
+void BytecodeInterpreter::layout_interpreterState(interpreterState istate,
+ frame* caller,
+ frame* current,
+ methodOop method,
+ intptr_t* locals,
+ intptr_t* stack,
+ intptr_t* stack_base,
+ intptr_t* monitor_base,
+ intptr_t* frame_bottom,
+ bool is_top_frame) {
+ istate->set_locals(locals);
+ istate->set_method(method);
+ istate->set_self_link(istate);
+ istate->set_prev_link(NULL);
+ // thread will be set by a hacky repurposing of frame::patch_pc()
+ // bcp will be set by vframeArrayElement::unpack_on_stack()
+ istate->set_constants(method->constants()->cache());
+ istate->set_msg(BytecodeInterpreter::method_resume);
+ istate->set_bcp_advance(0);
+ istate->set_oop_temp(NULL);
+ istate->set_mdx(NULL);
+ if (caller->is_interpreted_frame()) {
+ interpreterState prev = caller->get_interpreterState();
+ prev->set_callee(method);
+ if (*prev->bcp() == Bytecodes::_invokeinterface)
+ prev->set_bcp_advance(5);
+ else
+ prev->set_bcp_advance(3);
+ }
+ istate->set_callee(NULL);
+ istate->set_monitor_base((BasicObjectLock *) monitor_base);
+ istate->set_stack_base(stack_base);
+ istate->set_stack(stack);
+ istate->set_stack_limit(stack_base - method->max_stack() - 1);
+}
+
+address CppInterpreter::return_entry(TosState state, int length) {
+ ShouldNotCallThis();
+}
+
+address CppInterpreter::deopt_entry(TosState state, int length) {
+ return NULL;
+}
+
+// Helper for (runtime) stack overflow checks
+
+int AbstractInterpreter::size_top_interpreter_activation(methodOop method) {
+ return 0;
+}
+
+// Helper for figuring out if frames are interpreter frames
+
+bool CppInterpreter::contains(address pc) {
+#ifdef PRODUCT
+ ShouldNotCallThis();
+#else
+ return false; // make frame::print_value_on work
+#endif // !PRODUCT
+}
+
+// Result handlers and convertors
+
+address CppInterpreterGenerator::generate_result_handler_for(
+ BasicType type) {
+ assembler()->advance(1);
+ return ShouldNotCallThisStub();
+}
+
+address CppInterpreterGenerator::generate_tosca_to_stack_converter(
+ BasicType type) {
+ assembler()->advance(1);
+ return ShouldNotCallThisStub();
+}
+
+address CppInterpreterGenerator::generate_stack_to_stack_converter(
+ BasicType type) {
+ assembler()->advance(1);
+ return ShouldNotCallThisStub();
+}
+
+address CppInterpreterGenerator::generate_stack_to_native_abi_converter(
+ BasicType type) {
+ assembler()->advance(1);
+ return ShouldNotCallThisStub();
+}
+
+#endif // CC_INTERP
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,43 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+ protected:
+ // Size of interpreter code
+ const static int InterpreterCodeSize = 6 * K;
+
+ public:
+ // Method entries
+ static void normal_entry(methodOop method, intptr_t UNUSED, TRAPS);
+ static void native_entry(methodOop method, intptr_t UNUSED, TRAPS);
+ static void accessor_entry(methodOop method, intptr_t UNUSED, TRAPS);
+ static void empty_entry(methodOop method, intptr_t UNUSED, TRAPS);
+
+ public:
+ // Main loop of normal_entry
+ static void main_loop(int recurse, TRAPS);
+
+ private:
+ // Stack overflow checks
+ static bool stack_overflow_imminent(JavaThread *thread);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/debug_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_debug_zero.cpp.incl"
+
+void pd_ps(frame f) {
+ ShouldNotCallThis();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/depChecker_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/depChecker_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/disassembler_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/disassembler_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// The disassembler prints out zero code annotated
+// with Java specific information.
+
+ static int pd_instruction_alignment() {
+ ShouldNotCallThis();
+ }
+
+ static const char* pd_cpu_opts() {
+ ShouldNotCallThis();
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/dump_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_dump_zero.cpp.incl"
+
+void CompactingPermGenGen::generate_vtable_methods(void** vtbl_list,
+ void** vtable,
+ char** md_top,
+ char* md_end,
+ char** mc_top,
+ char* mc_end) {
+ ShouldNotCallThis();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/entryFrame_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// | ... |
+// +--------------------+ ------------------
+// | parameter n-1 | low addresses
+// | ... |
+// | parameter 0 |
+// | call_wrapper |
+// | frame_type |
+// | next_frame | high addresses
+// +--------------------+ ------------------
+// | ... |
+
+class EntryFrame : public ZeroFrame {
+ private:
+ EntryFrame() : ZeroFrame() {
+ ShouldNotCallThis();
+ }
+
+ protected:
+ enum Layout {
+ call_wrapper_off = jf_header_words,
+ header_words
+ };
+
+ public:
+ static EntryFrame *build(ZeroStack* stack,
+ const intptr_t* parameters,
+ int parameter_words,
+ JavaCallWrapper* call_wrapper);
+ public:
+ JavaCallWrapper *call_wrapper() const {
+ return (JavaCallWrapper *) value_of_word(call_wrapper_off);
+ }
+
+ public:
+ void identify_word(int frame_index,
+ int offset,
+ char* fieldbuf,
+ char* valuebuf,
+ int buflen) const;
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/entry_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2008, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+class ZeroEntry {
+ public:
+ ZeroEntry() {
+ ShouldNotCallThis();
+ }
+
+ private:
+ address _entry_point;
+
+ public:
+ address entry_point() const {
+ return _entry_point;
+ }
+ void set_entry_point(address entry_point) {
+ _entry_point = entry_point;
+ }
+
+ private:
+ typedef void (*NormalEntryFunc)(methodOop method,
+ intptr_t base_pc,
+ TRAPS);
+ typedef void (*OSREntryFunc)(methodOop method,
+ address osr_buf,
+ intptr_t base_pc,
+ TRAPS);
+
+ public:
+ void invoke(methodOop method, TRAPS) const {
+ ((NormalEntryFunc) entry_point())(method, (intptr_t) this, THREAD);
+ }
+ void invoke_osr(methodOop method, address osr_buf, TRAPS) const {
+ ((OSREntryFunc) entry_point())(method, osr_buf, (intptr_t) this, THREAD);
+ }
+
+ public:
+ static ByteSize entry_point_offset() {
+ return byte_offset_of(ZeroEntry, _entry_point);
+ }
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/fakeStubFrame_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// | ... |
+// +--------------------+ ------------------
+// | frame_type | low addresses
+// | next_frame | high addresses
+// +--------------------+ ------------------
+// | ... |
+
+class FakeStubFrame : public ZeroFrame {
+ private:
+ FakeStubFrame() : ZeroFrame() {
+ ShouldNotCallThis();
+ }
+
+ protected:
+ enum Layout {
+ header_words = jf_header_words
+ };
+
+ public:
+ static FakeStubFrame *build(ZeroStack* stack);
+
+ public:
+ void identify_word(int frame_index,
+ int offset,
+ char* fieldbuf,
+ char* valuebuf,
+ int buflen) const {}
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/frame_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,414 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_frame_zero.cpp.incl"
+
+#ifdef ASSERT
+void RegisterMap::check_location_valid() {
+ ShouldNotCallThis();
+}
+#endif
+
+bool frame::is_interpreted_frame() const {
+ return zeroframe()->is_interpreter_frame();
+}
+
+bool frame::is_fake_stub_frame() const {
+ return zeroframe()->is_fake_stub_frame();
+}
+
+frame frame::sender_for_entry_frame(RegisterMap *map) const {
+ assert(map != NULL, "map must be set");
+ assert(!entry_frame_is_first(), "next Java fp must be non zero");
+ assert(entry_frame_call_wrapper()->anchor()->last_Java_sp() == sender_sp(),
+ "sender should be next Java frame");
+ map->clear();
+ assert(map->include_argument_oops(), "should be set by clear");
+ return frame(sender_sp(), sp() + 1);
+}
+
+frame frame::sender_for_interpreter_frame(RegisterMap *map) const {
+ return frame(sender_sp(), sp() + 1);
+}
+
+frame frame::sender_for_compiled_frame(RegisterMap *map) const {
+ return frame(sender_sp(), sp() + 1);
+}
+
+frame frame::sender_for_fake_stub_frame(RegisterMap *map) const {
+ return frame(sender_sp(), sp() + 1);
+}
+
+frame frame::sender(RegisterMap* map) const {
+ // Default is not to follow arguments; the various
+ // sender_for_xxx methods update this accordingly.
+ map->set_include_argument_oops(false);
+
+ if (is_entry_frame())
+ return sender_for_entry_frame(map);
+
+ if (is_interpreted_frame())
+ return sender_for_interpreter_frame(map);
+
+ if (is_compiled_frame())
+ return sender_for_compiled_frame(map);
+
+ if (is_fake_stub_frame())
+ return sender_for_fake_stub_frame(map);
+
+ ShouldNotReachHere();
+}
+
+#ifdef CC_INTERP
+BasicObjectLock* frame::interpreter_frame_monitor_begin() const {
+ return get_interpreterState()->monitor_base();
+}
+
+BasicObjectLock* frame::interpreter_frame_monitor_end() const {
+ return (BasicObjectLock*) get_interpreterState()->stack_base();
+}
+#endif // CC_INTERP
+
+void frame::patch_pc(Thread* thread, address pc) {
+ // We borrow this call to set the thread pointer in the interpreter
+ // state; the hook to set up deoptimized frames isn't supplied it.
+ assert(pc == NULL, "should be");
+ get_interpreterState()->set_thread((JavaThread *) thread);
+}
+
+bool frame::safe_for_sender(JavaThread *thread) {
+ ShouldNotCallThis();
+}
+
+void frame::pd_gc_epilog() {
+}
+
+bool frame::is_interpreted_frame_valid(JavaThread *thread) const {
+ ShouldNotCallThis();
+}
+
+BasicType frame::interpreter_frame_result(oop* oop_result,
+ jvalue* value_result) {
+ assert(is_interpreted_frame(), "interpreted frame expected");
+ methodOop method = interpreter_frame_method();
+ BasicType type = method->result_type();
+ intptr_t* tos_addr = (intptr_t *) interpreter_frame_tos_address();
+ oop obj;
+
+ switch (type) {
+ case T_VOID:
+ break;
+ case T_BOOLEAN:
+ value_result->z = *(jboolean *) tos_addr;
+ break;
+ case T_BYTE:
+ value_result->b = *(jbyte *) tos_addr;
+ break;
+ case T_CHAR:
+ value_result->c = *(jchar *) tos_addr;
+ break;
+ case T_SHORT:
+ value_result->s = *(jshort *) tos_addr;
+ break;
+ case T_INT:
+ value_result->i = *(jint *) tos_addr;
+ break;
+ case T_LONG:
+ value_result->j = *(jlong *) tos_addr;
+ break;
+ case T_FLOAT:
+ value_result->f = *(jfloat *) tos_addr;
+ break;
+ case T_DOUBLE:
+ value_result->d = *(jdouble *) tos_addr;
+ break;
+
+ case T_OBJECT:
+ case T_ARRAY:
+ if (method->is_native()) {
+ obj = get_interpreterState()->oop_temp();
+ }
+ else {
+ oop* obj_p = (oop *) tos_addr;
+ obj = (obj_p == NULL) ? (oop) NULL : *obj_p;
+ }
+ assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check");
+ *oop_result = obj;
+ break;
+
+ default:
+ ShouldNotReachHere();
+ }
+
+ return type;
+}
+
+int frame::frame_size(RegisterMap* map) const {
+#ifdef PRODUCT
+ ShouldNotCallThis();
+#else
+ return 0; // make javaVFrame::print_value work
+#endif // PRODUCT
+}
+
+intptr_t* frame::interpreter_frame_tos_at(jint offset) const {
+ int index = (Interpreter::expr_offset_in_bytes(offset) / wordSize);
+ return &interpreter_frame_tos_address()[index];
+}
+
+void frame::zero_print_on_error(int frame_index,
+ outputStream* st,
+ char* buf,
+ int buflen) const {
+ // Divide the buffer between the field and the value
+ buflen >>= 1;
+ char *fieldbuf = buf;
+ char *valuebuf = buf + buflen;
+
+ // Print each word of the frame
+ for (intptr_t *addr = fp(); addr <= sp(); addr++) {
+ int offset = sp() - addr;
+
+ // Fill in default values, then try and improve them
+ snprintf(fieldbuf, buflen, "word[%d]", offset);
+ snprintf(valuebuf, buflen, PTR_FORMAT, *addr);
+ zeroframe()->identify_word(frame_index, offset, fieldbuf, valuebuf, buflen);
+ fieldbuf[buflen - 1] = '\0';
+ valuebuf[buflen - 1] = '\0';
+
+ // Print the result
+ st->print_cr(" " PTR_FORMAT ": %-21s = %s", addr, fieldbuf, valuebuf);
+ }
+}
+
+void ZeroFrame::identify_word(int frame_index,
+ int offset,
+ char* fieldbuf,
+ char* valuebuf,
+ int buflen) const {
+ switch (offset) {
+ case next_frame_off:
+ strncpy(fieldbuf, "next_frame", buflen);
+ break;
+
+ case frame_type_off:
+ strncpy(fieldbuf, "frame_type", buflen);
+ if (is_entry_frame())
+ strncpy(valuebuf, "ENTRY_FRAME", buflen);
+ else if (is_interpreter_frame())
+ strncpy(valuebuf, "INTERPRETER_FRAME", buflen);
+ else if (is_shark_frame())
+ strncpy(valuebuf, "SHARK_FRAME", buflen);
+ else if (is_fake_stub_frame())
+ strncpy(valuebuf, "FAKE_STUB_FRAME", buflen);
+ break;
+
+ default:
+ if (is_entry_frame()) {
+ as_entry_frame()->identify_word(
+ frame_index, offset, fieldbuf, valuebuf, buflen);
+ }
+ else if (is_interpreter_frame()) {
+ as_interpreter_frame()->identify_word(
+ frame_index, offset, fieldbuf, valuebuf, buflen);
+ }
+ else if (is_shark_frame()) {
+ as_shark_frame()->identify_word(
+ frame_index, offset, fieldbuf, valuebuf, buflen);
+ }
+ else if (is_fake_stub_frame()) {
+ as_fake_stub_frame()->identify_word(
+ frame_index, offset, fieldbuf, valuebuf, buflen);
+ }
+ }
+}
+
+void EntryFrame::identify_word(int frame_index,
+ int offset,
+ char* fieldbuf,
+ char* valuebuf,
+ int buflen) const {
+ switch (offset) {
+ case call_wrapper_off:
+ strncpy(fieldbuf, "call_wrapper", buflen);
+ break;
+
+ default:
+ snprintf(fieldbuf, buflen, "local[%d]", offset - 3);
+ }
+}
+
+void InterpreterFrame::identify_word(int frame_index,
+ int offset,
+ char* fieldbuf,
+ char* valuebuf,
+ int buflen) const {
+ interpreterState istate = interpreter_state();
+ bool is_valid = istate->self_link() == istate;
+ intptr_t *addr = addr_of_word(offset);
+
+ // Fixed part
+ if (addr >= (intptr_t *) istate) {
+ const char *field = istate->name_of_field_at_address((address) addr);
+ if (field) {
+ if (is_valid && !strcmp(field, "_method")) {
+ istate->method()->name_and_sig_as_C_string(valuebuf, buflen);
+ }
+ else if (is_valid && !strcmp(field, "_bcp") && istate->bcp()) {
+ snprintf(valuebuf, buflen, PTR_FORMAT " (bci %d)",
+ (intptr_t) istate->bcp(),
+ istate->method()->bci_from(istate->bcp()));
+ }
+ snprintf(fieldbuf, buflen, "%sistate->%s",
+ field[strlen(field) - 1] == ')' ? "(": "", field);
+ }
+ else if (addr == (intptr_t *) istate) {
+ strncpy(fieldbuf, "(vtable for istate)", buflen);
+ }
+ return;
+ }
+
+ // Variable part
+ if (!is_valid)
+ return;
+
+ // JNI stuff
+ if (istate->method()->is_native() && addr < istate->stack_base()) {
+ address hA = istate->method()->signature_handler();
+ if (hA != NULL) {
+ if (hA != (address) InterpreterRuntime::slow_signature_handler) {
+ InterpreterRuntime::SignatureHandler *handler =
+ InterpreterRuntime::SignatureHandler::from_handlerAddr(hA);
+
+ intptr_t *params = istate->stack_base() - handler->argument_count();
+ if (addr >= params) {
+ int param = addr - params;
+ const char *desc = "";
+ if (param == 0)
+ desc = " (JNIEnv)";
+ else if (param == 1) {
+ if (istate->method()->is_static())
+ desc = " (mirror)";
+ else
+ desc = " (this)";
+ }
+ snprintf(fieldbuf, buflen, "parameter[%d]%s", param, desc);
+ return;
+ }
+
+ for (int i = 0; i < handler->argument_count(); i++) {
+ if (params[i] == (intptr_t) addr) {
+ snprintf(fieldbuf, buflen, "unboxed parameter[%d]", i);
+ return;
+ }
+ }
+ }
+ }
+ return;
+ }
+
+ // Monitors and stack
+ identify_vp_word(frame_index, addr,
+ (intptr_t *) istate->monitor_base(),
+ istate->stack_base(),
+ fieldbuf, buflen);
+}
+
+void SharkFrame::identify_word(int frame_index,
+ int offset,
+ char* fieldbuf,
+ char* valuebuf,
+ int buflen) const {
+ // Fixed part
+ switch (offset) {
+ case pc_off:
+ strncpy(fieldbuf, "pc", buflen);
+ if (method()->is_oop()) {
+ nmethod *code = method()->code();
+ if (code && code->pc_desc_at(pc())) {
+ SimpleScopeDesc ssd(code, pc());
+ snprintf(valuebuf, buflen, PTR_FORMAT " (bci %d)",
+ (intptr_t) pc(), ssd.bci());
+ }
+ }
+ return;
+
+ case unextended_sp_off:
+ strncpy(fieldbuf, "unextended_sp", buflen);
+ return;
+
+ case method_off:
+ strncpy(fieldbuf, "method", buflen);
+ if (method()->is_oop()) {
+ method()->name_and_sig_as_C_string(valuebuf, buflen);
+ }
+ return;
+
+ case oop_tmp_off:
+ strncpy(fieldbuf, "oop_tmp", buflen);
+ return;
+ }
+
+ // Variable part
+ if (method()->is_oop()) {
+ identify_vp_word(frame_index, addr_of_word(offset),
+ addr_of_word(header_words + 1),
+ unextended_sp() + method()->max_stack(),
+ fieldbuf, buflen);
+ }
+}
+
+void ZeroFrame::identify_vp_word(int frame_index,
+ intptr_t* addr,
+ intptr_t* monitor_base,
+ intptr_t* stack_base,
+ char* fieldbuf,
+ int buflen) const {
+ // Monitors
+ if (addr >= stack_base && addr < monitor_base) {
+ int monitor_size = frame::interpreter_frame_monitor_size();
+ int last_index = (monitor_base - stack_base) / monitor_size - 1;
+ int index = last_index - (addr - stack_base) / monitor_size;
+ intptr_t monitor = (intptr_t) (
+ (BasicObjectLock *) monitor_base - 1 - index);
+ intptr_t offset = (intptr_t) addr - monitor;
+
+ if (offset == BasicObjectLock::obj_offset_in_bytes())
+ snprintf(fieldbuf, buflen, "monitor[%d]->_obj", index);
+ else if (offset == BasicObjectLock::lock_offset_in_bytes())
+ snprintf(fieldbuf, buflen, "monitor[%d]->_lock", index);
+
+ return;
+ }
+
+ // Expression stack
+ if (addr < stack_base) {
+ snprintf(fieldbuf, buflen, "%s[%d]",
+ frame_index == 0 ? "stack_word" : "local",
+ (int) (stack_base - addr - 1));
+ return;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/frame_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// A frame represents a physical stack frame on the Zero stack.
+
+ public:
+ enum {
+ pc_return_offset = 0
+ };
+
+ // Constructor
+ public:
+ frame(intptr_t* sp, intptr_t* fp);
+
+ // The sp of a Zero frame is the address of the highest word in
+ // that frame. We keep track of the lowest address too, so the
+ // boundaries of the frame are available for debug printing.
+ private:
+ intptr_t* _fp;
+
+ public:
+ intptr_t* fp() const {
+ return _fp;
+ }
+
+#ifdef CC_INTERP
+ inline interpreterState get_interpreterState() const;
+#endif // CC_INTERP
+
+ public:
+ const ZeroFrame *zeroframe() const {
+ return (ZeroFrame *) sp();
+ }
+
+ const EntryFrame *zero_entryframe() const {
+ return zeroframe()->as_entry_frame();
+ }
+ const InterpreterFrame *zero_interpreterframe() const {
+ return zeroframe()->as_interpreter_frame();
+ }
+ const SharkFrame *zero_sharkframe() const {
+ return zeroframe()->as_shark_frame();
+ }
+
+ public:
+ bool is_fake_stub_frame() const;
+
+ public:
+ frame sender_for_fake_stub_frame(RegisterMap* map) const;
+
+ public:
+ void zero_print_on_error(int index,
+ outputStream* st,
+ char* buf,
+ int buflen) const;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/frame_zero.inline.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,151 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// Constructors
+
+inline frame::frame() {
+ _sp = NULL;
+ _fp = NULL;
+ _pc = NULL;
+ _cb = NULL;
+ _deopt_state = unknown;
+}
+
+inline frame::frame(intptr_t* sp, intptr_t* fp) {
+ _sp = sp;
+ _fp = fp;
+ switch (zeroframe()->type()) {
+ case ZeroFrame::ENTRY_FRAME:
+ _pc = StubRoutines::call_stub_return_pc();
+ _cb = NULL;
+ break;
+
+ case ZeroFrame::INTERPRETER_FRAME:
+ _pc = NULL;
+ _cb = NULL;
+ break;
+
+ case ZeroFrame::SHARK_FRAME:
+ _pc = zero_sharkframe()->pc();
+ _cb = CodeCache::find_blob_unsafe(pc());
+ break;
+
+ case ZeroFrame::FAKE_STUB_FRAME:
+ _pc = NULL;
+ _cb = NULL;
+ break;
+
+ default:
+ ShouldNotReachHere();
+ }
+ _deopt_state = not_deoptimized;
+}
+
+// Accessors
+
+inline intptr_t* frame::sender_sp() const {
+ return (intptr_t *) zeroframe()->next();
+}
+
+inline intptr_t* frame::link() const {
+ ShouldNotCallThis();
+}
+
+#ifdef CC_INTERP
+inline interpreterState frame::get_interpreterState() const {
+ return zero_interpreterframe()->interpreter_state();
+}
+
+inline intptr_t** frame::interpreter_frame_locals_addr() const {
+ return &(get_interpreterState()->_locals);
+}
+
+inline intptr_t* frame::interpreter_frame_bcx_addr() const {
+ return (intptr_t*) &(get_interpreterState()->_bcp);
+}
+
+inline constantPoolCacheOop* frame::interpreter_frame_cache_addr() const {
+ return &(get_interpreterState()->_constants);
+}
+
+inline methodOop* frame::interpreter_frame_method_addr() const {
+ return &(get_interpreterState()->_method);
+}
+
+inline intptr_t* frame::interpreter_frame_mdx_addr() const {
+ return (intptr_t*) &(get_interpreterState()->_mdx);
+}
+
+inline intptr_t* frame::interpreter_frame_tos_address() const {
+ return get_interpreterState()->_stack + 1;
+}
+#endif // CC_INTERP
+
+inline int frame::interpreter_frame_monitor_size() {
+ return BasicObjectLock::size();
+}
+
+inline intptr_t* frame::interpreter_frame_expression_stack() const {
+ intptr_t* monitor_end = (intptr_t*) interpreter_frame_monitor_end();
+ return monitor_end - 1;
+}
+
+inline jint frame::interpreter_frame_expression_stack_direction() {
+ return -1;
+}
+
+// Return a unique id for this frame. The id must have a value where
+// we can distinguish identity and younger/older relationship. NULL
+// represents an invalid (incomparable) frame.
+inline intptr_t* frame::id() const {
+ return sp();
+}
+
+inline JavaCallWrapper* frame::entry_frame_call_wrapper() const {
+ return zero_entryframe()->call_wrapper();
+}
+
+inline void frame::set_saved_oop_result(RegisterMap* map, oop obj) {
+ ShouldNotCallThis();
+}
+
+inline oop frame::saved_oop_result(RegisterMap* map) const {
+ ShouldNotCallThis();
+}
+
+inline bool frame::is_older(intptr_t* id) const {
+ ShouldNotCallThis();
+}
+
+inline intptr_t* frame::entry_frame_argument_at(int offset) const {
+ ShouldNotCallThis();
+}
+
+inline intptr_t* frame::unextended_sp() const {
+ if (zeroframe()->is_shark_frame())
+ return zero_sharkframe()->unextended_sp();
+ else
+ return (intptr_t *) -1;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/globalDefinitions_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include <ffi.h>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/globals_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+//
+// Set the default values for platform dependent flags used by the
+// runtime system. See globals.hpp for details of what they do.
+//
+
+define_pd_global(bool, ConvertSleepToYield, true);
+define_pd_global(bool, ShareVtableStubs, true);
+define_pd_global(bool, CountInterpCalls, true);
+define_pd_global(bool, NeedsDeoptSuspend, false);
+
+define_pd_global(bool, ImplicitNullChecks, true);
+define_pd_global(bool, UncommonNullCast, true);
+
+define_pd_global(intx, CodeEntryAlignment, 32);
+define_pd_global(uintx, TLABSize, 0);
+#ifdef _LP64
+define_pd_global(uintx, NewSize, ScaleForWordSize(2048 * K));
+#else
+define_pd_global(uintx, NewSize, ScaleForWordSize(1024 * K));
+#endif // _LP64
+define_pd_global(intx, InlineFrequencyCount, 100);
+define_pd_global(intx, InlineSmallCode, 1000);
+define_pd_global(intx, PreInflateSpin, 10);
+
+define_pd_global(intx, StackYellowPages, 2);
+define_pd_global(intx, StackRedPages, 1);
+define_pd_global(intx, StackShadowPages, 3 LP64_ONLY(+3) DEBUG_ONLY(+3));
+
+define_pd_global(bool, RewriteBytecodes, true);
+define_pd_global(bool, RewriteFrequentPairs, true);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/icBuffer_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_icBuffer_zero.cpp.incl"
+
+int InlineCacheBuffer::ic_stub_code_size() {
+ // NB set this once the functions below are implemented
+ return 4;
+}
+
+void InlineCacheBuffer::assemble_ic_buffer_code(address code_begin,
+ oop cached_oop,
+ address entry_point) {
+ // NB ic_stub_code_size() must return the size of the code we generate
+ ShouldNotCallThis();
+}
+
+address InlineCacheBuffer::ic_buffer_entry_point(address code_begin) {
+ // NB ic_stub_code_size() must return the size of the code we generate
+ ShouldNotCallThis();
+}
+
+oop InlineCacheBuffer::ic_buffer_cached_oop(address code_begin) {
+ // NB ic_stub_code_size() must return the size of the code we generate
+ ShouldNotCallThis();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/icache_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_icache_zero.cpp.incl"
+
+void ICacheStubGenerator::generate_icache_flush(
+ ICache::flush_icache_stub_t* flush_icache_stub) {
+ ShouldNotCallThis();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/icache_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// Interface for updating the instruction cache. Whenever the VM
+// modifies code, part of the processor instruction cache potentially
+// has to be flushed. This implementation is empty: Zero never deals
+// with code, and LLVM handles cache flushing for Shark.
+
+class ICache : public AbstractICache {
+ public:
+ static void initialize() {}
+ static void invalidate_word(address addr) {}
+ static void invalidate_range(address start, int nbytes) {}
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/interp_masm_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/interp_masm_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file specializes the assember with interpreter-specific macros
+
+class InterpreterMacroAssembler : public MacroAssembler {
+ public:
+ InterpreterMacroAssembler(CodeBuffer* code) : MacroAssembler(code) {}
+
+ public:
+ RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr,
+ Register tmp,
+ int offset) {
+ ShouldNotCallThis();
+ }
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/interpreterFrame_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#ifdef CC_INTERP
+// | ... |
+// +--------------------+ ------------------
+// | stack slot n-1 | low addresses
+// | ... |
+// | stack slot 0 |
+// | monitor 0 (maybe) |
+// | ... |
+// | interpreter state |
+// | ... |
+// | frame_type |
+// | next_frame | high addresses
+// +--------------------+ ------------------
+// | ... |
+
+class InterpreterFrame : public ZeroFrame {
+ friend class AbstractInterpreter;
+
+ private:
+ InterpreterFrame() : ZeroFrame() {
+ ShouldNotCallThis();
+ }
+
+ protected:
+ enum Layout {
+ istate_off = jf_header_words +
+ (align_size_up_(sizeof(BytecodeInterpreter),
+ wordSize) >> LogBytesPerWord) - 1,
+ header_words
+ };
+
+ public:
+ static InterpreterFrame *build(ZeroStack* stack,
+ const methodOop method,
+ JavaThread* thread);
+ static InterpreterFrame *build(ZeroStack* stack, int size);
+
+ public:
+ interpreterState interpreter_state() const {
+ return (interpreterState) addr_of_word(istate_off);
+ }
+
+ public:
+ void identify_word(int frame_index,
+ int offset,
+ char* fieldbuf,
+ char* valuebuf,
+ int buflen) const;
+};
+#endif // CC_INTERP
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/interpreterGenerator_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,37 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+ // Generation of Interpreter
+ //
+ friend class AbstractInterpreterGenerator;
+
+ private:
+ address generate_normal_entry(bool synchronized);
+ address generate_native_entry(bool synchronized);
+ address generate_abstract_entry();
+ address generate_math_entry(AbstractInterpreter::MethodKind kind);
+ address generate_empty_entry();
+ address generate_accessor_entry();
+ address generate_method_handle_entry();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/interpreterRT_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_interpreterRT_zero.cpp.incl"
+
+void InterpreterRuntime::SignatureHandlerGeneratorBase::pass_int() {
+ push(T_INT);
+ _cif->nargs++;
+}
+
+void InterpreterRuntime::SignatureHandlerGeneratorBase::pass_long() {
+ push(T_LONG);
+ _cif->nargs++;
+}
+
+void InterpreterRuntime::SignatureHandlerGeneratorBase::pass_float() {
+ push(T_FLOAT);
+ _cif->nargs++;
+}
+
+void InterpreterRuntime::SignatureHandlerGeneratorBase::pass_double() {
+ push(T_DOUBLE);
+ _cif->nargs++;
+}
+
+void InterpreterRuntime::SignatureHandlerGeneratorBase::pass_object() {
+ push(T_OBJECT);
+ _cif->nargs++;
+}
+
+void InterpreterRuntime::SignatureHandlerGeneratorBase::push(BasicType type) {
+ ffi_type *ftype;
+ switch (type) {
+ case T_VOID:
+ ftype = &ffi_type_void;
+ break;
+
+ case T_BOOLEAN:
+ ftype = &ffi_type_uint8;
+ break;
+
+ case T_CHAR:
+ ftype = &ffi_type_uint16;
+ break;
+
+ case T_BYTE:
+ ftype = &ffi_type_sint8;
+ break;
+
+ case T_SHORT:
+ ftype = &ffi_type_sint16;
+ break;
+
+ case T_INT:
+ ftype = &ffi_type_sint32;
+ break;
+
+ case T_LONG:
+ ftype = &ffi_type_sint64;
+ break;
+
+ case T_FLOAT:
+ ftype = &ffi_type_float;
+ break;
+
+ case T_DOUBLE:
+ ftype = &ffi_type_double;
+ break;
+
+ case T_OBJECT:
+ case T_ARRAY:
+ ftype = &ffi_type_pointer;
+ break;
+
+ default:
+ ShouldNotReachHere();
+ }
+ push((intptr_t) ftype);
+}
+
+// For fast signature handlers the "signature handler" is generated
+// into a temporary buffer. It is then copied to its final location,
+// and pd_set_handler is called on it. We have this two stage thing
+// to accomodate this.
+
+void InterpreterRuntime::SignatureHandlerGeneratorBase::generate(
+ uint64_t fingerprint) {
+
+ // Build the argument types list
+ pass_object();
+ if (method()->is_static())
+ pass_object();
+ iterate(fingerprint);
+
+ // Tack on the result type
+ push(method()->result_type());
+}
+
+void InterpreterRuntime::SignatureHandler::finalize() {
+ ffi_status status =
+ ffi_prep_cif(cif(),
+ FFI_DEFAULT_ABI,
+ argument_count(),
+ result_type(),
+ argument_types());
+
+ assert(status == FFI_OK, "should be");
+}
+
+IRT_ENTRY(address,
+ InterpreterRuntime::slow_signature_handler(JavaThread* thread,
+ methodOop method,
+ intptr_t* unused1,
+ intptr_t* unused2))
+ ZeroStack *stack = thread->zero_stack();
+
+ int required_words =
+ (align_size_up(sizeof(ffi_cif), wordSize) >> LogBytesPerWord) +
+ (method->is_static() ? 2 : 1) + method->size_of_parameters() + 1;
+ if (required_words > stack->available_words()) {
+ Unimplemented();
+ }
+
+ intptr_t *buf = (intptr_t *) stack->alloc(required_words * wordSize);
+ SlowSignatureHandlerGenerator sshg(methodHandle(thread, method), buf);
+ sshg.generate(UCONST64(-1));
+
+ SignatureHandler *handler = sshg.handler();
+ handler->finalize();
+
+ return (address) handler;
+IRT_END
+
+void SignatureHandlerLibrary::pd_set_handler(address handlerAddr) {
+ InterpreterRuntime::SignatureHandler *handler =
+ InterpreterRuntime::SignatureHandler::from_handlerAddr(handlerAddr);
+
+ handler->finalize();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/interpreterRT_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+class SignatureHandler {
+ public:
+ static SignatureHandler *from_handlerAddr(address handlerAddr) {
+ return (SignatureHandler *) handlerAddr;
+ }
+
+ public:
+ ffi_cif* cif() const {
+ return (ffi_cif *) this;
+ }
+
+ int argument_count() const {
+ return cif()->nargs;
+ }
+
+ ffi_type** argument_types() const {
+ return (ffi_type**) (cif() + 1);
+ }
+
+ ffi_type* argument_type(int i) const {
+ return argument_types()[i];
+ }
+
+ ffi_type* result_type() const {
+ return *(argument_types() + argument_count());
+ }
+
+ protected:
+ friend class InterpreterRuntime;
+ friend class SignatureHandlerLibrary;
+
+ void finalize();
+};
+
+class SignatureHandlerGeneratorBase : public NativeSignatureIterator {
+ private:
+ ffi_cif* _cif;
+
+ protected:
+ SignatureHandlerGeneratorBase(methodHandle method, ffi_cif *cif)
+ : NativeSignatureIterator(method), _cif(cif) {
+ _cif->nargs = 0;
+ }
+
+ ffi_cif *cif() const {
+ return _cif;
+ }
+
+ public:
+ void generate(uint64_t fingerprint);
+
+ private:
+ void pass_int();
+ void pass_long();
+ void pass_float();
+ void pass_double();
+ void pass_object();
+
+ private:
+ void push(BasicType type);
+ virtual void push(intptr_t value) = 0;
+};
+
+class SignatureHandlerGenerator : public SignatureHandlerGeneratorBase {
+ private:
+ CodeBuffer* _cb;
+
+ public:
+ SignatureHandlerGenerator(methodHandle method, CodeBuffer* buffer)
+ : SignatureHandlerGeneratorBase(method, (ffi_cif *) buffer->code_end()),
+ _cb(buffer) {
+ _cb->set_code_end((address) (cif() + 1));
+ }
+
+ private:
+ void push(intptr_t value) {
+ intptr_t *dst = (intptr_t *) _cb->code_end();
+ _cb->set_code_end((address) (dst + 1));
+ *dst = value;
+ }
+};
+
+class SlowSignatureHandlerGenerator : public SignatureHandlerGeneratorBase {
+ private:
+ intptr_t *_dst;
+
+ public:
+ SlowSignatureHandlerGenerator(methodHandle method, intptr_t* buf)
+ : SignatureHandlerGeneratorBase(method, (ffi_cif *) buf) {
+ _dst = (intptr_t *) (cif() + 1);
+ }
+
+ private:
+ void push(intptr_t value) {
+ *(_dst++) = value;
+ }
+
+ public:
+ SignatureHandler *handler() const {
+ return (SignatureHandler *) cif();
+ }
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/interpreter_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_interpreter_zero.cpp.incl"
+
+address AbstractInterpreterGenerator::generate_slow_signature_handler() {
+ _masm->advance(1);
+ return (address) InterpreterRuntime::slow_signature_handler;
+}
+
+address InterpreterGenerator::generate_math_entry(
+ AbstractInterpreter::MethodKind kind) {
+ if (!InlineIntrinsics)
+ return NULL;
+
+ Unimplemented();
+}
+
+address InterpreterGenerator::generate_abstract_entry() {
+ return ShouldNotCallThisEntry();
+}
+
+address InterpreterGenerator::generate_method_handle_entry() {
+ return ShouldNotCallThisEntry();
+}
+
+int AbstractInterpreter::size_activation(methodOop method,
+ int tempcount,
+ int popframe_extra_args,
+ int moncount,
+ int callee_param_count,
+ int callee_locals,
+ bool is_top_frame) {
+ return layout_activation(method,
+ tempcount,
+ popframe_extra_args,
+ moncount,
+ callee_param_count,
+ callee_locals,
+ (frame*) NULL,
+ (frame*) NULL,
+ is_top_frame);
+}
+
+void Deoptimization::unwind_callee_save_values(frame* f,
+ vframeArray* vframe_array) {
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/interpreter_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+ public:
+ static void invoke_method(methodOop method, address entry_point, TRAPS) {
+ ((ZeroEntry *) entry_point)->invoke(method, THREAD);
+ }
+ static void invoke_osr(methodOop method,
+ address entry_point,
+ address osr_buf,
+ TRAPS) {
+ ((ZeroEntry *) entry_point)->invoke_osr(method, osr_buf, THREAD);
+ }
+
+ public:
+ static int expr_index_at(int i) {
+ return stackElementWords() * i;
+ }
+ static int expr_tag_index_at(int i) {
+ assert(TaggedStackInterpreter, "should not call this");
+ Unimplemented();
+ }
+
+ static int expr_offset_in_bytes(int i) {
+ return stackElementSize() * i;
+ }
+ static int expr_tag_offset_in_bytes(int i) {
+ assert(TaggedStackInterpreter, "should not call this");
+ Unimplemented();
+ }
+
+ static int local_index_at(int i) {
+ assert(i <= 0, "local direction already negated");
+ return stackElementWords() * i + (value_offset_in_bytes() / wordSize);
+ }
+ static int local_tag_index_at(int i) {
+ assert(TaggedStackInterpreter, "should not call this");
+ Unimplemented();
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/javaFrameAnchor_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+ public:
+ // Each arch must define reset, save, restore
+ // These are used by objects that only care about:
+ // 1 - initializing a new state (thread creation, javaCalls)
+ // 2 - saving a current state (javaCalls)
+ // 3 - restoring an old state (javaCalls)
+
+ void clear() {
+ // clearing _last_Java_sp must be first
+ _last_Java_sp = NULL;
+ // fence?
+ _last_Java_pc = NULL;
+ }
+
+ void copy(JavaFrameAnchor* src) {
+ // In order to make sure the transition state is valid for "this"
+ // We must clear _last_Java_sp before copying the rest of the new
+ // data
+ //
+ // Hack Alert: Temporary bugfix for 4717480/4721647 To act like
+ // previous version (pd_cache_state) don't NULL _last_Java_sp
+ // unless the value is changing
+ //
+ if (_last_Java_sp != src->_last_Java_sp)
+ _last_Java_sp = NULL;
+
+ _last_Java_pc = src->_last_Java_pc;
+ // Must be last so profiler will always see valid frame if
+ // has_last_frame() is true
+ _last_Java_sp = src->_last_Java_sp;
+ }
+
+ bool walkable() {
+ return true;
+ }
+
+ void make_walkable(JavaThread* thread) {
+ // nothing to do
+ }
+
+ intptr_t* last_Java_sp() const {
+ return _last_Java_sp;
+ }
+
+ void set_last_Java_sp(intptr_t* sp) {
+ _last_Java_sp = sp;
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/jniFastGetField_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2004-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_jniFastGetField_zero.cpp.incl"
+
+address JNI_FastGetField::generate_fast_get_boolean_field() {
+ return (address) -1;
+}
+
+address JNI_FastGetField::generate_fast_get_byte_field() {
+ return (address) -1;
+}
+
+address JNI_FastGetField::generate_fast_get_char_field() {
+ return (address) -1;
+}
+
+address JNI_FastGetField::generate_fast_get_short_field() {
+ return (address) -1;
+}
+
+address JNI_FastGetField::generate_fast_get_int_field() {
+ return (address) -1;
+}
+
+address JNI_FastGetField::generate_fast_get_long_field() {
+ return (address) -1;
+}
+
+address JNI_FastGetField::generate_fast_get_float_field() {
+ return (address) -1;
+}
+
+address JNI_FastGetField::generate_fast_get_double_field() {
+ return (address) -1;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/jniTypes_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,108 @@
+/*
+ * Copyright 1998-2002 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file holds platform-dependent routines used to write primitive jni
+// types to the array of arguments passed into JavaCalls::call
+
+class JNITypes : AllStatic {
+ // These functions write a java primitive type (in native format)
+ // to a java stack slot array to be passed as an argument to JavaCalls:calls.
+ // I.e., they are functionally 'push' operations if they have a 'pos'
+ // formal parameter. Note that jlong's and jdouble's are written
+ // _in reverse_ of the order in which they appear in the interpreter
+ // stack. This is because call stubs (see stubGenerator_zero.cpp)
+ // reverse the argument list constructed by JavaCallArguments (see
+ // javaCalls.hpp).
+
+private:
+ // Helper routines.
+ static inline void put_int2 (jint *from, jint *to) { to[0] = from[0]; to[1] = from[1]; }
+ static inline void put_int2 (jint *from, jint *to, int& pos) { put_int2 (from, (jint *)((intptr_t *)to + pos)); pos += 2; }
+ static inline void put_int2r(jint *from, jint *to) { to[0] = from[1]; to[1] = from[0]; }
+ static inline void put_int2r(jint *from, jint *to, int& pos) { put_int2r(from, (jint *)((intptr_t *)to + pos)); pos += 2; }
+
+public:
+ // Ints are stored in native format in one JavaCallArgument slot at *to.
+ static inline void put_int(jint from, intptr_t *to) { *(jint *)(to + 0 ) = from; }
+ static inline void put_int(jint from, intptr_t *to, int& pos) { *(jint *)(to + pos++) = from; }
+ static inline void put_int(jint *from, intptr_t *to, int& pos) { *(jint *)(to + pos++) = *from; }
+
+#ifdef _LP64
+ // Longs are stored in native format in one JavaCallArgument slot at *(to+1).
+ static inline void put_long(jlong from, intptr_t *to) { *(jlong *)(to + 1 + 0) = from; }
+ static inline void put_long(jlong from, intptr_t *to, int& pos) { *(jlong *)(to + 1 + pos) = from; pos += 2; }
+ static inline void put_long(jlong *from, intptr_t *to, int& pos) { *(jlong *)(to + 1 + pos) = *from; pos += 2; }
+#else
+ // Longs are stored in reversed native word format in two JavaCallArgument slots at *to.
+ // The high half is in *(to+1) and the low half in *to.
+ static inline void put_long(jlong from, intptr_t *to) { put_int2r((jint *)&from, (jint *)to); }
+ static inline void put_long(jlong from, intptr_t *to, int& pos) { put_int2r((jint *)&from, (jint *)to, pos); }
+ static inline void put_long(jlong *from, intptr_t *to, int& pos) { put_int2r((jint *) from, (jint *)to, pos); }
+#endif
+
+ // Oops are stored in native format in one JavaCallArgument slot at *to.
+ static inline void put_obj(oop from, intptr_t *to) { *(oop *)(to + 0 ) = from; }
+ static inline void put_obj(oop from, intptr_t *to, int& pos) { *(oop *)(to + pos++) = from; }
+ static inline void put_obj(oop *from, intptr_t *to, int& pos) { *(oop *)(to + pos++) = *from; }
+
+ // Floats are stored in native format in one JavaCallArgument slot at *to.
+ static inline void put_float(jfloat from, intptr_t *to) { *(jfloat *)(to + 0 ) = from; }
+ static inline void put_float(jfloat from, intptr_t *to, int& pos) { *(jfloat *)(to + pos++) = from; }
+ static inline void put_float(jfloat *from, intptr_t *to, int& pos) { *(jfloat *)(to + pos++) = *from; }
+
+#ifdef _LP64
+ // Doubles are stored in native word format in one JavaCallArgument slot at *(to+1).
+ static inline void put_double(jdouble from, intptr_t *to) { *(jdouble *)(to + 1 + 0) = from; }
+ static inline void put_double(jdouble from, intptr_t *to, int& pos) { *(jdouble *)(to + 1 + pos) = from; pos += 2; }
+ static inline void put_double(jdouble *from, intptr_t *to, int& pos) { *(jdouble *)(to + 1 + pos) = *from; pos += 2; }
+#else
+ // Doubles are stored in reversed native word format in two JavaCallArgument slots at *to.
+ static inline void put_double(jdouble from, intptr_t *to) { put_int2r((jint *)&from, (jint *)to); }
+ static inline void put_double(jdouble from, intptr_t *to, int& pos) { put_int2r((jint *)&from, (jint *)to, pos); }
+ static inline void put_double(jdouble *from, intptr_t *to, int& pos) { put_int2r((jint *) from, (jint *)to, pos); }
+#endif
+
+ // The get_xxx routines, on the other hand, actually _do_ fetch
+ // java primitive types from the interpreter stack.
+ static inline jint get_int(intptr_t *from) { return *(jint *)from; }
+
+#ifdef _LP64
+ static inline jlong get_long(intptr_t *from) { return *(jlong *)from; }
+#else
+ static inline jlong get_long(intptr_t *from) { return ((jlong)(*( signed int *)((jint *)from )) << 32) |
+ ((jlong)(*(unsigned int *)((jint *)from + 1)) << 0); }
+#endif
+
+ static inline oop get_obj(intptr_t *from) { return *(oop *)from; }
+ static inline jfloat get_float(intptr_t *from) { return *(jfloat *)from; }
+
+#ifdef _LP64
+ static inline jdouble get_double(intptr_t *from) { return *(jdouble *)from; }
+#else
+ static inline jdouble get_double(intptr_t *from) { jlong jl = ((jlong)(*( signed int *)((jint *)from )) << 32) |
+ ((jlong)(*(unsigned int *)((jint *)from + 1)) << 0);
+ return *(jdouble *)&jl; }
+#endif
+
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/jni_zero.h Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,38 @@
+/*
+ * Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+#define JNIEXPORT
+#define JNIIMPORT
+#define JNICALL
+
+typedef int jint;
+typedef signed char jbyte;
+
+#ifdef _LP64
+typedef long jlong;
+#else
+typedef long long jlong;
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/methodHandles_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/nativeInst_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_nativeInst_zero.cpp.incl"
+
+// This method is called by nmethod::make_not_entrant_or_zombie to
+// insert a jump to SharedRuntime::get_handle_wrong_method_stub()
+// (dest) at the start of a compiled method (verified_entry) to avoid
+// a race where a method is invoked while being made non-entrant.
+//
+// In Shark, verified_entry is a pointer to a SharkEntry. We can
+// handle this simply by changing it's entry point to point at the
+// interpreter. This only works because the interpreter and Shark
+// calling conventions are the same.
+
+void NativeJump::patch_verified_entry(address entry,
+ address verified_entry,
+ address dest) {
+ assert(dest == SharedRuntime::get_handle_wrong_method_stub(), "should be");
+
+#ifdef CC_INTERP
+ ((ZeroEntry*) verified_entry)->set_entry_point(
+ (address) CppInterpreter::normal_entry);
+#else
+ Unimplemented();
+#endif // CC_INTERP
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/nativeInst_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,185 @@
+/*
+ * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// We have interfaces for the following instructions:
+// - NativeInstruction
+// - - NativeCall
+// - - NativeMovConstReg
+// - - NativeMovConstRegPatching
+// - - NativeJump
+// - - NativeIllegalOpCode
+// - - NativeReturn
+// - - NativeReturnX (return with argument)
+// - - NativePushConst
+// - - NativeTstRegMem
+
+// The base class for different kinds of native instruction abstractions.
+// Provides the primitive operations to manipulate code relative to this.
+
+class NativeInstruction VALUE_OBJ_CLASS_SPEC {
+ public:
+ bool is_jump() {
+ ShouldNotCallThis();
+ }
+
+ bool is_safepoint_poll() {
+ ShouldNotCallThis();
+ }
+};
+
+inline NativeInstruction* nativeInstruction_at(address address) {
+ ShouldNotCallThis();
+}
+
+class NativeCall : public NativeInstruction {
+ public:
+ enum zero_specific_constants {
+ instruction_size = 0 // not used within the interpreter
+ };
+
+ address instruction_address() const {
+ ShouldNotCallThis();
+ }
+
+ address next_instruction_address() const {
+ ShouldNotCallThis();
+ }
+
+ address return_address() const {
+ ShouldNotCallThis();
+ }
+
+ address destination() const {
+ ShouldNotCallThis();
+ }
+
+ void set_destination_mt_safe(address dest) {
+ ShouldNotCallThis();
+ }
+
+ void verify_alignment() {
+ ShouldNotCallThis();
+ }
+
+ void verify() {
+ ShouldNotCallThis();
+ }
+
+ static bool is_call_before(address return_address) {
+ ShouldNotCallThis();
+ }
+};
+
+inline NativeCall* nativeCall_before(address return_address) {
+ ShouldNotCallThis();
+}
+
+inline NativeCall* nativeCall_at(address address) {
+ ShouldNotCallThis();
+}
+
+class NativeMovConstReg : public NativeInstruction {
+ public:
+ address next_instruction_address() const {
+ ShouldNotCallThis();
+ }
+
+ intptr_t data() const {
+ ShouldNotCallThis();
+ }
+
+ void set_data(intptr_t x) {
+ ShouldNotCallThis();
+ }
+};
+
+inline NativeMovConstReg* nativeMovConstReg_at(address address) {
+ ShouldNotCallThis();
+}
+
+class NativeMovRegMem : public NativeInstruction {
+ public:
+ int offset() const {
+ ShouldNotCallThis();
+ }
+
+ void set_offset(intptr_t x) {
+ ShouldNotCallThis();
+ }
+
+ void add_offset_in_bytes(int add_offset) {
+ ShouldNotCallThis();
+ }
+};
+
+inline NativeMovRegMem* nativeMovRegMem_at(address address) {
+ ShouldNotCallThis();
+}
+
+class NativeJump : public NativeInstruction {
+ public:
+ enum zero_specific_constants {
+ instruction_size = 0 // not used within the interpreter
+ };
+
+ address jump_destination() const {
+ ShouldNotCallThis();
+ }
+
+ void set_jump_destination(address dest) {
+ ShouldNotCallThis();
+ }
+
+ static void check_verified_entry_alignment(address entry,
+ address verified_entry) {
+ }
+
+ static void patch_verified_entry(address entry,
+ address verified_entry,
+ address dest);
+};
+
+inline NativeJump* nativeJump_at(address address) {
+ ShouldNotCallThis();
+}
+
+class NativeGeneralJump : public NativeInstruction {
+ public:
+ address jump_destination() const {
+ ShouldNotCallThis();
+ }
+
+ static void insert_unconditional(address code_pos, address entry) {
+ ShouldNotCallThis();
+ }
+
+ static void replace_mt_safe(address instr_addr, address code_buffer) {
+ ShouldNotCallThis();
+ }
+};
+
+inline NativeGeneralJump* nativeGeneralJump_at(address address) {
+ ShouldNotCallThis();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/registerMap_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,39 @@
+/*
+ * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+ // machine-dependent implemention for register maps
+ friend class frame;
+
+ private:
+ // This is the hook for finding a register in an "well-known" location,
+ // such as a register block of a predetermined format.
+ // Since there is none, we just return NULL.
+ // See registerMap_sparc.hpp for an example of grabbing registers
+ // from register save areas of a standard layout.
+ address pd_location(VMReg reg) const { return NULL; }
+
+ // no PD state to clear or copy:
+ void pd_clear() {}
+ void pd_initialize() {}
+ void pd_initialize_from(const RegisterMap* map) {}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/register_definitions_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/register_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_register_zero.cpp.incl"
+
+const int ConcreteRegisterImpl::max_gpr = RegisterImpl::number_of_registers;
+const int ConcreteRegisterImpl::max_fpr =
+ ConcreteRegisterImpl::max_gpr + FloatRegisterImpl::number_of_registers;
+
+const char* RegisterImpl::name() const {
+ ShouldNotCallThis();
+}
+
+const char* FloatRegisterImpl::name() const {
+ ShouldNotCallThis();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/register_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+class VMRegImpl;
+typedef VMRegImpl* VMReg;
+
+// Use Register as shortcut
+class RegisterImpl;
+typedef RegisterImpl* Register;
+
+inline Register as_Register(int encoding) {
+ return (Register)(intptr_t) encoding;
+}
+
+// The implementation of integer registers for the zero architecture
+class RegisterImpl : public AbstractRegisterImpl {
+ public:
+ enum {
+ number_of_registers = 0
+ };
+
+ // construction
+ inline friend Register as_Register(int encoding);
+ VMReg as_VMReg();
+
+ // derived registers, offsets, and addresses
+ Register successor() const {
+ return as_Register(encoding() + 1);
+ }
+
+ // accessors
+ int encoding() const {
+ assert(is_valid(), "invalid register");
+ return (intptr_t)this;
+ }
+ bool is_valid() const {
+ return 0 <= (intptr_t) this && (intptr_t)this < number_of_registers;
+ }
+ const char* name() const;
+};
+
+// Use FloatRegister as shortcut
+class FloatRegisterImpl;
+typedef FloatRegisterImpl* FloatRegister;
+
+inline FloatRegister as_FloatRegister(int encoding) {
+ return (FloatRegister)(intptr_t) encoding;
+}
+
+// The implementation of floating point registers for the zero architecture
+class FloatRegisterImpl : public AbstractRegisterImpl {
+ public:
+ enum {
+ number_of_registers = 0
+ };
+
+ // construction
+ inline friend FloatRegister as_FloatRegister(int encoding);
+ VMReg as_VMReg();
+
+ // derived registers, offsets, and addresses
+ FloatRegister successor() const {
+ return as_FloatRegister(encoding() + 1);
+ }
+
+ // accessors
+ int encoding() const {
+ assert(is_valid(), "invalid register");
+ return (intptr_t)this;
+ }
+ bool is_valid() const {
+ return 0 <= (intptr_t) this && (intptr_t)this < number_of_registers;
+ }
+ const char* name() const;
+};
+
+class ConcreteRegisterImpl : public AbstractRegisterImpl {
+ public:
+ enum {
+ number_of_registers = RegisterImpl::number_of_registers +
+ FloatRegisterImpl::number_of_registers
+ };
+
+ static const int max_gpr;
+ static const int max_fpr;
+};
+
+CONSTANT_REGISTER_DECLARATION(Register, noreg, (-1));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/relocInfo_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_relocInfo_zero.cpp.incl"
+
+void Relocation::pd_set_data_value(address x, intptr_t o) {
+ ShouldNotCallThis();
+}
+
+address Relocation::pd_call_destination(address orig_addr) {
+ ShouldNotCallThis();
+}
+
+void Relocation::pd_set_call_destination(address x) {
+ ShouldNotCallThis();
+}
+
+address Relocation::pd_get_address_from_code() {
+ ShouldNotCallThis();
+}
+
+address* Relocation::pd_address_in_code() {
+ // Relocations in Shark are just stored directly
+ return (address *) addr();
+}
+
+int Relocation::pd_breakpoint_size() {
+ ShouldNotCallThis();
+}
+
+void Relocation::pd_swap_in_breakpoint(address x,
+ short* instrs,
+ int instrlen) {
+ ShouldNotCallThis();
+}
+
+void Relocation::pd_swap_out_breakpoint(address x,
+ short* instrs,
+ int instrlen) {
+ ShouldNotCallThis();
+}
+
+void poll_Relocation::fix_relocation_after_move(const CodeBuffer* src,
+ CodeBuffer* dst) {
+ ShouldNotCallThis();
+}
+
+void poll_return_Relocation::fix_relocation_after_move(const CodeBuffer* src,
+ CodeBuffer* dst) {
+ ShouldNotCallThis();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/relocInfo_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+ // machine-dependent parts of class relocInfo
+ private:
+ enum {
+ // these constants mean nothing without an assembler
+ offset_unit = 1,
+ format_width = 1
+ };
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/sharedRuntime_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_sharedRuntime_zero.cpp.incl"
+
+DeoptimizationBlob *SharedRuntime::_deopt_blob;
+SafepointBlob *SharedRuntime::_polling_page_safepoint_handler_blob;
+SafepointBlob *SharedRuntime::_polling_page_return_handler_blob;
+RuntimeStub *SharedRuntime::_wrong_method_blob;
+RuntimeStub *SharedRuntime::_ic_miss_blob;
+RuntimeStub *SharedRuntime::_resolve_opt_virtual_call_blob;
+RuntimeStub *SharedRuntime::_resolve_virtual_call_blob;
+RuntimeStub *SharedRuntime::_resolve_static_call_blob;
+
+int SharedRuntime::java_calling_convention(const BasicType *sig_bt,
+ VMRegPair *regs,
+ int total_args_passed,
+ int is_outgoing) {
+ return 0;
+}
+
+AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters(
+ MacroAssembler *masm,
+ int total_args_passed,
+ int comp_args_on_stack,
+ const BasicType *sig_bt,
+ const VMRegPair *regs) {
+ return new AdapterHandlerEntry(
+ ShouldNotCallThisStub(),
+ ShouldNotCallThisStub(),
+ ShouldNotCallThisStub());
+}
+
+nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
+ methodHandle method,
+ int total_in_args,
+ int comp_args_on_stack,
+ BasicType *in_sig_bt,
+ VMRegPair *in_regs,
+ BasicType ret_type) {
+ ShouldNotCallThis();
+}
+
+int Deoptimization::last_frame_adjust(int callee_parameters,
+ int callee_locals) {
+ return 0;
+}
+
+uint SharedRuntime::out_preserve_stack_slots() {
+ ShouldNotCallThis();
+}
+
+static RuntimeStub* generate_empty_runtime_stub(const char* name) {
+ CodeBuffer buffer(name, 0, 0);
+ return RuntimeStub::new_runtime_stub(name, &buffer, 0, 0, NULL, false);
+}
+
+static SafepointBlob* generate_empty_safepoint_blob() {
+ CodeBuffer buffer("handler_blob", 0, 0);
+ return SafepointBlob::create(&buffer, NULL, 0);
+}
+
+void SharedRuntime::generate_stubs() {
+ _wrong_method_blob =
+ generate_empty_runtime_stub("wrong_method_stub");
+ _ic_miss_blob =
+ generate_empty_runtime_stub("ic_miss_stub");
+ _resolve_opt_virtual_call_blob =
+ generate_empty_runtime_stub("resolve_opt_virtual_call");
+ _resolve_virtual_call_blob =
+ generate_empty_runtime_stub("resolve_virtual_call");
+ _resolve_static_call_blob =
+ generate_empty_runtime_stub("resolve_static_call");
+
+ _polling_page_safepoint_handler_blob =
+ generate_empty_safepoint_blob();
+ _polling_page_return_handler_blob =
+ generate_empty_safepoint_blob();
+}
+
+int SharedRuntime::c_calling_convention(const BasicType *sig_bt,
+ VMRegPair *regs,
+ int total_args_passed) {
+ ShouldNotCallThis();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/sharkFrame_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// | ... |
+// +--------------------+ ------------------
+// | stack slot n-1 | low addresses
+// | ... |
+// | stack slot 0 |
+// | monitor m-1 |
+// | ... |
+// | monitor 0 |
+// | oop_tmp |
+// | method |
+// | unextended_sp |
+// | pc |
+// | frame_type |
+// | next_frame | high addresses
+// +--------------------+ ------------------
+// | ... |
+
+class SharkFrame : public ZeroFrame {
+ friend class SharkFunction;
+
+ private:
+ SharkFrame() : ZeroFrame() {
+ ShouldNotCallThis();
+ }
+
+ protected:
+ enum Layout {
+ pc_off = jf_header_words,
+ unextended_sp_off,
+ method_off,
+ oop_tmp_off,
+ header_words
+ };
+
+ public:
+ address pc() const {
+ return (address) value_of_word(pc_off);
+ }
+
+ intptr_t* unextended_sp() const {
+ return (intptr_t *) value_of_word(unextended_sp_off);
+ }
+
+ methodOop method() const {
+ return (methodOop) value_of_word(method_off);
+ }
+
+ public:
+ void identify_word(int frame_index,
+ int offset,
+ char* fieldbuf,
+ char* valuebuf,
+ int buflen) const;
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/stack_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,197 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2008, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+class ZeroStack {
+ private:
+ intptr_t *_base; // the last available word
+ intptr_t *_top; // the word past the end of the stack
+ intptr_t *_sp; // the top word on the stack
+
+ public:
+ ZeroStack()
+ : _base(NULL), _top(NULL), _sp(NULL) {}
+
+ bool needs_setup() const {
+ return _base == NULL;
+ }
+
+ void setup(void *mem, size_t size) {
+ assert(needs_setup(), "already set up");
+ assert(!(size & WordAlignmentMask), "unaligned");
+
+ _base = (intptr_t *) mem;
+ _top = _base + (size >> LogBytesPerWord);
+ _sp = _top;
+ }
+ void teardown() {
+ assert(!needs_setup(), "not set up");
+ assert(_sp == _top, "stuff on stack at teardown");
+
+ _base = NULL;
+ _top = NULL;
+ _sp = NULL;
+ }
+
+ intptr_t *sp() const {
+ return _sp;
+ }
+ void set_sp(intptr_t *new_sp) {
+ assert(_top >= new_sp && new_sp >= _base, "bad stack pointer");
+ _sp = new_sp;
+ }
+
+ int available_words() const {
+ return _sp - _base;
+ }
+
+ void push(intptr_t value) {
+ assert(_sp > _base, "stack overflow");
+ *(--_sp) = value;
+ }
+ intptr_t pop() {
+ assert(_sp < _top, "stack underflow");
+ return *(_sp++);
+ }
+
+ void *alloc(size_t size) {
+ int count = align_size_up(size, wordSize) >> LogBytesPerWord;
+ assert(count <= available_words(), "stack overflow");
+ return _sp -= count;
+ }
+
+ public:
+ static ByteSize base_offset() {
+ return byte_offset_of(ZeroStack, _base);
+ }
+ static ByteSize top_offset() {
+ return byte_offset_of(ZeroStack, _top);
+ }
+ static ByteSize sp_offset() {
+ return byte_offset_of(ZeroStack, _sp);
+ }
+};
+
+
+class EntryFrame;
+class InterpreterFrame;
+class SharkFrame;
+class FakeStubFrame;
+
+//
+// | ... |
+// +--------------------+ ------------------
+// | ... | low addresses
+// | frame_type |
+// | next_frame | high addresses
+// +--------------------+ ------------------
+// | ... |
+
+class ZeroFrame {
+ friend class frame;
+ friend class ZeroStackPrinter;
+
+ protected:
+ ZeroFrame() {
+ ShouldNotCallThis();
+ }
+
+ enum Layout {
+ next_frame_off,
+ frame_type_off,
+ jf_header_words
+ };
+
+ enum FrameType {
+ ENTRY_FRAME = 1,
+ INTERPRETER_FRAME,
+ SHARK_FRAME,
+ FAKE_STUB_FRAME
+ };
+
+ protected:
+ intptr_t *addr_of_word(int offset) const {
+ return (intptr_t *) this - offset;
+ }
+ intptr_t value_of_word(int offset) const {
+ return *addr_of_word(offset);
+ }
+
+ public:
+ ZeroFrame *next() const {
+ return (ZeroFrame *) value_of_word(next_frame_off);
+ }
+
+ protected:
+ FrameType type() const {
+ return (FrameType) value_of_word(frame_type_off);
+ }
+
+ public:
+ bool is_entry_frame() const {
+ return type() == ENTRY_FRAME;
+ }
+ bool is_interpreter_frame() const {
+ return type() == INTERPRETER_FRAME;
+ }
+ bool is_shark_frame() const {
+ return type() == SHARK_FRAME;
+ }
+ bool is_fake_stub_frame() const {
+ return type() == FAKE_STUB_FRAME;
+ }
+
+ public:
+ EntryFrame *as_entry_frame() const {
+ assert(is_entry_frame(), "should be");
+ return (EntryFrame *) this;
+ }
+ InterpreterFrame *as_interpreter_frame() const {
+ assert(is_interpreter_frame(), "should be");
+ return (InterpreterFrame *) this;
+ }
+ SharkFrame *as_shark_frame() const {
+ assert(is_shark_frame(), "should be");
+ return (SharkFrame *) this;
+ }
+ FakeStubFrame *as_fake_stub_frame() const {
+ assert(is_fake_stub_frame(), "should be");
+ return (FakeStubFrame *) this;
+ }
+
+ public:
+ void identify_word(int frame_index,
+ int offset,
+ char* fieldbuf,
+ char* valuebuf,
+ int buflen) const;
+
+ protected:
+ void identify_vp_word(int frame_index,
+ intptr_t* addr,
+ intptr_t* monitor_base,
+ intptr_t* stack_base,
+ char* fieldbuf,
+ int buflen) const;
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/stubGenerator_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,251 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_stubGenerator_zero.cpp.incl"
+
+// Declaration and definition of StubGenerator (no .hpp file).
+// For a more detailed description of the stub routine structure
+// see the comment in stubRoutines.hpp
+
+class StubGenerator: public StubCodeGenerator {
+ private:
+ // The call stub is used to call Java from C
+ static void call_stub(
+ JavaCallWrapper *call_wrapper,
+ intptr_t* result,
+ BasicType result_type,
+ methodOop method,
+ address entry_point,
+ intptr_t* parameters,
+ int parameter_words,
+ TRAPS) {
+ JavaThread *thread = (JavaThread *) THREAD;
+ ZeroStack *stack = thread->zero_stack();
+
+ // Make sure we have no pending exceptions
+ assert(!HAS_PENDING_EXCEPTION, "call_stub called with pending exception");
+
+ // Set up the stack if necessary
+ bool stack_needs_teardown = false;
+ if (stack->needs_setup()) {
+ size_t stack_used = thread->stack_base() - (address) &stack_used;
+ size_t stack_free = thread->stack_size() - stack_used;
+ size_t zero_stack_size = align_size_down(stack_free / 2, wordSize);
+
+ stack->setup(alloca(zero_stack_size), zero_stack_size);
+ stack_needs_teardown = true;
+ }
+
+ // Allocate and initialize our frame
+ thread->push_zero_frame(
+ EntryFrame::build(stack, parameters, parameter_words, call_wrapper));
+
+ // Make the call
+ Interpreter::invoke_method(method, entry_point, THREAD);
+
+ // Store result depending on type
+ if (!HAS_PENDING_EXCEPTION) {
+ switch (result_type) {
+ case T_INT:
+ *(jint *) result = *(jint *) stack->sp();
+ break;
+ case T_LONG:
+ *(jlong *) result = *(jlong *) stack->sp();
+ break;
+ case T_FLOAT:
+ *(jfloat *) result = *(jfloat *) stack->sp();
+ break;
+ case T_DOUBLE:
+ *(jdouble *) result = *(jdouble *) stack->sp();
+ break;
+ case T_OBJECT:
+ *(oop *) result = *(oop *) stack->sp();
+ break;
+ default:
+ ShouldNotReachHere();
+ }
+ }
+
+ // Unwind our frame
+ thread->pop_zero_frame();
+
+ // Tear down the stack if necessary
+ if (stack_needs_teardown)
+ stack->teardown();
+ }
+
+ // These stubs get called from some dumb test routine.
+ // I'll write them properly when they're called from
+ // something that's actually doing something.
+ static void fake_arraycopy_stub(address src, address dst, int count) {
+ assert(count == 0, "huh?");
+ }
+
+ void generate_arraycopy_stubs() {
+ // Call the conjoint generation methods immediately after
+ // the disjoint ones so that short branches from the former
+ // to the latter can be generated.
+ StubRoutines::_jbyte_disjoint_arraycopy = (address) fake_arraycopy_stub;
+ StubRoutines::_jbyte_arraycopy = (address) fake_arraycopy_stub;
+
+ StubRoutines::_jshort_disjoint_arraycopy = (address) fake_arraycopy_stub;
+ StubRoutines::_jshort_arraycopy = (address) fake_arraycopy_stub;
+
+ StubRoutines::_jint_disjoint_arraycopy = (address) fake_arraycopy_stub;
+ StubRoutines::_jint_arraycopy = (address) fake_arraycopy_stub;
+
+ StubRoutines::_jlong_disjoint_arraycopy = (address) fake_arraycopy_stub;
+ StubRoutines::_jlong_arraycopy = (address) fake_arraycopy_stub;
+
+ StubRoutines::_oop_disjoint_arraycopy = ShouldNotCallThisStub();
+ StubRoutines::_oop_arraycopy = ShouldNotCallThisStub();
+
+ StubRoutines::_checkcast_arraycopy = ShouldNotCallThisStub();
+ StubRoutines::_unsafe_arraycopy = ShouldNotCallThisStub();
+ StubRoutines::_generic_arraycopy = ShouldNotCallThisStub();
+
+ // We don't generate specialized code for HeapWord-aligned source
+ // arrays, so just use the code we've already generated
+ StubRoutines::_arrayof_jbyte_disjoint_arraycopy =
+ StubRoutines::_jbyte_disjoint_arraycopy;
+ StubRoutines::_arrayof_jbyte_arraycopy =
+ StubRoutines::_jbyte_arraycopy;
+
+ StubRoutines::_arrayof_jshort_disjoint_arraycopy =
+ StubRoutines::_jshort_disjoint_arraycopy;
+ StubRoutines::_arrayof_jshort_arraycopy =
+ StubRoutines::_jshort_arraycopy;
+
+ StubRoutines::_arrayof_jint_disjoint_arraycopy =
+ StubRoutines::_jint_disjoint_arraycopy;
+ StubRoutines::_arrayof_jint_arraycopy =
+ StubRoutines::_jint_arraycopy;
+
+ StubRoutines::_arrayof_jlong_disjoint_arraycopy =
+ StubRoutines::_jlong_disjoint_arraycopy;
+ StubRoutines::_arrayof_jlong_arraycopy =
+ StubRoutines::_jlong_arraycopy;
+
+ StubRoutines::_arrayof_oop_disjoint_arraycopy =
+ StubRoutines::_oop_disjoint_arraycopy;
+ StubRoutines::_arrayof_oop_arraycopy =
+ StubRoutines::_oop_arraycopy;
+ }
+
+ void generate_initial() {
+ // Generates all stubs and initializes the entry points
+
+ // entry points that exist in all platforms Note: This is code
+ // that could be shared among different platforms - however the
+ // benefit seems to be smaller than the disadvantage of having a
+ // much more complicated generator structure. See also comment in
+ // stubRoutines.hpp.
+
+ StubRoutines::_forward_exception_entry = ShouldNotCallThisStub();
+ StubRoutines::_call_stub_entry = (address) call_stub;
+ StubRoutines::_catch_exception_entry = ShouldNotCallThisStub();
+
+ // atomic calls
+ StubRoutines::_atomic_xchg_entry = ShouldNotCallThisStub();
+ StubRoutines::_atomic_xchg_ptr_entry = ShouldNotCallThisStub();
+ StubRoutines::_atomic_cmpxchg_entry = ShouldNotCallThisStub();
+ StubRoutines::_atomic_cmpxchg_ptr_entry = ShouldNotCallThisStub();
+ StubRoutines::_atomic_cmpxchg_long_entry = ShouldNotCallThisStub();
+ StubRoutines::_atomic_add_entry = ShouldNotCallThisStub();
+ StubRoutines::_atomic_add_ptr_entry = ShouldNotCallThisStub();
+ StubRoutines::_fence_entry = ShouldNotCallThisStub();
+
+ // amd64 does this here, sparc does it in generate_all()
+ StubRoutines::_handler_for_unsafe_access_entry =
+ ShouldNotCallThisStub();
+ }
+
+ void generate_all() {
+ // Generates all stubs and initializes the entry points
+
+ // These entry points require SharedInfo::stack0 to be set up in
+ // non-core builds and need to be relocatable, so they each
+ // fabricate a RuntimeStub internally.
+ StubRoutines::_throw_AbstractMethodError_entry =
+ ShouldNotCallThisStub();
+
+ StubRoutines::_throw_ArithmeticException_entry =
+ ShouldNotCallThisStub();
+
+ StubRoutines::_throw_NullPointerException_entry =
+ ShouldNotCallThisStub();
+
+ StubRoutines::_throw_NullPointerException_at_call_entry =
+ ShouldNotCallThisStub();
+
+ StubRoutines::_throw_StackOverflowError_entry =
+ ShouldNotCallThisStub();
+
+ // support for verify_oop (must happen after universe_init)
+ StubRoutines::_verify_oop_subroutine_entry =
+ ShouldNotCallThisStub();
+
+ // arraycopy stubs used by compilers
+ generate_arraycopy_stubs();
+ }
+
+ public:
+ StubGenerator(CodeBuffer* code, bool all) : StubCodeGenerator(code) {
+ if (all) {
+ generate_all();
+ } else {
+ generate_initial();
+ }
+ }
+};
+
+void StubGenerator_generate(CodeBuffer* code, bool all) {
+ StubGenerator g(code, all);
+}
+
+EntryFrame *EntryFrame::build(ZeroStack* stack,
+ const intptr_t* parameters,
+ int parameter_words,
+ JavaCallWrapper* call_wrapper) {
+ if (header_words + parameter_words > stack->available_words()) {
+ Unimplemented();
+ }
+
+ stack->push(0); // next_frame, filled in later
+ intptr_t *fp = stack->sp();
+ assert(fp - stack->sp() == next_frame_off, "should be");
+
+ stack->push(ENTRY_FRAME);
+ assert(fp - stack->sp() == frame_type_off, "should be");
+
+ stack->push((intptr_t) call_wrapper);
+ assert(fp - stack->sp() == call_wrapper_off, "should be");
+
+ for (int i = 0; i < parameter_words; i++)
+ stack->push(parameters[i]);
+
+ return (EntryFrame *) fp;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/stubRoutines_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2008, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_stubRoutines_zero.cpp.incl"
+
+#ifdef IA32
+address StubRoutines::x86::_call_stub_compiled_return = NULL;
+#endif // IA32
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/stubRoutines_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+ // This file holds the platform specific parts of the StubRoutines
+ // definition. See stubRoutines.hpp for a description on how to
+ // extend it.
+
+ public:
+ static address call_stub_return_pc() {
+ return (address) -1;
+ }
+
+ static bool returns_to_call_stub(address return_pc) {
+ return return_pc == call_stub_return_pc();
+ }
+
+ enum platform_dependent_constants {
+ code_size1 = 0, // The assembler will fail with a guarantee
+ code_size2 = 0 // if these are too small. Simply increase
+ }; // them if that happens.
+
+#ifdef IA32
+ class x86 {
+ friend class VMStructs;
+
+ private:
+ static address _call_stub_compiled_return;
+ };
+#endif // IA32
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/templateInterpreterGenerator_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/templateInterpreter_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/templateInterpreter_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/templateTable_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/templateTable_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/vmStructs_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// These are the CPU-specific fields, types and integer
+// constants required by the Serviceability Agent. This file is
+// referenced by vmStructs.cpp.
+
+#define VM_STRUCTS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field, last_entry) \
+
+ /* NOTE that we do not use the last_entry() macro here; it is used */
+ /* in vmStructs_<os>_<cpu>.hpp's VM_STRUCTS_OS_CPU macro (and must */
+ /* be present there) */
+
+#define VM_TYPES_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type, last_entry) \
+
+ /* NOTE that we do not use the last_entry() macro here; it is used */
+ /* in vmStructs_<os>_<cpu>.hpp's VM_TYPES_OS_CPU macro (and must */
+ /* be present there) */
+
+#define VM_INT_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
+
+ /* NOTE that we do not use the last_entry() macro here; it is used */
+ /* in vmStructs_<os>_<cpu>.hpp's VM_INT_CONSTANTS_OS_CPU macro (and must */
+ /* be present there) */
+
+#define VM_LONG_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
+
+ /* NOTE that we do not use the last_entry() macro here; it is used */
+ /* in vmStructs_<os>_<cpu>.hpp's VM_LONG_CONSTANTS_OS_CPU macro (and must */
+ /* be present there) */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/vm_version_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/vm_version_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+class VM_Version : public Abstract_VM_Version {
+ public:
+ static const char* cpu_features() {
+ return "";
+ }
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/vmreg_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2006-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_vmreg_zero.cpp.incl"
+
+void VMRegImpl::set_regName() {
+ int i = 0;
+ Register reg = ::as_Register(0);
+ for ( ; i < ConcreteRegisterImpl::max_gpr ; ) {
+ regName[i++] = reg->name();
+ reg = reg->successor();
+ }
+ FloatRegister freg = ::as_FloatRegister(0);
+ for ( ; i < ConcreteRegisterImpl::max_fpr ; ) {
+ regName[i++] = freg->name();
+ freg = freg->successor();
+ }
+ assert(i == ConcreteRegisterImpl::number_of_registers, "fix this");
+}
+
+bool VMRegImpl::is_Register() {
+ return value() >= 0 &&
+ value() < ConcreteRegisterImpl::max_gpr;
+}
+
+bool VMRegImpl::is_FloatRegister() {
+ return value() >= ConcreteRegisterImpl::max_gpr &&
+ value() < ConcreteRegisterImpl::max_fpr;
+}
+
+Register VMRegImpl::as_Register() {
+ assert(is_Register(), "must be");
+ return ::as_Register(value());
+}
+
+FloatRegister VMRegImpl::as_FloatRegister() {
+ assert(is_FloatRegister(), "must be" );
+ return ::as_FloatRegister(value() - ConcreteRegisterImpl::max_gpr);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/vmreg_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+ bool is_Register();
+ Register as_Register();
+
+ bool is_FloatRegister();
+ FloatRegister as_FloatRegister();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/vmreg_zero.inline.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2006-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+inline VMReg RegisterImpl::as_VMReg() {
+ return VMRegImpl::as_VMReg(encoding());
+}
+
+inline VMReg FloatRegisterImpl::as_VMReg() {
+ return VMRegImpl::as_VMReg(encoding() + ConcreteRegisterImpl::max_gpr);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/zero/vm/vtableStubs_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_vtableStubs_zero.cpp.incl"
+
+VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
+ ShouldNotCallThis();
+}
+
+VtableStub* VtableStubs::create_itable_stub(int vtable_index) {
+ ShouldNotCallThis();
+}
+
+int VtableStub::pd_code_size_limit(bool is_vtable_stub) {
+ ShouldNotCallThis();
+}
+
+int VtableStub::pd_code_alignment() {
+ ShouldNotCallThis();
+}
--- a/hotspot/src/os/linux/vm/os_linux.cpp Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -176,7 +176,9 @@
#endif
// Cpu architecture string
-#if defined(IA64)
+#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";
@@ -1743,7 +1745,14 @@
{EM_SPARC32PLUS, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
{EM_SPARCV9, EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"},
{EM_PPC, EM_PPC, ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"},
- {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"}
+ {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"},
+ {EM_ARM, EM_ARM, ELFCLASS32, ELFDATA2LSB, (char*)"ARM"},
+ {EM_S390, EM_S390, ELFCLASSNONE, ELFDATA2MSB, (char*)"IBM System/390"},
+ {EM_ALPHA, EM_ALPHA, ELFCLASS64, ELFDATA2LSB, (char*)"Alpha"},
+ {EM_MIPS_RS3_LE, EM_MIPS_RS3_LE, ELFCLASS32, ELFDATA2LSB, (char*)"MIPSel"},
+ {EM_MIPS, EM_MIPS, ELFCLASS32, ELFDATA2MSB, (char*)"MIPS"},
+ {EM_PARISC, EM_PARISC, ELFCLASS32, ELFDATA2MSB, (char*)"PARISC"},
+ {EM_68K, EM_68K, ELFCLASS32, ELFDATA2MSB, (char*)"M68k"}
};
#if (defined IA32)
@@ -1760,9 +1769,23 @@
static Elf32_Half running_arch_code=EM_PPC64;
#elif (defined __powerpc__)
static Elf32_Half running_arch_code=EM_PPC;
+ #elif (defined ARM)
+ static Elf32_Half running_arch_code=EM_ARM;
+ #elif (defined S390)
+ static Elf32_Half running_arch_code=EM_S390;
+ #elif (defined ALPHA)
+ static Elf32_Half running_arch_code=EM_ALPHA;
+ #elif (defined MIPSEL)
+ static Elf32_Half running_arch_code=EM_MIPS_RS3_LE;
+ #elif (defined PARISC)
+ static Elf32_Half running_arch_code=EM_PARISC;
+ #elif (defined MIPS)
+ static Elf32_Half running_arch_code=EM_MIPS;
+ #elif (defined M68K)
+ static Elf32_Half running_arch_code=EM_68K;
#else
#error Method os::dll_load requires that one of following is defined:\
- IA32, AMD64, IA64, __sparc, __powerpc__
+ IA32, AMD64, IA64, __sparc, __powerpc__, ARM, S390, ALPHA, MIPS, MIPSEL, PARISC, M68K
#endif
// Identify compatability class for VM's architecture and library's architecture
@@ -1794,10 +1817,12 @@
return NULL;
}
+#ifndef S390
if (lib_arch.elf_class != arch_array[running_arch_index].elf_class) {
::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: architecture word width mismatch)");
return NULL;
}
+#endif // !S390
if (lib_arch.compat_class != arch_array[running_arch_index].compat_class) {
if ( lib_arch.name!=NULL ) {
@@ -2586,7 +2611,9 @@
// format has been changed), we'll use the largest page size supported by
// the processor.
+#ifndef ZERO
_large_page_size = IA32_ONLY(4 * M) AMD64_ONLY(2 * M) IA64_ONLY(256 * M) SPARC_ONLY(4 * M);
+#endif // ZERO
FILE *fp = fopen("/proc/meminfo", "r");
if (fp) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/os_cpu/linux_zero/vm/assembler_linux_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/os_cpu/linux_zero/vm/atomic_linux_zero.inline.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,293 @@
+/*
+ * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// Implementation of class atomic
+
+#ifdef M68K
+
+/*
+ * __m68k_cmpxchg
+ *
+ * Atomically store newval in *ptr if *ptr is equal to oldval for user space.
+ * Returns newval on success and oldval if no exchange happened.
+ * This implementation is processor specific and works on
+ * 68020 68030 68040 and 68060.
+ *
+ * It will not work on ColdFire, 68000 and 68010 since they lack the CAS
+ * instruction.
+ * Using a kernelhelper would be better for arch complete implementation.
+ *
+ */
+
+static inline int __m68k_cmpxchg(int oldval, int newval, volatile int *ptr) {
+ int ret;
+ __asm __volatile ("cas%.l %0,%2,%1"
+ : "=d" (ret), "+m" (*(ptr))
+ : "d" (newval), "0" (oldval));
+ return ret;
+}
+
+/* Perform an atomic compare and swap: if the current value of `*PTR'
+ is OLDVAL, then write NEWVAL into `*PTR'. Return the contents of
+ `*PTR' before the operation.*/
+static inline int m68k_compare_and_swap(volatile int *ptr,
+ int oldval,
+ int newval) {
+ for (;;) {
+ int prev = *ptr;
+ if (prev != oldval)
+ return prev;
+
+ if (__m68k_cmpxchg (prev, newval, ptr) == newval)
+ // Success.
+ return prev;
+
+ // We failed even though prev == oldval. Try again.
+ }
+}
+
+/* Atomically add an int to memory. */
+static inline int m68k_add_and_fetch(volatile int *ptr, int add_value) {
+ for (;;) {
+ // Loop until success.
+
+ int prev = *ptr;
+
+ if (__m68k_cmpxchg (prev, prev + add_value, ptr) == prev + add_value)
+ return prev + add_value;
+ }
+}
+
+/* Atomically write VALUE into `*PTR' and returns the previous
+ contents of `*PTR'. */
+static inline int m68k_lock_test_and_set(volatile int *ptr, int newval) {
+ for (;;) {
+ // Loop until success.
+ int prev = *ptr;
+
+ if (__m68k_cmpxchg (prev, newval, ptr) == prev)
+ return prev;
+ }
+}
+#endif // M68K
+
+#ifdef ARM
+
+/*
+ * __kernel_cmpxchg
+ *
+ * Atomically store newval in *ptr if *ptr is equal to oldval for user space.
+ * Return zero if *ptr was changed or non-zero if no exchange happened.
+ * The C flag is also set if *ptr was changed to allow for assembly
+ * optimization in the calling code.
+ *
+ */
+
+typedef int (__kernel_cmpxchg_t)(int oldval, int newval, volatile int *ptr);
+#define __kernel_cmpxchg (*(__kernel_cmpxchg_t *) 0xffff0fc0)
+
+
+
+/* Perform an atomic compare and swap: if the current value of `*PTR'
+ is OLDVAL, then write NEWVAL into `*PTR'. Return the contents of
+ `*PTR' before the operation.*/
+static inline int arm_compare_and_swap(volatile int *ptr,
+ int oldval,
+ int newval) {
+ for (;;) {
+ int prev = *ptr;
+ if (prev != oldval)
+ return prev;
+
+ if (__kernel_cmpxchg (prev, newval, ptr) == 0)
+ // Success.
+ return prev;
+
+ // We failed even though prev == oldval. Try again.
+ }
+}
+
+/* Atomically add an int to memory. */
+static inline int arm_add_and_fetch(volatile int *ptr, int add_value) {
+ for (;;) {
+ // Loop until a __kernel_cmpxchg succeeds.
+
+ int prev = *ptr;
+
+ if (__kernel_cmpxchg (prev, prev + add_value, ptr) == 0)
+ return prev + add_value;
+ }
+}
+
+/* Atomically write VALUE into `*PTR' and returns the previous
+ contents of `*PTR'. */
+static inline int arm_lock_test_and_set(volatile int *ptr, int newval) {
+ for (;;) {
+ // Loop until a __kernel_cmpxchg succeeds.
+ int prev = *ptr;
+
+ if (__kernel_cmpxchg (prev, newval, ptr) == 0)
+ return prev;
+ }
+}
+#endif // ARM
+
+inline void Atomic::store(jint store_value, volatile jint* dest) {
+ *dest = store_value;
+}
+
+inline void Atomic::store_ptr(intptr_t store_value, intptr_t* dest) {
+ *dest = store_value;
+}
+
+inline jint Atomic::add(jint add_value, volatile jint* dest) {
+#ifdef ARM
+ return arm_add_and_fetch(dest, add_value);
+#else
+#ifdef M68K
+ return m68k_add_and_fetch(dest, add_value);
+#else
+ return __sync_add_and_fetch(dest, add_value);
+#endif // M68K
+#endif // ARM
+}
+
+inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
+#ifdef ARM
+ return arm_add_and_fetch(dest, add_value);
+#else
+#ifdef M68K
+ return m68k_add_and_fetch(dest, add_value);
+#else
+ return __sync_add_and_fetch(dest, add_value);
+#endif // M68K
+#endif // ARM
+}
+
+inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) {
+ return (void *) add_ptr(add_value, (volatile intptr_t *) dest);
+}
+
+inline void Atomic::inc(volatile jint* dest) {
+ add(1, dest);
+}
+
+inline void Atomic::inc_ptr(volatile intptr_t* dest) {
+ add_ptr(1, dest);
+}
+
+inline void Atomic::inc_ptr(volatile void* dest) {
+ add_ptr(1, dest);
+}
+
+inline void Atomic::dec(volatile jint* dest) {
+ add(-1, dest);
+}
+
+inline void Atomic::dec_ptr(volatile intptr_t* dest) {
+ add_ptr(-1, dest);
+}
+
+inline void Atomic::dec_ptr(volatile void* dest) {
+ add_ptr(-1, dest);
+}
+
+inline jint Atomic::xchg(jint exchange_value, volatile jint* dest) {
+#ifdef ARM
+ return arm_lock_test_and_set(dest, exchange_value);
+#else
+#ifdef M68K
+ return m68k_lock_test_and_set(dest, exchange_value);
+#else
+ // __sync_lock_test_and_set is a bizarrely named atomic exchange
+ // operation. Note that some platforms only support this with the
+ // limitation that the only valid value to store is the immediate
+ // constant 1. There is a test for this in JNI_CreateJavaVM().
+ return __sync_lock_test_and_set (dest, exchange_value);
+#endif // M68K
+#endif // ARM
+}
+
+inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value,
+ volatile intptr_t* dest) {
+#ifdef ARM
+ return arm_lock_test_and_set(dest, exchange_value);
+#else
+#ifdef M68K
+ return m68k_lock_test_and_set(dest, exchange_value);
+#else
+ return __sync_lock_test_and_set (dest, exchange_value);
+#endif // M68K
+#endif // ARM
+}
+
+inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
+ return (void *) xchg_ptr((intptr_t) exchange_value,
+ (volatile intptr_t*) dest);
+}
+
+inline jint Atomic::cmpxchg(jint exchange_value,
+ volatile jint* dest,
+ jint compare_value) {
+#ifdef ARM
+ return arm_compare_and_swap(dest, compare_value, exchange_value);
+#else
+#ifdef M68K
+ return m68k_compare_and_swap(dest, compare_value, exchange_value);
+#else
+ return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
+#endif // M68K
+#endif // ARM
+}
+
+inline jlong Atomic::cmpxchg(jlong exchange_value,
+ volatile jlong* dest,
+ jlong compare_value) {
+
+ return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
+}
+
+inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value,
+ volatile intptr_t* dest,
+ intptr_t compare_value) {
+#ifdef ARM
+ return arm_compare_and_swap(dest, compare_value, exchange_value);
+#else
+#ifdef M68K
+ return m68k_compare_and_swap(dest, compare_value, exchange_value);
+#else
+ return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
+#endif // M68K
+#endif // ARM
+}
+
+inline void* Atomic::cmpxchg_ptr(void* exchange_value,
+ volatile void* dest,
+ void* compare_value) {
+
+ return (void *) cmpxchg_ptr((intptr_t) exchange_value,
+ (volatile intptr_t*) dest,
+ (intptr_t) compare_value);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/os_cpu/linux_zero/vm/bytes_linux_zero.inline.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// Efficient swapping of data bytes from Java byte
+// ordering to native byte ordering and vice versa.
+
+#include <byteswap.h>
+
+inline u2 Bytes::swap_u2(u2 x) {
+ return bswap_16(x);
+}
+
+inline u4 Bytes::swap_u4(u4 x) {
+ return bswap_32(x);
+}
+
+inline u8 Bytes::swap_u8(u8 x) {
+ return bswap_64(x);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/os_cpu/linux_zero/vm/globals_linux_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+//
+// Set the default values for platform dependent flags used by the
+// runtime system. See globals.hpp for details of what they do.
+//
+
+define_pd_global(bool, DontYieldALot, false);
+#ifdef _LP64
+define_pd_global(intx, ThreadStackSize, 1536);
+define_pd_global(intx, VMThreadStackSize, 1024);
+#else
+define_pd_global(intx, ThreadStackSize, 1024);
+define_pd_global(intx, VMThreadStackSize, 512);
+#endif // _LP64
+define_pd_global(intx, SurvivorRatio, 8);
+define_pd_global(intx, CompilerThreadStackSize, 0);
+define_pd_global(uintx, JVMInvokeMethodSlack, 8192);
+
+define_pd_global(bool, UseVectoredExceptions, false);
+// Only used on 64 bit platforms
+define_pd_global(uintx, HeapBaseMinAddress, 2*G);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/os_cpu/linux_zero/vm/orderAccess_linux_zero.inline.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#ifdef ARM
+
+/*
+ * ARM Kernel helper for memory barrier.
+ * Using __asm __volatile ("":::"memory") does not work reliable on ARM
+ * and gcc __sync_synchronize(); implementation does not use the kernel
+ * helper for all gcc versions so it is unreliable to use as well.
+ */
+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()
+
+#else // ARM
+
+#define FULL_MEM_BARRIER __sync_synchronize()
+
+#ifdef PPC
+
+#define READ_MEM_BARRIER __asm __volatile ("isync":::"memory")
+#ifdef __NO_LWSYNC__
+#define WRITE_MEM_BARRIER __asm __volatile ("sync":::"memory")
+#else
+#define WRITE_MEM_BARRIER __asm __volatile ("lwsync":::"memory")
+#endif
+
+#else // PPC
+
+#define READ_MEM_BARRIER __asm __volatile ("":::"memory")
+#define WRITE_MEM_BARRIER __asm __volatile ("":::"memory")
+
+#endif // PPC
+
+#endif // ARM
+
+
+inline void OrderAccess::loadload() { acquire(); }
+inline void OrderAccess::storestore() { release(); }
+inline void OrderAccess::loadstore() { acquire(); }
+inline void OrderAccess::storeload() { fence(); }
+
+inline void OrderAccess::acquire() {
+ READ_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(); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,456 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// do not include precompiled header file
+#include "incls/_os_linux_zero.cpp.incl"
+
+address os::current_stack_pointer() {
+ address dummy = (address) &dummy;
+ return dummy;
+}
+
+frame os::get_sender_for_C_frame(frame* fr) {
+ ShouldNotCallThis();
+}
+
+frame os::current_frame() {
+ // The only thing that calls this is the stack printing code in
+ // VMError::report:
+ // - Step 110 (printing stack bounds) uses the sp in the frame
+ // to determine the amount of free space on the stack. We
+ // set the sp to a close approximation of the real value in
+ // order to allow this step to complete.
+ // - Step 120 (printing native stack) tries to walk the stack.
+ // The frame we create has a NULL pc, which is ignored as an
+ // invalid frame.
+ frame dummy = frame();
+ dummy.set_sp((intptr_t *) current_stack_pointer());
+ return dummy;
+}
+
+char* os::non_memory_address_word() {
+ // Must never look like an address returned by reserve_memory,
+ // even in its subfields (as defined by the CPU immediate fields,
+ // if the CPU splits constants across multiple instructions).
+#ifdef SPARC
+ // On SPARC, 0 != %hi(any real address), because there is no
+ // allocation in the first 1Kb of the virtual address space.
+ return (char *) 0;
+#else
+ // This is the value for x86; works pretty well for PPC too.
+ return (char *) -1;
+#endif // SPARC
+}
+
+void os::initialize_thread() {
+ // Nothing to do.
+}
+
+address os::Linux::ucontext_get_pc(ucontext_t* uc) {
+ ShouldNotCallThis();
+}
+
+ExtendedPC os::fetch_frame_from_context(void* ucVoid,
+ intptr_t** ret_sp,
+ intptr_t** ret_fp) {
+ ShouldNotCallThis();
+}
+
+frame os::fetch_frame_from_context(void* ucVoid) {
+ ShouldNotCallThis();
+}
+
+extern "C" int
+JVM_handle_linux_signal(int sig,
+ siginfo_t* info,
+ void* ucVoid,
+ int abort_if_unrecognized) {
+ ucontext_t* uc = (ucontext_t*) ucVoid;
+
+ Thread* t = ThreadLocalStorage::get_thread_slow();
+
+ SignalHandlerMark shm(t);
+
+ // Note: it's not uncommon that JNI code uses signal/sigset to
+ // install then restore certain signal handler (e.g. to temporarily
+ // block SIGPIPE, or have a SIGILL handler when detecting CPU
+ // type). When that happens, JVM_handle_linux_signal() might be
+ // invoked with junk info/ucVoid. To avoid unnecessary crash when
+ // libjsig is not preloaded, try handle signals that do not require
+ // siginfo/ucontext first.
+
+ if (sig == SIGPIPE || sig == SIGXFSZ) {
+ // allow chained handler to go first
+ if (os::Linux::chained_handler(sig, info, ucVoid)) {
+ return true;
+ } else {
+ if (PrintMiscellaneous && (WizardMode || Verbose)) {
+ char buf[64];
+ warning("Ignoring %s - see bugs 4229104 or 646499219",
+ os::exception_name(sig, buf, sizeof(buf)));
+ }
+ return true;
+ }
+ }
+
+ JavaThread* thread = NULL;
+ VMThread* vmthread = NULL;
+ if (os::Linux::signal_handlers_are_installed) {
+ if (t != NULL ){
+ if(t->is_Java_thread()) {
+ thread = (JavaThread*)t;
+ }
+ else if(t->is_VM_thread()){
+ vmthread = (VMThread *)t;
+ }
+ }
+ }
+
+ if (info != NULL && thread != NULL) {
+ // Handle ALL stack overflow variations here
+ if (sig == SIGSEGV) {
+ address addr = (address) info->si_addr;
+
+ // check if fault address is within thread stack
+ if (addr < thread->stack_base() &&
+ addr >= thread->stack_base() - thread->stack_size()) {
+ // stack overflow
+ if (thread->in_stack_yellow_zone(addr)) {
+ thread->disable_stack_yellow_zone();
+ ShouldNotCallThis();
+ }
+ else if (thread->in_stack_red_zone(addr)) {
+ thread->disable_stack_red_zone();
+ ShouldNotCallThis();
+ }
+ else {
+ // Accessing stack address below sp may cause SEGV if
+ // current thread has MAP_GROWSDOWN stack. This should
+ // only happen when current thread was created by user
+ // code with MAP_GROWSDOWN flag and then attached to VM.
+ // See notes in os_linux.cpp.
+ if (thread->osthread()->expanding_stack() == 0) {
+ thread->osthread()->set_expanding_stack();
+ if (os::Linux::manually_expand_stack(thread, addr)) {
+ thread->osthread()->clear_expanding_stack();
+ return true;
+ }
+ thread->osthread()->clear_expanding_stack();
+ }
+ else {
+ fatal("recursive segv. expanding stack.");
+ }
+ }
+ }
+ }
+
+ /*if (thread->thread_state() == _thread_in_Java) {
+ ShouldNotCallThis();
+ }
+ else*/ if (thread->thread_state() == _thread_in_vm &&
+ sig == SIGBUS && thread->doing_unsafe_access()) {
+ ShouldNotCallThis();
+ }
+
+ // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC
+ // kicks in and the heap gets shrunk before the field access.
+ /*if (sig == SIGSEGV || sig == SIGBUS) {
+ address addr = JNI_FastGetField::find_slowcase_pc(pc);
+ if (addr != (address)-1) {
+ stub = addr;
+ }
+ }*/
+
+ // Check to see if we caught the safepoint code in the process
+ // of write protecting the memory serialization page. It write
+ // enables the page immediately after protecting it so we can
+ // just return to retry the write.
+ if (sig == SIGSEGV &&
+ os::is_memory_serialize_page(thread, (address) info->si_addr)) {
+ // Block current thread until permission is restored.
+ os::block_on_serialize_page_trap();
+ return true;
+ }
+ }
+
+ // signal-chaining
+ if (os::Linux::chained_handler(sig, info, ucVoid)) {
+ return true;
+ }
+
+ if (!abort_if_unrecognized) {
+ // caller wants another chance, so give it to him
+ return false;
+ }
+
+#ifndef PRODUCT
+ if (sig == SIGSEGV) {
+ fatal("\n#"
+ "\n# /--------------------\\"
+ "\n# | segmentation fault |"
+ "\n# \\---\\ /--------------/"
+ "\n# /"
+ "\n# [-] |\\_/| "
+ "\n# (+)=C |o o|__ "
+ "\n# | | =-*-=__\\ "
+ "\n# OOO c_c_(___)");
+ }
+#endif // !PRODUCT
+
+ const char *fmt = "caught unhandled signal %d";
+ char buf[64];
+
+ sprintf(buf, fmt, sig);
+ fatal(buf);
+}
+
+void os::Linux::init_thread_fpu_state(void) {
+ // Nothing to do
+}
+
+int os::Linux::get_fpu_control_word() {
+ ShouldNotCallThis();
+}
+
+void os::Linux::set_fpu_control_word(int fpu) {
+ ShouldNotCallThis();
+}
+
+bool os::is_allocatable(size_t bytes) {
+ ShouldNotCallThis();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// thread stack
+
+size_t os::Linux::min_stack_allowed = 64 * K;
+
+bool os::Linux::supports_variable_stack_size() {
+ return true;
+}
+
+size_t os::Linux::default_stack_size(os::ThreadType thr_type) {
+#ifdef _LP64
+ size_t s = (thr_type == os::compiler_thread ? 4 * M : 1 * M);
+#else
+ size_t s = (thr_type == os::compiler_thread ? 2 * M : 512 * K);
+#endif // _LP64
+ return s;
+}
+
+size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
+ // Only enable glibc guard pages for non-Java threads
+ // (Java threads have HotSpot guard pages)
+ return (thr_type == java_thread ? 0 : page_size());
+}
+
+static void current_stack_region(address *bottom, size_t *size) {
+ pthread_attr_t attr;
+ int res = pthread_getattr_np(pthread_self(), &attr);
+ if (res != 0) {
+ if (res == ENOMEM) {
+ vm_exit_out_of_memory(0, "pthread_getattr_np");
+ }
+ else {
+ fatal1("pthread_getattr_np failed with errno = %d", res);
+ }
+ }
+
+ address stack_bottom;
+ size_t stack_bytes;
+ res = pthread_attr_getstack(&attr, (void **) &stack_bottom, &stack_bytes);
+ if (res != 0) {
+ fatal1("pthread_attr_getstack failed with errno = %d", res);
+ }
+ address stack_top = stack_bottom + stack_bytes;
+
+ // The block of memory returned by pthread_attr_getstack() includes
+ // guard pages where present. We need to trim these off.
+ size_t page_bytes = os::Linux::page_size();
+ assert(((intptr_t) stack_bottom & (page_bytes - 1)) == 0, "unaligned stack");
+
+ size_t guard_bytes;
+ res = pthread_attr_getguardsize(&attr, &guard_bytes);
+ if (res != 0) {
+ fatal1("pthread_attr_getguardsize failed with errno = %d", res);
+ }
+ int guard_pages = align_size_up(guard_bytes, page_bytes) / page_bytes;
+ assert(guard_bytes == guard_pages * page_bytes, "unaligned guard");
+
+#ifdef IA64
+ // IA64 has two stacks sharing the same area of memory, a normal
+ // stack growing downwards and a register stack growing upwards.
+ // Guard pages, if present, are in the centre. This code splits
+ // the stack in two even without guard pages, though in theory
+ // there's nothing to stop us allocating more to the normal stack
+ // or more to the register stack if one or the other were found
+ // to grow faster.
+ int total_pages = align_size_down(stack_bytes, page_bytes) / page_bytes;
+ stack_bottom += (total_pages - guard_pages) / 2 * page_bytes;
+#endif // IA64
+
+ stack_bottom += guard_bytes;
+
+ pthread_attr_destroy(&attr);
+
+ // The initial thread has a growable stack, and the size reported
+ // by pthread_attr_getstack is the maximum size it could possibly
+ // be given what currently mapped. This can be huge, so we cap it.
+ if (os::Linux::is_initial_thread()) {
+ stack_bytes = stack_top - stack_bottom;
+
+ if (stack_bytes > JavaThread::stack_size_at_create())
+ stack_bytes = JavaThread::stack_size_at_create();
+
+ stack_bottom = stack_top - stack_bytes;
+ }
+
+ assert(os::current_stack_pointer() >= stack_bottom, "should do");
+ assert(os::current_stack_pointer() < stack_top, "should do");
+
+ *bottom = stack_bottom;
+ *size = stack_top - stack_bottom;
+}
+
+address os::current_stack_base() {
+ address bottom;
+ size_t size;
+ current_stack_region(&bottom, &size);
+ return bottom + size;
+}
+
+size_t os::current_stack_size() {
+ // stack size includes normal stack and HotSpot guard pages
+ address bottom;
+ size_t size;
+ current_stack_region(&bottom, &size);
+ return size;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// helper functions for fatal error handler
+
+void os::print_context(outputStream* st, void* context) {
+ ShouldNotCallThis();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// Stubs for things that would be in linux_zero.s if it existed.
+// You probably want to disassemble these monkeys to check they're ok.
+
+extern "C" {
+ int SpinPause() {
+ }
+
+ int SafeFetch32(int *adr, int errValue) {
+ int value = errValue;
+ value = *adr;
+ return value;
+ }
+ intptr_t SafeFetchN(intptr_t *adr, intptr_t errValue) {
+ intptr_t value = errValue;
+ value = *adr;
+ return value;
+ }
+
+ void _Copy_conjoint_jshorts_atomic(jshort* from, jshort* to, size_t count) {
+ if (from > to) {
+ jshort *end = from + count;
+ while (from < end)
+ *(to++) = *(from++);
+ }
+ else if (from < to) {
+ jshort *end = from;
+ from += count - 1;
+ to += count - 1;
+ while (from >= end)
+ *(to--) = *(from--);
+ }
+ }
+ void _Copy_conjoint_jints_atomic(jint* from, jint* to, size_t count) {
+ if (from > to) {
+ jint *end = from + count;
+ while (from < end)
+ *(to++) = *(from++);
+ }
+ else if (from < to) {
+ jint *end = from;
+ from += count - 1;
+ to += count - 1;
+ while (from >= end)
+ *(to--) = *(from--);
+ }
+ }
+ void _Copy_conjoint_jlongs_atomic(jlong* from, jlong* to, size_t count) {
+ if (from > to) {
+ jlong *end = from + count;
+ while (from < end)
+ os::atomic_copy64(from++, to++);
+ }
+ else if (from < to) {
+ jlong *end = from;
+ from += count - 1;
+ to += count - 1;
+ while (from >= end)
+ os::atomic_copy64(from--, to--);
+ }
+ }
+
+ void _Copy_arrayof_conjoint_bytes(HeapWord* from,
+ HeapWord* to,
+ size_t count) {
+ ShouldNotCallThis();
+ }
+ void _Copy_arrayof_conjoint_jshorts(HeapWord* from,
+ HeapWord* to,
+ size_t count) {
+ ShouldNotCallThis();
+ }
+ void _Copy_arrayof_conjoint_jints(HeapWord* from,
+ HeapWord* to,
+ size_t count) {
+ ShouldNotCallThis();
+ }
+ void _Copy_arrayof_conjoint_jlongs(HeapWord* from,
+ HeapWord* to,
+ size_t count) {
+ ShouldNotCallThis();
+ }
+};
+
+/////////////////////////////////////////////////////////////////////////////
+// Implementations of atomic operations not supported by processors.
+// -- http://gcc.gnu.org/onlinedocs/gcc-4.2.1/gcc/Atomic-Builtins.html
+
+#ifndef _LP64
+extern "C" {
+ long long unsigned int __sync_val_compare_and_swap_8(
+ volatile void *ptr,
+ long long unsigned int oldval,
+ long long unsigned int newval) {
+ ShouldNotCallThis();
+ }
+};
+#endif // !_LP64
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+ static void setup_fpu() {}
+
+ static bool is_allocatable(size_t bytes);
+
+ // Used to register dynamic code cache area with the OS
+ // Note: Currently only used in 64 bit Windows implementations
+ static bool register_code_area(char *low, char *high) { return true; }
+
+ // Atomically copy 64 bits of data
+ static void atomic_copy64(volatile void *src, volatile void *dst) {
+#if defined(PPC) && !defined(_LP64)
+ double tmp;
+ asm volatile ("lfd %0, 0(%1)\n"
+ "stfd %0, 0(%2)\n"
+ : "=f"(tmp)
+ : "b"(src), "b"(dst));
+#else
+ *(jlong *) dst = *(jlong *) src;
+#endif // PPC && !_LP64
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/os_cpu/linux_zero/vm/prefetch_linux_zero.inline.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+inline void Prefetch::read(void* loc, intx interval) {
+}
+
+inline void Prefetch::write(void* loc, intx interval) {
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/os_cpu/linux_zero/vm/threadLS_linux_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_threadLS_linux_zero.cpp.incl"
+
+void ThreadLocalStorage::generate_code_for_get_thread() {
+ // nothing to do
+}
+
+void ThreadLocalStorage::pd_init() {
+ // nothing to do
+}
+
+void ThreadLocalStorage::pd_set_thread(Thread* thread) {
+ os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/os_cpu/linux_zero/vm/threadLS_linux_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// Processor dependent parts of ThreadLocalStorage
+
+ public:
+ static Thread* thread() {
+ return (Thread*) os::thread_local_storage_at(thread_index());
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/os_cpu/linux_zero/vm/thread_linux_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/os_cpu/linux_zero/vm/thread_linux_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007, 2008, 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+ private:
+ ZeroStack _zero_stack;
+ ZeroFrame* _top_zero_frame;
+
+ void pd_initialize() {
+ _top_zero_frame = NULL;
+ }
+
+ public:
+ ZeroStack *zero_stack() {
+ return &_zero_stack;
+ }
+
+ public:
+ ZeroFrame *top_zero_frame() {
+ return _top_zero_frame;
+ }
+ void push_zero_frame(ZeroFrame *frame) {
+ *(ZeroFrame **) frame = _top_zero_frame;
+ _top_zero_frame = frame;
+ }
+ void pop_zero_frame() {
+ zero_stack()->set_sp((intptr_t *) _top_zero_frame + 1);
+ _top_zero_frame = *(ZeroFrame **) _top_zero_frame;
+ }
+
+ public:
+ static ByteSize zero_stack_offset() {
+ return byte_offset_of(JavaThread, _zero_stack);
+ }
+ static ByteSize top_zero_frame_offset() {
+ return byte_offset_of(JavaThread, _top_zero_frame);
+ }
+
+ public:
+ void record_base_of_stack_pointer() {
+ assert(top_zero_frame() == NULL, "junk on stack prior to Java call");
+ }
+ void set_base_of_stack_pointer(intptr_t* base_sp) {
+ assert(base_sp == NULL, "should be");
+ assert(top_zero_frame() == NULL, "junk on stack after Java call");
+ }
+
+ public:
+ void set_last_Java_frame() {
+ JavaFrameAnchor *jfa = frame_anchor();
+ jfa->set_last_Java_sp((intptr_t *) top_zero_frame());
+ }
+ void reset_last_Java_frame() {
+ JavaFrameAnchor *jfa = frame_anchor();
+ jfa->set_last_Java_sp(NULL);
+ }
+
+ private:
+ frame pd_last_frame() {
+ assert(has_last_Java_frame(), "must have last_Java_sp() when suspended");
+ return frame(last_Java_sp(), zero_stack()->sp());
+ }
+
+ public:
+ // Check for pending suspend requests and pending asynchronous
+ // exceptions. There are separate accessors for these, but
+ // _suspend_flags is volatile so using them would be unsafe.
+ bool has_special_condition_for_native_trans() {
+ return _suspend_flags != 0;
+ }
+
+ public:
+ bool pd_get_top_frame_for_signal_handler(frame* fr_addr,
+ void* ucontext,
+ bool isInJava) {
+ ShouldNotCallThis();
+ }
+
+ // These routines are only used on cpu architectures that
+ // have separate register stacks (Itanium).
+ static bool register_stack_overflow() { return false; }
+ static void enable_register_stack_guard() {}
+ static void disable_register_stack_guard() {}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/os_cpu/linux_zero/vm/vmStructs_linux_zero.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// These are the OS and CPU-specific fields, types and integer
+// constants required by the Serviceability Agent. This file is
+// referenced by vmStructs.cpp.
+
+#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field, last_entry) \
+ /* This must be the last entry, and must be present */ \
+ last_entry()
+
+
+#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type, last_entry) \
+ /* This must be the last entry, and must be present */ \
+ last_entry()
+
+#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
+ /* This must be the last entry, and must be present */ \
+ last_entry()
+
+#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant, last_entry) \
+ /* This must be the last entry, and must be present */ \
+ last_entry()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/os_cpu/linux_zero/vm/vm_version_linux_zero.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2009 Red Hat, Inc.
+ * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// This file is intentionally empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/includeDB_zero Tue Oct 13 12:04:21 2009 -0700
@@ -0,0 +1,55 @@
+//
+// Copyright 2001-2009 Sun Microsystems, Inc. All Rights Reserved.
+// Copyright 2009 Red Hat, Inc.
+// 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+// CA 95054 USA or visit www.sun.com if you need additional information or
+// have any questions.
+//
+//
+
+// NOTE: DO NOT CHANGE THIS COPYRIGHT TO NEW STYLE - IT WILL BREAK makeDeps!
+
+entryFrame_<arch>.hpp javaCalls.hpp
+entryFrame_<arch>.hpp stack_<arch>.hpp
+
+fakeStubFrame_<arch>.hpp stack_<arch>.hpp
+
+frame.hpp stack_<arch>.hpp
+
+frame.inline.hpp fakeStubFrame_<arch>.hpp
+frame.inline.hpp entryFrame_<arch>.hpp
+frame.inline.hpp interpreterFrame_<arch>.hpp
+frame.inline.hpp sharkFrame_<arch>.hpp
+
+frame_<arch>.cpp interpreterRuntime.hpp
+frame_<arch>.cpp scopeDesc.hpp
+
+interpreter.hpp entry_<arch>.hpp
+
+interpreterFrame_<arch>.hpp bytecodeInterpreter.hpp
+interpreterFrame_<arch>.hpp methodOop.hpp
+interpreterFrame_<arch>.hpp stack_<arch>.hpp
+interpreterFrame_<arch>.hpp thread.hpp
+
+sharkFrame_<arch>.hpp methodOop.hpp
+sharkFrame_<arch>.hpp stack_<arch>.hpp
+
+stack_<arch>.hpp sizes.hpp
+
+thread.hpp stack_<arch>.hpp
--- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -3031,9 +3031,9 @@
tty->print_cr("&native_fresult: " INTPTR_FORMAT, (uintptr_t) &this->_native_fresult);
tty->print_cr("native_lresult: " INTPTR_FORMAT, (uintptr_t) this->_native_lresult);
#endif
-#ifdef IA64
+#if defined(IA64) && !defined(ZERO)
tty->print_cr("last_Java_fp: " INTPTR_FORMAT, (uintptr_t) this->_last_Java_fp);
-#endif // IA64
+#endif // IA64 && !ZERO
tty->print_cr("self_link: " INTPTR_FORMAT, (uintptr_t) this->_self_link);
}
--- a/hotspot/src/share/vm/interpreter/oopMapCache.cpp Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/src/share/vm/interpreter/oopMapCache.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -281,7 +281,7 @@
public:
void pass_int() { /* ignore */ }
void pass_long() { /* ignore */ }
-#ifdef _LP64
+#if defined(_LP64) || defined(ZERO)
void pass_float() { /* ignore */ }
#endif
void pass_double() { /* ignore */ }
--- a/hotspot/src/share/vm/runtime/arguments.cpp Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -1229,6 +1229,7 @@
}
}
+#ifndef ZERO
#ifdef _LP64
// Check that UseCompressedOops can be set with the max heap size allocated
// by ergonomics.
@@ -1254,6 +1255,7 @@
// Also checks that certain machines are slower with compressed oops
// in vm_version initialization code.
#endif // _LP64
+#endif // !ZERO
}
void Arguments::set_parallel_gc_flags() {
--- a/hotspot/src/share/vm/runtime/globals.hpp Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/src/share/vm/runtime/globals.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -47,7 +47,6 @@
define_pd_global(intx, OnStackReplacePercentage, 0);
define_pd_global(bool, ResizeTLAB, false);
define_pd_global(intx, FreqInlineSize, 0);
-define_pd_global(intx, InlineSmallCode, 0);
define_pd_global(intx, NewSizeThreadIncrease, 4*K);
define_pd_global(intx, NewRatio, 4);
define_pd_global(intx, InlineClassNatives, true);
--- a/hotspot/src/share/vm/runtime/jniHandles.hpp Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/src/share/vm/runtime/jniHandles.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -99,6 +99,8 @@
class JNIHandleBlock : public CHeapObj {
friend class VMStructs;
+ friend class CppInterpreter;
+
private:
enum SomeConstants {
block_size_in_oops = 32 // Number of handles per handle block
@@ -126,9 +128,11 @@
// Fill block with bad_handle values
void zap();
+ protected:
// No more handles in the both the current and following blocks
void clear() { _top = 0; }
+ private:
// Free list computation
void rebuild_free_list();
--- a/hotspot/src/share/vm/runtime/mutex.hpp Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/src/share/vm/runtime/mutex.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -61,18 +61,10 @@
} ;
// Endian-ness ... index of least-significant byte in SplitWord.Bytes[]
-#ifdef AMD64 // little
- #define _LSBINDEX 0
-#else
-#if IA32 // little
+#ifdef VM_LITTLE_ENDIAN
#define _LSBINDEX 0
#else
-#ifdef SPARC // big
#define _LSBINDEX (sizeof(intptr_t)-1)
-#else
- #error "unknown architecture"
-#endif
-#endif
#endif
class ParkEvent ;
--- a/hotspot/src/share/vm/runtime/signature.hpp Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/src/share/vm/runtime/signature.hpp Tue Oct 13 12:04:21 2009 -0700
@@ -275,11 +275,14 @@
void do_bool () { pass_int(); _jni_offset++; _offset++; }
void do_char () { pass_int(); _jni_offset++; _offset++; }
+#if defined(_LP64) || defined(ZERO)
+ void do_float () { pass_float(); _jni_offset++; _offset++; }
+#else
+ void do_float () { pass_int(); _jni_offset++; _offset++; }
+#endif
#ifdef _LP64
- void do_float () { pass_float(); _jni_offset++; _offset++; }
void do_double() { pass_double(); _jni_offset++; _offset += 2; }
#else
- void do_float () { pass_int(); _jni_offset++; _offset++; }
void do_double() { pass_double(); _jni_offset += 2; _offset += 2; }
#endif
void do_byte () { pass_int(); _jni_offset++; _offset++; }
@@ -303,8 +306,10 @@
virtual void pass_int() = 0;
virtual void pass_long() = 0;
virtual void pass_object() = 0;
+#if defined(_LP64) || defined(ZERO)
+ virtual void pass_float() = 0;
+#endif
#ifdef _LP64
- virtual void pass_float() = 0;
virtual void pass_double() = 0;
#else
virtual void pass_double() { pass_long(); } // may be same as long
--- a/hotspot/src/share/vm/runtime/vm_version.cpp Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/src/share/vm/runtime/vm_version.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -93,9 +93,13 @@
#else // KERNEL
#ifdef TIERED
#define VMTYPE "Server"
-#else
- #define VMTYPE COMPILER1_PRESENT("Client") \
- COMPILER2_PRESENT("Server")
+#else // TIERED
+#ifdef ZERO
+ #define VMTYPE "Zero"
+#else // ZERO
+ #define VMTYPE COMPILER1_PRESENT("Client") \
+ COMPILER2_PRESENT("Server")
+#endif // ZERO
#endif // TIERED
#endif // KERNEL
@@ -142,10 +146,14 @@
WINDOWS_ONLY("windows") \
SOLARIS_ONLY("solaris")
+#ifdef ZERO
+#define CPU ZERO_LIBARCH
+#else
#define CPU IA32_ONLY("x86") \
IA64_ONLY("ia64") \
AMD64_ONLY("amd64") \
SPARC_ONLY("sparc")
+#endif // ZERO
const char *Abstract_VM_Version::vm_platform_string() {
return OS "-" CPU;
--- a/hotspot/src/share/vm/utilities/vmError.cpp Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/src/share/vm/utilities/vmError.cpp Tue Oct 13 12:04:21 2009 -0700
@@ -458,6 +458,40 @@
if (_verbose && _thread && _thread->is_Java_thread()) {
JavaThread* jt = (JavaThread*)_thread;
+#ifdef ZERO
+ if (jt->zero_stack()->sp() && jt->top_zero_frame()) {
+ // StackFrameStream uses the frame anchor, which may not have
+ // been set up. This can be done at any time in Zero, however,
+ // so if it hasn't been set up then we just set it up now and
+ // clear it again when we're done.
+ bool has_last_Java_frame = jt->has_last_Java_frame();
+ if (!has_last_Java_frame)
+ jt->set_last_Java_frame();
+ st->print("Java frames:");
+
+ // If the top frame is a Shark frame and the frame anchor isn't
+ // set up then it's possible that the information in the frame
+ // is garbage: it could be from a previous decache, or it could
+ // simply have never been written. So we print a warning...
+ StackFrameStream sfs(jt);
+ if (!has_last_Java_frame && !sfs.is_done()) {
+ if (sfs.current()->zeroframe()->is_shark_frame()) {
+ st->print(" (TOP FRAME MAY BE JUNK)");
+ }
+ }
+ st->cr();
+
+ // Print the frames
+ for(int i = 0; !sfs.is_done(); sfs.next(), i++) {
+ sfs.current()->zero_print_on_error(i, st, buf, sizeof(buf));
+ st->cr();
+ }
+
+ // Reset the frame anchor if necessary
+ if (!has_last_Java_frame)
+ jt->reset_last_Java_frame();
+ }
+#else
if (jt->has_last_Java_frame()) {
st->print_cr("Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)");
for(StackFrameStream sfs(jt); !sfs.is_done(); sfs.next()) {
@@ -465,6 +499,7 @@
st->cr();
}
}
+#endif // ZERO
}
STEP(140, "(printing VM operation)" )