cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

module.c (1740B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * OpenRISC module.c
      4 *
      5 * Linux architectural port borrowing liberally from similar works of
      6 * others.  All original copyrights apply as per the original source
      7 * declaration.
      8 *
      9 * Modifications for the OpenRISC architecture:
     10 * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
     11 */
     12
     13#include <linux/moduleloader.h>
     14#include <linux/elf.h>
     15
     16int apply_relocate_add(Elf32_Shdr *sechdrs,
     17		       const char *strtab,
     18		       unsigned int symindex,
     19		       unsigned int relsec,
     20		       struct module *me)
     21{
     22	unsigned int i;
     23	Elf32_Rela *rel = (void *)sechdrs[relsec].sh_addr;
     24	Elf32_Sym *sym;
     25	uint32_t *location;
     26	uint32_t value;
     27
     28	pr_debug("Applying relocate section %u to %u\n", relsec,
     29		 sechdrs[relsec].sh_info);
     30	for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
     31		/* This is where to make the change */
     32		location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
     33			+ rel[i].r_offset;
     34
     35		/* This is the symbol it is referring to.  Note that all
     36		   undefined symbols have been resolved.  */
     37		sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
     38			+ ELF32_R_SYM(rel[i].r_info);
     39		value = sym->st_value + rel[i].r_addend;
     40
     41		switch (ELF32_R_TYPE(rel[i].r_info)) {
     42		case R_OR32_32:
     43			*location = value;
     44			break;
     45		case R_OR32_CONST:
     46			*((uint16_t *)location + 1) = value;
     47			break;
     48		case R_OR32_CONSTH:
     49			*((uint16_t *)location + 1) = value >> 16;
     50			break;
     51		case R_OR32_JUMPTARG:
     52			value -= (uint32_t)location;
     53			value >>= 2;
     54			value &= 0x03ffffff;
     55			value |= *location & 0xfc000000;
     56			*location = value;
     57			break;
     58		default:
     59			pr_err("module %s: Unknown relocation: %u\n",
     60			       me->name, ELF32_R_TYPE(rel[i].r_info));
     61			break;
     62		}
     63	}
     64
     65	return 0;
     66}