Linux Audio

Check our new training course

Loading...
v5.9
 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}
v4.17
 1// SPDX-License-Identifier: GPL-2.0
 2#include <ctype.h>
 3#include "symbol/kallsyms.h"
 
 4#include <stdio.h>
 5#include <stdlib.h>
 
 6
 7u8 kallsyms2elf_type(char type)
 8{
 9	type = tolower(type);
10	return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT;
11}
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13int kallsyms__parse(const char *filename, void *arg,
14		    int (*process_symbol)(void *arg, const char *name,
15					  char type, u64 start))
16{
17	char *line = NULL;
18	size_t n;
19	int err = -1;
20	FILE *file = fopen(filename, "r");
 
21
22	if (file == NULL)
23		goto out_failure;
 
 
24
25	err = 0;
26
27	while (!feof(file)) {
28		u64 start;
29		int line_len, len;
30		char symbol_type;
31		char *symbol_name;
32
33		line_len = getline(&line, &n, file);
34		if (line_len < 0 || !line)
35			break;
36
37		line[--line_len] = '\0'; /* \n */
38
39		len = hex2u64(line, &start);
40
41		/* Skip the line if we failed to parse the address. */
42		if (!len)
43			continue;
44
45		len++;
46		if (len + 2 >= line_len)
 
47			continue;
48
49		symbol_type = line[len];
50		len += 2;
51		symbol_name = line + len;
52		len = line_len - len;
53
54		if (len >= KSYM_NAME_LEN) {
55			err = -1;
56			break;
57		}
 
 
 
 
 
 
 
58
59		err = process_symbol(arg, symbol_name, symbol_type, start);
60		if (err)
61			break;
62	}
63
64	free(line);
65	fclose(file);
66	return err;
67
68out_failure:
69	return -1;
70}