portable_entrypoints_arm.S revision 08bf1967611965b65ffd5de1aa603b60e7b2d6a8
17655f29fabc0a12765de828914a18314382e5a35Ian Rogers/* 27655f29fabc0a12765de828914a18314382e5a35Ian Rogers * Copyright (C) 2012 The Android Open Source Project 37655f29fabc0a12765de828914a18314382e5a35Ian Rogers * 47655f29fabc0a12765de828914a18314382e5a35Ian Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 57655f29fabc0a12765de828914a18314382e5a35Ian Rogers * you may not use this file except in compliance with the License. 67655f29fabc0a12765de828914a18314382e5a35Ian Rogers * You may obtain a copy of the License at 77655f29fabc0a12765de828914a18314382e5a35Ian Rogers * 87655f29fabc0a12765de828914a18314382e5a35Ian Rogers * http://www.apache.org/licenses/LICENSE-2.0 97655f29fabc0a12765de828914a18314382e5a35Ian Rogers * 107655f29fabc0a12765de828914a18314382e5a35Ian Rogers * Unless required by applicable law or agreed to in writing, software 117655f29fabc0a12765de828914a18314382e5a35Ian Rogers * distributed under the License is distributed on an "AS IS" BASIS, 127655f29fabc0a12765de828914a18314382e5a35Ian Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137655f29fabc0a12765de828914a18314382e5a35Ian Rogers * See the License for the specific language governing permissions and 147655f29fabc0a12765de828914a18314382e5a35Ian Rogers * limitations under the License. 157655f29fabc0a12765de828914a18314382e5a35Ian Rogers */ 167655f29fabc0a12765de828914a18314382e5a35Ian Rogers 177655f29fabc0a12765de828914a18314382e5a35Ian Rogers#include "asm_support_arm.S" 187655f29fabc0a12765de828914a18314382e5a35Ian Rogers 191a2f1bc64974254ab3246ca5c0682c5bb4317badIan Rogers .cfi_sections .debug_frame 201a2f1bc64974254ab3246ca5c0682c5bb4317badIan Rogers 217655f29fabc0a12765de828914a18314382e5a35Ian Rogers /* 227655f29fabc0a12765de828914a18314382e5a35Ian Rogers * Portable invocation stub. 237655f29fabc0a12765de828914a18314382e5a35Ian Rogers * On entry: 247655f29fabc0a12765de828914a18314382e5a35Ian Rogers * r0 = method pointer 257655f29fabc0a12765de828914a18314382e5a35Ian Rogers * r1 = argument array or NULL for no argument methods 267655f29fabc0a12765de828914a18314382e5a35Ian Rogers * r2 = size of argument array in bytes 277655f29fabc0a12765de828914a18314382e5a35Ian Rogers * r3 = (managed) thread pointer 287655f29fabc0a12765de828914a18314382e5a35Ian Rogers * [sp] = JValue* result 297655f29fabc0a12765de828914a18314382e5a35Ian Rogers * [sp + 4] = result type char 307655f29fabc0a12765de828914a18314382e5a35Ian Rogers */ 317655f29fabc0a12765de828914a18314382e5a35Ian RogersENTRY art_portable_invoke_stub 327655f29fabc0a12765de828914a18314382e5a35Ian Rogers push {r0, r4, r5, r9, r11, lr} @ spill regs 337655f29fabc0a12765de828914a18314382e5a35Ian Rogers .save {r0, r4, r5, r9, r11, lr} 347655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_adjust_cfa_offset 24 357655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset r0, 0 367655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset r4, 4 377655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset r5, 8 387655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset r9, 12 397655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset r11, 16 407655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset lr, 20 417655f29fabc0a12765de828914a18314382e5a35Ian Rogers mov r11, sp @ save the stack pointer 427655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_def_cfa_register r11 4308bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea @.movsp r11 447655f29fabc0a12765de828914a18314382e5a35Ian Rogers mov r9, r3 @ move managed thread pointer into r9 457655f29fabc0a12765de828914a18314382e5a35Ian Rogers mov r4, #SUSPEND_CHECK_INTERVAL @ reset r4 to suspend check interval 467655f29fabc0a12765de828914a18314382e5a35Ian Rogers add r5, r2, #16 @ create space for method pointer in frame 477655f29fabc0a12765de828914a18314382e5a35Ian Rogers and r5, #0xFFFFFFF0 @ align frame size to 16 bytes 487655f29fabc0a12765de828914a18314382e5a35Ian Rogers sub sp, r5 @ reserve stack space for argument array 497655f29fabc0a12765de828914a18314382e5a35Ian Rogers add r0, sp, #4 @ pass stack pointer + method ptr as dest for memcpy 507655f29fabc0a12765de828914a18314382e5a35Ian Rogers bl memcpy @ memcpy (dest, src, bytes) 517655f29fabc0a12765de828914a18314382e5a35Ian Rogers ldr r0, [r11] @ restore method* 527655f29fabc0a12765de828914a18314382e5a35Ian Rogers ldr r1, [sp, #4] @ copy arg value for r1 537655f29fabc0a12765de828914a18314382e5a35Ian Rogers ldr r2, [sp, #8] @ copy arg value for r2 547655f29fabc0a12765de828914a18314382e5a35Ian Rogers ldr r3, [sp, #12] @ copy arg value for r3 557655f29fabc0a12765de828914a18314382e5a35Ian Rogers mov ip, #0 @ set ip to 0 567655f29fabc0a12765de828914a18314382e5a35Ian Rogers str ip, [sp] @ store NULL for method* at bottom of frame 577655f29fabc0a12765de828914a18314382e5a35Ian Rogers add sp, #16 @ first 4 args are not passed on stack for portable 587655f29fabc0a12765de828914a18314382e5a35Ian Rogers ldr ip, [r0, #METHOD_CODE_OFFSET] @ get pointer to the code 597655f29fabc0a12765de828914a18314382e5a35Ian Rogers blx ip @ call the method 607655f29fabc0a12765de828914a18314382e5a35Ian Rogers mov sp, r11 @ restore the stack pointer 617655f29fabc0a12765de828914a18314382e5a35Ian Rogers ldr ip, [sp, #24] @ load the result pointer 627655f29fabc0a12765de828914a18314382e5a35Ian Rogers strd r0, [ip] @ store r0/r1 into result pointer 637655f29fabc0a12765de828914a18314382e5a35Ian Rogers pop {r0, r4, r5, r9, r11, lr} @ restore spill regs 647655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_adjust_cfa_offset -24 657655f29fabc0a12765de828914a18314382e5a35Ian Rogers bx lr 667655f29fabc0a12765de828914a18314382e5a35Ian RogersEND art_portable_invoke_stub 677655f29fabc0a12765de828914a18314382e5a35Ian Rogers 687655f29fabc0a12765de828914a18314382e5a35Ian Rogers .extern artPortableProxyInvokeHandler 697655f29fabc0a12765de828914a18314382e5a35Ian RogersENTRY art_portable_proxy_invoke_handler 707655f29fabc0a12765de828914a18314382e5a35Ian Rogers @ Fake callee save ref and args frame set up, note portable doesn't use callee save frames. 717655f29fabc0a12765de828914a18314382e5a35Ian Rogers @ TODO: just save the registers that are needed in artPortableProxyInvokeHandler. 727655f29fabc0a12765de828914a18314382e5a35Ian Rogers push {r1-r3, r5-r8, r10-r11, lr} @ 10 words of callee saves 737655f29fabc0a12765de828914a18314382e5a35Ian Rogers .save {r1-r3, r5-r8, r10-r11, lr} 747655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_adjust_cfa_offset 40 757655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset r1, 0 767655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset r2, 4 777655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset r3, 8 787655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset r5, 12 797655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset r6, 16 807655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset r7, 20 817655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset r8, 24 827655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset r10, 28 837655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset r11, 32 847655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset lr, 36 857655f29fabc0a12765de828914a18314382e5a35Ian Rogers sub sp, #8 @ 2 words of space, bottom word will hold Method* 867655f29fabc0a12765de828914a18314382e5a35Ian Rogers .pad #8 877655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_adjust_cfa_offset 8 887655f29fabc0a12765de828914a18314382e5a35Ian Rogers @ Begin argument set up. 897655f29fabc0a12765de828914a18314382e5a35Ian Rogers str r0, [sp, #0] @ place proxy method at bottom of frame 907655f29fabc0a12765de828914a18314382e5a35Ian Rogers mov r2, r9 @ pass Thread::Current 917655f29fabc0a12765de828914a18314382e5a35Ian Rogers mov r3, sp @ pass SP 927655f29fabc0a12765de828914a18314382e5a35Ian Rogers blx artPortableProxyInvokeHandler @ (Method* proxy method, receiver, Thread*, SP) 937655f29fabc0a12765de828914a18314382e5a35Ian Rogers ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ 947655f29fabc0a12765de828914a18314382e5a35Ian Rogers ldr lr, [sp, #44] @ restore lr 957655f29fabc0a12765de828914a18314382e5a35Ian Rogers add sp, #48 @ pop frame 967655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_adjust_cfa_offset -48 977655f29fabc0a12765de828914a18314382e5a35Ian Rogers bx lr @ return 987655f29fabc0a12765de828914a18314382e5a35Ian RogersEND art_portable_proxy_invoke_handler 99848871b4d8481229c32e0d048a9856e5a9a17ef9Ian Rogers 10008bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .extern artPortableResolutionTrampoline 10108bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos SbirleaENTRY art_portable_resolution_trampoline 10208bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea @ Fake callee save ref and args frame set up, note portable doesn't use callee save frames. 10308bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea @ TODO: just save the registers that are needed in artPortableResolutionTrampoline. 10408bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea push {r1-r3, r5-r8, r10-r11, lr} @ 10 words of callee saves 10508bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .save {r1-r3, r5-r8, r10-r11, lr} 10608bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_adjust_cfa_offset 40 10708bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r1, 0 10808bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r2, 4 10908bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r3, 8 11008bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r5, 12 11108bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r6, 16 11208bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r7, 20 11308bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r8, 24 11408bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r10, 28 11508bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r11, 32 11608bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset lr, 36 11708bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea sub sp, #8 @ 2 words of space, bottom word will hold Method* 11808bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .pad #8 11908bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_adjust_cfa_offset 8 12008bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea mov r2, r9 @ pass Thread::Current 12108bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea mov r3, sp @ pass SP 12208bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea blx artPortableResolutionTrampoline @ (Method* called, receiver, Thread*, SP) 12308bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea cmp r0, #0 @ is code pointer null? 12408bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea beq 1f @ goto exception 12508bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea mov r12, r0 12608bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea ldr r0, [sp, #0] @ load resolved method in r0 12708bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea ldr r1, [sp, #8] @ restore non-callee save r1 12808bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea ldrd r2, [sp, #12] @ restore non-callee saves r2-r3 12908bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea ldr lr, [sp, #44] @ restore lr 13008bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea add sp, #48 @ rewind sp 13108bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_adjust_cfa_offset -48 13208bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea bx r12 @ tail-call into actual code 13308bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea1: 13408bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea ldr r1, [sp, #8] @ restore non-callee save r1 13508bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea ldrd r2, [sp, #12] @ restore non-callee saves r2-r3 13608bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea ldr lr, [sp, #44] @ restore lr 13708bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea add sp, #48 @ rewind sp 13808bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_adjust_cfa_offset -48 13908bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea bx lr 14008bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos SbirleaEND art_portable_resolution_trampoline 14108bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea 14208bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .extern artPortableToInterpreterBridge 14308bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos SbirleaENTRY art_portable_to_interpreter_bridge 14408bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea @ Fake callee save ref and args frame set up, note portable doesn't use callee save frames. 14508bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea @ TODO: just save the registers that are needed in artPortableToInterpreterBridge. 14608bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea push {r1-r3, r5-r8, r10-r11, lr} @ 10 words of callee saves 14708bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .save {r1-r3, r5-r8, r10-r11, lr} 14808bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_adjust_cfa_offset 40 14908bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r1, 0 15008bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r2, 4 15108bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r3, 8 15208bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r5, 12 15308bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r6, 16 15408bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r7, 20 15508bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r8, 24 15608bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r10, 28 15708bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset r11, 32 15808bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_rel_offset lr, 36 15908bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea sub sp, #8 @ 2 words of space, bottom word will hold Method* 16008bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .pad #8 16108bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_adjust_cfa_offset 8 16208bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea mov r1, r9 @ pass Thread::Current 16308bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea mov r2, sp @ pass SP 16408bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea blx artPortableToInterpreterBridge @ (Method* method, Thread*, SP) 16508bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea ldr lr, [sp, #44] @ restore lr 16608bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea add sp, #48 @ pop frame 16708bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea .cfi_adjust_cfa_offset -48 16808bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos Sbirlea bx lr @ return 16908bf1967611965b65ffd5de1aa603b60e7b2d6a8Dragos SbirleaEND art_portable_to_interpreter_bridge 170