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.c (1431B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include "symbol/kallsyms.h"
      3#include "api/io.h"
      4#include <stdio.h>
      5#include <sys/stat.h>
      6#include <fcntl.h>
      7
      8u8 kallsyms2elf_type(char type)
      9{
     10	type = tolower(type);
     11	return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT;
     12}
     13
     14bool kallsyms__is_function(char symbol_type)
     15{
     16	symbol_type = toupper(symbol_type);
     17	return symbol_type == 'T' || symbol_type == 'W';
     18}
     19
     20static void read_to_eol(struct io *io)
     21{
     22	int ch;
     23
     24	for (;;) {
     25		ch = io__get_char(io);
     26		if (ch < 0 || ch == '\n')
     27			return;
     28	}
     29}
     30
     31int kallsyms__parse(const char *filename, void *arg,
     32		    int (*process_symbol)(void *arg, const char *name,
     33					  char type, u64 start))
     34{
     35	struct io io;
     36	char bf[BUFSIZ];
     37	int err;
     38
     39	io.fd = open(filename, O_RDONLY, 0);
     40
     41	if (io.fd < 0)
     42		return -1;
     43
     44	io__init(&io, io.fd, bf, sizeof(bf));
     45
     46	err = 0;
     47	while (!io.eof) {
     48		__u64 start;
     49		int ch;
     50		size_t i;
     51		char symbol_type;
     52		char symbol_name[KSYM_NAME_LEN + 1];
     53
     54		if (io__get_hex(&io, &start) != ' ') {
     55			read_to_eol(&io);
     56			continue;
     57		}
     58		symbol_type = io__get_char(&io);
     59		if (io__get_char(&io) != ' ') {
     60			read_to_eol(&io);
     61			continue;
     62		}
     63		for (i = 0; i < sizeof(symbol_name); i++) {
     64			ch = io__get_char(&io);
     65			if (ch < 0 || ch == '\n')
     66				break;
     67			symbol_name[i]  = ch;
     68		}
     69		symbol_name[i]  = '\0';
     70
     71		err = process_symbol(arg, symbol_name, symbol_type, start);
     72		if (err)
     73			break;
     74	}
     75
     76	close(io.fd);
     77	return err;
     78}