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