Lines Matching +full:32 +full:- +full:bit

1 // SPDX-License-Identifier: GPL-2.0+
26 #include <asm/nospec-branch.h>
43 execmem_free(mod->arch.trampolines_start); in module_arch_cleanup()
50 mod->state == MODULE_STATE_LIVE) in module_arch_freeing_init()
53 vfree(mod->arch.syminfo); in module_arch_freeing_init()
54 mod->arch.syminfo = NULL; in module_arch_freeing_init()
61 info = me->arch.syminfo + ELF_R_SYM (rela->r_info); in check_rela()
62 switch (ELF_R_TYPE (rela->r_info)) { in check_rela()
63 case R_390_GOT12: /* 12 bit GOT offset. */ in check_rela()
64 case R_390_GOT16: /* 16 bit GOT offset. */ in check_rela()
65 case R_390_GOT20: /* 20 bit GOT offset. */ in check_rela()
66 case R_390_GOT32: /* 32 bit GOT offset. */ in check_rela()
67 case R_390_GOT64: /* 64 bit GOT offset. */ in check_rela()
68 case R_390_GOTENT: /* 32 bit PC rel. to GOT entry shifted by 1. */ in check_rela()
69 case R_390_GOTPLT12: /* 12 bit offset to jump slot. */ in check_rela()
70 case R_390_GOTPLT16: /* 16 bit offset to jump slot. */ in check_rela()
71 case R_390_GOTPLT20: /* 20 bit offset to jump slot. */ in check_rela()
72 case R_390_GOTPLT32: /* 32 bit offset to jump slot. */ in check_rela()
73 case R_390_GOTPLT64: /* 64 bit offset to jump slot. */ in check_rela()
74 case R_390_GOTPLTENT: /* 32 bit rel. offset to jump slot >> 1. */ in check_rela()
75 if (info->got_offset == -1UL) { in check_rela()
76 info->got_offset = me->arch.got_size; in check_rela()
77 me->arch.got_size += sizeof(void*); in check_rela()
80 case R_390_PLT16DBL: /* 16 bit PC rel. PLT shifted by 1. */ in check_rela()
81 case R_390_PLT32DBL: /* 32 bit PC rel. PLT shifted by 1. */ in check_rela()
82 case R_390_PLT32: /* 32 bit PC relative PLT address. */ in check_rela()
83 case R_390_PLT64: /* 64 bit PC relative PLT address. */ in check_rela()
84 case R_390_PLTOFF16: /* 16 bit offset from GOT to PLT. */ in check_rela()
85 case R_390_PLTOFF32: /* 32 bit offset from GOT to PLT. */ in check_rela()
86 case R_390_PLTOFF64: /* 16 bit offset from GOT to PLT. */ in check_rela()
87 if (info->plt_offset == -1UL) { in check_rela()
88 info->plt_offset = me->arch.plt_size; in check_rela()
89 me->arch.plt_size += PLT_ENTRY_SIZE; in check_rela()
97 modules linked with -shared. */ in check_rela()
118 for (i = 0; i < hdr->e_shnum; i++) in module_frob_arch_sections()
125 printk(KERN_ERR "module %s: no symbol table\n", me->name); in module_frob_arch_sections()
126 return -ENOEXEC; in module_frob_arch_sections()
130 me->arch.nsyms = symtab->sh_size / sizeof(Elf_Sym); in module_frob_arch_sections()
131 me->arch.syminfo = vmalloc(array_size(sizeof(struct mod_arch_syminfo), in module_frob_arch_sections()
132 me->arch.nsyms)); in module_frob_arch_sections()
133 if (!me->arch.syminfo) in module_frob_arch_sections()
134 return -ENOMEM; in module_frob_arch_sections()
135 symbols = (void *) hdr + symtab->sh_offset; in module_frob_arch_sections()
136 strings = (void *) hdr + sechdrs[symtab->sh_link].sh_offset; in module_frob_arch_sections()
137 for (i = 0; i < me->arch.nsyms; i++) { in module_frob_arch_sections()
143 me->arch.syminfo[i].got_offset = -1UL; in module_frob_arch_sections()
144 me->arch.syminfo[i].plt_offset = -1UL; in module_frob_arch_sections()
145 me->arch.syminfo[i].got_initialized = 0; in module_frob_arch_sections()
146 me->arch.syminfo[i].plt_initialized = 0; in module_frob_arch_sections()
150 me->arch.got_size = me->arch.plt_size = 0; in module_frob_arch_sections()
151 for (i = 0; i < hdr->e_shnum; i++) { in module_frob_arch_sections()
162 mod_mem = &me->mem[MOD_TEXT]; in module_frob_arch_sections()
163 mod_mem->size = ALIGN(mod_mem->size, 4); in module_frob_arch_sections()
164 me->arch.got_offset = mod_mem->size; in module_frob_arch_sections()
165 mod_mem->size += me->arch.got_size; in module_frob_arch_sections()
166 me->arch.plt_offset = mod_mem->size; in module_frob_arch_sections()
167 if (me->arch.plt_size) { in module_frob_arch_sections()
169 me->arch.plt_size += PLT_ENTRY_SIZE; in module_frob_arch_sections()
170 mod_mem->size += me->arch.plt_size; in module_frob_arch_sections()
183 if (val & ((1UL << shift) - 1)) in apply_rela_bits()
184 return -ENOEXEC; in apply_rela_bits()
187 min = -(1L << (bits - 1)); in apply_rela_bits()
188 max = (1L << (bits - 1)) - 1; in apply_rela_bits()
190 return -ENOEXEC; in apply_rela_bits()
193 umax = ((1UL << (bits - 1)) << 1) - 1; in apply_rela_bits()
195 return -ENOEXEC; in apply_rela_bits()
212 } else if (bits == 32) { in apply_rela_bits()
229 int rc = -ENOEXEC; in apply_rela()
232 loc = base + rela->r_offset; in apply_rela()
235 r_sym = ELF_R_SYM(rela->r_info); in apply_rela()
236 r_type = ELF_R_TYPE(rela->r_info); in apply_rela()
237 info = me->arch.syminfo + r_sym; in apply_rela()
244 case R_390_8: /* Direct 8 bit. */ in apply_rela()
245 case R_390_12: /* Direct 12 bit. */ in apply_rela()
246 case R_390_16: /* Direct 16 bit. */ in apply_rela()
247 case R_390_20: /* Direct 20 bit. */ in apply_rela()
248 case R_390_32: /* Direct 32 bit. */ in apply_rela()
249 case R_390_64: /* Direct 64 bit. */ in apply_rela()
250 val += rela->r_addend; in apply_rela()
260 rc = apply_rela_bits(loc, val, 0, 32, 0, write); in apply_rela()
264 case R_390_PC16: /* PC relative 16 bit. */ in apply_rela()
265 case R_390_PC16DBL: /* PC relative 16 bit shifted by 1. */ in apply_rela()
266 case R_390_PC32DBL: /* PC relative 32 bit shifted by 1. */ in apply_rela()
267 case R_390_PC32: /* PC relative 32 bit. */ in apply_rela()
268 case R_390_PC64: /* PC relative 64 bit. */ in apply_rela()
269 val += rela->r_addend - loc; in apply_rela()
275 rc = apply_rela_bits(loc, val, 1, 32, 1, write); in apply_rela()
277 rc = apply_rela_bits(loc, val, 1, 32, 0, write); in apply_rela()
281 case R_390_GOT12: /* 12 bit GOT offset. */ in apply_rela()
282 case R_390_GOT16: /* 16 bit GOT offset. */ in apply_rela()
283 case R_390_GOT20: /* 20 bit GOT offset. */ in apply_rela()
284 case R_390_GOT32: /* 32 bit GOT offset. */ in apply_rela()
285 case R_390_GOT64: /* 64 bit GOT offset. */ in apply_rela()
286 case R_390_GOTENT: /* 32 bit PC rel. to GOT entry shifted by 1. */ in apply_rela()
287 case R_390_GOTPLT12: /* 12 bit offset to jump slot. */ in apply_rela()
288 case R_390_GOTPLT20: /* 20 bit offset to jump slot. */ in apply_rela()
289 case R_390_GOTPLT16: /* 16 bit offset to jump slot. */ in apply_rela()
290 case R_390_GOTPLT32: /* 32 bit offset to jump slot. */ in apply_rela()
291 case R_390_GOTPLT64: /* 64 bit offset to jump slot. */ in apply_rela()
292 case R_390_GOTPLTENT: /* 32 bit rel. offset to jump slot >> 1. */ in apply_rela()
293 if (info->got_initialized == 0) { in apply_rela()
294 Elf_Addr *gotent = me->mem[MOD_TEXT].base + in apply_rela()
295 me->arch.got_offset + in apply_rela()
296 info->got_offset; in apply_rela()
299 info->got_initialized = 1; in apply_rela()
301 val = info->got_offset + rela->r_addend; in apply_rela()
313 rc = apply_rela_bits(loc, val, 0, 32, 0, write); in apply_rela()
319 val += (Elf_Addr)me->mem[MOD_TEXT].base + in apply_rela()
320 me->arch.got_offset - loc; in apply_rela()
321 rc = apply_rela_bits(loc, val, 1, 32, 1, write); in apply_rela()
324 case R_390_PLT16DBL: /* 16 bit PC rel. PLT shifted by 1. */ in apply_rela()
325 case R_390_PLT32DBL: /* 32 bit PC rel. PLT shifted by 1. */ in apply_rela()
326 case R_390_PLT32: /* 32 bit PC relative PLT address. */ in apply_rela()
327 case R_390_PLT64: /* 64 bit PC relative PLT address. */ in apply_rela()
328 case R_390_PLTOFF16: /* 16 bit offset from GOT to PLT. */ in apply_rela()
329 case R_390_PLTOFF32: /* 32 bit offset from GOT to PLT. */ in apply_rela()
330 case R_390_PLTOFF64: /* 16 bit offset from GOT to PLT. */ in apply_rela()
331 if (info->plt_initialized == 0) { in apply_rela()
336 plt_base = me->mem[MOD_TEXT].base + me->arch.plt_offset; in apply_rela()
337 ip = plt_base + info->plt_offset; in apply_rela()
343 jump_r1 = plt_base + me->arch.plt_size - in apply_rela()
347 *(int *)&insn[10] = (jump_r1 - (ip + 8)) / 2; in apply_rela()
354 info->plt_initialized = 1; in apply_rela()
359 val = me->arch.plt_offset - me->arch.got_offset + in apply_rela()
360 info->plt_offset + rela->r_addend; in apply_rela()
363 val - loc + 0xffffUL < 0x1ffffeUL) || in apply_rela()
365 val - loc + 0xffffffffULL < 0x1fffffffeULL))) in apply_rela()
366 val = (Elf_Addr) me->mem[MOD_TEXT].base + in apply_rela()
367 me->arch.plt_offset + in apply_rela()
368 info->plt_offset; in apply_rela()
369 val += rela->r_addend - loc; in apply_rela()
376 rc = apply_rela_bits(loc, val, 1, 32, 1, write); in apply_rela()
379 rc = apply_rela_bits(loc, val, 0, 32, 0, write); in apply_rela()
384 case R_390_GOTOFF16: /* 16 bit offset to GOT. */ in apply_rela()
385 case R_390_GOTOFF32: /* 32 bit offset to GOT. */ in apply_rela()
386 case R_390_GOTOFF64: /* 64 bit offset to GOT. */ in apply_rela()
387 val = val + rela->r_addend - in apply_rela()
388 ((Elf_Addr) me->mem[MOD_TEXT].base + me->arch.got_offset); in apply_rela()
392 rc = apply_rela_bits(loc, val, 0, 32, 0, write); in apply_rela()
396 case R_390_GOTPC: /* 32 bit PC relative offset to GOT. */ in apply_rela()
397 case R_390_GOTPCDBL: /* 32 bit PC rel. off. to GOT shifted by 1. */ in apply_rela()
398 val = (Elf_Addr) me->mem[MOD_TEXT].base + me->arch.got_offset + in apply_rela()
399 rela->r_addend - loc; in apply_rela()
401 rc = apply_rela_bits(loc, val, 1, 32, 0, write); in apply_rela()
403 rc = apply_rela_bits(loc, val, 1, 32, 1, write); in apply_rela()
410 modules linked with -shared. */ in apply_rela()
411 return -ENOEXEC; in apply_rela()
414 me->name, r_type); in apply_rela()
415 return -ENOEXEC; in apply_rela()
420 me->name, strtab + symtab[r_sym].st_name, in apply_rela()
457 bool early = me->state == MODULE_STATE_UNFORMED; in apply_relocate_add()
475 size = FTRACE_HOTPATCH_TRAMPOLINES_SIZE(s->sh_size); in module_alloc_ftrace_hotpatch_trampolines()
479 return -ENOMEM; in module_alloc_ftrace_hotpatch_trampolines()
483 me->arch.trampolines_start = (struct ftrace_hotpatch_trampoline *)start; in module_alloc_ftrace_hotpatch_trampolines()
484 me->arch.trampolines_end = (struct ftrace_hotpatch_trampoline *)end; in module_alloc_ftrace_hotpatch_trampolines()
485 me->arch.next_trampoline = me->arch.trampolines_start; in module_alloc_ftrace_hotpatch_trampolines()
503 !nospec_disable && me->arch.plt_size) { in module_finalize()
506 ij = me->mem[MOD_TEXT].base + me->arch.plt_offset + in module_finalize()
507 me->arch.plt_size - PLT_ENTRY_SIZE; in module_finalize()
513 secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; in module_finalize()
514 for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) { in module_finalize()
515 aseg = (void *) s->sh_addr; in module_finalize()
516 secname = secstrings + s->sh_name; in module_finalize()
520 apply_alternatives(aseg, aseg + s->sh_size); in module_finalize()
524 nospec_revert(aseg, aseg + s->sh_size); in module_finalize()
528 nospec_revert(aseg, aseg + s->sh_size); in module_finalize()