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

kallsyms.h (4467B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/* Rewritten and vastly simplified by Rusty Russell for in-kernel
      3 * module loader:
      4 *   Copyright 2002 Rusty Russell <rusty@rustcorp.com.au> IBM Corporation
      5 */
      6#ifndef _LINUX_KALLSYMS_H
      7#define _LINUX_KALLSYMS_H
      8
      9#include <linux/errno.h>
     10#include <linux/buildid.h>
     11#include <linux/kernel.h>
     12#include <linux/stddef.h>
     13#include <linux/mm.h>
     14#include <linux/module.h>
     15
     16#include <asm/sections.h>
     17
     18#define KSYM_NAME_LEN 128
     19#define KSYM_SYMBOL_LEN (sizeof("%s+%#lx/%#lx [%s %s]") + \
     20			(KSYM_NAME_LEN - 1) + \
     21			2*(BITS_PER_LONG*3/10) + (MODULE_NAME_LEN - 1) + \
     22			(BUILD_ID_SIZE_MAX * 2) + 1)
     23
     24struct cred;
     25struct module;
     26
     27static inline int is_kernel_text(unsigned long addr)
     28{
     29	if (__is_kernel_text(addr))
     30		return 1;
     31	return in_gate_area_no_mm(addr);
     32}
     33
     34static inline int is_kernel(unsigned long addr)
     35{
     36	if (__is_kernel(addr))
     37		return 1;
     38	return in_gate_area_no_mm(addr);
     39}
     40
     41static inline int is_ksym_addr(unsigned long addr)
     42{
     43	if (IS_ENABLED(CONFIG_KALLSYMS_ALL))
     44		return is_kernel(addr);
     45
     46	return is_kernel_text(addr) || is_kernel_inittext(addr);
     47}
     48
     49static inline void *dereference_symbol_descriptor(void *ptr)
     50{
     51#ifdef CONFIG_HAVE_FUNCTION_DESCRIPTORS
     52	struct module *mod;
     53
     54	ptr = dereference_kernel_function_descriptor(ptr);
     55	if (is_ksym_addr((unsigned long)ptr))
     56		return ptr;
     57
     58	preempt_disable();
     59	mod = __module_address((unsigned long)ptr);
     60	preempt_enable();
     61
     62	if (mod)
     63		ptr = dereference_module_function_descriptor(mod, ptr);
     64#endif
     65	return ptr;
     66}
     67
     68#ifdef CONFIG_KALLSYMS
     69int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *,
     70				      unsigned long),
     71			    void *data);
     72
     73/* Lookup the address for a symbol. Returns 0 if not found. */
     74unsigned long kallsyms_lookup_name(const char *name);
     75
     76extern int kallsyms_lookup_size_offset(unsigned long addr,
     77				  unsigned long *symbolsize,
     78				  unsigned long *offset);
     79
     80/* Lookup an address.  modname is set to NULL if it's in the kernel. */
     81const char *kallsyms_lookup(unsigned long addr,
     82			    unsigned long *symbolsize,
     83			    unsigned long *offset,
     84			    char **modname, char *namebuf);
     85
     86/* Look up a kernel symbol and return it in a text buffer. */
     87extern int sprint_symbol(char *buffer, unsigned long address);
     88extern int sprint_symbol_build_id(char *buffer, unsigned long address);
     89extern int sprint_symbol_no_offset(char *buffer, unsigned long address);
     90extern int sprint_backtrace(char *buffer, unsigned long address);
     91extern int sprint_backtrace_build_id(char *buffer, unsigned long address);
     92
     93int lookup_symbol_name(unsigned long addr, char *symname);
     94int lookup_symbol_attrs(unsigned long addr, unsigned long *size, unsigned long *offset, char *modname, char *name);
     95
     96/* How and when do we show kallsyms values? */
     97extern bool kallsyms_show_value(const struct cred *cred);
     98
     99#else /* !CONFIG_KALLSYMS */
    100
    101static inline unsigned long kallsyms_lookup_name(const char *name)
    102{
    103	return 0;
    104}
    105
    106static inline int kallsyms_lookup_size_offset(unsigned long addr,
    107					      unsigned long *symbolsize,
    108					      unsigned long *offset)
    109{
    110	return 0;
    111}
    112
    113static inline const char *kallsyms_lookup(unsigned long addr,
    114					  unsigned long *symbolsize,
    115					  unsigned long *offset,
    116					  char **modname, char *namebuf)
    117{
    118	return NULL;
    119}
    120
    121static inline int sprint_symbol(char *buffer, unsigned long addr)
    122{
    123	*buffer = '\0';
    124	return 0;
    125}
    126
    127static inline int sprint_symbol_build_id(char *buffer, unsigned long address)
    128{
    129	*buffer = '\0';
    130	return 0;
    131}
    132
    133static inline int sprint_symbol_no_offset(char *buffer, unsigned long addr)
    134{
    135	*buffer = '\0';
    136	return 0;
    137}
    138
    139static inline int sprint_backtrace(char *buffer, unsigned long addr)
    140{
    141	*buffer = '\0';
    142	return 0;
    143}
    144
    145static inline int sprint_backtrace_build_id(char *buffer, unsigned long addr)
    146{
    147	*buffer = '\0';
    148	return 0;
    149}
    150
    151static inline int lookup_symbol_name(unsigned long addr, char *symname)
    152{
    153	return -ERANGE;
    154}
    155
    156static inline int lookup_symbol_attrs(unsigned long addr, unsigned long *size, unsigned long *offset, char *modname, char *name)
    157{
    158	return -ERANGE;
    159}
    160
    161static inline bool kallsyms_show_value(const struct cred *cred)
    162{
    163	return false;
    164}
    165
    166static inline int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *,
    167					  unsigned long), void *data)
    168{
    169	return -EOPNOTSUPP;
    170}
    171#endif /*CONFIG_KALLSYMS*/
    172
    173static inline void print_ip_sym(const char *loglvl, unsigned long ip)
    174{
    175	printk("%s[<%px>] %pS\n", loglvl, (void *) ip, (void *) ip);
    176}
    177
    178#endif /*_LINUX_KALLSYMS_H*/