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 /* Skip the search for empty string. */ 216 if (!*name) 217 return 0; 218 219 for (i = 0, off = 0; i < kallsyms_num_syms; i++) { 220 off = kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf)); 221 222 if (strcmp(namebuf, name) == 0) 223 return kallsyms_sym_address(i); 224 225 if (cleanup_symbol_name(namebuf) && strcmp(namebuf, name) == 0) 226 return kallsyms_sym_address(i); 227 } 228 return module_kallsyms_lookup_name(name); 229 } 230 231 #ifdef CONFIG_LIVEPATCH 232 /* 233 * Iterate over all symbols in vmlinux. For symbols from modules use 234 * module_kallsyms_on_each_symbol instead. 235 */ 236 int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *, 237 unsigned long), 238 void *data) 239 { 240 char namebuf[KSYM_NAME_LEN]; 241 unsigned long i; 242 unsigned int off; 243 int ret; 244 245 for (i = 0, off = 0; i < kallsyms_num_syms; i++) { 246 off = kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf)); 247 ret = fn(data, namebuf, NULL, kallsyms_sym_address(i)); 248 if (ret != 0) 249 return ret; 250 cond_resched(); 251 } 252 return 0; 253 } 254 #endif /* CONFIG_LIVEPATCH */ 255 256 static unsigned long get_symbol_pos(unsigned long addr, 257 unsigned long *symbolsize, 258 unsigned long *offset) 259 { 260 unsigned long symbol_start = 0, symbol_end = 0; 261 unsigned long i, low, high, mid; 262 263 /* This kernel should never had been booted. */ 264 if (!IS_ENABLED(CONFIG_KALLSYMS_BASE_RELATIVE)) 265 BUG_ON(!kallsyms_addresses); 266 else 267 BUG_ON(!kallsyms_offsets); 268 269 /* Do a binary search on the sorted kallsyms_addresses array. */ 270 low = 0; 271 high = kallsyms_num_syms; 272 273 while (high - low > 1) { 274 mid = low + (high - low) / 2; 275 if (kallsyms_sym_address(mid) <= addr) 276 low = mid; 277 else 278 high = mid; 279 } 280 281 /* 282 * Search for the first aliased symbol. Aliased 283 * symbols are symbols with the same address. 284 */ 285 while (low && kallsyms_sym_address(low-1) == kallsyms_sym_address(low)) 286 --low; 287 288 symbol_start = kallsyms_sym_address(low); 289 290 /* Search for next non-aliased symbol. */ 291 for (i = low + 1; i < kallsyms_num_syms; i++) { 292 if (kallsyms_sym_address(i) > symbol_start) { 293 symbol_end = kallsyms_sym_address(i); 294 break; 295 } 296 } 297 298 /* If we found no next symbol, we use the end of the section. */ 299 if (!symbol_end) { 300 if (is_kernel_inittext(addr)) 301 symbol_end = (unsigned long)_einittext; 302 else if (IS_ENABLED(CONFIG_KALLSYMS_ALL)) 303 symbol_end = (unsigned long)_end; 304 else 305 symbol_end = (unsigned long)_etext; 306 } 307 308 if (symbolsize) 309 *symbolsize = symbol_end - symbol_start; 310 if (offset) 311 *offset = addr - symbol_start; 312 313 return low; 314 } 315 316 /* 317 * Lookup an address but don't bother to find any names. 318 */ 319 int kallsyms_lookup_size_offset(unsigned long addr, unsigned long *symbolsize, 320 unsigned long *offset) 321 { 322 char namebuf[KSYM_NAME_LEN]; 323 324 if (is_ksym_addr(addr)) { 325 get_symbol_pos(addr, symbolsize, offset); 326 return 1; 327 } 328 return !!module_address_lookup(addr, symbolsize, offset, NULL, NULL, namebuf) || 329 !!__bpf_address_lookup(addr, symbolsize, offset, namebuf); 330 } 331 332 static const char *kallsyms_lookup_buildid(unsigned long addr, 333 unsigned long *symbolsize, 334 unsigned long *offset, char **modname, 335 const unsigned char **modbuildid, char *namebuf) 336 { 337 const char *ret; 338 339 namebuf[KSYM_NAME_LEN - 1] = 0; 340 namebuf[0] = 0; 341 342 if (is_ksym_addr(addr)) { 343 unsigned long pos; 344 345 pos = get_symbol_pos(addr, symbolsize, offset); 346 /* Grab name */ 347 kallsyms_expand_symbol(get_symbol_offset(pos), 348 namebuf, KSYM_NAME_LEN); 349 if (modname) 350 *modname = NULL; 351 if (modbuildid) 352 *modbuildid = NULL; 353 354 ret = namebuf; 355 goto found; 356 } 357 358 /* See if it's in a module or a BPF JITed image. */ 359 ret = module_address_lookup(addr, symbolsize, offset, 360 modname, modbuildid, namebuf); 361 if (!ret) 362 ret = bpf_address_lookup(addr, symbolsize, 363 offset, modname, namebuf); 364 365 if (!ret) 366 ret = ftrace_mod_address_lookup(addr, symbolsize, 367 offset, modname, namebuf); 368 369 found: 370 cleanup_symbol_name(namebuf); 371 return ret; 372 } 373 374 /* 375 * Lookup an address 376 * - modname is set to NULL if it's in the kernel. 377 * - We guarantee that the returned name is valid until we reschedule even if. 378 * It resides in a module. 379 * - We also guarantee that modname will be valid until rescheduled. 380 */ 381 const char *kallsyms_lookup(unsigned long addr, 382 unsigned long *symbolsize, 383 unsigned long *offset, 384 char **modname, char *namebuf) 385 { 386 return kallsyms_lookup_buildid(addr, symbolsize, offset, modname, 387 NULL, namebuf); 388 } 389 390 int lookup_symbol_name(unsigned long addr, char *symname) 391 { 392 int res; 393 394 symname[0] = '\0'; 395 symname[KSYM_NAME_LEN - 1] = '\0'; 396 397 if (is_ksym_addr(addr)) { 398 unsigned long pos; 399 400 pos = get_symbol_pos(addr, NULL, NULL); 401 /* Grab name */ 402 kallsyms_expand_symbol(get_symbol_offset(pos), 403 symname, KSYM_NAME_LEN); 404 goto found; 405 } 406 /* See if it's in a module. */ 407 res = lookup_module_symbol_name(addr, symname); 408 if (res) 409 return res; 410 411 found: 412 cleanup_symbol_name(symname); 413 return 0; 414 } 415 416 int lookup_symbol_attrs(unsigned long addr, unsigned long *size, 417 unsigned long *offset, char *modname, char *name) 418 { 419 int res; 420 421 name[0] = '\0'; 422 name[KSYM_NAME_LEN - 1] = '\0'; 423 424 if (is_ksym_addr(addr)) { 425 unsigned long pos; 426 427 pos = get_symbol_pos(addr, size, offset); 428 /* Grab name */ 429 kallsyms_expand_symbol(get_symbol_offset(pos), 430 name, KSYM_NAME_LEN); 431 modname[0] = '\0'; 432 goto found; 433 } 434 /* See if it's in a module. */ 435 res = lookup_module_symbol_attrs(addr, size, offset, modname, name); 436 if (res) 437 return res; 438 439 found: 440 cleanup_symbol_name(name); 441 return 0; 442 } 443 444 /* Look up a kernel symbol and return it in a text buffer. */ 445 static int __sprint_symbol(char *buffer, unsigned long address, 446 int symbol_offset, int add_offset, int add_buildid) 447 { 448 char *modname; 449 const unsigned char *buildid; 450 const char *name; 451 unsigned long offset, size; 452 int len; 453 454 address += symbol_offset; 455 name = kallsyms_lookup_buildid(address, &size, &offset, &modname, &buildid, 456 buffer); 457 if (!name) 458 return sprintf(buffer, "0x%lx", address - symbol_offset); 459 460 if (name != buffer) 461 strcpy(buffer, name); 462 len = strlen(buffer); 463 offset -= symbol_offset; 464 465 if (add_offset) 466 len += sprintf(buffer + len, "+%#lx/%#lx", offset, size); 467 468 if (modname) { 469 len += sprintf(buffer + len, " [%s", modname); 470 #if IS_ENABLED(CONFIG_STACKTRACE_BUILD_ID) 471 if (add_buildid && buildid) { 472 /* build ID should match length of sprintf */ 473 #if IS_ENABLED(CONFIG_MODULES) 474 static_assert(sizeof(typeof_member(struct module, build_id)) == 20); 475 #endif 476 len += sprintf(buffer + len, " %20phN", buildid); 477 } 478 #endif 479 len += sprintf(buffer + len, "]"); 480 } 481 482 return len; 483 } 484 485 /** 486 * sprint_symbol - Look up a kernel symbol and return it in a text buffer 487 * @buffer: buffer to be stored 488 * @address: address to lookup 489 * 490 * This function looks up a kernel symbol with @address and stores its name, 491 * offset, size and module name to @buffer if possible. If no symbol was found, 492 * just saves its @address as is. 493 * 494 * This function returns the number of bytes stored in @buffer. 495 */ 496 int sprint_symbol(char *buffer, unsigned long address) 497 { 498 return __sprint_symbol(buffer, address, 0, 1, 0); 499 } 500 EXPORT_SYMBOL_GPL(sprint_symbol); 501 502 /** 503 * sprint_symbol_build_id - Look up a kernel symbol and return it in a text buffer 504 * @buffer: buffer to be stored 505 * @address: address to lookup 506 * 507 * This function looks up a kernel symbol with @address and stores its name, 508 * offset, size, module name and module build ID to @buffer if possible. If no 509 * symbol was found, just saves its @address as is. 510 * 511 * This function returns the number of bytes stored in @buffer. 512 */ 513 int sprint_symbol_build_id(char *buffer, unsigned long address) 514 { 515 return __sprint_symbol(buffer, address, 0, 1, 1); 516 } 517 EXPORT_SYMBOL_GPL(sprint_symbol_build_id); 518 519 /** 520 * sprint_symbol_no_offset - Look up a kernel symbol and return it in a text buffer 521 * @buffer: buffer to be stored 522 * @address: address to lookup 523 * 524 * This function looks up a kernel symbol with @address and stores its name 525 * and module name to @buffer if possible. If no symbol was found, just saves 526 * its @address as is. 527 * 528 * This function returns the number of bytes stored in @buffer. 529 */ 530 int sprint_symbol_no_offset(char *buffer, unsigned long address) 531 { 532 return __sprint_symbol(buffer, address, 0, 0, 0); 533 } 534 EXPORT_SYMBOL_GPL(sprint_symbol_no_offset); 535 536 /** 537 * sprint_backtrace - Look up a backtrace symbol and return it in a text buffer 538 * @buffer: buffer to be stored 539 * @address: address to lookup 540 * 541 * This function is for stack backtrace and does the same thing as 542 * sprint_symbol() but with modified/decreased @address. If there is a 543 * tail-call to the function marked "noreturn", gcc optimized out code after 544 * the call so that the stack-saved return address could point outside of the 545 * caller. This function ensures that kallsyms will find the original caller 546 * by decreasing @address. 547 * 548 * This function returns the number of bytes stored in @buffer. 549 */ 550 int sprint_backtrace(char *buffer, unsigned long address) 551 { 552 return __sprint_symbol(buffer, address, -1, 1, 0); 553 } 554 555 /** 556 * sprint_backtrace_build_id - Look up a backtrace symbol and return it in a text buffer 557 * @buffer: buffer to be stored 558 * @address: address to lookup 559 * 560 * This function is for stack backtrace and does the same thing as 561 * sprint_symbol() but with modified/decreased @address. If there is a 562 * tail-call to the function marked "noreturn", gcc optimized out code after 563 * the call so that the stack-saved return address could point outside of the 564 * caller. This function ensures that kallsyms will find the original caller 565 * by decreasing @address. This function also appends the module build ID to 566 * the @buffer if @address is within a kernel module. 567 * 568 * This function returns the number of bytes stored in @buffer. 569 */ 570 int sprint_backtrace_build_id(char *buffer, unsigned long address) 571 { 572 return __sprint_symbol(buffer, address, -1, 1, 1); 573 } 574 575 /* To avoid using get_symbol_offset for every symbol, we carry prefix along. */ 576 struct kallsym_iter { 577 loff_t pos; 578 loff_t pos_arch_end; 579 loff_t pos_mod_end; 580 loff_t pos_ftrace_mod_end; 581 loff_t pos_bpf_end; 582 unsigned long value; 583 unsigned int nameoff; /* If iterating in core kernel symbols. */ 584 char type; 585 char name[KSYM_NAME_LEN]; 586 char module_name[MODULE_NAME_LEN]; 587 int exported; 588 int show_value; 589 }; 590 591 int __weak arch_get_kallsym(unsigned int symnum, unsigned long *value, 592 char *type, char *name) 593 { 594 return -EINVAL; 595 } 596 597 static int get_ksymbol_arch(struct kallsym_iter *iter) 598 { 599 int ret = arch_get_kallsym(iter->pos - kallsyms_num_syms, 600 &iter->value, &iter->type, 601 iter->name); 602 603 if (ret < 0) { 604 iter->pos_arch_end = iter->pos; 605 return 0; 606 } 607 608 return 1; 609 } 610 611 static int get_ksymbol_mod(struct kallsym_iter *iter) 612 { 613 int ret = module_get_kallsym(iter->pos - iter->pos_arch_end, 614 &iter->value, &iter->type, 615 iter->name, iter->module_name, 616 &iter->exported); 617 if (ret < 0) { 618 iter->pos_mod_end = iter->pos; 619 return 0; 620 } 621 622 return 1; 623 } 624 625 /* 626 * ftrace_mod_get_kallsym() may also get symbols for pages allocated for ftrace 627 * purposes. In that case "__builtin__ftrace" is used as a module name, even 628 * though "__builtin__ftrace" is not a module. 629 */ 630 static int get_ksymbol_ftrace_mod(struct kallsym_iter *iter) 631 { 632 int ret = ftrace_mod_get_kallsym(iter->pos - iter->pos_mod_end, 633 &iter->value, &iter->type, 634 iter->name, iter->module_name, 635 &iter->exported); 636 if (ret < 0) { 637 iter->pos_ftrace_mod_end = iter->pos; 638 return 0; 639 } 640 641 return 1; 642 } 643 644 static int get_ksymbol_bpf(struct kallsym_iter *iter) 645 { 646 int ret; 647 648 strlcpy(iter->module_name, "bpf", MODULE_NAME_LEN); 649 iter->exported = 0; 650 ret = bpf_get_kallsym(iter->pos - iter->pos_ftrace_mod_end, 651 &iter->value, &iter->type, 652 iter->name); 653 if (ret < 0) { 654 iter->pos_bpf_end = iter->pos; 655 return 0; 656 } 657 658 return 1; 659 } 660 661 /* 662 * This uses "__builtin__kprobes" as a module name for symbols for pages 663 * allocated for kprobes' purposes, even though "__builtin__kprobes" is not a 664 * module. 665 */ 666 static int get_ksymbol_kprobe(struct kallsym_iter *iter) 667 { 668 strlcpy(iter->module_name, "__builtin__kprobes", MODULE_NAME_LEN); 669 iter->exported = 0; 670 return kprobe_get_kallsym(iter->pos - iter->pos_bpf_end, 671 &iter->value, &iter->type, 672 iter->name) < 0 ? 0 : 1; 673 } 674 675 /* Returns space to next name. */ 676 static unsigned long get_ksymbol_core(struct kallsym_iter *iter) 677 { 678 unsigned off = iter->nameoff; 679 680 iter->module_name[0] = '\0'; 681 iter->value = kallsyms_sym_address(iter->pos); 682 683 iter->type = kallsyms_get_symbol_type(off); 684 685 off = kallsyms_expand_symbol(off, iter->name, ARRAY_SIZE(iter->name)); 686 687 return off - iter->nameoff; 688 } 689 690 static void reset_iter(struct kallsym_iter *iter, loff_t new_pos) 691 { 692 iter->name[0] = '\0'; 693 iter->nameoff = get_symbol_offset(new_pos); 694 iter->pos = new_pos; 695 if (new_pos == 0) { 696 iter->pos_arch_end = 0; 697 iter->pos_mod_end = 0; 698 iter->pos_ftrace_mod_end = 0; 699 iter->pos_bpf_end = 0; 700 } 701 } 702 703 /* 704 * The end position (last + 1) of each additional kallsyms section is recorded 705 * in iter->pos_..._end as each section is added, and so can be used to 706 * determine which get_ksymbol_...() function to call next. 707 */ 708 static int update_iter_mod(struct kallsym_iter *iter, loff_t pos) 709 { 710 iter->pos = pos; 711 712 if ((!iter->pos_arch_end || iter->pos_arch_end > pos) && 713 get_ksymbol_arch(iter)) 714 return 1; 715 716 if ((!iter->pos_mod_end || iter->pos_mod_end > pos) && 717 get_ksymbol_mod(iter)) 718 return 1; 719 720 if ((!iter->pos_ftrace_mod_end || iter->pos_ftrace_mod_end > pos) && 721 get_ksymbol_ftrace_mod(iter)) 722 return 1; 723 724 if ((!iter->pos_bpf_end || iter->pos_bpf_end > pos) && 725 get_ksymbol_bpf(iter)) 726 return 1; 727 728 return get_ksymbol_kprobe(iter); 729 } 730 731 /* Returns false if pos at or past end of file. */ 732 static int update_iter(struct kallsym_iter *iter, loff_t pos) 733 { 734 /* Module symbols can be accessed randomly. */ 735 if (pos >= kallsyms_num_syms) 736 return update_iter_mod(iter, pos); 737 738 /* If we're not on the desired position, reset to new position. */ 739 if (pos != iter->pos) 740 reset_iter(iter, pos); 741 742 iter->nameoff += get_ksymbol_core(iter); 743 iter->pos++; 744 745 return 1; 746 } 747 748 static void *s_next(struct seq_file *m, void *p, loff_t *pos) 749 { 750 (*pos)++; 751 752 if (!update_iter(m->private, *pos)) 753 return NULL; 754 return p; 755 } 756 757 static void *s_start(struct seq_file *m, loff_t *pos) 758 { 759 if (!update_iter(m->private, *pos)) 760 return NULL; 761 return m->private; 762 } 763 764 static void s_stop(struct seq_file *m, void *p) 765 { 766 } 767 768 static int s_show(struct seq_file *m, void *p) 769 { 770 void *value; 771 struct kallsym_iter *iter = m->private; 772 773 /* Some debugging symbols have no name. Ignore them. */ 774 if (!iter->name[0]) 775 return 0; 776 777 value = iter->show_value ? (void *)iter->value : NULL; 778 779 if (iter->module_name[0]) { 780 char type; 781 782 /* 783 * Label it "global" if it is exported, 784 * "local" if not exported. 785 */ 786 type = iter->exported ? toupper(iter->type) : 787 tolower(iter->type); 788 seq_printf(m, "%px %c %s\t[%s]\n", value, 789 type, iter->name, iter->module_name); 790 } else 791 seq_printf(m, "%px %c %s\n", value, 792 iter->type, iter->name); 793 return 0; 794 } 795 796 static const struct seq_operations kallsyms_op = { 797 .start = s_start, 798 .next = s_next, 799 .stop = s_stop, 800 .show = s_show 801 }; 802 803 static inline int kallsyms_for_perf(void) 804 { 805 #ifdef CONFIG_PERF_EVENTS 806 extern int sysctl_perf_event_paranoid; 807 if (sysctl_perf_event_paranoid <= 1) 808 return 1; 809 #endif 810 return 0; 811 } 812 813 /* 814 * We show kallsyms information even to normal users if we've enabled 815 * kernel profiling and are explicitly not paranoid (so kptr_restrict 816 * is clear, and sysctl_perf_event_paranoid isn't set). 817 * 818 * Otherwise, require CAP_SYSLOG (assuming kptr_restrict isn't set to 819 * block even that). 820 */ 821 bool kallsyms_show_value(const struct cred *cred) 822 { 823 switch (kptr_restrict) { 824 case 0: 825 if (kallsyms_for_perf()) 826 return true; 827 fallthrough; 828 case 1: 829 if (security_capable(cred, &init_user_ns, CAP_SYSLOG, 830 CAP_OPT_NOAUDIT) == 0) 831 return true; 832 fallthrough; 833 default: 834 return false; 835 } 836 } 837 838 static int kallsyms_open(struct inode *inode, struct file *file) 839 { 840 /* 841 * We keep iterator in m->private, since normal case is to 842 * s_start from where we left off, so we avoid doing 843 * using get_symbol_offset for every symbol. 844 */ 845 struct kallsym_iter *iter; 846 iter = __seq_open_private(file, &kallsyms_op, sizeof(*iter)); 847 if (!iter) 848 return -ENOMEM; 849 reset_iter(iter, 0); 850 851 /* 852 * Instead of checking this on every s_show() call, cache 853 * the result here at open time. 854 */ 855 iter->show_value = kallsyms_show_value(file->f_cred); 856 return 0; 857 } 858 859 #ifdef CONFIG_KGDB_KDB 860 const char *kdb_walk_kallsyms(loff_t *pos) 861 { 862 static struct kallsym_iter kdb_walk_kallsyms_iter; 863 if (*pos == 0) { 864 memset(&kdb_walk_kallsyms_iter, 0, 865 sizeof(kdb_walk_kallsyms_iter)); 866 reset_iter(&kdb_walk_kallsyms_iter, 0); 867 } 868 while (1) { 869 if (!update_iter(&kdb_walk_kallsyms_iter, *pos)) 870 return NULL; 871 ++*pos; 872 /* Some debugging symbols have no name. Ignore them. */ 873 if (kdb_walk_kallsyms_iter.name[0]) 874 return kdb_walk_kallsyms_iter.name; 875 } 876 } 877 #endif /* CONFIG_KGDB_KDB */ 878 879 static const struct proc_ops kallsyms_proc_ops = { 880 .proc_open = kallsyms_open, 881 .proc_read = seq_read, 882 .proc_lseek = seq_lseek, 883 .proc_release = seq_release_private, 884 }; 885 886 static int __init kallsyms_init(void) 887 { 888 proc_create("kallsyms", 0444, NULL, &kallsyms_proc_ops); 889 return 0; 890 } 891 device_initcall(kallsyms_init); 892