--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/cpu/aarch64/vm/aarch64_linkage.S Tue Jan 20 11:34:17 2015 -0800
@@ -0,0 +1,167 @@
+#
+# Copyright (c) 2012, Red Hat. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+
+# Routines used to enable x86 VM C++ code to invoke JIT-compiled ARM code
+# -- either Java methods or generated stub -- and to allow JIT-compiled
+# ARM code to invoke x86 VM C++ code
+#
+# the code for aarch64_stub_prolog below can be copied into the start
+# of the ARM code buffer and patched with a link to the
+# C++ routine which starts execution on the simulator. the ARM
+# code can be generated immediately following the copied code.
+
+#ifdef BUILTIN_SIM
+
+ .data
+ .globl setup_arm_sim,
+ .type setup_arm_sim,@function
+ .globl get_alt_stack,
+ .type get_alt_stack,@function
+ .globl aarch64_stub_prolog
+ .p2align 4
+aarch64_stub_prolog:
+ // entry point
+4: lea 1f(%rip), %r11
+ mov (%r11), %r10
+ mov (%r10), %r10
+ jmp *%r10
+ .p2align 4
+1:
+ .set entry_offset, . - 1b
+ .quad aarch64_prolog_ptr
+ // 64 bit int used to idenitfy called fn arg/return types
+ .set calltype_offset, . - 1b
+ .quad 0
+ // arm JIT code follows the stub
+ .set arm_code_offset, . - 1b
+ .size aarch64_stub_prolog, .-aarch64_stub_prolog
+aarch64_stub_prolog_end:
+
+ .text
+aarch64_prolog_ptr:
+ .quad aarch64_prolog
+
+ .globl aarch64_prolog
+aarch64_prolog:
+ .cfi_startproc
+ pushq %rbp
+ .cfi_def_cfa_offset 16
+ .cfi_offset 6, -16
+ movq %rsp, %rbp
+ .cfi_def_cfa_register 6
+ // save all registers used to pass args
+ sub $8, %rsp
+ movd %xmm7, (%rsp)
+ sub $8, %rsp
+ movd %xmm6, (%rsp)
+ sub $8, %rsp
+ movd %xmm5, (%rsp)
+ sub $8, %rsp
+ movd %xmm4, (%rsp)
+ sub $8, %rsp
+ movd %xmm3, (%rsp)
+ sub $8, %rsp
+ movd %xmm2, (%rsp)
+ sub $8, %rsp
+ movd %xmm1, (%rsp)
+ sub $8, %rsp
+ movd %xmm0, (%rsp)
+ push %r9
+ push %r8
+ push %rcx
+ push %rdx
+ push %rsi
+ push %rdi
+ // save rax -- this stack slot will be rewritten with a
+ // return value if needed
+ push %rax
+ // temporarily save r11 while we find the other stack
+ push %r11
+ // retrieve alt stack
+ call get_alt_stack@PLT
+ pop %r11
+ // push start of arm code
+ lea (arm_code_offset)(%r11), %rsi
+ push %rsi
+ // load call type code in arg reg 1
+ mov (calltype_offset)(%r11), %rsi
+ // load current stack pointer in arg reg 0
+ mov %rsp, %rdi
+ // switch to alt stack
+ mov %rax, %rsp
+ // save previous stack pointer on new stack
+ push %rdi
+ // 16-align the new stack pointer
+ push %rdi
+ // call sim setup routine
+ call setup_arm_sim@PLT
+ // switch back to old stack
+ pop %rsp
+ // pop start of arm code
+ pop %rdi
+ // pop rax -- either restores old value or installs return value
+ pop %rax
+ // pop arg registers
+ pop %rdi
+ pop %rsi
+ pop %rdx
+ pop %rcx
+ pop %r8
+ pop %r9
+ movd (%rsp), %xmm0
+ add $8, %rsp
+ movd (%rsp), %xmm1
+ add $8, %rsp
+ movd (%rsp), %xmm2
+ add $8, %rsp
+ movd (%rsp), %xmm3
+ add $8, %rsp
+ movd (%rsp), %xmm4
+ add $8, %rsp
+ movd (%rsp), %xmm5
+ add $8, %rsp
+ movd (%rsp), %xmm6
+ add $8, %rsp
+ movd (%rsp), %xmm7
+ add $8, %rsp
+ leave
+ .cfi_def_cfa 7, 8
+ ret
+ .cfi_endproc
+
+
+ .p2align 4
+get_pc:
+ // get return pc in rdi and then push it back
+ pop %rdi
+ push %rdi
+ ret
+
+ .p2align 4
+ .long
+ .globl aarch64_stub_prolog_size
+ .type aarch64_stub_prolog_size,@function
+aarch64_stub_prolog_size:
+ leaq aarch64_stub_prolog_end - aarch64_stub_prolog, %rax
+ ret
+
+#endif