1 #
   2 # Copyright (c) 2012, Red Hat. All rights reserved.
   3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4 #
   5 # This code is free software; you can redistribute it and/or modify it
   6 # under the terms of the GNU General Public License version 2 only, as
   7 # published by the Free Software Foundation.
   8 #
   9 # This code is distributed in the hope that it will be useful, but WITHOUT
  10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12 # version 2 for more details (a copy is included in the LICENSE file that
  13 # accompanied this code).
  14 #
  15 # You should have received a copy of the GNU General Public License version
  16 # 2 along with this work; if not, write to the Free Software Foundation,
  17 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18 #
  19 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20 # or visit www.oracle.com if you need additional information or have any
  21 # questions.
  22 
  23 # Routines used to enable x86 VM C++ code to invoke JIT-compiled ARM code
  24 # -- either Java methods or generated stub -- and to allow JIT-compiled
  25 # ARM code to invoke x86 VM C++ code
  26 #
  27 # the code for aarch64_stub_prolog below can be copied into the start
  28 # of the ARM code buffer and patched with a link to the
  29 # C++ routine which starts execution on the simulator. the ARM
  30 # code can be generated immediately following the copied code.
  31 
  32 #ifdef BUILTIN_SIM
  33 
  34         .data
  35         .globl setup_arm_sim,
  36         .type  setup_arm_sim,@function
  37         .globl get_alt_stack,
  38         .type  get_alt_stack,@function
  39         .globl aarch64_stub_prolog
  40         .p2align  4
  41 aarch64_stub_prolog:
  42         // entry point
  43 4:      lea 1f(%rip), %r11
  44         mov (%r11), %r10
  45         mov (%r10), %r10
  46         jmp *%r10
  47         .p2align 4
  48 1:
  49         .set entry_offset, . - 1b
  50         .quad aarch64_prolog_ptr
  51         // 64 bit int used to idenitfy called fn arg/return types
  52         .set calltype_offset, . - 1b
  53         .quad 0
  54         // arm JIT code follows the stub
  55         .set arm_code_offset, . - 1b
  56         .size aarch64_stub_prolog, .-aarch64_stub_prolog
  57 aarch64_stub_prolog_end:
  58 
  59         .text
  60 aarch64_prolog_ptr:
  61         .quad aarch64_prolog
  62 
  63         .globl aarch64_prolog
  64 aarch64_prolog:
  65         .cfi_startproc
  66         pushq   %rbp
  67         .cfi_def_cfa_offset 16
  68         .cfi_offset 6, -16
  69         movq    %rsp, %rbp
  70         .cfi_def_cfa_register 6
  71         // save all registers used to pass args
  72         sub $8, %rsp
  73         movd %xmm7, (%rsp)
  74         sub $8, %rsp
  75         movd %xmm6, (%rsp)
  76         sub $8, %rsp
  77         movd %xmm5, (%rsp)
  78         sub $8, %rsp
  79         movd %xmm4, (%rsp)
  80         sub $8, %rsp
  81         movd %xmm3, (%rsp)
  82         sub $8, %rsp
  83         movd %xmm2, (%rsp)
  84         sub $8, %rsp
  85         movd %xmm1, (%rsp)
  86         sub $8, %rsp
  87         movd %xmm0, (%rsp)
  88         push %r9
  89         push %r8
  90         push %rcx
  91         push %rdx
  92         push %rsi
  93         push %rdi
  94         // save rax -- this stack slot will be rewritten with a
  95         // return value if needed
  96         push %rax
  97         // temporarily save r11 while we find the other stack
  98         push %r11
  99         // retrieve alt stack
 100         call get_alt_stack@PLT
 101         pop %r11
 102         // push start of arm code
 103         lea (arm_code_offset)(%r11), %rsi
 104         push %rsi
 105         // load call type code in arg reg 1
 106         mov (calltype_offset)(%r11), %rsi
 107         // load current stack pointer in arg reg 0
 108         mov %rsp, %rdi
 109         // switch to alt stack
 110         mov %rax, %rsp
 111         // save previous stack pointer on new stack
 112         push %rdi
 113         // 16-align the new stack pointer
 114         push %rdi
 115         // call sim setup routine
 116         call setup_arm_sim@PLT
 117         // switch back to old stack
 118         pop %rsp
 119         // pop start of arm code
 120         pop %rdi
 121         // pop rax -- either restores old value or installs return value
 122         pop %rax
 123         // pop arg registers
 124         pop %rdi
 125         pop %rsi
 126         pop %rdx
 127         pop %rcx
 128         pop %r8
 129         pop %r9
 130         movd (%rsp), %xmm0
 131         add $8, %rsp
 132         movd (%rsp), %xmm1
 133         add $8, %rsp
 134         movd (%rsp), %xmm2
 135         add $8, %rsp
 136         movd (%rsp), %xmm3
 137         add $8, %rsp
 138         movd (%rsp), %xmm4
 139         add $8, %rsp
 140         movd (%rsp), %xmm5
 141         add $8, %rsp
 142         movd (%rsp), %xmm6
 143         add $8, %rsp
 144         movd (%rsp), %xmm7
 145         add $8, %rsp
 146         leave
 147         .cfi_def_cfa 7, 8
 148         ret
 149         .cfi_endproc
 150 
 151 
 152         .p2align  4
 153 get_pc:
 154         // get return pc in rdi and then push it back
 155         pop %rdi
 156         push %rdi
 157         ret
 158 
 159         .p2align 4
 160         .long
 161         .globl aarch64_stub_prolog_size
 162         .type  aarch64_stub_prolog_size,@function
 163 aarch64_stub_prolog_size:
 164         leaq  aarch64_stub_prolog_end - aarch64_stub_prolog, %rax
 165         ret
 166 
 167 #endif