tools/power/turbostat: Remove Package C6 Retention on Ice Lake Server
[linux-2.6-microblaze.git] / tools / lib / symbol / kallsyms.c
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
8 u8 kallsyms2elf_type(char type)
9 {
10         type = tolower(type);
11         return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT;
12 }
13
14 bool kallsyms__is_function(char symbol_type)
15 {
16         symbol_type = toupper(symbol_type);
17         return symbol_type == 'T' || symbol_type == 'W';
18 }
19
20 static 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
31 int 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 }