1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * kallsyms.c: in-kernel printing of symbolic oopses and stack traces. 4 * 5 * Rewritten and vastly simplified by Rusty Russell for in-kernel 6 * module loader: 7 * Copyright 2002 Rusty Russell <rusty@rustcorp.com.au> IBM Corporation 8 * 9 * ChangeLog: 10 * 11 * (25/Aug/2004) Paulo Marques <pmarques@grupopie.com> 12 * Changed the compression method from stem compression to "table lookup" 13 * compression (see scripts/kallsyms.c for a more complete description) 14 */ 15 #include <linux/kallsyms.h> 16 #include <linux/init.h> 17 #include <linux/seq_file.h> 18 #include <linux/fs.h> 19 #include <linux/kdb.h> 20 #include <linux/err.h> 21 #include <linux/proc_fs.h> 22 #include <linux/sched.h> /* for cond_resched */ 23 #include <linux/ctype.h> 24 #include <linux/slab.h> 25 #include <linux/filter.h> 26 #include <linux/ftrace.h> 27 #include <linux/kprobes.h> 28 #include <linux/build_bug.h> 29 #include <linux/compiler.h> 30 #include <linux/module.h> 31 #include <linux/kernel.h> 32 33 /* 34 * These will be re-linked against their real values 35 * during the second link stage. 36 */ 37 extern const unsigned long kallsyms_addresses[] __weak; 38 extern const int kallsyms_offsets[] __weak; 39 extern const u8 kallsyms_names[] __weak; 40 41 /* 42 * Tell the compiler that the count isn't in the small data section if the arch 43 * has one (eg: FRV). 44 */ 45 extern const unsigned int kallsyms_num_syms 46 __section(".rodata") __attribute__((weak)); 47 48 extern const unsigned long kallsyms_relative_base 49 __section(".rodata") __attribute__((weak)); 50 51 extern const char kallsyms_token_table[] __weak; 52 extern const u16 kallsyms_token_index[] __weak; 53 54 extern const unsigned int kallsyms_markers[] __weak; 55 56 /* 57 * Expand a compressed symbol data into the resulting uncompressed string, 58 * if uncompressed string is too long (>= maxlen), it will be truncated, 59 * given the offset to where the symbol is in the compressed stream. 60 */ 61 static unsigned int kallsyms_expand_symbol(unsigned int off, 62 char *result, size_t maxlen) 63 { 64 int len, skipped_first = 0; 65 const char *tptr; 66 const u8 *data; 67 68 /* Get the compressed symbol length from the first symbol byte. */ 69 data = &kallsyms_names[off]; 70 len = *data; 71 data++; 72 73 /* 74 * Update the offset to return the offset for the next symbol on 75 * the compressed stream. 76 */ 77 off += len + 1; 78 79 /* 80 * For every byte on the compressed symbol data, copy the table 81 * entry for that byte. 82 */ 83 while (len) { 84 tptr = &kallsyms_token_table[kallsyms_token_index[*data]]; 85 data++; 86 len--; 87 88 while (*tptr) { 89 if (skipped_first) { 90 if (maxlen <= 1) 91 goto tail; 92 *result = *tptr; 93 result++; 94 maxlen--; 95 } else 96 skipped_first = 1; 97 tptr++; 98 } 99 } 100 101 tail: 102 if (maxlen) 103 *result = '\0'; 104 105 /* Return to offset to the next symbol. */ 106 return off; 107 } 108 109 /* 110 * Get symbol type information. This is encoded as a single char at the 111 * beginning of the symbol name. 112 */ 113 static char kallsyms_get_symbol_type(unsigned int off) 114 { 115 /* 116 * Get just the first code, look it up in the token table, 117 * and return the first char from this token. 118 */ 119 return kallsyms_token_table[kallsyms_token_index[kallsyms_names[off + 1]]]; 120 } 121 122 123 /* 124 * Find the offset on the compressed stream given and index in the 125 * kallsyms array. 126 */ 127 static unsigned int get_symbol_offset(unsigned long pos) 128 { 129 const u8 *name; 130 int i; 131 132 /* 133 * Use the closest marker we have. We have markers every 256 positions, 134 * so that should be close enough. 135 */ 136 name = &kallsyms_names[kallsyms_markers[pos >> 8]]; 137 138 /* 139 * Sequentially scan all the symbols up to the point we're searching 140 * for. Every symbol is stored in a [<len>][<len> bytes of data] format, 141 * so we just need to add the len to the current pointer for every 142 * symbol we wish to skip. 143 */ 144 for (i = 0; i < (pos & 0xFF); i++) 145 name = name + (*name) + 1; 146 147 return name - kallsyms_names; 148 } 149 150 static unsigned long kallsyms_sym_address(int idx) 151 { 152 if (!IS_ENABLED(CONFIG_KALLSYMS_BASE_RELATIVE)) 153 return kallsyms_addresses[idx]; 154 155 /* values are unsigned offsets if --absolute-percpu is not in effect */ 156 if (!IS_ENABLED(CONFIG_KALLSYMS_ABSOLUTE_PERCPU)) 157 return kallsyms_relative_base + (u32)kallsyms_offsets[idx]; 158 159 /* ...otherwise, positive offsets are absolute values */ 160 if (kallsyms_offsets[idx] >= 0) 161 return kallsyms_offsets[idx]; 162 163 /* ...and negative offsets are relative to kallsyms_relative_base - 1 */ 164 return kallsyms_relative_base - 1 - kallsyms_offsets[idx]; 165 } 166 167 static bool cleanup_symbol_name(char *s) 168 { 169 char *res; 170 171 if (!IS_ENABLED(CONFIG_LTO_CLANG)) 172 return false; 173 174 /* 175 * LLVM appends various suffixes for local functions and variables that 176 * must be promoted to global scope as part of LTO. This can break 177 * hooking of static functions with kprobes. '.' is not a valid 178 * character in an identifier in C. Suffixes observed: 179 * - foo.llvm.[0-9a-f]+ 180 * - foo.[0-9a-f]+ 181 * - foo.[0-9a-f]+.cfi_jt 182 */ 183 res = strchr(s, '.'); 184 if (res) { 185 *res = '\0'; 186 return true; 187 } 188 189 if (!IS_ENABLED(CONFIG_CFI_CLANG) || 190 !IS_ENABLED(CONFIG_LTO_CLANG_THIN) || 191 CONFIG_CLANG_VERSION >= 130000) 192 return false; 193 194 /* 195 * Prior to LLVM 13, the following suffixes were observed when thinLTO 196 * and CFI are both enabled: 197 * - foo$[0-9]+ 198 */ 199 res = strrchr(s, '$'); 200 if (res) { 201 *res = '\0'; 202 return true; 203 } 204 205 return false; 206 } 207 208 /* Lookup the address for this symbol. Returns 0 if not found. */ 209 unsigned long kallsyms_lookup_name(const char *name) 210 { 211 char namebuf[KSYM_NAME_LEN]; 212 unsigned long i; 213 unsigned int off; 214 215 for (i = 0, off = 0; i < kallsyms_num_syms; i++) { 216 off = kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf)); 217 218 if (strcmp(namebuf, name) == 0) 219 return kallsyms_sym_address(i); 220 221 if (cleanup_symbol_name(namebuf) && strcmp(namebuf, name) == 0) 222 return kallsyms_sym_address(i); 223 } 224 return module_kallsyms_lookup_name(name); 225 } 226 227 #ifdef CONFIG_LIVEPATCH 228 /* 229 * Iterate over all symbols in vmlinux. For symbols from modules use 230 * module_kallsyms_on_each_symbol instead. 231 */ 232 int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *, 233 unsigned long), 234 void *data) 235 { 236 char namebuf[KSYM_NAME_LEN]; 237 unsigned long i; 238 unsigned int off; 239 int ret; 240 241 for (i = 0, off = 0; i < kallsyms_num_syms; i++) { 242 off = kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf)); 243 ret = fn(data, namebuf, NULL, kallsyms_sym_address(i)); 244 if (ret != 0) 245 return ret; 246 cond_resched(); 247 } 248 return 0; 249 } 250 #endif /* CONFIG_LIVEPATCH */ 251 252 static unsigned long get_symbol_pos(unsigned long addr, 253 unsigned long *symbolsize, 254 unsigned long *offset) 255 { 256 unsigned long symbol_start = 0, symbol_end = 0; 257 unsigned long i, low, high, mid; 258 259 /* This kernel should never had been booted. */ 260 if (!IS_ENABLED(CONFIG_KALLSYMS_BASE_RELATIVE)) 261 BUG_ON(!kallsyms_addresses); 262 else 263 BUG_ON(!kallsyms_offsets); 264 265 /* Do a binary search on the sorted kallsyms_addresses array. */ 266 low = 0; 267 high = kallsyms_num_syms; 268 269 while (high - low > 1) { 270 mid = low + (high - low) / 2; 271 if (kallsyms_sym_address(mid) <= addr) 272 low = mid; 273 else 274 high = mid; 275 } 276 277 /* 278 * Search for the first aliased symbol. Aliased 279 * symbols are symbols with the same address. 280 */ 281 while (low && kallsyms_sym_address(low-1) == kallsyms_sym_address(low)) 282 --low; 283 284 symbol_start = kallsyms_sym_address(low); 285 286 /* Search for next non-aliased symbol. */ 287 for (i = low + 1; i < kallsyms_num_syms; i++) { 288 if (kallsyms_sym_address(i) > symbol_start) { 289 symbol_end = kallsyms_sym_address(i); 290 break; 291 } 292 } 293 294 /* If we found no next symbol, we use the end of the section. */ 295 if (!symbol_end) { 296 if (is_kernel_inittext(addr)) 297 symbol_end = (unsigned long)_einittext; 298 else if (IS_ENABLED(CONFIG_KALLSYMS_ALL)) 299 symbol_end = (unsigned long)_end; 300 else 301 symbol_end = (unsigned long)_etext; 302 } 303 304 if (symbolsize) 305 *symbolsize = symbol_end - symbol_start; 306 if (offset) 307 *offset = addr - symbol_start; 308 309 return low; 310 } 311 312 /* 313 * Lookup an address but don't bother to find any names. 314 */ 315 int kallsyms_lookup_size_offset(unsigned long addr, unsigned long *symbolsize, 316 unsigned long *offset) 317 { 318 char namebuf[KSYM_NAME_LEN]; 319 320 if (is_ksym_addr(addr)) { 321 get_symbol_pos(addr, symbolsize, offset); 322 return 1; 323 } 324 return !!module_address_lookup(addr, symbolsize, offset, NULL, NULL, namebuf) || 325 !!__bpf_address_lookup(addr, symbolsize, offset, namebuf); 326 } 327 328 static const char *kallsyms_lookup_buildid(unsigned long addr, 329 unsigned long *symbolsize, 330 unsigned long *offset, char **modname, 331 const unsigned char **modbuildid, char *namebuf) 332 { 333 const char *ret; 334 335 namebuf[KSYM_NAME_LEN - 1] = 0; 336 namebuf[0] = 0; 337 338 if (is_ksym_addr(addr)) { 339 unsigned long pos; 340 341 pos = get_symbol_pos(addr, symbolsize, offset); 342 /* Grab name */ 343 kallsyms_expand_symbol(get_symbol_offset(pos), 344 namebuf, KSYM_NAME_LEN); 345 if (modname) 346 *modname = NULL; 347 if (modbuildid) 348 *modbuildid = NULL; 349 350 ret = namebuf; 351 goto found; 352 } 353 354 /* See if it's in a module or a BPF JITed image. */ 355 ret = module_address_lookup(addr, symbolsize, offset, 356 modname, modbuildid, namebuf); 357 if (!ret) 358 ret = bpf_address_lookup(addr, symbolsize, 359 offset, modname, namebuf); 360 361 if (!ret) 362 ret = ftrace_mod_address_lookup(addr, symbolsize, 363 offset, modname, namebuf); 364 365 found: 366 cleanup_symbol_name(namebuf); 367 return ret; 368 } 369 370 /* 371 * Lookup an address 372 * - modname is set to NULL if it's in the kernel. 373 * - We guarantee that the returned name is valid until we reschedule even if. 374 * It resides in a module. 375 * - We also guarantee that modname will be valid until rescheduled. 376 */ 377 const char *kallsyms_lookup(unsigned long addr, 378 unsigned long *symbolsize, 379 unsigned long *offset, 380 char **modname, char *namebuf) 381 { 382 return kallsyms_lookup_buildid(addr, symbolsize, offset, modname, 383 NULL, namebuf); 384 } 385 386 int lookup_symbol_name(unsigned long addr, char *symname) 387 { 388 int res; 389 390 symname[0] = '\0'; 391 symname[KSYM_NAME_LEN - 1] = '\0'; 392 393 if (is_ksym_addr(addr)) { 394 unsigned long pos; 395 396 pos = get_symbol_pos(addr, NULL, NULL); 397 /* Grab name */ 398 kallsyms_expand_symbol(get_symbol_offset(pos), 399 symname, KSYM_NAME_LEN); 400 goto found; 401 } 402 /* See if it's in a module. */ 403 res = lookup_module_symbol_name(addr, symname); 404 if (res) 405 return res; 406 407 found: 408 cleanup_symbol_name(symname); 409 return 0; 410 } 411 412 int lookup_symbol_attrs(unsigned long addr, unsigned long *size, 413 unsigned long *offset, char *modname, char *name) 414 { 415 int res; 416 417 name[0] = '\0'; 418 name[KSYM_NAME_LEN - 1] = '\0'; 419 420 if (is_ksym_addr(addr)) { 421 unsigned long pos; 422 423 pos = get_symbol_pos(addr, size, offset); 424 /* Grab name */ 425 kallsyms_expand_symbol(get_symbol_offset(pos), 426 name, KSYM_NAME_LEN); 427 modname[0] = '\0'; 428 goto found; 429 } 430 /* See if it's in a module. */ 431 res = lookup_module_symbol_attrs(addr, size, offset, modname, name); 432 if (res) 433 return res; 434 435 found: 436 cleanup_symbol_name(name); 437 return 0; 438 } 439 440 /* Look up a kernel symbol and return it in a text buffer. */ 441 static int __sprint_symbol(char *buffer, unsigned long address, 442 int symbol_offset, int add_offset, int add_buildid) 443 { 444 char *modname; 445 const unsigned char *buildid; 446 const char *name; 447 unsigned long offset, size; 448 int len; 449 450 address += symbol_offset; 451 name = kallsyms_lookup_buildid(address, &size, &offset, &modname, &buildid, 452 buffer); 453 if (!name) 454 return sprintf(buffer, "0x%lx", address - symbol_offset); 455 456 if (name != buffer) 457 strcpy(buffer, name); 458 len = strlen(buffer); 459 offset -= symbol_offset; 460 461 if (add_offset) 462 len += sprintf(buffer + len, "+%#lx/%#lx", offset, size); 463 464 if (modname) { 465 len += sprintf(buffer + len, " [%s", modname); 466 #if IS_ENABLED(CONFIG_STACKTRACE_BUILD_ID) 467 if (add_buildid && buildid) { 468 /* build ID should match length of sprintf */ 469 #if IS_ENABLED(CONFIG_MODULES) 470 static_assert(sizeof(typeof_member(struct module, build_id)) == 20); 471 #endif 472 len += sprintf(buffer + len, " %20phN", buildid); 473 } 474 #endif 475 len += sprintf(buffer + len, "]"); 476 } 477 478 return len; 479 } 480 481 /** 482 * sprint_symbol - Look up a kernel symbol and return it in a text buffer 483 * @buffer: buffer to be stored 484 * @address: address to lookup 485 * 486 * This function looks up a kernel symbol with @address and stores its name, 487 * offset, size and module name to @buffer if possible. If no symbol was found, 488 * just saves its @address as is. 489 * 490 * This function returns the number of bytes stored in @buffer. 491 */ 492 int sprint_symbol(char *buffer, unsigned long address) 493 { 494 return __sprint_symbol(buffer, address, 0, 1, 0); 495 } 496 EXPORT_SYMBOL_GPL(sprint_symbol); 497 498 /** 499 * sprint_symbol_build_id - Look up a kernel symbol and return it in a text buffer 500 * @buffer: buffer to be stored 501 * @address: address to lookup 502 * 503 * This function looks up a kernel symbol with @address and stores its name, 504 * offset, size, module name and module build ID to @buffer if possible. If no 505 * symbol was found, just saves its @address as is. 506 * 507 * This function returns the number of bytes stored in @buffer. 508 */ 509 int sprint_symbol_build_id(char *buffer, unsigned long address) 510 { 511 return __sprint_symbol(buffer, address, 0, 1, 1); 512 } 513 EXPORT_SYMBOL_GPL(sprint_symbol_build_id); 514 515 /** 516 * sprint_symbol_no_offset - Look up a kernel symbol and return it in a text buffer 517 * @buffer: buffer to be stored 518 * @address: address to lookup 519 * 520 * This function looks up a kernel symbol with @address and stores its name 521 * and module name to @buffer if possible. If no symbol was found, just saves 522 * its @address as is. 523 * 524 * This function returns the number of bytes stored in @buffer. 525 */ 526 int sprint_symbol_no_offset(char *buffer, unsigned long address) 527 { 528 return __sprint_symbol(buffer, address, 0, 0, 0); 529 } 530 EXPORT_SYMBOL_GPL(sprint_symbol_no_offset); 531 532 /** 533 * sprint_backtrace - Look up a backtrace symbol and return it in a text buffer 534 * @buffer: buffer to be stored 535 * @address: address to lookup 536 * 537 * This function is for stack backtrace and does the same thing as 538 * sprint_symbol() but with modified/decreased @address. If there is a 539 * tail-call to the function marked "noreturn", gcc optimized out code after 540 * the call so that the stack-saved return address could point outside of the 541 * caller. This function ensures that kallsyms will find the original caller 542 * by decreasing @address. 543 * 544 * This function returns the number of bytes stored in @buffer. 545 */ 546 int sprint_backtrace(char *buffer, unsigned long address) 547 { 548 return __sprint_symbol(buffer, address, -1, 1, 0); 549 } 550 551 /** 552 * sprint_backtrace_build_id - Look up a backtrace symbol and return it in a text buffer 553 * @buffer: buffer to be stored 554 * @address: address to lookup 555 * 556 * This function is for stack backtrace and does the same thing as 557 * sprint_symbol() but with modified/decreased @address. If there is a 558 * tail-call to the function marked "noreturn", gcc optimized out code after 559 * the call so that the stack-saved return address could point outside of the 560 * caller. This function ensures that kallsyms will find the original caller 561 * by decreasing @address. This function also appends the module build ID to 562 * the @buffer if @address is within a kernel module. 563 * 564 * This function returns the number of bytes stored in @buffer. 565 */ 566 int sprint_backtrace_build_id(char *buffer, unsigned long address) 567 { 568 return __sprint_symbol(buffer, address, -1, 1, 1); 569 } 570 571 /* To avoid using get_symbol_offset for every symbol, we carry prefix along. */ 572 struct kallsym_iter { 573 loff_t pos; 574 loff_t pos_arch_end; 575 loff_t pos_mod_end; 576 loff_t pos_ftrace_mod_end; 577 loff_t pos_bpf_end; 578 unsigned long value; 579 unsigned int nameoff; /* If iterating in core kernel symbols. */ 580 char type; 581 char name[KSYM_NAME_LEN]; 582 char module_name[MODULE_NAME_LEN]; 583 int exported; 584 int show_value; 585 }; 586 587 int __weak arch_get_kallsym(unsigned int symnum, unsigned long *value, 588 char *type, char *name) 589 { 590 return -EINVAL; 591 } 592 593 static int get_ksymbol_arch(struct kallsym_iter *iter) 594 { 595 int ret = arch_get_kallsym(iter->pos - kallsyms_num_syms, 596 &iter->value, &iter->type, 597 iter->name); 598 599 if (ret < 0) { 600 iter->pos_arch_end = iter->pos; 601 return 0; 602 } 603 604 return 1; 605 } 606 607 static int get_ksymbol_mod(struct kallsym_iter *iter) 608 { 609 int ret = module_get_kallsym(iter->pos - iter->pos_arch_end, 610 &iter->value, &iter->type, 611 iter->name, iter->module_name, 612 &iter->exported); 613 if (ret < 0) { 614 iter->pos_mod_end = iter->pos; 615 return 0; 616 } 617 618 return 1; 619 } 620 621 /* 622 * ftrace_mod_get_kallsym() may also get symbols for pages allocated for ftrace 623 * purposes. In that case "__builtin__ftrace" is used as a module name, even 624 * though "__builtin__ftrace" is not a module. 625 */ 626 static int get_ksymbol_ftrace_mod(struct kallsym_iter *iter) 627 { 628 int ret = ftrace_mod_get_kallsym(iter->pos - iter->pos_mod_end, 629 &iter->value, &iter->type, 630 iter->name, iter->module_name, 631 &iter->exported); 632 if (ret < 0) { 633 iter->pos_ftrace_mod_end = iter->pos; 634 return 0; 635 } 636 637 return 1; 638 } 639 640 static int get_ksymbol_bpf(struct kallsym_iter *iter) 641 { 642 int ret; 643 644 strlcpy(iter->module_name, "bpf", MODULE_NAME_LEN); 645 iter->exported = 0; 646 ret = bpf_get_kallsym(iter->pos - iter->pos_ftrace_mod_end, 647 &iter->value, &iter->type, 648 iter->name); 649 if (ret < 0) { 650 iter->pos_bpf_end = iter->pos; 651 return 0; 652 } 653 654 return 1; 655 } 656 657 /* 658 * This uses "__builtin__kprobes" as a module name for symbols for pages 659 * allocated for kprobes' purposes, even though "__builtin__kprobes" is not a 660 * module. 661 */ 662 static int get_ksymbol_kprobe(struct kallsym_iter *iter) 663 { 664 strlcpy(iter->module_name, "__builtin__kprobes", MODULE_NAME_LEN); 665 iter->exported = 0; 666 return kprobe_get_kallsym(iter->pos - iter->pos_bpf_end, 667 &iter->value, &iter->type, 668 iter->name) < 0 ? 0 : 1; 669 } 670 671 /* Returns space to next name. */ 672 static unsigned long get_ksymbol_core(struct kallsym_iter *iter) 673 { 674 unsigned off = iter->nameoff; 675 676 iter->module_name[0] = '\0'; 677 iter->value = kallsyms_sym_address(iter->pos); 678 679 iter->type = kallsyms_get_symbol_type(off); 680 681 off = kallsyms_expand_symbol(off, iter->name, ARRAY_SIZE(iter->name)); 682 683 return off - iter->nameoff; 684 } 685 686 static void reset_iter(struct kallsym_iter *iter, loff_t new_pos) 687 { 688 iter->name[0] = '\0'; 689 iter->nameoff = get_symbol_offset(new_pos); 690 iter->pos = new_pos; 691 if (new_pos == 0) { 692 iter->pos_arch_end = 0; 693 iter->pos_mod_end = 0; 694 iter->pos_ftrace_mod_end = 0; 695 iter->pos_bpf_end = 0; 696 } 697 } 698 699 /* 700 * The end position (last + 1) of each additional kallsyms section is recorded 701 * in iter->pos_..._end as each section is added, and so can be used to 702 * determine which get_ksymbol_...() function to call next. 703 */ 704 static int update_iter_mod(struct kallsym_iter *iter, loff_t pos) 705 { 706 iter->pos = pos; 707 708 if ((!iter->pos_arch_end || iter->pos_arch_end > pos) && 709 get_ksymbol_arch(iter)) 710 return 1; 711 712 if ((!iter->pos_mod_end || iter->pos_mod_end > pos) && 713 get_ksymbol_mod(iter)) 714 return 1; 715 716 if ((!iter->pos_ftrace_mod_end || iter->pos_ftrace_mod_end > pos) && 717 get_ksymbol_ftrace_mod(iter)) 718 return 1; 719 720 if ((!iter->pos_bpf_end || iter->pos_bpf_end > pos) && 721 get_ksymbol_bpf(iter)) 722 return 1; 723 724 return get_ksymbol_kprobe(iter); 725 } 726 727 /* Returns false if pos at or past end of file. */ 728 static int update_iter(struct kallsym_iter *iter, loff_t pos) 729 { 730 /* Module symbols can be accessed randomly. */ 731 if (pos >= kallsyms_num_syms) 732 return update_iter_mod(iter, pos); 733 734 /* If we're not on the desired position, reset to new position. */ 735 if (pos != iter->pos) 736 reset_iter(iter, pos); 737 738 iter->nameoff += get_ksymbol_core(iter); 739 iter->pos++; 740 741 return 1; 742 } 743 744 static void *s_next(struct seq_file *m, void *p, loff_t *pos) 745 { 746 (*pos)++; 747 748 if (!update_iter(m->private, *pos)) 749 return NULL; 750 return p; 751 } 752 753 static void *s_start(struct seq_file *m, loff_t *pos) 754 { 755 if (!update_iter(m->private, *pos)) 756 return NULL; 757 return m->private; 758 } 759 760 static void s_stop(struct seq_file *m, void *p) 761 { 762 } 763 764 static int s_show(struct seq_file *m, void *p) 765 { 766 void *value; 767 struct kallsym_iter *iter = m->private; 768 769 /* Some debugging symbols have no name. Ignore them. */ 770 if (!iter->name[0]) 771 return 0; 772 773 value = iter->show_value ? (void *)iter->value : NULL; 774 775 if (iter->module_name[0]) { 776 char type; 777 778 /* 779 * Label it "global" if it is exported, 780 * "local" if not exported. 781 */ 782 type = iter->exported ? toupper(iter->type) : 783 tolower(iter->type); 784 seq_printf(m, "%px %c %s\t[%s]\n", value, 785 type, iter->name, iter->module_name); 786 } else 787 seq_printf(m, "%px %c %s\n", value, 788 iter->type, iter->name); 789 return 0; 790 } 791 792 static const struct seq_operations kallsyms_op = { 793 .start = s_start, 794 .next = s_next, 795 .stop = s_stop, 796 .show = s_show 797 }; 798 799 static inline int kallsyms_for_perf(void) 800 { 801 #ifdef CONFIG_PERF_EVENTS 802 extern int sysctl_perf_event_paranoid; 803 if (sysctl_perf_event_paranoid <= 1) 804 return 1; 805 #endif 806 return 0; 807 } 808 809 /* 810 * We show kallsyms information even to normal users if we've enabled 811 * kernel profiling and are explicitly not paranoid (so kptr_restrict 812 * is clear, and sysctl_perf_event_paranoid isn't set). 813 * 814 * Otherwise, require CAP_SYSLOG (assuming kptr_restrict isn't set to 815 * block even that). 816 */ 817 bool kallsyms_show_value(const struct cred *cred) 818 { 819 switch (kptr_restrict) { 820 case 0: 821 if (kallsyms_for_perf()) 822 return true; 823 fallthrough; 824 case 1: 825 if (security_capable(cred, &init_user_ns, CAP_SYSLOG, 826 CAP_OPT_NOAUDIT) == 0) 827 return true; 828 fallthrough; 829 default: 830 return false; 831 } 832 } 833 834 static int kallsyms_open(struct inode *inode, struct file *file) 835 { 836 /* 837 * We keep iterator in m->private, since normal case is to 838 * s_start from where we left off, so we avoid doing 839 * using get_symbol_offset for every symbol. 840 */ 841 struct kallsym_iter *iter; 842 iter = __seq_open_private(file, &kallsyms_op, sizeof(*iter)); 843 if (!iter) 844 return -ENOMEM; 845 reset_iter(iter, 0); 846 847 /* 848 * Instead of checking this on every s_show() call, cache 849 * the result here at open time. 850 */ 851 iter->show_value = kallsyms_show_value(file->f_cred); 852 return 0; 853 } 854 855 #ifdef CONFIG_KGDB_KDB 856 const char *kdb_walk_kallsyms(loff_t *pos) 857 { 858 static struct kallsym_iter kdb_walk_kallsyms_iter; 859 if (*pos == 0) { 860 memset(&kdb_walk_kallsyms_iter, 0, 861 sizeof(kdb_walk_kallsyms_iter)); 862 reset_iter(&kdb_walk_kallsyms_iter, 0); 863 } 864 while (1) { 865 if (!update_iter(&kdb_walk_kallsyms_iter, *pos)) 866 return NULL; 867 ++*pos; 868 /* Some debugging symbols have no name. Ignore them. */ 869 if (kdb_walk_kallsyms_iter.name[0]) 870 return kdb_walk_kallsyms_iter.name; 871 } 872 } 873 #endif /* CONFIG_KGDB_KDB */ 874 875 static const struct proc_ops kallsyms_proc_ops = { 876 .proc_open = kallsyms_open, 877 .proc_read = seq_read, 878 .proc_lseek = seq_lseek, 879 .proc_release = seq_release_private, 880 }; 881 882 static int __init kallsyms_init(void) 883 { 884 proc_create("kallsyms", 0444, NULL, &kallsyms_proc_ops); 885 return 0; 886 } 887 device_initcall(kallsyms_init); 888