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

restart_table.c (1366B)


      1#include <asm/interrupt.h>
      2#include <asm/kprobes.h>
      3
      4struct soft_mask_table_entry {
      5	unsigned long start;
      6	unsigned long end;
      7};
      8
      9struct restart_table_entry {
     10	unsigned long start;
     11	unsigned long end;
     12	unsigned long fixup;
     13};
     14
     15extern struct soft_mask_table_entry __start___soft_mask_table[];
     16extern struct soft_mask_table_entry __stop___soft_mask_table[];
     17
     18extern struct restart_table_entry __start___restart_table[];
     19extern struct restart_table_entry __stop___restart_table[];
     20
     21/* Given an address, look for it in the soft mask table */
     22bool search_kernel_soft_mask_table(unsigned long addr)
     23{
     24	struct soft_mask_table_entry *smte = __start___soft_mask_table;
     25
     26	while (smte < __stop___soft_mask_table) {
     27		unsigned long start = smte->start;
     28		unsigned long end = smte->end;
     29
     30		if (addr >= start && addr < end)
     31			return true;
     32
     33		smte++;
     34	}
     35	return false;
     36}
     37NOKPROBE_SYMBOL(search_kernel_soft_mask_table);
     38
     39/* Given an address, look for it in the kernel exception table */
     40unsigned long search_kernel_restart_table(unsigned long addr)
     41{
     42	struct restart_table_entry *rte = __start___restart_table;
     43
     44	while (rte < __stop___restart_table) {
     45		unsigned long start = rte->start;
     46		unsigned long end = rte->end;
     47		unsigned long fixup = rte->fixup;
     48
     49		if (addr >= start && addr < end)
     50			return fixup;
     51
     52		rte++;
     53	}
     54	return 0;
     55}
     56NOKPROBE_SYMBOL(search_kernel_restart_table);