1214fad55SArd Biesheuvel/* 2214fad55SArd Biesheuvel * Copyright (C) 2017 Linaro, Ltd. <ard.biesheuvel@linaro.org> 3214fad55SArd Biesheuvel * 4214fad55SArd Biesheuvel * This program is free software; you can redistribute it and/or modify 5214fad55SArd Biesheuvel * it under the terms of the GNU General Public License version 2 as 6214fad55SArd Biesheuvel * published by the Free Software Foundation. 7214fad55SArd Biesheuvel * 8214fad55SArd Biesheuvel */ 9214fad55SArd Biesheuvel 10214fad55SArd Biesheuvel#include <linux/linkage.h> 11214fad55SArd Biesheuvel 12214fad55SArd BiesheuvelENTRY(absolute_data64) 13214fad55SArd Biesheuvel ldr x0, 0f 14214fad55SArd Biesheuvel ret 15214fad55SArd Biesheuvel0: .quad sym64_abs 16214fad55SArd BiesheuvelENDPROC(absolute_data64) 17214fad55SArd Biesheuvel 18214fad55SArd BiesheuvelENTRY(absolute_data32) 19214fad55SArd Biesheuvel ldr w0, 0f 20214fad55SArd Biesheuvel ret 21214fad55SArd Biesheuvel0: .long sym32_abs 22214fad55SArd BiesheuvelENDPROC(absolute_data32) 23214fad55SArd Biesheuvel 24214fad55SArd BiesheuvelENTRY(absolute_data16) 25214fad55SArd Biesheuvel adr x0, 0f 26214fad55SArd Biesheuvel ldrh w0, [x0] 27214fad55SArd Biesheuvel ret 28214fad55SArd Biesheuvel0: .short sym16_abs, 0 29214fad55SArd BiesheuvelENDPROC(absolute_data16) 30214fad55SArd Biesheuvel 31214fad55SArd BiesheuvelENTRY(signed_movw) 32214fad55SArd Biesheuvel movz x0, #:abs_g2_s:sym64_abs 33214fad55SArd Biesheuvel movk x0, #:abs_g1_nc:sym64_abs 34214fad55SArd Biesheuvel movk x0, #:abs_g0_nc:sym64_abs 35214fad55SArd Biesheuvel ret 36214fad55SArd BiesheuvelENDPROC(signed_movw) 37214fad55SArd Biesheuvel 38214fad55SArd BiesheuvelENTRY(unsigned_movw) 39214fad55SArd Biesheuvel movz x0, #:abs_g3:sym64_abs 40214fad55SArd Biesheuvel movk x0, #:abs_g2_nc:sym64_abs 41214fad55SArd Biesheuvel movk x0, #:abs_g1_nc:sym64_abs 42214fad55SArd Biesheuvel movk x0, #:abs_g0_nc:sym64_abs 43214fad55SArd Biesheuvel ret 44214fad55SArd BiesheuvelENDPROC(unsigned_movw) 45214fad55SArd Biesheuvel 46214fad55SArd Biesheuvel#ifndef CONFIG_ARM64_ERRATUM_843419 47214fad55SArd Biesheuvel 48214fad55SArd BiesheuvelENTRY(relative_adrp) 49214fad55SArd Biesheuvel adrp x0, sym64_rel 50214fad55SArd Biesheuvel add x0, x0, #:lo12:sym64_rel 51214fad55SArd Biesheuvel ret 52214fad55SArd BiesheuvelENDPROC(relative_adrp) 53214fad55SArd Biesheuvel 54214fad55SArd Biesheuvel#endif 55214fad55SArd Biesheuvel 56214fad55SArd BiesheuvelENTRY(relative_adr) 57214fad55SArd Biesheuvel adr x0, sym64_rel 58214fad55SArd Biesheuvel ret 59214fad55SArd BiesheuvelENDPROC(relative_adr) 60214fad55SArd Biesheuvel 61214fad55SArd BiesheuvelENTRY(relative_data64) 62214fad55SArd Biesheuvel adr x1, 0f 63214fad55SArd Biesheuvel ldr x0, [x1] 64214fad55SArd Biesheuvel add x0, x0, x1 65214fad55SArd Biesheuvel ret 66214fad55SArd Biesheuvel0: .quad sym64_rel - . 67214fad55SArd BiesheuvelENDPROC(relative_data64) 68214fad55SArd Biesheuvel 69214fad55SArd BiesheuvelENTRY(relative_data32) 70214fad55SArd Biesheuvel adr x1, 0f 71214fad55SArd Biesheuvel ldr w0, [x1] 72214fad55SArd Biesheuvel add x0, x0, x1 73214fad55SArd Biesheuvel ret 74214fad55SArd Biesheuvel0: .long sym64_rel - . 75214fad55SArd BiesheuvelENDPROC(relative_data32) 76214fad55SArd Biesheuvel 77214fad55SArd BiesheuvelENTRY(relative_data16) 78214fad55SArd Biesheuvel adr x1, 0f 79214fad55SArd Biesheuvel ldrsh w0, [x1] 80214fad55SArd Biesheuvel add x0, x0, x1 81214fad55SArd Biesheuvel ret 82214fad55SArd Biesheuvel0: .short sym64_rel - ., 0 83214fad55SArd BiesheuvelENDPROC(relative_data16) 84