Merge branches 'pm-cpufreq', 'pm-cpuidle', 'pm-devfreq', 'pm-opp' and 'pm-tools'
[linux-drm-fsl-dcu.git] / arch / ia64 / kernel / module.c
1 /*
2  * IA-64-specific support for kernel module loader.
3  *
4  * Copyright (C) 2003 Hewlett-Packard Co
5  *      David Mosberger-Tang <davidm@hpl.hp.com>
6  *
7  * Loosely based on patch by Rusty Russell.
8  */
9
10 /* relocs tested so far:
11
12    DIR64LSB
13    FPTR64LSB
14    GPREL22
15    LDXMOV
16    LDXMOV
17    LTOFF22
18    LTOFF22X
19    LTOFF22X
20    LTOFF_FPTR22
21    PCREL21B     (for br.call only; br.cond is not supported out of modules!)
22    PCREL60B     (for brl.cond only; brl.call is not supported for modules!)
23    PCREL64LSB
24    SECREL32LSB
25    SEGREL64LSB
26  */
27
28
29 #include <linux/kernel.h>
30 #include <linux/sched.h>
31 #include <linux/elf.h>
32 #include <linux/moduleloader.h>
33 #include <linux/string.h>
34 #include <linux/vmalloc.h>
35
36 #include <asm/patch.h>
37 #include <asm/unaligned.h>
38
39 #define ARCH_MODULE_DEBUG 0
40
41 #if ARCH_MODULE_DEBUG
42 # define DEBUGP printk
43 # define inline
44 #else
45 # define DEBUGP(fmt , a...)
46 #endif
47
48 #ifdef CONFIG_ITANIUM
49 # define USE_BRL        0
50 #else
51 # define USE_BRL        1
52 #endif
53
54 #define MAX_LTOFF       ((uint64_t) (1 << 22))  /* max. allowable linkage-table offset */
55
56 /* Define some relocation helper macros/types: */
57
58 #define FORMAT_SHIFT    0
59 #define FORMAT_BITS     3
60 #define FORMAT_MASK     ((1 << FORMAT_BITS) - 1)
61 #define VALUE_SHIFT     3
62 #define VALUE_BITS      5
63 #define VALUE_MASK      ((1 << VALUE_BITS) - 1)
64
65 enum reloc_target_format {
66         /* direct encoded formats: */
67         RF_NONE = 0,
68         RF_INSN14 = 1,
69         RF_INSN22 = 2,
70         RF_INSN64 = 3,
71         RF_32MSB = 4,
72         RF_32LSB = 5,
73         RF_64MSB = 6,
74         RF_64LSB = 7,
75
76         /* formats that cannot be directly decoded: */
77         RF_INSN60,
78         RF_INSN21B,     /* imm21 form 1 */
79         RF_INSN21M,     /* imm21 form 2 */
80         RF_INSN21F      /* imm21 form 3 */
81 };
82
83 enum reloc_value_formula {
84         RV_DIRECT = 4,          /* S + A */
85         RV_GPREL = 5,           /* @gprel(S + A) */
86         RV_LTREL = 6,           /* @ltoff(S + A) */
87         RV_PLTREL = 7,          /* @pltoff(S + A) */
88         RV_FPTR = 8,            /* @fptr(S + A) */
89         RV_PCREL = 9,           /* S + A - P */
90         RV_LTREL_FPTR = 10,     /* @ltoff(@fptr(S + A)) */
91         RV_SEGREL = 11,         /* @segrel(S + A) */
92         RV_SECREL = 12,         /* @secrel(S + A) */
93         RV_BDREL = 13,          /* BD + A */
94         RV_LTV = 14,            /* S + A (like RV_DIRECT, except frozen at static link-time) */
95         RV_PCREL2 = 15,         /* S + A - P */
96         RV_SPECIAL = 16,        /* various (see below) */
97         RV_RSVD17 = 17,
98         RV_TPREL = 18,          /* @tprel(S + A) */
99         RV_LTREL_TPREL = 19,    /* @ltoff(@tprel(S + A)) */
100         RV_DTPMOD = 20,         /* @dtpmod(S + A) */
101         RV_LTREL_DTPMOD = 21,   /* @ltoff(@dtpmod(S + A)) */
102         RV_DTPREL = 22,         /* @dtprel(S + A) */
103         RV_LTREL_DTPREL = 23,   /* @ltoff(@dtprel(S + A)) */
104         RV_RSVD24 = 24,
105         RV_RSVD25 = 25,
106         RV_RSVD26 = 26,
107         RV_RSVD27 = 27
108         /* 28-31 reserved for implementation-specific purposes.  */
109 };
110
111 #define N(reloc)        [R_IA64_##reloc] = #reloc
112
113 static const char *reloc_name[256] = {
114         N(NONE),                N(IMM14),               N(IMM22),               N(IMM64),
115         N(DIR32MSB),            N(DIR32LSB),            N(DIR64MSB),            N(DIR64LSB),
116         N(GPREL22),             N(GPREL64I),            N(GPREL32MSB),          N(GPREL32LSB),
117         N(GPREL64MSB),          N(GPREL64LSB),          N(LTOFF22),             N(LTOFF64I),
118         N(PLTOFF22),            N(PLTOFF64I),           N(PLTOFF64MSB),         N(PLTOFF64LSB),
119         N(FPTR64I),             N(FPTR32MSB),           N(FPTR32LSB),           N(FPTR64MSB),
120         N(FPTR64LSB),           N(PCREL60B),            N(PCREL21B),            N(PCREL21M),
121         N(PCREL21F),            N(PCREL32MSB),          N(PCREL32LSB),          N(PCREL64MSB),
122         N(PCREL64LSB),          N(LTOFF_FPTR22),        N(LTOFF_FPTR64I),       N(LTOFF_FPTR32MSB),
123         N(LTOFF_FPTR32LSB),     N(LTOFF_FPTR64MSB),     N(LTOFF_FPTR64LSB),     N(SEGREL32MSB),
124         N(SEGREL32LSB),         N(SEGREL64MSB),         N(SEGREL64LSB),         N(SECREL32MSB),
125         N(SECREL32LSB),         N(SECREL64MSB),         N(SECREL64LSB),         N(REL32MSB),
126         N(REL32LSB),            N(REL64MSB),            N(REL64LSB),            N(LTV32MSB),
127         N(LTV32LSB),            N(LTV64MSB),            N(LTV64LSB),            N(PCREL21BI),
128         N(PCREL22),             N(PCREL64I),            N(IPLTMSB),             N(IPLTLSB),
129         N(COPY),                N(LTOFF22X),            N(LDXMOV),              N(TPREL14),
130         N(TPREL22),             N(TPREL64I),            N(TPREL64MSB),          N(TPREL64LSB),
131         N(LTOFF_TPREL22),       N(DTPMOD64MSB),         N(DTPMOD64LSB),         N(LTOFF_DTPMOD22),
132         N(DTPREL14),            N(DTPREL22),            N(DTPREL64I),           N(DTPREL32MSB),
133         N(DTPREL32LSB),         N(DTPREL64MSB),         N(DTPREL64LSB),         N(LTOFF_DTPREL22)
134 };
135
136 #undef N
137
138 /* Opaque struct for insns, to protect against derefs. */
139 struct insn;
140
141 static inline uint64_t
142 bundle (const struct insn *insn)
143 {
144         return (uint64_t) insn & ~0xfUL;
145 }
146
147 static inline int
148 slot (const struct insn *insn)
149 {
150         return (uint64_t) insn & 0x3;
151 }
152
153 static int
154 apply_imm64 (struct module *mod, struct insn *insn, uint64_t val)
155 {
156         if (slot(insn) != 2) {
157                 printk(KERN_ERR "%s: invalid slot number %d for IMM64\n",
158                        mod->name, slot(insn));
159                 return 0;
160         }
161         ia64_patch_imm64((u64) insn, val);
162         return 1;
163 }
164
165 static int
166 apply_imm60 (struct module *mod, struct insn *insn, uint64_t val)
167 {
168         if (slot(insn) != 2) {
169                 printk(KERN_ERR "%s: invalid slot number %d for IMM60\n",
170                        mod->name, slot(insn));
171                 return 0;
172         }
173         if (val + ((uint64_t) 1 << 59) >= (1UL << 60)) {
174                 printk(KERN_ERR "%s: value %ld out of IMM60 range\n",
175                         mod->name, (long) val);
176                 return 0;
177         }
178         ia64_patch_imm60((u64) insn, val);
179         return 1;
180 }
181
182 static int
183 apply_imm22 (struct module *mod, struct insn *insn, uint64_t val)
184 {
185         if (val + (1 << 21) >= (1 << 22)) {
186                 printk(KERN_ERR "%s: value %li out of IMM22 range\n",
187                         mod->name, (long)val);
188                 return 0;
189         }
190         ia64_patch((u64) insn, 0x01fffcfe000UL, (  ((val & 0x200000UL) << 15) /* bit 21 -> 36 */
191                                                  | ((val & 0x1f0000UL) <<  6) /* bit 16 -> 22 */
192                                                  | ((val & 0x00ff80UL) << 20) /* bit  7 -> 27 */
193                                                  | ((val & 0x00007fUL) << 13) /* bit  0 -> 13 */));
194         return 1;
195 }
196
197 static int
198 apply_imm21b (struct module *mod, struct insn *insn, uint64_t val)
199 {
200         if (val + (1 << 20) >= (1 << 21)) {
201                 printk(KERN_ERR "%s: value %li out of IMM21b range\n",
202                         mod->name, (long)val);
203                 return 0;
204         }
205         ia64_patch((u64) insn, 0x11ffffe000UL, (  ((val & 0x100000UL) << 16) /* bit 20 -> 36 */
206                                                 | ((val & 0x0fffffUL) << 13) /* bit  0 -> 13 */));
207         return 1;
208 }
209
210 #if USE_BRL
211
212 struct plt_entry {
213         /* Three instruction bundles in PLT. */
214         unsigned char bundle[2][16];
215 };
216
217 static const struct plt_entry ia64_plt_template = {
218         {
219                 {
220                         0x04, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MLX] nop.m 0 */
221                         0x00, 0x00, 0x00, 0x00, 0x00, 0x20, /*       movl gp=TARGET_GP */
222                         0x00, 0x00, 0x00, 0x60
223                 },
224                 {
225                         0x05, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MLX] nop.m 0 */
226                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*       brl.many gp=TARGET_GP */
227                         0x08, 0x00, 0x00, 0xc0
228                 }
229         }
230 };
231
232 static int
233 patch_plt (struct module *mod, struct plt_entry *plt, long target_ip, unsigned long target_gp)
234 {
235         if (apply_imm64(mod, (struct insn *) (plt->bundle[0] + 2), target_gp)
236             && apply_imm60(mod, (struct insn *) (plt->bundle[1] + 2),
237                            (target_ip - (int64_t) plt->bundle[1]) / 16))
238                 return 1;
239         return 0;
240 }
241
242 unsigned long
243 plt_target (struct plt_entry *plt)
244 {
245         uint64_t b0, b1, *b = (uint64_t *) plt->bundle[1];
246         long off;
247
248         b0 = b[0]; b1 = b[1];
249         off = (  ((b1 & 0x00fffff000000000UL) >> 36)            /* imm20b -> bit 0 */
250                | ((b0 >> 48) << 20) | ((b1 & 0x7fffffUL) << 36) /* imm39 -> bit 20 */
251                | ((b1 & 0x0800000000000000UL) << 0));           /* i -> bit 59 */
252         return (long) plt->bundle[1] + 16*off;
253 }
254
255 #else /* !USE_BRL */
256
257 struct plt_entry {
258         /* Three instruction bundles in PLT. */
259         unsigned char bundle[3][16];
260 };
261
262 static const struct plt_entry ia64_plt_template = {
263         {
264                 {
265                         0x05, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MLX] nop.m 0 */
266                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*       movl r16=TARGET_IP */
267                         0x02, 0x00, 0x00, 0x60
268                 },
269                 {
270                         0x04, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MLX] nop.m 0 */
271                         0x00, 0x00, 0x00, 0x00, 0x00, 0x20, /*       movl gp=TARGET_GP */
272                         0x00, 0x00, 0x00, 0x60
273                 },
274                 {
275                         0x11, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MIB] nop.m 0 */
276                         0x60, 0x80, 0x04, 0x80, 0x03, 0x00, /*       mov b6=r16 */
277                         0x60, 0x00, 0x80, 0x00              /*       br.few b6 */
278                 }
279         }
280 };
281
282 static int
283 patch_plt (struct module *mod, struct plt_entry *plt, long target_ip, unsigned long target_gp)
284 {
285         if (apply_imm64(mod, (struct insn *) (plt->bundle[0] + 2), target_ip)
286             && apply_imm64(mod, (struct insn *) (plt->bundle[1] + 2), target_gp))
287                 return 1;
288         return 0;
289 }
290
291 unsigned long
292 plt_target (struct plt_entry *plt)
293 {
294         uint64_t b0, b1, *b = (uint64_t *) plt->bundle[0];
295
296         b0 = b[0]; b1 = b[1];
297         return (  ((b1 & 0x000007f000000000) >> 36)             /* imm7b -> bit 0 */
298                 | ((b1 & 0x07fc000000000000) >> 43)             /* imm9d -> bit 7 */
299                 | ((b1 & 0x0003e00000000000) >> 29)             /* imm5c -> bit 16 */
300                 | ((b1 & 0x0000100000000000) >> 23)             /* ic -> bit 21 */
301                 | ((b0 >> 46) << 22) | ((b1 & 0x7fffff) << 40)  /* imm41 -> bit 22 */
302                 | ((b1 & 0x0800000000000000) <<  4));           /* i -> bit 63 */
303 }
304
305 #endif /* !USE_BRL */
306
307 void
308 module_arch_freeing_init (struct module *mod)
309 {
310         if (mod->arch.init_unw_table) {
311                 unw_remove_unwind_table(mod->arch.init_unw_table);
312                 mod->arch.init_unw_table = NULL;
313         }
314 }
315
316 /* Have we already seen one of these relocations? */
317 /* FIXME: we could look in other sections, too --RR */
318 static int
319 duplicate_reloc (const Elf64_Rela *rela, unsigned int num)
320 {
321         unsigned int i;
322
323         for (i = 0; i < num; i++) {
324                 if (rela[i].r_info == rela[num].r_info && rela[i].r_addend == rela[num].r_addend)
325                         return 1;
326         }
327         return 0;
328 }
329
330 /* Count how many GOT entries we may need */
331 static unsigned int
332 count_gots (const Elf64_Rela *rela, unsigned int num)
333 {
334         unsigned int i, ret = 0;
335
336         /* Sure, this is order(n^2), but it's usually short, and not
337            time critical */
338         for (i = 0; i < num; i++) {
339                 switch (ELF64_R_TYPE(rela[i].r_info)) {
340                       case R_IA64_LTOFF22:
341                       case R_IA64_LTOFF22X:
342                       case R_IA64_LTOFF64I:
343                       case R_IA64_LTOFF_FPTR22:
344                       case R_IA64_LTOFF_FPTR64I:
345                       case R_IA64_LTOFF_FPTR32MSB:
346                       case R_IA64_LTOFF_FPTR32LSB:
347                       case R_IA64_LTOFF_FPTR64MSB:
348                       case R_IA64_LTOFF_FPTR64LSB:
349                         if (!duplicate_reloc(rela, i))
350                                 ret++;
351                         break;
352                 }
353         }
354         return ret;
355 }
356
357 /* Count how many PLT entries we may need */
358 static unsigned int
359 count_plts (const Elf64_Rela *rela, unsigned int num)
360 {
361         unsigned int i, ret = 0;
362
363         /* Sure, this is order(n^2), but it's usually short, and not
364            time critical */
365         for (i = 0; i < num; i++) {
366                 switch (ELF64_R_TYPE(rela[i].r_info)) {
367                       case R_IA64_PCREL21B:
368                       case R_IA64_PLTOFF22:
369                       case R_IA64_PLTOFF64I:
370                       case R_IA64_PLTOFF64MSB:
371                       case R_IA64_PLTOFF64LSB:
372                       case R_IA64_IPLTMSB:
373                       case R_IA64_IPLTLSB:
374                         if (!duplicate_reloc(rela, i))
375                                 ret++;
376                         break;
377                 }
378         }
379         return ret;
380 }
381
382 /* We need to create an function-descriptors for any internal function
383    which is referenced. */
384 static unsigned int
385 count_fdescs (const Elf64_Rela *rela, unsigned int num)
386 {
387         unsigned int i, ret = 0;
388
389         /* Sure, this is order(n^2), but it's usually short, and not time critical.  */
390         for (i = 0; i < num; i++) {
391                 switch (ELF64_R_TYPE(rela[i].r_info)) {
392                       case R_IA64_FPTR64I:
393                       case R_IA64_FPTR32LSB:
394                       case R_IA64_FPTR32MSB:
395                       case R_IA64_FPTR64LSB:
396                       case R_IA64_FPTR64MSB:
397                       case R_IA64_LTOFF_FPTR22:
398                       case R_IA64_LTOFF_FPTR32LSB:
399                       case R_IA64_LTOFF_FPTR32MSB:
400                       case R_IA64_LTOFF_FPTR64I:
401                       case R_IA64_LTOFF_FPTR64LSB:
402                       case R_IA64_LTOFF_FPTR64MSB:
403                       case R_IA64_IPLTMSB:
404                       case R_IA64_IPLTLSB:
405                         /*
406                          * Jumps to static functions sometimes go straight to their
407                          * offset.  Of course, that may not be possible if the jump is
408                          * from init -> core or vice. versa, so we need to generate an
409                          * FDESC (and PLT etc) for that.
410                          */
411                       case R_IA64_PCREL21B:
412                         if (!duplicate_reloc(rela, i))
413                                 ret++;
414                         break;
415                 }
416         }
417         return ret;
418 }
419
420 int
421 module_frob_arch_sections (Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, char *secstrings,
422                            struct module *mod)
423 {
424         unsigned long core_plts = 0, init_plts = 0, gots = 0, fdescs = 0;
425         Elf64_Shdr *s, *sechdrs_end = sechdrs + ehdr->e_shnum;
426
427         /*
428          * To store the PLTs and function-descriptors, we expand the .text section for
429          * core module-code and the .init.text section for initialization code.
430          */
431         for (s = sechdrs; s < sechdrs_end; ++s)
432                 if (strcmp(".core.plt", secstrings + s->sh_name) == 0)
433                         mod->arch.core_plt = s;
434                 else if (strcmp(".init.plt", secstrings + s->sh_name) == 0)
435                         mod->arch.init_plt = s;
436                 else if (strcmp(".got", secstrings + s->sh_name) == 0)
437                         mod->arch.got = s;
438                 else if (strcmp(".opd", secstrings + s->sh_name) == 0)
439                         mod->arch.opd = s;
440                 else if (strcmp(".IA_64.unwind", secstrings + s->sh_name) == 0)
441                         mod->arch.unwind = s;
442 #ifdef CONFIG_PARAVIRT
443                 else if (strcmp(".paravirt_bundles",
444                                 secstrings + s->sh_name) == 0)
445                         mod->arch.paravirt_bundles = s;
446                 else if (strcmp(".paravirt_insts",
447                                 secstrings + s->sh_name) == 0)
448                         mod->arch.paravirt_insts = s;
449 #endif
450
451         if (!mod->arch.core_plt || !mod->arch.init_plt || !mod->arch.got || !mod->arch.opd) {
452                 printk(KERN_ERR "%s: sections missing\n", mod->name);
453                 return -ENOEXEC;
454         }
455
456         /* GOT and PLTs can occur in any relocated section... */
457         for (s = sechdrs + 1; s < sechdrs_end; ++s) {
458                 const Elf64_Rela *rels = (void *)ehdr + s->sh_offset;
459                 unsigned long numrels = s->sh_size/sizeof(Elf64_Rela);
460
461                 if (s->sh_type != SHT_RELA)
462                         continue;
463
464                 gots += count_gots(rels, numrels);
465                 fdescs += count_fdescs(rels, numrels);
466                 if (strstr(secstrings + s->sh_name, ".init"))
467                         init_plts += count_plts(rels, numrels);
468                 else
469                         core_plts += count_plts(rels, numrels);
470         }
471
472         mod->arch.core_plt->sh_type = SHT_NOBITS;
473         mod->arch.core_plt->sh_flags = SHF_EXECINSTR | SHF_ALLOC;
474         mod->arch.core_plt->sh_addralign = 16;
475         mod->arch.core_plt->sh_size = core_plts * sizeof(struct plt_entry);
476         mod->arch.init_plt->sh_type = SHT_NOBITS;
477         mod->arch.init_plt->sh_flags = SHF_EXECINSTR | SHF_ALLOC;
478         mod->arch.init_plt->sh_addralign = 16;
479         mod->arch.init_plt->sh_size = init_plts * sizeof(struct plt_entry);
480         mod->arch.got->sh_type = SHT_NOBITS;
481         mod->arch.got->sh_flags = ARCH_SHF_SMALL | SHF_ALLOC;
482         mod->arch.got->sh_addralign = 8;
483         mod->arch.got->sh_size = gots * sizeof(struct got_entry);
484         mod->arch.opd->sh_type = SHT_NOBITS;
485         mod->arch.opd->sh_flags = SHF_ALLOC;
486         mod->arch.opd->sh_addralign = 8;
487         mod->arch.opd->sh_size = fdescs * sizeof(struct fdesc);
488         DEBUGP("%s: core.plt=%lx, init.plt=%lx, got=%lx, fdesc=%lx\n",
489                __func__, mod->arch.core_plt->sh_size, mod->arch.init_plt->sh_size,
490                mod->arch.got->sh_size, mod->arch.opd->sh_size);
491         return 0;
492 }
493
494 static inline int
495 in_init (const struct module *mod, uint64_t addr)
496 {
497         return addr - (uint64_t) mod->module_init < mod->init_size;
498 }
499
500 static inline int
501 in_core (const struct module *mod, uint64_t addr)
502 {
503         return addr - (uint64_t) mod->module_core < mod->core_size;
504 }
505
506 static inline int
507 is_internal (const struct module *mod, uint64_t value)
508 {
509         return in_init(mod, value) || in_core(mod, value);
510 }
511
512 /*
513  * Get gp-relative offset for the linkage-table entry of VALUE.
514  */
515 static uint64_t
516 get_ltoff (struct module *mod, uint64_t value, int *okp)
517 {
518         struct got_entry *got, *e;
519
520         if (!*okp)
521                 return 0;
522
523         got = (void *) mod->arch.got->sh_addr;
524         for (e = got; e < got + mod->arch.next_got_entry; ++e)
525                 if (e->val == value)
526                         goto found;
527
528         /* Not enough GOT entries? */
529         BUG_ON(e >= (struct got_entry *) (mod->arch.got->sh_addr + mod->arch.got->sh_size));
530
531         e->val = value;
532         ++mod->arch.next_got_entry;
533   found:
534         return (uint64_t) e - mod->arch.gp;
535 }
536
537 static inline int
538 gp_addressable (struct module *mod, uint64_t value)
539 {
540         return value - mod->arch.gp + MAX_LTOFF/2 < MAX_LTOFF;
541 }
542
543 /* Get PC-relative PLT entry for this value.  Returns 0 on failure. */
544 static uint64_t
545 get_plt (struct module *mod, const struct insn *insn, uint64_t value, int *okp)
546 {
547         struct plt_entry *plt, *plt_end;
548         uint64_t target_ip, target_gp;
549
550         if (!*okp)
551                 return 0;
552
553         if (in_init(mod, (uint64_t) insn)) {
554                 plt = (void *) mod->arch.init_plt->sh_addr;
555                 plt_end = (void *) plt + mod->arch.init_plt->sh_size;
556         } else {
557                 plt = (void *) mod->arch.core_plt->sh_addr;
558                 plt_end = (void *) plt + mod->arch.core_plt->sh_size;
559         }
560
561         /* "value" is a pointer to a function-descriptor; fetch the target ip/gp from it: */
562         target_ip = ((uint64_t *) value)[0];
563         target_gp = ((uint64_t *) value)[1];
564
565         /* Look for existing PLT entry. */
566         while (plt->bundle[0][0]) {
567                 if (plt_target(plt) == target_ip)
568                         goto found;
569                 if (++plt >= plt_end)
570                         BUG();
571         }
572         *plt = ia64_plt_template;
573         if (!patch_plt(mod, plt, target_ip, target_gp)) {
574                 *okp = 0;
575                 return 0;
576         }
577 #if ARCH_MODULE_DEBUG
578         if (plt_target(plt) != target_ip) {
579                 printk("%s: mistargeted PLT: wanted %lx, got %lx\n",
580                        __func__, target_ip, plt_target(plt));
581                 *okp = 0;
582                 return 0;
583         }
584 #endif
585   found:
586         return (uint64_t) plt;
587 }
588
589 /* Get function descriptor for VALUE. */
590 static uint64_t
591 get_fdesc (struct module *mod, uint64_t value, int *okp)
592 {
593         struct fdesc *fdesc = (void *) mod->arch.opd->sh_addr;
594
595         if (!*okp)
596                 return 0;
597
598         if (!value) {
599                 printk(KERN_ERR "%s: fdesc for zero requested!\n", mod->name);
600                 return 0;
601         }
602
603         if (!is_internal(mod, value))
604                 /*
605                  * If it's not a module-local entry-point, "value" already points to a
606                  * function-descriptor.
607                  */
608                 return value;
609
610         /* Look for existing function descriptor. */
611         while (fdesc->ip) {
612                 if (fdesc->ip == value)
613                         return (uint64_t)fdesc;
614                 if ((uint64_t) ++fdesc >= mod->arch.opd->sh_addr + mod->arch.opd->sh_size)
615                         BUG();
616         }
617
618         /* Create new one */
619         fdesc->ip = value;
620         fdesc->gp = mod->arch.gp;
621         return (uint64_t) fdesc;
622 }
623
624 static inline int
625 do_reloc (struct module *mod, uint8_t r_type, Elf64_Sym *sym, uint64_t addend,
626           Elf64_Shdr *sec, void *location)
627 {
628         enum reloc_target_format format = (r_type >> FORMAT_SHIFT) & FORMAT_MASK;
629         enum reloc_value_formula formula = (r_type >> VALUE_SHIFT) & VALUE_MASK;
630         uint64_t val;
631         int ok = 1;
632
633         val = sym->st_value + addend;
634
635         switch (formula) {
636               case RV_SEGREL:   /* segment base is arbitrarily chosen to be 0 for kernel modules */
637               case RV_DIRECT:
638                 break;
639
640               case RV_GPREL:      val -= mod->arch.gp; break;
641               case RV_LTREL:      val = get_ltoff(mod, val, &ok); break;
642               case RV_PLTREL:     val = get_plt(mod, location, val, &ok); break;
643               case RV_FPTR:       val = get_fdesc(mod, val, &ok); break;
644               case RV_SECREL:     val -= sec->sh_addr; break;
645               case RV_LTREL_FPTR: val = get_ltoff(mod, get_fdesc(mod, val, &ok), &ok); break;
646
647               case RV_PCREL:
648                 switch (r_type) {
649                       case R_IA64_PCREL21B:
650                         if ((in_init(mod, val) && in_core(mod, (uint64_t)location)) ||
651                             (in_core(mod, val) && in_init(mod, (uint64_t)location))) {
652                                 /*
653                                  * Init section may have been allocated far away from core,
654                                  * if the branch won't reach, then allocate a plt for it.
655                                  */
656                                 uint64_t delta = ((int64_t)val - (int64_t)location) / 16;
657                                 if (delta + (1 << 20) >= (1 << 21)) {
658                                         val = get_fdesc(mod, val, &ok);
659                                         val = get_plt(mod, location, val, &ok);
660                                 }
661                         } else if (!is_internal(mod, val))
662                                 val = get_plt(mod, location, val, &ok);
663                         /* FALL THROUGH */
664                       default:
665                         val -= bundle(location);
666                         break;
667
668                       case R_IA64_PCREL32MSB:
669                       case R_IA64_PCREL32LSB:
670                       case R_IA64_PCREL64MSB:
671                       case R_IA64_PCREL64LSB:
672                         val -= (uint64_t) location;
673                         break;
674
675                 }
676                 switch (r_type) {
677                       case R_IA64_PCREL60B: format = RF_INSN60; break;
678                       case R_IA64_PCREL21B: format = RF_INSN21B; break;
679                       case R_IA64_PCREL21M: format = RF_INSN21M; break;
680                       case R_IA64_PCREL21F: format = RF_INSN21F; break;
681                       default: break;
682                 }
683                 break;
684
685               case RV_BDREL:
686                 val -= (uint64_t) (in_init(mod, val) ? mod->module_init : mod->module_core);
687                 break;
688
689               case RV_LTV:
690                 /* can link-time value relocs happen here?  */
691                 BUG();
692                 break;
693
694               case RV_PCREL2:
695                 if (r_type == R_IA64_PCREL21BI) {
696                         if (!is_internal(mod, val)) {
697                                 printk(KERN_ERR "%s: %s reloc against "
698                                         "non-local symbol (%lx)\n", __func__,
699                                         reloc_name[r_type], (unsigned long)val);
700                                 return -ENOEXEC;
701                         }
702                         format = RF_INSN21B;
703                 }
704                 val -= bundle(location);
705                 break;
706
707               case RV_SPECIAL:
708                 switch (r_type) {
709                       case R_IA64_IPLTMSB:
710                       case R_IA64_IPLTLSB:
711                         val = get_fdesc(mod, get_plt(mod, location, val, &ok), &ok);
712                         format = RF_64LSB;
713                         if (r_type == R_IA64_IPLTMSB)
714                                 format = RF_64MSB;
715                         break;
716
717                       case R_IA64_SUB:
718                         val = addend - sym->st_value;
719                         format = RF_INSN64;
720                         break;
721
722                       case R_IA64_LTOFF22X:
723                         if (gp_addressable(mod, val))
724                                 val -= mod->arch.gp;
725                         else
726                                 val = get_ltoff(mod, val, &ok);
727                         format = RF_INSN22;
728                         break;
729
730                       case R_IA64_LDXMOV:
731                         if (gp_addressable(mod, val)) {
732                                 /* turn "ld8" into "mov": */
733                                 DEBUGP("%s: patching ld8 at %p to mov\n", __func__, location);
734                                 ia64_patch((u64) location, 0x1fff80fe000UL, 0x10000000000UL);
735                         }
736                         return 0;
737
738                       default:
739                         if (reloc_name[r_type])
740                                 printk(KERN_ERR "%s: special reloc %s not supported",
741                                        mod->name, reloc_name[r_type]);
742                         else
743                                 printk(KERN_ERR "%s: unknown special reloc %x\n",
744                                        mod->name, r_type);
745                         return -ENOEXEC;
746                 }
747                 break;
748
749               case RV_TPREL:
750               case RV_LTREL_TPREL:
751               case RV_DTPMOD:
752               case RV_LTREL_DTPMOD:
753               case RV_DTPREL:
754               case RV_LTREL_DTPREL:
755                 printk(KERN_ERR "%s: %s reloc not supported\n",
756                        mod->name, reloc_name[r_type] ? reloc_name[r_type] : "?");
757                 return -ENOEXEC;
758
759               default:
760                 printk(KERN_ERR "%s: unknown reloc %x\n", mod->name, r_type);
761                 return -ENOEXEC;
762         }
763
764         if (!ok)
765                 return -ENOEXEC;
766
767         DEBUGP("%s: [%p]<-%016lx = %s(%lx)\n", __func__, location, val,
768                reloc_name[r_type] ? reloc_name[r_type] : "?", sym->st_value + addend);
769
770         switch (format) {
771               case RF_INSN21B:  ok = apply_imm21b(mod, location, (int64_t) val / 16); break;
772               case RF_INSN22:   ok = apply_imm22(mod, location, val); break;
773               case RF_INSN64:   ok = apply_imm64(mod, location, val); break;
774               case RF_INSN60:   ok = apply_imm60(mod, location, (int64_t) val / 16); break;
775               case RF_32LSB:    put_unaligned(val, (uint32_t *) location); break;
776               case RF_64LSB:    put_unaligned(val, (uint64_t *) location); break;
777               case RF_32MSB:    /* ia64 Linux is little-endian... */
778               case RF_64MSB:    /* ia64 Linux is little-endian... */
779               case RF_INSN14:   /* must be within-module, i.e., resolved by "ld -r" */
780               case RF_INSN21M:  /* must be within-module, i.e., resolved by "ld -r" */
781               case RF_INSN21F:  /* must be within-module, i.e., resolved by "ld -r" */
782                 printk(KERN_ERR "%s: format %u needed by %s reloc is not supported\n",
783                        mod->name, format, reloc_name[r_type] ? reloc_name[r_type] : "?");
784                 return -ENOEXEC;
785
786               default:
787                 printk(KERN_ERR "%s: relocation %s resulted in unknown format %u\n",
788                        mod->name, reloc_name[r_type] ? reloc_name[r_type] : "?", format);
789                 return -ENOEXEC;
790         }
791         return ok ? 0 : -ENOEXEC;
792 }
793
794 int
795 apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symindex,
796                     unsigned int relsec, struct module *mod)
797 {
798         unsigned int i, n = sechdrs[relsec].sh_size / sizeof(Elf64_Rela);
799         Elf64_Rela *rela = (void *) sechdrs[relsec].sh_addr;
800         Elf64_Shdr *target_sec;
801         int ret;
802
803         DEBUGP("%s: applying section %u (%u relocs) to %u\n", __func__,
804                relsec, n, sechdrs[relsec].sh_info);
805
806         target_sec = sechdrs + sechdrs[relsec].sh_info;
807
808         if (target_sec->sh_entsize == ~0UL)
809                 /*
810                  * If target section wasn't allocated, we don't need to relocate it.
811                  * Happens, e.g., for debug sections.
812                  */
813                 return 0;
814
815         if (!mod->arch.gp) {
816                 /*
817                  * XXX Should have an arch-hook for running this after final section
818                  *     addresses have been selected...
819                  */
820                 uint64_t gp;
821                 if (mod->core_size > MAX_LTOFF)
822                         /*
823                          * This takes advantage of fact that SHF_ARCH_SMALL gets allocated
824                          * at the end of the module.
825                          */
826                         gp = mod->core_size - MAX_LTOFF / 2;
827                 else
828                         gp = mod->core_size / 2;
829                 gp = (uint64_t) mod->module_core + ((gp + 7) & -8);
830                 mod->arch.gp = gp;
831                 DEBUGP("%s: placing gp at 0x%lx\n", __func__, gp);
832         }
833
834         for (i = 0; i < n; i++) {
835                 ret = do_reloc(mod, ELF64_R_TYPE(rela[i].r_info),
836                                ((Elf64_Sym *) sechdrs[symindex].sh_addr
837                                 + ELF64_R_SYM(rela[i].r_info)),
838                                rela[i].r_addend, target_sec,
839                                (void *) target_sec->sh_addr + rela[i].r_offset);
840                 if (ret < 0)
841                         return ret;
842         }
843         return 0;
844 }
845
846 /*
847  * Modules contain a single unwind table which covers both the core and the init text
848  * sections but since the two are not contiguous, we need to split this table up such that
849  * we can register (and unregister) each "segment" separately.  Fortunately, this sounds
850  * more complicated than it really is.
851  */
852 static void
853 register_unwind_table (struct module *mod)
854 {
855         struct unw_table_entry *start = (void *) mod->arch.unwind->sh_addr;
856         struct unw_table_entry *end = start + mod->arch.unwind->sh_size / sizeof (*start);
857         struct unw_table_entry tmp, *e1, *e2, *core, *init;
858         unsigned long num_init = 0, num_core = 0;
859
860         /* First, count how many init and core unwind-table entries there are.  */
861         for (e1 = start; e1 < end; ++e1)
862                 if (in_init(mod, e1->start_offset))
863                         ++num_init;
864                 else
865                         ++num_core;
866         /*
867          * Second, sort the table such that all unwind-table entries for the init and core
868          * text sections are nicely separated.  We do this with a stupid bubble sort
869          * (unwind tables don't get ridiculously huge).
870          */
871         for (e1 = start; e1 < end; ++e1) {
872                 for (e2 = e1 + 1; e2 < end; ++e2) {
873                         if (e2->start_offset < e1->start_offset) {
874                                 tmp = *e1;
875                                 *e1 = *e2;
876                                 *e2 = tmp;
877                         }
878                 }
879         }
880         /*
881          * Third, locate the init and core segments in the unwind table:
882          */
883         if (in_init(mod, start->start_offset)) {
884                 init = start;
885                 core = start + num_init;
886         } else {
887                 core = start;
888                 init = start + num_core;
889         }
890
891         DEBUGP("%s: name=%s, gp=%lx, num_init=%lu, num_core=%lu\n", __func__,
892                mod->name, mod->arch.gp, num_init, num_core);
893
894         /*
895          * Fourth, register both tables (if not empty).
896          */
897         if (num_core > 0) {
898                 mod->arch.core_unw_table = unw_add_unwind_table(mod->name, 0, mod->arch.gp,
899                                                                 core, core + num_core);
900                 DEBUGP("%s:  core: handle=%p [%p-%p)\n", __func__,
901                        mod->arch.core_unw_table, core, core + num_core);
902         }
903         if (num_init > 0) {
904                 mod->arch.init_unw_table = unw_add_unwind_table(mod->name, 0, mod->arch.gp,
905                                                                 init, init + num_init);
906                 DEBUGP("%s:  init: handle=%p [%p-%p)\n", __func__,
907                        mod->arch.init_unw_table, init, init + num_init);
908         }
909 }
910
911 int
912 module_finalize (const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *mod)
913 {
914         DEBUGP("%s: init: entry=%p\n", __func__, mod->init);
915         if (mod->arch.unwind)
916                 register_unwind_table(mod);
917 #ifdef CONFIG_PARAVIRT
918         if (mod->arch.paravirt_bundles) {
919                 struct paravirt_patch_site_bundle *start =
920                         (struct paravirt_patch_site_bundle *)
921                         mod->arch.paravirt_bundles->sh_addr;
922                 struct paravirt_patch_site_bundle *end =
923                         (struct paravirt_patch_site_bundle *)
924                         (mod->arch.paravirt_bundles->sh_addr +
925                          mod->arch.paravirt_bundles->sh_size);
926
927                 paravirt_patch_apply_bundle(start, end);
928         }
929         if (mod->arch.paravirt_insts) {
930                 struct paravirt_patch_site_inst *start =
931                         (struct paravirt_patch_site_inst *)
932                         mod->arch.paravirt_insts->sh_addr;
933                 struct paravirt_patch_site_inst *end =
934                         (struct paravirt_patch_site_inst *)
935                         (mod->arch.paravirt_insts->sh_addr +
936                          mod->arch.paravirt_insts->sh_size);
937
938                 paravirt_patch_apply_inst(start, end);
939         }
940 #endif
941         return 0;
942 }
943
944 void
945 module_arch_cleanup (struct module *mod)
946 {
947         if (mod->arch.init_unw_table)
948                 unw_remove_unwind_table(mod->arch.init_unw_table);
949         if (mod->arch.core_unw_table)
950                 unw_remove_unwind_table(mod->arch.core_unw_table);
951 }