1*c0909341SAndroid Build Coastguard Worker/****************************************************************************** 2*c0909341SAndroid Build Coastguard Worker * Copyright © 2018, VideoLAN and dav1d authors 3*c0909341SAndroid Build Coastguard Worker * Copyright © 2015 Martin Storsjo 4*c0909341SAndroid Build Coastguard Worker * Copyright © 2015 Janne Grunau 5*c0909341SAndroid Build Coastguard Worker * All rights reserved. 6*c0909341SAndroid Build Coastguard Worker * 7*c0909341SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 8*c0909341SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met: 9*c0909341SAndroid Build Coastguard Worker * 10*c0909341SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright notice, this 11*c0909341SAndroid Build Coastguard Worker * list of conditions and the following disclaimer. 12*c0909341SAndroid Build Coastguard Worker * 13*c0909341SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright notice, 14*c0909341SAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation 15*c0909341SAndroid Build Coastguard Worker * and/or other materials provided with the distribution. 16*c0909341SAndroid Build Coastguard Worker * 17*c0909341SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 18*c0909341SAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19*c0909341SAndroid Build Coastguard Worker * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20*c0909341SAndroid Build Coastguard Worker * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 21*c0909341SAndroid Build Coastguard Worker * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22*c0909341SAndroid Build Coastguard Worker * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23*c0909341SAndroid Build Coastguard Worker * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24*c0909341SAndroid Build Coastguard Worker * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25*c0909341SAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 26*c0909341SAndroid Build Coastguard Worker * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27*c0909341SAndroid Build Coastguard Worker *****************************************************************************/ 28*c0909341SAndroid Build Coastguard Worker 29*c0909341SAndroid Build Coastguard Worker#define PRIVATE_PREFIX checkasm_ 30*c0909341SAndroid Build Coastguard Worker 31*c0909341SAndroid Build Coastguard Worker#include "src/arm/asm.S" 32*c0909341SAndroid Build Coastguard Worker#include "src/arm/64/util.S" 33*c0909341SAndroid Build Coastguard Worker 34*c0909341SAndroid Build Coastguard Workerconst register_init, align=4 35*c0909341SAndroid Build Coastguard Worker .quad 0x21f86d66c8ca00ce 36*c0909341SAndroid Build Coastguard Worker .quad 0x75b6ba21077c48ad 37*c0909341SAndroid Build Coastguard Worker .quad 0xed56bb2dcb3c7736 38*c0909341SAndroid Build Coastguard Worker .quad 0x8bda43d3fd1a7e06 39*c0909341SAndroid Build Coastguard Worker .quad 0xb64a9c9e5d318408 40*c0909341SAndroid Build Coastguard Worker .quad 0xdf9a54b303f1d3a3 41*c0909341SAndroid Build Coastguard Worker .quad 0x4a75479abd64e097 42*c0909341SAndroid Build Coastguard Worker .quad 0x249214109d5d1c88 43*c0909341SAndroid Build Coastguard Worker .quad 0x1a1b2550a612b48c 44*c0909341SAndroid Build Coastguard Worker .quad 0x79445c159ce79064 45*c0909341SAndroid Build Coastguard Worker .quad 0x2eed899d5a28ddcd 46*c0909341SAndroid Build Coastguard Worker .quad 0x86b2536fcd8cf636 47*c0909341SAndroid Build Coastguard Worker .quad 0xb0856806085e7943 48*c0909341SAndroid Build Coastguard Worker .quad 0x3f2bf84fc0fcca4e 49*c0909341SAndroid Build Coastguard Worker .quad 0xacbd382dcf5b8de2 50*c0909341SAndroid Build Coastguard Worker .quad 0xd229e1f5b281303f 51*c0909341SAndroid Build Coastguard Worker .quad 0x71aeaff20b095fd9 52*c0909341SAndroid Build Coastguard Worker .quad 0xab63e2e11fa38ed9 53*c0909341SAndroid Build Coastguard Workerendconst 54*c0909341SAndroid Build Coastguard Worker 55*c0909341SAndroid Build Coastguard Worker 56*c0909341SAndroid Build Coastguard Workerconst error_message_register 57*c0909341SAndroid Build Coastguard Worker .asciz "failed to preserve register" 58*c0909341SAndroid Build Coastguard Workererror_message_stack: 59*c0909341SAndroid Build Coastguard Worker .asciz "stack clobbered" 60*c0909341SAndroid Build Coastguard Workerendconst 61*c0909341SAndroid Build Coastguard Worker 62*c0909341SAndroid Build Coastguard Worker 63*c0909341SAndroid Build Coastguard Worker// max number of args used by any asm function. 64*c0909341SAndroid Build Coastguard Worker#define MAX_ARGS 15 65*c0909341SAndroid Build Coastguard Worker 66*c0909341SAndroid Build Coastguard Worker#define CLOBBER_STACK ((8*MAX_ARGS + 15) & ~15) 67*c0909341SAndroid Build Coastguard Worker 68*c0909341SAndroid Build Coastguard Workerfunction stack_clobber, export=1 69*c0909341SAndroid Build Coastguard Worker mov x3, sp 70*c0909341SAndroid Build Coastguard Worker mov x2, #CLOBBER_STACK 71*c0909341SAndroid Build Coastguard Worker1: 72*c0909341SAndroid Build Coastguard Worker stp x0, x1, [sp, #-16]! 73*c0909341SAndroid Build Coastguard Worker subs x2, x2, #16 74*c0909341SAndroid Build Coastguard Worker b.gt 1b 75*c0909341SAndroid Build Coastguard Worker mov sp, x3 76*c0909341SAndroid Build Coastguard Worker ret 77*c0909341SAndroid Build Coastguard Workerendfunc 78*c0909341SAndroid Build Coastguard Worker 79*c0909341SAndroid Build Coastguard Worker// + 16 for stack canary reference 80*c0909341SAndroid Build Coastguard Worker#define ARG_STACK ((8*(MAX_ARGS - 8) + 15) & ~15 + 16) 81*c0909341SAndroid Build Coastguard Worker 82*c0909341SAndroid Build Coastguard Workerfunction checked_call, export=1 83*c0909341SAndroid Build Coastguard Worker stp x29, x30, [sp, #-16]! 84*c0909341SAndroid Build Coastguard Worker mov x29, sp 85*c0909341SAndroid Build Coastguard Worker stp x19, x20, [sp, #-16]! 86*c0909341SAndroid Build Coastguard Worker stp x21, x22, [sp, #-16]! 87*c0909341SAndroid Build Coastguard Worker stp x23, x24, [sp, #-16]! 88*c0909341SAndroid Build Coastguard Worker stp x25, x26, [sp, #-16]! 89*c0909341SAndroid Build Coastguard Worker stp x27, x28, [sp, #-16]! 90*c0909341SAndroid Build Coastguard Worker stp d8, d9, [sp, #-16]! 91*c0909341SAndroid Build Coastguard Worker stp d10, d11, [sp, #-16]! 92*c0909341SAndroid Build Coastguard Worker stp d12, d13, [sp, #-16]! 93*c0909341SAndroid Build Coastguard Worker stp d14, d15, [sp, #-16]! 94*c0909341SAndroid Build Coastguard Worker 95*c0909341SAndroid Build Coastguard Worker movrel x9, register_init 96*c0909341SAndroid Build Coastguard Worker ldp d8, d9, [x9], #16 97*c0909341SAndroid Build Coastguard Worker ldp d10, d11, [x9], #16 98*c0909341SAndroid Build Coastguard Worker ldp d12, d13, [x9], #16 99*c0909341SAndroid Build Coastguard Worker ldp d14, d15, [x9], #16 100*c0909341SAndroid Build Coastguard Worker ldp x19, x20, [x9], #16 101*c0909341SAndroid Build Coastguard Worker ldp x21, x22, [x9], #16 102*c0909341SAndroid Build Coastguard Worker ldp x23, x24, [x9], #16 103*c0909341SAndroid Build Coastguard Worker ldp x25, x26, [x9], #16 104*c0909341SAndroid Build Coastguard Worker ldp x27, x28, [x9], #16 105*c0909341SAndroid Build Coastguard Worker 106*c0909341SAndroid Build Coastguard Worker sub sp, sp, #ARG_STACK 107*c0909341SAndroid Build Coastguard Worker.equ pos, 0 108*c0909341SAndroid Build Coastguard Worker.rept MAX_ARGS-8 109*c0909341SAndroid Build Coastguard Worker // Skip the first 8 args, that are loaded into registers 110*c0909341SAndroid Build Coastguard Worker ldr x9, [x29, #16 + 8*8 + pos] 111*c0909341SAndroid Build Coastguard Worker str x9, [sp, #pos] 112*c0909341SAndroid Build Coastguard Worker.equ pos, pos + 8 113*c0909341SAndroid Build Coastguard Worker.endr 114*c0909341SAndroid Build Coastguard Worker 115*c0909341SAndroid Build Coastguard Worker // Fill x8-x17 with garbage. This doesn't have to be preserved, 116*c0909341SAndroid Build Coastguard Worker // but avoids relying on them having any particular value. 117*c0909341SAndroid Build Coastguard Worker movrel x9, register_init 118*c0909341SAndroid Build Coastguard Worker ldp x10, x11, [x9], #32 119*c0909341SAndroid Build Coastguard Worker ldp x12, x13, [x9], #32 120*c0909341SAndroid Build Coastguard Worker ldp x14, x15, [x9], #32 121*c0909341SAndroid Build Coastguard Worker ldp x16, x17, [x9], #32 122*c0909341SAndroid Build Coastguard Worker ldp x8, x9, [x9] 123*c0909341SAndroid Build Coastguard Worker 124*c0909341SAndroid Build Coastguard Worker // For stack overflows, the callee is free to overwrite the parameters 125*c0909341SAndroid Build Coastguard Worker // that were passed on the stack (if any), so we can only check after 126*c0909341SAndroid Build Coastguard Worker // that point. First figure out how many parameters the function 127*c0909341SAndroid Build Coastguard Worker // really took on the stack: 128*c0909341SAndroid Build Coastguard Worker ldr w2, [x29, #16 + 8*8 + (MAX_ARGS-8)*8] 129*c0909341SAndroid Build Coastguard Worker // Load the first non-parameter value from the stack, that should be 130*c0909341SAndroid Build Coastguard Worker // left untouched by the function. Store a copy of it inverted, so that 131*c0909341SAndroid Build Coastguard Worker // e.g. overwriting everything with zero would be noticed. 132*c0909341SAndroid Build Coastguard Worker ldr x2, [sp, x2, lsl #3] 133*c0909341SAndroid Build Coastguard Worker mvn x2, x2 134*c0909341SAndroid Build Coastguard Worker str x2, [sp, #ARG_STACK-8] 135*c0909341SAndroid Build Coastguard Worker 136*c0909341SAndroid Build Coastguard Worker // Load the in-register arguments 137*c0909341SAndroid Build Coastguard Worker mov x12, x0 138*c0909341SAndroid Build Coastguard Worker ldp x0, x1, [x29, #16] 139*c0909341SAndroid Build Coastguard Worker ldp x2, x3, [x29, #32] 140*c0909341SAndroid Build Coastguard Worker ldp x4, x5, [x29, #48] 141*c0909341SAndroid Build Coastguard Worker ldp x6, x7, [x29, #64] 142*c0909341SAndroid Build Coastguard Worker // Call the target function 143*c0909341SAndroid Build Coastguard Worker blr x12 144*c0909341SAndroid Build Coastguard Worker 145*c0909341SAndroid Build Coastguard Worker // Load the number of stack parameters, stack canary and its reference 146*c0909341SAndroid Build Coastguard Worker ldr w2, [x29, #16 + 8*8 + (MAX_ARGS-8)*8] 147*c0909341SAndroid Build Coastguard Worker ldr x2, [sp, x2, lsl #3] 148*c0909341SAndroid Build Coastguard Worker ldr x3, [sp, #ARG_STACK-8] 149*c0909341SAndroid Build Coastguard Worker 150*c0909341SAndroid Build Coastguard Worker add sp, sp, #ARG_STACK 151*c0909341SAndroid Build Coastguard Worker stp x0, x1, [sp, #-16]! 152*c0909341SAndroid Build Coastguard Worker 153*c0909341SAndroid Build Coastguard Worker mvn x3, x3 154*c0909341SAndroid Build Coastguard Worker cmp x2, x3 155*c0909341SAndroid Build Coastguard Worker b.ne 2f 156*c0909341SAndroid Build Coastguard Worker 157*c0909341SAndroid Build Coastguard Worker movrel x9, register_init 158*c0909341SAndroid Build Coastguard Worker movi v3.8h, #0 159*c0909341SAndroid Build Coastguard Worker 160*c0909341SAndroid Build Coastguard Worker.macro check_reg_neon reg1, reg2 161*c0909341SAndroid Build Coastguard Worker ldr q1, [x9], #16 162*c0909341SAndroid Build Coastguard Worker uzp1 v2.2d, v\reg1\().2d, v\reg2\().2d 163*c0909341SAndroid Build Coastguard Worker eor v1.16b, v1.16b, v2.16b 164*c0909341SAndroid Build Coastguard Worker orr v3.16b, v3.16b, v1.16b 165*c0909341SAndroid Build Coastguard Worker.endm 166*c0909341SAndroid Build Coastguard Worker check_reg_neon 8, 9 167*c0909341SAndroid Build Coastguard Worker check_reg_neon 10, 11 168*c0909341SAndroid Build Coastguard Worker check_reg_neon 12, 13 169*c0909341SAndroid Build Coastguard Worker check_reg_neon 14, 15 170*c0909341SAndroid Build Coastguard Worker uqxtn v3.8b, v3.8h 171*c0909341SAndroid Build Coastguard Worker umov x3, v3.d[0] 172*c0909341SAndroid Build Coastguard Worker 173*c0909341SAndroid Build Coastguard Worker.macro check_reg reg1, reg2 174*c0909341SAndroid Build Coastguard Worker ldp x0, x1, [x9], #16 175*c0909341SAndroid Build Coastguard Worker eor x0, x0, \reg1 176*c0909341SAndroid Build Coastguard Worker eor x1, x1, \reg2 177*c0909341SAndroid Build Coastguard Worker orr x3, x3, x0 178*c0909341SAndroid Build Coastguard Worker orr x3, x3, x1 179*c0909341SAndroid Build Coastguard Worker.endm 180*c0909341SAndroid Build Coastguard Worker check_reg x19, x20 181*c0909341SAndroid Build Coastguard Worker check_reg x21, x22 182*c0909341SAndroid Build Coastguard Worker check_reg x23, x24 183*c0909341SAndroid Build Coastguard Worker check_reg x25, x26 184*c0909341SAndroid Build Coastguard Worker check_reg x27, x28 185*c0909341SAndroid Build Coastguard Worker 186*c0909341SAndroid Build Coastguard Worker cbz x3, 0f 187*c0909341SAndroid Build Coastguard Worker 188*c0909341SAndroid Build Coastguard Worker movrel x0, error_message_register 189*c0909341SAndroid Build Coastguard Worker b 1f 190*c0909341SAndroid Build Coastguard Worker2: 191*c0909341SAndroid Build Coastguard Worker movrel x0, error_message_stack 192*c0909341SAndroid Build Coastguard Worker1: 193*c0909341SAndroid Build Coastguard Worker#ifdef PREFIX 194*c0909341SAndroid Build Coastguard Worker bl _checkasm_fail_func 195*c0909341SAndroid Build Coastguard Worker#else 196*c0909341SAndroid Build Coastguard Worker bl checkasm_fail_func 197*c0909341SAndroid Build Coastguard Worker#endif 198*c0909341SAndroid Build Coastguard Worker0: 199*c0909341SAndroid Build Coastguard Worker ldp x0, x1, [sp], #16 200*c0909341SAndroid Build Coastguard Worker ldp d14, d15, [sp], #16 201*c0909341SAndroid Build Coastguard Worker ldp d12, d13, [sp], #16 202*c0909341SAndroid Build Coastguard Worker ldp d10, d11, [sp], #16 203*c0909341SAndroid Build Coastguard Worker ldp d8, d9, [sp], #16 204*c0909341SAndroid Build Coastguard Worker ldp x27, x28, [sp], #16 205*c0909341SAndroid Build Coastguard Worker ldp x25, x26, [sp], #16 206*c0909341SAndroid Build Coastguard Worker ldp x23, x24, [sp], #16 207*c0909341SAndroid Build Coastguard Worker ldp x21, x22, [sp], #16 208*c0909341SAndroid Build Coastguard Worker ldp x19, x20, [sp], #16 209*c0909341SAndroid Build Coastguard Worker ldp x29, x30, [sp], #16 210*c0909341SAndroid Build Coastguard Worker ret 211*c0909341SAndroid Build Coastguard Workerendfunc 212*c0909341SAndroid Build Coastguard Worker 213*c0909341SAndroid Build Coastguard Worker#if HAVE_SVE 214*c0909341SAndroid Build Coastguard WorkerENABLE_SVE 215*c0909341SAndroid Build Coastguard Workerfunction sve_length, export=1 216*c0909341SAndroid Build Coastguard Worker cntb x0 217*c0909341SAndroid Build Coastguard Worker lsl x0, x0, #3 218*c0909341SAndroid Build Coastguard Worker ret 219*c0909341SAndroid Build Coastguard Workerendfunc 220*c0909341SAndroid Build Coastguard WorkerDISABLE_SVE 221*c0909341SAndroid Build Coastguard Worker#endif 222