1/* 2 * Copyright (C) 2013 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 32/* 33 * typedef void (*PushAllRegistersCallback)(SafePointBarrier*, ThreadState*, intptr_t*); 34 * extern "C" void pushAllRegisters(SafePointBarrier*, ThreadState*, PushAllRegistersCallback) 35 */ 36 37.type pushAllRegisters, %function 38.global pushAllRegisters 39.hidden pushAllRegisters 40#ifdef __thumb__ 41/* In THUMB Mode jump to ARM stub via bx to ensure CPU mode switch. 42 * FIXME: This trampoline is provided to workaround bugs in 43 * the THUMB/ARM interworking that appear in the component build. 44 * When these issues are resolved this stub can be removed. 45 */ 46.align 2 47.code 16 48.thumb_func 49pushAllRegisters: 50 adr r3, pushAllRegistersARM 51 bx r3 52 53.type pushAllRegistersARM, %function 54.hidden pushAllRegistersARM 55.align 4 56.code 32 57pushAllRegistersARM: 58#else 59/* ARM Mode */ 60.align 4 61.code 32 62pushAllRegisters: 63#endif 64 /* Push all callee-saved registers and save return address. */ 65 push {r4-r11, lr} 66 /* Pass the two first arguments unchanged (r0, r1) 67 * and pass the stack pointer after pushing callee-saved 68 * registers to the callback function. 69 */ 70 mov r3, r2 71 mov r2, sp 72 blx r3 73 /* Discard all the registers, and pop lr into pc which returns 74 * and switches mode if needed. 75 */ 76 add sp, sp, #32 77 pop {pc} 78