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