1*0c81fcd6SJens Wiklander/* 2*0c81fcd6SJens Wiklander Copyright (c) 2011, 2012 ARM Ltd 3*0c81fcd6SJens Wiklander All rights reserved. 4*0c81fcd6SJens Wiklander 5*0c81fcd6SJens Wiklander Redistribution and use in source and binary forms, with or without 6*0c81fcd6SJens Wiklander modification, are permitted provided that the following conditions 7*0c81fcd6SJens Wiklander are met: 8*0c81fcd6SJens Wiklander 1. Redistributions of source code must retain the above copyright 9*0c81fcd6SJens Wiklander notice, this list of conditions and the following disclaimer. 10*0c81fcd6SJens Wiklander 2. Redistributions in binary form must reproduce the above copyright 11*0c81fcd6SJens Wiklander notice, this list of conditions and the following disclaimer in the 12*0c81fcd6SJens Wiklander documentation and/or other materials provided with the distribution. 13*0c81fcd6SJens Wiklander 3. The name of the company may not be used to endorse or promote 14*0c81fcd6SJens Wiklander products derived from this software without specific prior written 15*0c81fcd6SJens Wiklander permission. 16*0c81fcd6SJens Wiklander 17*0c81fcd6SJens Wiklander THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED 18*0c81fcd6SJens Wiklander WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19*0c81fcd6SJens Wiklander MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20*0c81fcd6SJens Wiklander IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21*0c81fcd6SJens Wiklander SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 22*0c81fcd6SJens Wiklander TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 23*0c81fcd6SJens Wiklander PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 24*0c81fcd6SJens Wiklander LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 25*0c81fcd6SJens Wiklander NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 26*0c81fcd6SJens Wiklander SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27*0c81fcd6SJens Wiklander */ 28*0c81fcd6SJens Wiklander 29*0c81fcd6SJens Wiklander#define GPR_LAYOUT \ 30*0c81fcd6SJens Wiklander REG_PAIR (x19, x20, 0); \ 31*0c81fcd6SJens Wiklander REG_PAIR (x21, x22, 16); \ 32*0c81fcd6SJens Wiklander REG_PAIR (x23, x24, 32); \ 33*0c81fcd6SJens Wiklander REG_PAIR (x25, x26, 48); \ 34*0c81fcd6SJens Wiklander REG_PAIR (x27, x28, 64); \ 35*0c81fcd6SJens Wiklander REG_PAIR (x29, x30, 80); \ 36*0c81fcd6SJens Wiklander REG_ONE (x16, 96) 37*0c81fcd6SJens Wiklander 38*0c81fcd6SJens Wiklander#define FPR_LAYOUT \ 39*0c81fcd6SJens Wiklander REG_PAIR ( d8, d9, 112); \ 40*0c81fcd6SJens Wiklander REG_PAIR (d10, d11, 128); \ 41*0c81fcd6SJens Wiklander REG_PAIR (d12, d13, 144); \ 42*0c81fcd6SJens Wiklander REG_PAIR (d14, d15, 160); 43*0c81fcd6SJens Wiklander 44*0c81fcd6SJens Wiklander// int setjmp (jmp_buf) 45*0c81fcd6SJens Wiklander .global setjmp 46*0c81fcd6SJens Wiklander .type setjmp, %function 47*0c81fcd6SJens Wiklandersetjmp: 48*0c81fcd6SJens Wiklander mov x16, sp 49*0c81fcd6SJens Wiklander#define REG_PAIR(REG1, REG2, OFFS) stp REG1, REG2, [x0, OFFS] 50*0c81fcd6SJens Wiklander#define REG_ONE(REG1, OFFS) str REG1, [x0, OFFS] 51*0c81fcd6SJens Wiklander GPR_LAYOUT 52*0c81fcd6SJens Wiklander FPR_LAYOUT 53*0c81fcd6SJens Wiklander#undef REG_PAIR 54*0c81fcd6SJens Wiklander#undef REG_ONE 55*0c81fcd6SJens Wiklander mov w0, #0 56*0c81fcd6SJens Wiklander ret 57*0c81fcd6SJens Wiklander .size setjmp, .-setjmp 58*0c81fcd6SJens Wiklander 59*0c81fcd6SJens Wiklander// void longjmp (jmp_buf, int) __attribute__ ((noreturn)) 60*0c81fcd6SJens Wiklander .global longjmp 61*0c81fcd6SJens Wiklander .type longjmp, %function 62*0c81fcd6SJens Wiklanderlongjmp: 63*0c81fcd6SJens Wiklander#define REG_PAIR(REG1, REG2, OFFS) ldp REG1, REG2, [x0, OFFS] 64*0c81fcd6SJens Wiklander#define REG_ONE(REG1, OFFS) ldr REG1, [x0, OFFS] 65*0c81fcd6SJens Wiklander GPR_LAYOUT 66*0c81fcd6SJens Wiklander FPR_LAYOUT 67*0c81fcd6SJens Wiklander#undef REG_PAIR 68*0c81fcd6SJens Wiklander#undef REG_ONE 69*0c81fcd6SJens Wiklander mov sp, x16 70*0c81fcd6SJens Wiklander cmp w1, #0 71*0c81fcd6SJens Wiklander cinc w0, w1, eq 72*0c81fcd6SJens Wiklander // use br not ret, as ret is guaranteed to mispredict 73*0c81fcd6SJens Wiklander br x30 74*0c81fcd6SJens Wiklander .size longjmp, .-longjmp 75