1ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers/* 2ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Copyright (C) 2012 The Android Open Source Project 3ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * 4ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 5ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * you may not use this file except in compliance with the License. 6ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * You may obtain a copy of the License at 7ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * 8ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * http://www.apache.org/licenses/LICENSE-2.0 9ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * 10ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Unless required by applicable law or agreed to in writing, software 11ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * distributed under the License is distributed on an "AS IS" BASIS, 12ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * See the License for the specific language governing permissions and 14ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * limitations under the License. 15ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers */ 16ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 17ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#include "asm_support_x86_64.S" 18ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 19ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers /* 20ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Jni dlsym lookup stub. 21ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers */ 22bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas GampeDEFINE_FUNCTION art_jni_dlsym_lookup_stub 23bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe // Save callee and GPR args, mixed together to agree with core spills bitmap. 24bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe PUSH r9 // Arg. 25bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe PUSH r8 // Arg. 2604c31d2c984d382b4186974fa0a416aecbed2625Ian Rogers PUSH rdi // JniEnv. 27bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe PUSH rsi // Arg. 28bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe PUSH rdx // Arg. 29bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe PUSH rcx // Arg. 30bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe // Create space for FPR args, plus padding for alignment 31c380191f3048db2a3796d65db8e5d5a5e7b08c65Serguei Katkov subq LITERAL(72 + 4 * 8), %rsp 32c380191f3048db2a3796d65db8e5d5a5e7b08c65Serguei Katkov CFI_ADJUST_CFA_OFFSET(72 + 4 * 8) 33bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe // Save FPRs. 34bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq %xmm0, 0(%rsp) 35bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq %xmm1, 8(%rsp) 36bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq %xmm2, 16(%rsp) 37bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq %xmm3, 24(%rsp) 38bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq %xmm4, 32(%rsp) 39bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq %xmm5, 40(%rsp) 40bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq %xmm6, 48(%rsp) 41bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq %xmm7, 56(%rsp) 42c380191f3048db2a3796d65db8e5d5a5e7b08c65Serguei Katkov movq %xmm12, 64(%rsp) 43c380191f3048db2a3796d65db8e5d5a5e7b08c65Serguei Katkov movq %xmm13, 72(%rsp) 44c380191f3048db2a3796d65db8e5d5a5e7b08c65Serguei Katkov movq %xmm14, 80(%rsp) 45c380191f3048db2a3796d65db8e5d5a5e7b08c65Serguei Katkov movq %xmm15, 88(%rsp) 46bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe // prepare call 4704c31d2c984d382b4186974fa0a416aecbed2625Ian Rogers movq %gs:THREAD_SELF_OFFSET, %rdi // RDI := Thread::Current() 48bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe // call 49bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe call PLT_SYMBOL(artFindNativeMethod) // (Thread*) 50bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe // restore arguments 51bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq 0(%rsp), %xmm0 52bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq 8(%rsp), %xmm1 53bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq 16(%rsp), %xmm2 54bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq 24(%rsp), %xmm3 55bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq 32(%rsp), %xmm4 56bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq 40(%rsp), %xmm5 57bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq 48(%rsp), %xmm6 58bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe movq 56(%rsp), %xmm7 59c380191f3048db2a3796d65db8e5d5a5e7b08c65Serguei Katkov movq 64(%rsp), %xmm12 60c380191f3048db2a3796d65db8e5d5a5e7b08c65Serguei Katkov movq 72(%rsp), %xmm13 61c380191f3048db2a3796d65db8e5d5a5e7b08c65Serguei Katkov movq 80(%rsp), %xmm14 62c380191f3048db2a3796d65db8e5d5a5e7b08c65Serguei Katkov movq 88(%rsp), %xmm15 63c380191f3048db2a3796d65db8e5d5a5e7b08c65Serguei Katkov addq LITERAL(72 + 4 * 8), %rsp 64c380191f3048db2a3796d65db8e5d5a5e7b08c65Serguei Katkov CFI_ADJUST_CFA_OFFSET(-72 - 4 * 8) 65bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe POP rcx // Arg. 66bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe POP rdx // Arg. 67bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe POP rsi // Arg. 6804c31d2c984d382b4186974fa0a416aecbed2625Ian Rogers POP rdi // JniEnv. 69bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe POP r8 // Arg. 70bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe POP r9 // Arg. 71bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe testq %rax, %rax // check if returned method code is null 72bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe jz .Lno_native_code_found // if null, jump to return to handle 73bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe jmp *%rax // otherwise, tail call to intended method 74bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe.Lno_native_code_found: 75bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas Gampe ret 76bf6b92a158053c98b15f4393abb3b86344ec9a20Andreas GampeEND_FUNCTION art_jni_dlsym_lookup_stub 77