portable_entrypoints_arm.S revision 468532ea115657709bc32ee498e701a4c71762d4
16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (C) 2012 The Android Open Source Project 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Licensed under the Apache License, Version 2.0 (the "License"); 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * you may not use this file except in compliance with the License. 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * You may obtain a copy of the License at 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * http://www.apache.org/licenses/LICENSE-2.0 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Unless required by applicable law or agreed to in writing, software 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * distributed under the License is distributed on an "AS IS" BASIS, 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * See the License for the specific language governing permissions and 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * limitations under the License. 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "asm_support_arm.S" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Portable invocation stub. 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * On entry: 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * r0 = method pointer 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * r1 = argument array or NULL for no argument methods 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * r2 = size of argument array in bytes 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * r3 = (managed) thread pointer 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * [sp] = JValue* result 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * [sp + 4] = result type char 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgENTRY art_portable_invoke_stub 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org push {r0, r4, r5, r9, r11, lr} @ spill regs 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .save {r0, r4, r5, r9, r11, lr} 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .pad #24 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_adjust_cfa_offset 24 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset r0, 0 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset r4, 4 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset r5, 8 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset r9, 12 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset r11, 16 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset lr, 20 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mov r11, sp @ save the stack pointer 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_def_cfa_register r11 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mov r9, r3 @ move managed thread pointer into r9 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mov r4, #SUSPEND_CHECK_INTERVAL @ reset r4 to suspend check interval 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org add r5, r2, #16 @ create space for method pointer in frame 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org and r5, #0xFFFFFFF0 @ align frame size to 16 bytes 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sub sp, r5 @ reserve stack space for argument array 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org add r0, sp, #4 @ pass stack pointer + method ptr as dest for memcpy 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bl memcpy @ memcpy (dest, src, bytes) 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ldr r0, [r11] @ restore method* 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ldr r1, [sp, #4] @ copy arg value for r1 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ldr r2, [sp, #8] @ copy arg value for r2 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ldr r3, [sp, #12] @ copy arg value for r3 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mov ip, #0 @ set ip to 0 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str ip, [sp] @ store NULL for method* at bottom of frame 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org add sp, #16 @ first 4 args are not passed on stack for portable 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ldr ip, [r0, #METHOD_CODE_OFFSET] @ get pointer to the code 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org blx ip @ call the method 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mov sp, r11 @ restore the stack pointer 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ldr ip, [sp, #24] @ load the result pointer 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strd r0, [ip] @ store r0/r1 into result pointer 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pop {r0, r4, r5, r9, r11, lr} @ restore spill regs 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_adjust_cfa_offset -24 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bx lr 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgEND art_portable_invoke_stub 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .extern artPortableProxyInvokeHandler 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgENTRY art_portable_proxy_invoke_handler 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org @ Fake callee save ref and args frame set up, note portable doesn't use callee save frames. 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org @ TODO: just save the registers that are needed in artPortableProxyInvokeHandler. 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org push {r1-r3, r5-r8, r10-r11, lr} @ 10 words of callee saves 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .save {r1-r3, r5-r8, r10-r11, lr} 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_adjust_cfa_offset 40 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset r1, 0 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset r2, 4 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset r3, 8 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset r5, 12 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset r6, 16 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset r7, 20 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset r8, 24 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset r10, 28 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset r11, 32 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_rel_offset lr, 36 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sub sp, #8 @ 2 words of space, bottom word will hold Method* 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .pad #8 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_adjust_cfa_offset 8 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org @ Begin argument set up. 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str r0, [sp, #0] @ place proxy method at bottom of frame 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mov r2, r9 @ pass Thread::Current 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mov r3, sp @ pass SP 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org blx artPortableProxyInvokeHandler @ (Method* proxy method, receiver, Thread*, SP) 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ldr lr, [sp, #44] @ restore lr 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org add sp, #48 @ pop frame 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .cfi_adjust_cfa_offset -48 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bx lr @ return 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgEND art_portable_proxy_invoke_handler 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUNIMPLEMENTED art_portable_resolution_trampoline 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUNIMPLEMENTED art_portable_to_interpreter_bridge 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org