Merge branch 'fix/soundcore' into for-linus
[pandora-kernel.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_alloc (unsigned long size)
309 {
310         if (!size)
311                 return NULL;
312         return vmalloc(size);
313 }
314
315 void
316 module_free (struct module *mod, void *module_region)
317 {
318         if (mod && mod->arch.init_unw_table &&
319             module_region == mod->module_init) {
320                 unw_remove_unwind_table(mod->arch.init_unw_table);
321                 mod->arch.init_unw_table = NULL;
322         }
323         vfree(module_region);
324 }
325
326 /* Have we already seen one of these relocations? */
327 /* FIXME: we could look in other sections, too --RR */
328 static int
329 duplicate_reloc (const Elf64_Rela *rela, unsigned int num)
330 {
331         unsigned int i;
332
333         for (i = 0; i < num; i++) {
334                 if (rela[i].r_info == rela[num].r_info && rela[i].r_addend == rela[num].r_addend)
335                         return 1;
336         }
337         return 0;
338 }
339
340 /* Count how many GOT entries we may need */
341 static unsigned int
342 count_gots (const Elf64_Rela *rela, unsigned int num)
343 {
344         unsigned int i, ret = 0;
345
346         /* Sure, this is order(n^2), but it's usually short, and not
347            time critical */
348         for (i = 0; i < num; i++) {
349                 switch (ELF64_R_TYPE(rela[i].r_info)) {
350                       case R_IA64_LTOFF22:
351                       case R_IA64_LTOFF22X:
352                       case R_IA64_LTOFF64I:
353                       case R_IA64_LTOFF_FPTR22:
354                       case R_IA64_LTOFF_FPTR64I:
355                       case R_IA64_LTOFF_FPTR32MSB:
356                       case R_IA64_LTOFF_FPTR32LSB:
357                       case R_IA64_LTOFF_FPTR64MSB:
358                       case R_IA64_LTOFF_FPTR64LSB:
359                         if (!duplicate_reloc(rela, i))
360                                 ret++;
361                         break;
362                 }
363         }
364         return ret;
365 }
366
367 /* Count how many PLT entries we may need */
368 static unsigned int
369 count_plts (const Elf64_Rela *rela, unsigned int num)
370 {
371         unsigned int i, ret = 0;
372
373         /* Sure, this is order(n^2), but it's usually short, and not
374            time critical */
375         for (i = 0; i < num; i++) {
376                 switch (ELF64_R_TYPE(rela[i].r_info)) {
377                       case R_IA64_PCREL21B:
378                       case R_IA64_PLTOFF22:
379                       case R_IA64_PLTOFF64I:
380                       case R_IA64_PLTOFF64MSB:
381                       case R_IA64_PLTOFF64LSB:
382                       case R_IA64_IPLTMSB:
383                       case R_IA64_IPLTLSB:
384                         if (!duplicate_reloc(rela, i))
385                                 ret++;
386                         break;
387                 }
388         }
389         return ret;
390 }
391
392 /* We need to create an function-descriptors for any internal function
393    which is referenced. */
394 static unsigned int
395 count_fdescs (const Elf64_Rela *rela, unsigned int num)
396 {
397         unsigned int i, ret = 0;
398
399         /* Sure, this is order(n^2), but it's usually short, and not time critical.  */
400         for (i = 0; i < num; i++) {
401                 switch (ELF64_R_TYPE(rela[i].r_info)) {
402                       case R_IA64_FPTR64I:
403                       case R_IA64_FPTR32LSB:
404                       case R_IA64_FPTR32MSB:
405                       case R_IA64_FPTR64LSB:
406                       case R_IA64_FPTR64MSB:
407                       case R_IA64_LTOFF_FPTR22:
408                       case R_IA64_LTOFF_FPTR32LSB:
409                       case R_IA64_LTOFF_FPTR32MSB:
410                       case R_IA64_LTOFF_FPTR64I:
411                       case R_IA64_LTOFF_FPTR64LSB:
412                       case R_IA64_LTOFF_FPTR64MSB:
413                       case R_IA64_IPLTMSB:
414                       case R_IA64_IPLTLSB:
415                         /*
416                          * Jumps to static functions sometimes go straight to their
417                          * offset.  Of course, that may not be possible if the jump is
418                          * from init -> core or vice. versa, so we need to generate an
419                          * FDESC (and PLT etc) for that.
420                          */
421                       case R_IA64_PCREL21B:
422                         if (!duplicate_reloc(rela, i))
423                                 ret++;
424                         break;
425                 }
426         }
427         return ret;
428 }
429
430 int
431 module_frob_arch_sections (Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, char *secstrings,
432                            struct module *mod)
433 {
434         unsigned long core_plts = 0, init_plts = 0, gots = 0, fdescs = 0;
435         Elf64_Shdr *s, *sechdrs_end = sechdrs + ehdr->e_shnum;
436
437         /*
438          * To store the PLTs and function-descriptors, we expand the .text section for
439          * core module-code and the .init.text section for initialization code.
440          */
441         for (s = sechdrs; s < sechdrs_end; ++s)
442                 if (strcmp(".core.plt", secstrings + s->sh_name) == 0)
443                         mod->arch.core_plt = s;
444                 else if (strcmp(".init.plt", secstrings + s->sh_name) == 0)
445                         mod->arch.init_plt = s;
446                 else if (strcmp(".got", secstrings + s->sh_name) == 0)
447                         mod->arch.got = s;
448                 else if (strcmp(".opd", secstrings + s->sh_name) == 0)
449                         mod->arch.opd = s;
450                 else if (strcmp(".IA_64.unwind", secstrings + s->sh_name) == 0)
451                         mod->arch.unwind = s;
452 #ifdef CONFIG_PARAVIRT
453                 else if (strcmp(".paravirt_bundles",
454                                 secstrings + s->sh_name) == 0)
455                         mod->arch.paravirt_bundles = s;
456                 else if (strcmp(".paravirt_insts",
457                                 secstrings + s->sh_name) == 0)
458                         mod->arch.paravirt_insts = s;
459 #endif
460
461         if (!mod->arch.core_plt || !mod->arch.init_plt || !mod->arch.got || !mod->arch.opd) {
462                 printk(KERN_ERR "%s: sections missing\n", mod->name);
463                 return -ENOEXEC;
464         }
465
466         /* GOT and PLTs can occur in any relocated section... */
467         for (s = sechdrs + 1; s < sechdrs_end; ++s) {
468                 const Elf64_Rela *rels = (void *)ehdr + s->sh_offset;
469                 unsigned long numrels = s->sh_size/sizeof(Elf64_Rela);
470
471                 if (s->sh_type != SHT_RELA)
472                         continue;
473
474                 gots += count_gots(rels, numrels);
475                 fdescs += count_fdescs(rels, numrels);
476                 if (strstr(secstrings + s->sh_name, ".init"))
477                         init_plts += count_plts(rels, numrels);
478                 else
479                         core_plts += count_plts(rels, numrels);
480         }
481
482         mod->arch.core_plt->sh_type = SHT_NOBITS;
483         mod->arch.core_plt->sh_flags = SHF_EXECINSTR | SHF_ALLOC;
484         mod->arch.core_plt->sh_addralign = 16;
485         mod->arch.core_plt->sh_size = core_plts * sizeof(struct plt_entry);
486         mod->arch.init_plt->sh_type = SHT_NOBITS;
487         mod->arch.init_plt->sh_flags = SHF_EXECINSTR | SHF_ALLOC;
488         mod->arch.init_plt->sh_addralign = 16;
489         mod->arch.init_plt->sh_size = init_plts * sizeof(struct plt_entry);
490         mod->arch.got->sh_type = SHT_NOBITS;
491         mod->arch.got->sh_flags = ARCH_SHF_SMALL | SHF_ALLOC;
492         mod->arch.got->sh_addralign = 8;
493         mod->arch.got->sh_size = gots * sizeof(struct got_entry);
494         mod->arch.opd->sh_type = SHT_NOBITS;
495         mod->arch.opd->sh_flags = SHF_ALLOC;
496         mod->arch.opd->sh_addralign = 8;
497         mod->arch.opd->sh_size = fdescs * sizeof(struct fdesc);
498         DEBUGP("%s: core.plt=%lx, init.plt=%lx, got=%lx, fdesc=%lx\n",
499                __func__, mod->arch.core_plt->sh_size, mod->arch.init_plt->sh_size,
500                mod->arch.got->sh_size, mod->arch.opd->sh_size);
501         return 0;
502 }
503
504 static inline int
505 in_init (const struct module *mod, uint64_t addr)
506 {
507         return addr - (uint64_t) mod->module_init < mod->init_size;
508 }
509
510 static inline int
511 in_core (const struct module *mod, uint64_t addr)
512 {
513         return addr - (uint64_t) mod->module_core < mod->core_size;
514 }
515
516 static inline int
517 is_internal (const struct module *mod, uint64_t value)
518 {
519         return in_init(mod, value) || in_core(mod, value);
520 }
521
522 /*
523  * Get gp-relative offset for the linkage-table entry of VALUE.
524  */
525 static uint64_t
526 get_ltoff (struct module *mod, uint64_t value, int *okp)
527 {
528         struct got_entry *got, *e;
529
530         if (!*okp)
531                 return 0;
532
533         got = (void *) mod->arch.got->sh_addr;
534         for (e = got; e < got + mod->arch.next_got_entry; ++e)
535                 if (e->val == value)
536                         goto found;
537
538         /* Not enough GOT entries? */
539         BUG_ON(e >= (struct got_entry *) (mod->arch.got->sh_addr + mod->arch.got->sh_size));
540
541         e->val = value;
542         ++mod->arch.next_got_entry;
543   found:
544         return (uint64_t) e - mod->arch.gp;
545 }
546
547 static inline int
548 gp_addressable (struct module *mod, uint64_t value)
549 {
550         return value - mod->arch.gp + MAX_LTOFF/2 < MAX_LTOFF;
551 }
552
553 /* Get PC-relative PLT entry for this value.  Returns 0 on failure. */
554 static uint64_t
555 get_plt (struct module *mod, const struct insn *insn, uint64_t value, int *okp)
556 {
557         struct plt_entry *plt, *plt_end;
558         uint64_t target_ip, target_gp;
559
560         if (!*okp)
561                 return 0;
562
563         if (in_init(mod, (uint64_t) insn)) {
564                 plt = (void *) mod->arch.init_plt->sh_addr;
565                 plt_end = (void *) plt + mod->arch.init_plt->sh_size;
566         } else {
567                 plt = (void *) mod->arch.core_plt->sh_addr;
568                 plt_end = (void *) plt + mod->arch.core_plt->sh_size;
569         }
570
571         /* "value" is a pointer to a function-descriptor; fetch the target ip/gp from it: */
572         target_ip = ((uint64_t *) value)[0];
573         target_gp = ((uint64_t *) value)[1];
574
575         /* Look for existing PLT entry. */
576         while (plt->bundle[0][0]) {
577                 if (plt_target(plt) == target_ip)
578                         goto found;
579                 if (++plt >= plt_end)
580                         BUG();
581         }
582         *plt = ia64_plt_template;
583         if (!patch_plt(mod, plt, target_ip, target_gp)) {
584                 *okp = 0;
585                 return 0;
586         }
587 #if ARCH_MODULE_DEBUG
588         if (plt_target(plt) != target_ip) {
589                 printk("%s: mistargeted PLT: wanted %lx, got %lx\n",
590                        __func__, target_ip, plt_target(plt));
591                 *okp = 0;
592                 return 0;
593         }
594 #endif
595   found:
596         return (uint64_t) plt;
597 }
598
599 /* Get function descriptor for VALUE. */
600 static uint64_t
601 get_fdesc (struct module *mod, uint64_t value, int *okp)
602 {
603         struct fdesc *fdesc = (void *) mod->arch.opd->sh_addr;
604
605         if (!*okp)
606                 return 0;
607
608         if (!value) {
609                 printk(KERN_ERR "%s: fdesc for zero requested!\n", mod->name);
610                 return 0;
611         }
612
613         if (!is_internal(mod, value))
614                 /*
615                  * If it's not a module-local entry-point, "value" already points to a
616                  * function-descriptor.
617                  */
618                 return value;
619
620         /* Look for existing function descriptor. */
621         while (fdesc->ip) {
622                 if (fdesc->ip == value)
623                         return (uint64_t)fdesc;
624                 if ((uint64_t) ++fdesc >= mod->arch.opd->sh_addr + mod->arch.opd->sh_size)
625                         BUG();
626         }
627
628         /* Create new one */
629         fdesc->ip = value;
630         fdesc->gp = mod->arch.gp;
631         return (uint64_t) fdesc;
632 }
633
634 static inline int
635 do_reloc (struct module *mod, uint8_t r_type, Elf64_Sym *sym, uint64_t addend,
636           Elf64_Shdr *sec, void *location)
637 {
638         enum reloc_target_format format = (r_type >> FORMAT_SHIFT) & FORMAT_MASK;
639         enum reloc_value_formula formula = (r_type >> VALUE_SHIFT) & VALUE_MASK;
640         uint64_t val;
641         int ok = 1;
642
643         val = sym->st_value + addend;
644
645         switch (formula) {
646               case RV_SEGREL:   /* segment base is arbitrarily chosen to be 0 for kernel modules */
647               case RV_DIRECT:
648                 break;
649
650               case RV_GPREL:      val -= mod->arch.gp; break;
651               case RV_LTREL:      val = get_ltoff(mod, val, &ok); break;
652               case RV_PLTREL:     val = get_plt(mod, location, val, &ok); break;
653               case RV_FPTR:       val = get_fdesc(mod, val, &ok); break;
654               case RV_SECREL:     val -= sec->sh_addr; break;
655               case RV_LTREL_FPTR: val = get_ltoff(mod, get_fdesc(mod, val, &ok), &ok); break;
656
657               case RV_PCREL:
658                 switch (r_type) {
659                       case R_IA64_PCREL21B:
660                         if ((in_init(mod, val) && in_core(mod, (uint64_t)location)) ||
661                             (in_core(mod, val) && in_init(mod, (uint64_t)location))) {
662                                 /*
663                                  * Init section may have been allocated far away from core,
664                                  * if the branch won't reach, then allocate a plt for it.
665                                  */
666                                 uint64_t delta = ((int64_t)val - (int64_t)location) / 16;
667                                 if (delta + (1 << 20) >= (1 << 21)) {
668                                         val = get_fdesc(mod, val, &ok);
669                                         val = get_plt(mod, location, val, &ok);
670                                 }
671                         } else if (!is_internal(mod, val))
672                                 val = get_plt(mod, location, val, &ok);
673                         /* FALL THROUGH */
674                       default:
675                         val -= bundle(location);
676                         break;
677
678                       case R_IA64_PCREL32MSB:
679                       case R_IA64_PCREL32LSB:
680                       case R_IA64_PCREL64MSB:
681                       case R_IA64_PCREL64LSB:
682                         val -= (uint64_t) location;
683                         break;
684
685                 }
686                 switch (r_type) {
687                       case R_IA64_PCREL60B: format = RF_INSN60; break;
688                       case R_IA64_PCREL21B: format = RF_INSN21B; break;
689                       case R_IA64_PCREL21M: format = RF_INSN21M; break;
690                       case R_IA64_PCREL21F: format = RF_INSN21F; break;
691                       default: break;
692                 }
693                 break;
694
695               case RV_BDREL:
696                 val -= (uint64_t) (in_init(mod, val) ? mod->module_init : mod->module_core);
697                 break;
698
699               case RV_LTV:
700                 /* can link-time value relocs happen here?  */
701                 BUG();
702                 break;
703
704               case RV_PCREL2:
705                 if (r_type == R_IA64_PCREL21BI) {
706                         if (!is_internal(mod, val)) {
707                                 printk(KERN_ERR "%s: %s reloc against "
708                                         "non-local symbol (%lx)\n", __func__,
709                                         reloc_name[r_type], (unsigned long)val);
710                                 return -ENOEXEC;
711                         }
712                         format = RF_INSN21B;
713                 }
714                 val -= bundle(location);
715                 break;
716
717               case RV_SPECIAL:
718                 switch (r_type) {
719                       case R_IA64_IPLTMSB:
720                       case R_IA64_IPLTLSB:
721                         val = get_fdesc(mod, get_plt(mod, location, val, &ok), &ok);
722                         format = RF_64LSB;
723                         if (r_type == R_IA64_IPLTMSB)
724                                 format = RF_64MSB;
725                         break;
726
727                       case R_IA64_SUB:
728                         val = addend - sym->st_value;
729                         format = RF_INSN64;
730                         break;
731
732                       case R_IA64_LTOFF22X:
733                         if (gp_addressable(mod, val))
734                                 val -= mod->arch.gp;
735                         else
736                                 val = get_ltoff(mod, val, &ok);
737                         format = RF_INSN22;
738                         break;
739
740                       case R_IA64_LDXMOV:
741                         if (gp_addressable(mod, val)) {
742                                 /* turn "ld8" into "mov": */
743                                 DEBUGP("%s: patching ld8 at %p to mov\n", __func__, location);
744                                 ia64_patch((u64) location, 0x1fff80fe000UL, 0x10000000000UL);
745                         }
746                         return 0;
747
748                       default:
749                         if (reloc_name[r_type])
750                                 printk(KERN_ERR "%s: special reloc %s not supported",
751                                        mod->name, reloc_name[r_type]);
752                         else
753                                 printk(KERN_ERR "%s: unknown special reloc %x\n",
754                                        mod->name, r_type);
755                         return -ENOEXEC;
756                 }
757                 break;
758
759               case RV_TPREL:
760               case RV_LTREL_TPREL:
761               case RV_DTPMOD:
762               case RV_LTREL_DTPMOD:
763               case RV_DTPREL:
764               case RV_LTREL_DTPREL:
765                 printk(KERN_ERR "%s: %s reloc not supported\n",
766                        mod->name, reloc_name[r_type] ? reloc_name[r_type] : "?");
767                 return -ENOEXEC;
768
769               default:
770                 printk(KERN_ERR "%s: unknown reloc %x\n", mod->name, r_type);
771                 return -ENOEXEC;
772         }
773
774         if (!ok)
775                 return -ENOEXEC;
776
777         DEBUGP("%s: [%p]<-%016lx = %s(%lx)\n", __func__, location, val,
778                reloc_name[r_type] ? reloc_name[r_type] : "?", sym->st_value + addend);
779
780         switch (format) {
781               case RF_INSN21B:  ok = apply_imm21b(mod, location, (int64_t) val / 16); break;
782               case RF_INSN22:   ok = apply_imm22(mod, location, val); break;
783               case RF_INSN64:   ok = apply_imm64(mod, location, val); break;
784               case RF_INSN60:   ok = apply_imm60(mod, location, (int64_t) val / 16); break;
785               case RF_32LSB:    put_unaligned(val, (uint32_t *) location); break;
786               case RF_64LSB:    put_unaligned(val, (uint64_t *) location); break;
787               case RF_32MSB:    /* ia64 Linux is little-endian... */
788               case RF_64MSB:    /* ia64 Linux is little-endian... */
789               case RF_INSN14:   /* must be within-module, i.e., resolved by "ld -r" */
790               case RF_INSN21M:  /* must be within-module, i.e., resolved by "ld -r" */
791               case RF_INSN21F:  /* must be within-module, i.e., resolved by "ld -r" */
792                 printk(KERN_ERR "%s: format %u needed by %s reloc is not supported\n",
793                        mod->name, format, reloc_name[r_type] ? reloc_name[r_type] : "?");
794                 return -ENOEXEC;
795
796               default:
797                 printk(KERN_ERR "%s: relocation %s resulted in unknown format %u\n",
798                        mod->name, reloc_name[r_type] ? reloc_name[r_type] : "?", format);
799                 return -ENOEXEC;
800         }
801         return ok ? 0 : -ENOEXEC;
802 }
803
804 int
805 apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symindex,
806                     unsigned int relsec, struct module *mod)
807 {
808         unsigned int i, n = sechdrs[relsec].sh_size / sizeof(Elf64_Rela);
809         Elf64_Rela *rela = (void *) sechdrs[relsec].sh_addr;
810         Elf64_Shdr *target_sec;
811         int ret;
812
813         DEBUGP("%s: applying section %u (%u relocs) to %u\n", __func__,
814                relsec, n, sechdrs[relsec].sh_info);
815
816         target_sec = sechdrs + sechdrs[relsec].sh_info;
817
818         if (target_sec->sh_entsize == ~0UL)
819                 /*
820                  * If target section wasn't allocated, we don't need to relocate it.
821                  * Happens, e.g., for debug sections.
822                  */
823                 return 0;
824
825         if (!mod->arch.gp) {
826                 /*
827                  * XXX Should have an arch-hook for running this after final section
828                  *     addresses have been selected...
829                  */
830                 uint64_t gp;
831                 if (mod->core_size > MAX_LTOFF)
832                         /*
833                          * This takes advantage of fact that SHF_ARCH_SMALL gets allocated
834                          * at the end of the module.
835                          */
836                         gp = mod->core_size - MAX_LTOFF / 2;
837                 else
838                         gp = mod->core_size / 2;
839                 gp = (uint64_t) mod->module_core + ((gp + 7) & -8);
840                 mod->arch.gp = gp;
841                 DEBUGP("%s: placing gp at 0x%lx\n", __func__, gp);
842         }
843
844         for (i = 0; i < n; i++) {
845                 ret = do_reloc(mod, ELF64_R_TYPE(rela[i].r_info),
846                                ((Elf64_Sym *) sechdrs[symindex].sh_addr
847                                 + ELF64_R_SYM(rela[i].r_info)),
848                                rela[i].r_addend, target_sec,
849                                (void *) target_sec->sh_addr + rela[i].r_offset);
850                 if (ret < 0)
851                         return ret;
852         }
853         return 0;
854 }
855
856 int
857 apply_relocate (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symindex,
858                 unsigned int relsec, struct module *mod)
859 {
860         printk(KERN_ERR "module %s: REL relocs in section %u unsupported\n", mod->name, relsec);
861         return -ENOEXEC;
862 }
863
864 /*
865  * Modules contain a single unwind table which covers both the core and the init text
866  * sections but since the two are not contiguous, we need to split this table up such that
867  * we can register (and unregister) each "segment" separately.  Fortunately, this sounds
868  * more complicated than it really is.
869  */
870 static void
871 register_unwind_table (struct module *mod)
872 {
873         struct unw_table_entry *start = (void *) mod->arch.unwind->sh_addr;
874         struct unw_table_entry *end = start + mod->arch.unwind->sh_size / sizeof (*start);
875         struct unw_table_entry tmp, *e1, *e2, *core, *init;
876         unsigned long num_init = 0, num_core = 0;
877
878         /* First, count how many init and core unwind-table entries there are.  */
879         for (e1 = start; e1 < end; ++e1)
880                 if (in_init(mod, e1->start_offset))
881                         ++num_init;
882                 else
883                         ++num_core;
884         /*
885          * Second, sort the table such that all unwind-table entries for the init and core
886          * text sections are nicely separated.  We do this with a stupid bubble sort
887          * (unwind tables don't get ridiculously huge).
888          */
889         for (e1 = start; e1 < end; ++e1) {
890                 for (e2 = e1 + 1; e2 < end; ++e2) {
891                         if (e2->start_offset < e1->start_offset) {
892                                 tmp = *e1;
893                                 *e1 = *e2;
894                                 *e2 = tmp;
895                         }
896                 }
897         }
898         /*
899          * Third, locate the init and core segments in the unwind table:
900          */
901         if (in_init(mod, start->start_offset)) {
902                 init = start;
903                 core = start + num_init;
904         } else {
905                 core = start;
906                 init = start + num_core;
907         }
908
909         DEBUGP("%s: name=%s, gp=%lx, num_init=%lu, num_core=%lu\n", __func__,
910                mod->name, mod->arch.gp, num_init, num_core);
911
912         /*
913          * Fourth, register both tables (if not empty).
914          */
915         if (num_core > 0) {
916                 mod->arch.core_unw_table = unw_add_unwind_table(mod->name, 0, mod->arch.gp,
917                                                                 core, core + num_core);
918                 DEBUGP("%s:  core: handle=%p [%p-%p)\n", __func__,
919                        mod->arch.core_unw_table, core, core + num_core);
920         }
921         if (num_init > 0) {
922                 mod->arch.init_unw_table = unw_add_unwind_table(mod->name, 0, mod->arch.gp,
923                                                                 init, init + num_init);
924                 DEBUGP("%s:  init: handle=%p [%p-%p)\n", __func__,
925                        mod->arch.init_unw_table, init, init + num_init);
926         }
927 }
928
929 int
930 module_finalize (const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *mod)
931 {
932         DEBUGP("%s: init: entry=%p\n", __func__, mod->init);
933         if (mod->arch.unwind)
934                 register_unwind_table(mod);
935 #ifdef CONFIG_PARAVIRT
936         if (mod->arch.paravirt_bundles) {
937                 struct paravirt_patch_site_bundle *start =
938                         (struct paravirt_patch_site_bundle *)
939                         mod->arch.paravirt_bundles->sh_addr;
940                 struct paravirt_patch_site_bundle *end =
941                         (struct paravirt_patch_site_bundle *)
942                         (mod->arch.paravirt_bundles->sh_addr +
943                          mod->arch.paravirt_bundles->sh_size);
944
945                 paravirt_patch_apply_bundle(start, end);
946         }
947         if (mod->arch.paravirt_insts) {
948                 struct paravirt_patch_site_inst *start =
949                         (struct paravirt_patch_site_inst *)
950                         mod->arch.paravirt_insts->sh_addr;
951                 struct paravirt_patch_site_inst *end =
952                         (struct paravirt_patch_site_inst *)
953                         (mod->arch.paravirt_insts->sh_addr +
954                          mod->arch.paravirt_insts->sh_size);
955
956                 paravirt_patch_apply_inst(start, end);
957         }
958 #endif
959         return 0;
960 }
961
962 void
963 module_arch_cleanup (struct module *mod)
964 {
965         if (mod->arch.init_unw_table)
966                 unw_remove_unwind_table(mod->arch.init_unw_table);
967         if (mod->arch.core_unw_table)
968                 unw_remove_unwind_table(mod->arch.core_unw_table);
969 }