Linux Audio

Check our new training course

Loading...
v4.17
  1// SPDX-License-Identifier: GPL-2.0
  2/*
  3 * Post mortem Dwarf CFI based unwinding on top of regs and stack dumps.
  4 *
  5 * Lots of this code have been borrowed or heavily inspired from parts of
  6 * the libunwind 0.99 code which are (amongst other contributors I may have
  7 * forgotten):
  8 *
  9 * Copyright (C) 2002-2007 Hewlett-Packard Co
 10 *	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 11 *
 12 * And the bugs have been added by:
 13 *
 14 * Copyright (C) 2010, Frederic Weisbecker <fweisbec@gmail.com>
 15 * Copyright (C) 2012, Jiri Olsa <jolsa@redhat.com>
 16 *
 17 */
 18
 19#include <elf.h>
 20#include <errno.h>
 21#include <gelf.h>
 22#include <fcntl.h>
 23#include <inttypes.h>
 24#include <string.h>
 25#include <unistd.h>
 26#include <sys/mman.h>
 27#include <linux/list.h>
 
 28#ifndef REMOTE_UNWIND_LIBUNWIND
 29#include <libunwind.h>
 30#include <libunwind-ptrace.h>
 31#endif
 32#include "callchain.h"
 33#include "thread.h"
 34#include "session.h"
 35#include "perf_regs.h"
 36#include "unwind.h"
 
 37#include "symbol.h"
 38#include "util.h"
 39#include "debug.h"
 40#include "asm/bug.h"
 41#include "dso.h"
 42
 43extern int
 44UNW_OBJ(dwarf_search_unwind_table) (unw_addr_space_t as,
 45				    unw_word_t ip,
 46				    unw_dyn_info_t *di,
 47				    unw_proc_info_t *pi,
 48				    int need_unwind_info, void *arg);
 49
 50#define dwarf_search_unwind_table UNW_OBJ(dwarf_search_unwind_table)
 51
 52extern int
 53UNW_OBJ(dwarf_find_debug_frame) (int found, unw_dyn_info_t *di_debug,
 54				 unw_word_t ip,
 55				 unw_word_t segbase,
 56				 const char *obj_name, unw_word_t start,
 57				 unw_word_t end);
 58
 59#define dwarf_find_debug_frame UNW_OBJ(dwarf_find_debug_frame)
 60
 61#define DW_EH_PE_FORMAT_MASK	0x0f	/* format of the encoded value */
 62#define DW_EH_PE_APPL_MASK	0x70	/* how the value is to be applied */
 63
 64/* Pointer-encoding formats: */
 65#define DW_EH_PE_omit		0xff
 66#define DW_EH_PE_ptr		0x00	/* pointer-sized unsigned value */
 67#define DW_EH_PE_udata4		0x03	/* unsigned 32-bit value */
 68#define DW_EH_PE_udata8		0x04	/* unsigned 64-bit value */
 69#define DW_EH_PE_sdata4		0x0b	/* signed 32-bit value */
 70#define DW_EH_PE_sdata8		0x0c	/* signed 64-bit value */
 71
 72/* Pointer-encoding application: */
 73#define DW_EH_PE_absptr		0x00	/* absolute value */
 74#define DW_EH_PE_pcrel		0x10	/* rel. to addr. of encoded value */
 75
 76/*
 77 * The following are not documented by LSB v1.3, yet they are used by
 78 * GCC, presumably they aren't documented by LSB since they aren't
 79 * used on Linux:
 80 */
 81#define DW_EH_PE_funcrel	0x40	/* start-of-procedure-relative */
 82#define DW_EH_PE_aligned	0x50	/* aligned pointer */
 83
 84/* Flags intentionaly not handled, since they're not needed:
 85 * #define DW_EH_PE_indirect      0x80
 86 * #define DW_EH_PE_uleb128       0x01
 87 * #define DW_EH_PE_udata2        0x02
 88 * #define DW_EH_PE_sleb128       0x09
 89 * #define DW_EH_PE_sdata2        0x0a
 90 * #define DW_EH_PE_textrel       0x20
 91 * #define DW_EH_PE_datarel       0x30
 92 */
 93
 94struct unwind_info {
 95	struct perf_sample	*sample;
 96	struct machine		*machine;
 97	struct thread		*thread;
 98};
 99
100#define dw_read(ptr, type, end) ({	\
101	type *__p = (type *) ptr;	\
102	type  __v;			\
103	if ((__p + 1) > (type *) end)	\
104		return -EINVAL;		\
105	__v = *__p++;			\
106	ptr = (typeof(ptr)) __p;	\
107	__v;				\
108	})
109
110static int __dw_read_encoded_value(u8 **p, u8 *end, u64 *val,
111				   u8 encoding)
112{
113	u8 *cur = *p;
114	*val = 0;
115
116	switch (encoding) {
117	case DW_EH_PE_omit:
118		*val = 0;
119		goto out;
120	case DW_EH_PE_ptr:
121		*val = dw_read(cur, unsigned long, end);
122		goto out;
123	default:
124		break;
125	}
126
127	switch (encoding & DW_EH_PE_APPL_MASK) {
128	case DW_EH_PE_absptr:
129		break;
130	case DW_EH_PE_pcrel:
131		*val = (unsigned long) cur;
132		break;
133	default:
134		return -EINVAL;
135	}
136
137	if ((encoding & 0x07) == 0x00)
138		encoding |= DW_EH_PE_udata4;
139
140	switch (encoding & DW_EH_PE_FORMAT_MASK) {
141	case DW_EH_PE_sdata4:
142		*val += dw_read(cur, s32, end);
143		break;
144	case DW_EH_PE_udata4:
145		*val += dw_read(cur, u32, end);
146		break;
147	case DW_EH_PE_sdata8:
148		*val += dw_read(cur, s64, end);
149		break;
150	case DW_EH_PE_udata8:
151		*val += dw_read(cur, u64, end);
152		break;
153	default:
154		return -EINVAL;
155	}
156
157 out:
158	*p = cur;
159	return 0;
160}
161
162#define dw_read_encoded_value(ptr, end, enc) ({			\
163	u64 __v;						\
164	if (__dw_read_encoded_value(&ptr, end, &__v, enc)) {	\
165		return -EINVAL;                                 \
166	}                                                       \
167	__v;                                                    \
168	})
169
170static u64 elf_section_offset(int fd, const char *name)
171{
172	Elf *elf;
173	GElf_Ehdr ehdr;
174	GElf_Shdr shdr;
175	u64 offset = 0;
176
177	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
178	if (elf == NULL)
179		return 0;
180
181	do {
182		if (gelf_getehdr(elf, &ehdr) == NULL)
183			break;
184
185		if (!elf_section_by_name(elf, &ehdr, &shdr, name, NULL))
186			break;
187
188		offset = shdr.sh_offset;
189	} while (0);
190
191	elf_end(elf);
192	return offset;
193}
194
195#ifndef NO_LIBUNWIND_DEBUG_FRAME
196static int elf_is_exec(int fd, const char *name)
197{
198	Elf *elf;
199	GElf_Ehdr ehdr;
200	int retval = 0;
201
202	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
203	if (elf == NULL)
204		return 0;
205	if (gelf_getehdr(elf, &ehdr) == NULL)
206		goto out;
207
208	retval = (ehdr.e_type == ET_EXEC);
209
210out:
211	elf_end(elf);
212	pr_debug("unwind: elf_is_exec(%s): %d\n", name, retval);
213	return retval;
214}
215#endif
216
217struct table_entry {
218	u32 start_ip_offset;
219	u32 fde_offset;
220};
221
222struct eh_frame_hdr {
223	unsigned char version;
224	unsigned char eh_frame_ptr_enc;
225	unsigned char fde_count_enc;
226	unsigned char table_enc;
227
228	/*
229	 * The rest of the header is variable-length and consists of the
230	 * following members:
231	 *
232	 *	encoded_t eh_frame_ptr;
233	 *	encoded_t fde_count;
234	 */
235
236	/* A single encoded pointer should not be more than 8 bytes. */
237	u64 enc[2];
238
239	/*
240	 * struct {
241	 *    encoded_t start_ip;
242	 *    encoded_t fde_addr;
243	 * } binary_search_table[fde_count];
244	 */
245	char data[0];
246} __packed;
247
248static int unwind_spec_ehframe(struct dso *dso, struct machine *machine,
249			       u64 offset, u64 *table_data, u64 *segbase,
250			       u64 *fde_count)
251{
252	struct eh_frame_hdr hdr;
253	u8 *enc = (u8 *) &hdr.enc;
254	u8 *end = (u8 *) &hdr.data;
255	ssize_t r;
256
257	r = dso__data_read_offset(dso, machine, offset,
258				  (u8 *) &hdr, sizeof(hdr));
259	if (r != sizeof(hdr))
260		return -EINVAL;
261
262	/* We dont need eh_frame_ptr, just skip it. */
263	dw_read_encoded_value(enc, end, hdr.eh_frame_ptr_enc);
264
265	*fde_count  = dw_read_encoded_value(enc, end, hdr.fde_count_enc);
266	*segbase    = offset;
267	*table_data = (enc - (u8 *) &hdr) + offset;
268	return 0;
269}
270
271static int read_unwind_spec_eh_frame(struct dso *dso, struct machine *machine,
272				     u64 *table_data, u64 *segbase,
273				     u64 *fde_count)
274{
275	int ret = -EINVAL, fd;
276	u64 offset = dso->data.eh_frame_hdr_offset;
277
278	if (offset == 0) {
279		fd = dso__data_get_fd(dso, machine);
280		if (fd < 0)
281			return -EINVAL;
282
283		/* Check the .eh_frame section for unwinding info */
284		offset = elf_section_offset(fd, ".eh_frame_hdr");
285		dso->data.eh_frame_hdr_offset = offset;
286		dso__data_put_fd(dso);
287	}
288
289	if (offset)
290		ret = unwind_spec_ehframe(dso, machine, offset,
291					  table_data, segbase,
292					  fde_count);
293
294	return ret;
295}
296
297#ifndef NO_LIBUNWIND_DEBUG_FRAME
298static int read_unwind_spec_debug_frame(struct dso *dso,
299					struct machine *machine, u64 *offset)
300{
301	int fd;
302	u64 ofs = dso->data.debug_frame_offset;
303
304	/* debug_frame can reside in:
305	 *  - dso
306	 *  - debug pointed by symsrc_filename
307	 *  - gnu_debuglink, which doesn't necessary
308	 *    has to be pointed by symsrc_filename
309	 */
310	if (ofs == 0) {
311		fd = dso__data_get_fd(dso, machine);
312		if (fd >= 0) {
313			ofs = elf_section_offset(fd, ".debug_frame");
314			dso__data_put_fd(dso);
315		}
316
317		if (ofs <= 0) {
318			fd = open(dso->symsrc_filename, O_RDONLY);
319			if (fd >= 0) {
320				ofs = elf_section_offset(fd, ".debug_frame");
321				close(fd);
322			}
323		}
324
325		if (ofs <= 0) {
326			char *debuglink = malloc(PATH_MAX);
327			int ret = 0;
328
329			ret = dso__read_binary_type_filename(
330				dso, DSO_BINARY_TYPE__DEBUGLINK,
331				machine->root_dir, debuglink, PATH_MAX);
332			if (!ret) {
333				fd = open(debuglink, O_RDONLY);
334				if (fd >= 0) {
335					ofs = elf_section_offset(fd,
336							".debug_frame");
337					close(fd);
338				}
339			}
340			if (ofs > 0) {
341				if (dso->symsrc_filename != NULL) {
342					pr_warning(
343						"%s: overwrite symsrc(%s,%s)\n",
344							__func__,
345							dso->symsrc_filename,
346							debuglink);
347					free(dso->symsrc_filename);
348				}
349				dso->symsrc_filename = debuglink;
350			} else {
351				free(debuglink);
352			}
353		}
354
355		dso->data.debug_frame_offset = ofs;
356	}
357
358	*offset = ofs;
359	if (*offset)
360		return 0;
361
362	return -EINVAL;
363}
364#endif
365
366static struct map *find_map(unw_word_t ip, struct unwind_info *ui)
367{
368	struct addr_location al;
369
370	thread__find_addr_map(ui->thread, PERF_RECORD_MISC_USER,
371			      MAP__FUNCTION, ip, &al);
372	if (!al.map) {
373		/*
374		 * We've seen cases (softice) where DWARF unwinder went
375		 * through non executable mmaps, which we need to lookup
376		 * in MAP__VARIABLE tree.
377		 */
378		thread__find_addr_map(ui->thread, PERF_RECORD_MISC_USER,
379				      MAP__VARIABLE, ip, &al);
380	}
381	return al.map;
382}
383
384static int
385find_proc_info(unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
386	       int need_unwind_info, void *arg)
387{
388	struct unwind_info *ui = arg;
389	struct map *map;
390	unw_dyn_info_t di;
391	u64 table_data, segbase, fde_count;
392	int ret = -EINVAL;
393
394	map = find_map(ip, ui);
395	if (!map || !map->dso)
396		return -EINVAL;
397
398	pr_debug("unwind: find_proc_info dso %s\n", map->dso->name);
399
400	/* Check the .eh_frame section for unwinding info */
401	if (!read_unwind_spec_eh_frame(map->dso, ui->machine,
402				       &table_data, &segbase, &fde_count)) {
403		memset(&di, 0, sizeof(di));
404		di.format   = UNW_INFO_FORMAT_REMOTE_TABLE;
405		di.start_ip = map->start;
406		di.end_ip   = map->end;
407		di.u.rti.segbase    = map->start + segbase - map->pgoff;
408		di.u.rti.table_data = map->start + table_data - map->pgoff;
409		di.u.rti.table_len  = fde_count * sizeof(struct table_entry)
410				      / sizeof(unw_word_t);
411		ret = dwarf_search_unwind_table(as, ip, &di, pi,
412						need_unwind_info, arg);
413	}
414
415#ifndef NO_LIBUNWIND_DEBUG_FRAME
416	/* Check the .debug_frame section for unwinding info */
417	if (ret < 0 &&
418	    !read_unwind_spec_debug_frame(map->dso, ui->machine, &segbase)) {
419		int fd = dso__data_get_fd(map->dso, ui->machine);
420		int is_exec = elf_is_exec(fd, map->dso->name);
421		unw_word_t base = is_exec ? 0 : map->start;
422		const char *symfile;
423
424		if (fd >= 0)
425			dso__data_put_fd(map->dso);
426
427		symfile = map->dso->symsrc_filename ?: map->dso->name;
428
429		memset(&di, 0, sizeof(di));
430		if (dwarf_find_debug_frame(0, &di, ip, base, symfile,
431					   map->start, map->end))
432			return dwarf_search_unwind_table(as, ip, &di, pi,
433							 need_unwind_info, arg);
434	}
435#endif
436
437	return ret;
438}
439
440static int access_fpreg(unw_addr_space_t __maybe_unused as,
441			unw_regnum_t __maybe_unused num,
442			unw_fpreg_t __maybe_unused *val,
443			int __maybe_unused __write,
444			void __maybe_unused *arg)
445{
446	pr_err("unwind: access_fpreg unsupported\n");
447	return -UNW_EINVAL;
448}
449
450static int get_dyn_info_list_addr(unw_addr_space_t __maybe_unused as,
451				  unw_word_t __maybe_unused *dil_addr,
452				  void __maybe_unused *arg)
453{
454	return -UNW_ENOINFO;
455}
456
457static int resume(unw_addr_space_t __maybe_unused as,
458		  unw_cursor_t __maybe_unused *cu,
459		  void __maybe_unused *arg)
460{
461	pr_err("unwind: resume unsupported\n");
462	return -UNW_EINVAL;
463}
464
465static int
466get_proc_name(unw_addr_space_t __maybe_unused as,
467	      unw_word_t __maybe_unused addr,
468		char __maybe_unused *bufp, size_t __maybe_unused buf_len,
469		unw_word_t __maybe_unused *offp, void __maybe_unused *arg)
470{
471	pr_err("unwind: get_proc_name unsupported\n");
472	return -UNW_EINVAL;
473}
474
475static int access_dso_mem(struct unwind_info *ui, unw_word_t addr,
476			  unw_word_t *data)
477{
478	struct map *map;
479	ssize_t size;
480
481	map = find_map(addr, ui);
482	if (!map) {
483		pr_debug("unwind: no map for %lx\n", (unsigned long)addr);
484		return -1;
485	}
486
487	if (!map->dso)
488		return -1;
489
490	size = dso__data_read_addr(map->dso, map, ui->machine,
491				   addr, (u8 *) data, sizeof(*data));
492
493	return !(size == sizeof(*data));
494}
495
496static int access_mem(unw_addr_space_t __maybe_unused as,
497		      unw_word_t addr, unw_word_t *valp,
498		      int __write, void *arg)
499{
500	struct unwind_info *ui = arg;
501	struct stack_dump *stack = &ui->sample->user_stack;
502	u64 start, end;
503	int offset;
504	int ret;
505
506	/* Don't support write, probably not needed. */
507	if (__write || !stack || !ui->sample->user_regs.regs) {
508		*valp = 0;
509		return 0;
510	}
511
512	ret = perf_reg_value(&start, &ui->sample->user_regs,
513			     LIBUNWIND__ARCH_REG_SP);
514	if (ret)
515		return ret;
516
517	end = start + stack->size;
518
519	/* Check overflow. */
520	if (addr + sizeof(unw_word_t) < addr)
521		return -EINVAL;
522
523	if (addr < start || addr + sizeof(unw_word_t) >= end) {
524		ret = access_dso_mem(ui, addr, valp);
525		if (ret) {
526			pr_debug("unwind: access_mem %p not inside range"
527				 " 0x%" PRIx64 "-0x%" PRIx64 "\n",
528				 (void *) (uintptr_t) addr, start, end);
529			*valp = 0;
530			return ret;
531		}
532		return 0;
533	}
534
535	offset = addr - start;
536	*valp  = *(unw_word_t *)&stack->data[offset];
537	pr_debug("unwind: access_mem addr %p val %lx, offset %d\n",
538		 (void *) (uintptr_t) addr, (unsigned long)*valp, offset);
539	return 0;
540}
541
542static int access_reg(unw_addr_space_t __maybe_unused as,
543		      unw_regnum_t regnum, unw_word_t *valp,
544		      int __write, void *arg)
545{
546	struct unwind_info *ui = arg;
547	int id, ret;
548	u64 val;
549
550	/* Don't support write, I suspect we don't need it. */
551	if (__write) {
552		pr_err("unwind: access_reg w %d\n", regnum);
553		return 0;
554	}
555
556	if (!ui->sample->user_regs.regs) {
557		*valp = 0;
558		return 0;
559	}
560
561	id = LIBUNWIND__ARCH_REG_ID(regnum);
562	if (id < 0)
563		return -EINVAL;
564
565	ret = perf_reg_value(&val, &ui->sample->user_regs, id);
566	if (ret) {
567		pr_err("unwind: can't read reg %d\n", regnum);
568		return ret;
569	}
570
571	*valp = (unw_word_t) val;
572	pr_debug("unwind: reg %d, val %lx\n", regnum, (unsigned long)*valp);
573	return 0;
574}
575
576static void put_unwind_info(unw_addr_space_t __maybe_unused as,
577			    unw_proc_info_t *pi __maybe_unused,
578			    void *arg __maybe_unused)
579{
580	pr_debug("unwind: put_unwind_info called\n");
581}
582
583static int entry(u64 ip, struct thread *thread,
584		 unwind_entry_cb_t cb, void *arg)
585{
586	struct unwind_entry e;
587	struct addr_location al;
588
589	thread__find_addr_location(thread, PERF_RECORD_MISC_USER,
590				   MAP__FUNCTION, ip, &al);
591
592	e.ip = al.addr;
593	e.map = al.map;
594	e.sym = al.sym;
595
596	pr_debug("unwind: %s:ip = 0x%" PRIx64 " (0x%" PRIx64 ")\n",
597		 al.sym ? al.sym->name : "''",
598		 ip,
599		 al.map ? al.map->map_ip(al.map, ip) : (u64) 0);
600
601	return cb(&e, arg);
602}
603
604static void display_error(int err)
605{
606	switch (err) {
607	case UNW_EINVAL:
608		pr_err("unwind: Only supports local.\n");
609		break;
610	case UNW_EUNSPEC:
611		pr_err("unwind: Unspecified error.\n");
612		break;
613	case UNW_EBADREG:
614		pr_err("unwind: Register unavailable.\n");
615		break;
616	default:
617		break;
618	}
619}
620
621static unw_accessors_t accessors = {
622	.find_proc_info		= find_proc_info,
623	.put_unwind_info	= put_unwind_info,
624	.get_dyn_info_list_addr	= get_dyn_info_list_addr,
625	.access_mem		= access_mem,
626	.access_reg		= access_reg,
627	.access_fpreg		= access_fpreg,
628	.resume			= resume,
629	.get_proc_name		= get_proc_name,
630};
631
632static int _unwind__prepare_access(struct thread *thread)
633{
634	if (!dwarf_callchain_users)
635		return 0;
636	thread->addr_space = unw_create_addr_space(&accessors, 0);
637	if (!thread->addr_space) {
638		pr_err("unwind: Can't create unwind address space.\n");
639		return -ENOMEM;
640	}
641
642	unw_set_caching_policy(thread->addr_space, UNW_CACHE_GLOBAL);
643	return 0;
644}
645
646static void _unwind__flush_access(struct thread *thread)
647{
648	if (!dwarf_callchain_users)
649		return;
650	unw_flush_cache(thread->addr_space, 0, 0);
651}
652
653static void _unwind__finish_access(struct thread *thread)
654{
655	if (!dwarf_callchain_users)
656		return;
657	unw_destroy_addr_space(thread->addr_space);
658}
659
660static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
661		       void *arg, int max_stack)
662{
663	u64 val;
664	unw_word_t ips[max_stack];
665	unw_addr_space_t addr_space;
666	unw_cursor_t c;
667	int ret, i = 0;
668
669	ret = perf_reg_value(&val, &ui->sample->user_regs,
670			     LIBUNWIND__ARCH_REG_IP);
671	if (ret)
672		return ret;
673
674	ips[i++] = (unw_word_t) val;
675
676	/*
677	 * If we need more than one entry, do the DWARF
678	 * unwind itself.
679	 */
680	if (max_stack - 1 > 0) {
681		WARN_ONCE(!ui->thread, "WARNING: ui->thread is NULL");
682		addr_space = ui->thread->addr_space;
683
684		if (addr_space == NULL)
685			return -1;
686
687		ret = unw_init_remote(&c, addr_space, ui);
688		if (ret)
689			display_error(ret);
690
691		while (!ret && (unw_step(&c) > 0) && i < max_stack) {
692			unw_get_reg(&c, UNW_REG_IP, &ips[i]);
693
694			/*
695			 * Decrement the IP for any non-activation frames.
696			 * this is required to properly find the srcline
697			 * for caller frames.
698			 * See also the documentation for dwfl_frame_pc(),
699			 * which this code tries to replicate.
700			 */
701			if (unw_is_signal_frame(&c) <= 0)
702				--ips[i];
703
704			++i;
705		}
706
707		max_stack = i;
708	}
709
710	/*
711	 * Display what we got based on the order setup.
712	 */
713	for (i = 0; i < max_stack && !ret; i++) {
714		int j = i;
715
716		if (callchain_param.order == ORDER_CALLER)
717			j = max_stack - i - 1;
718		ret = ips[j] ? entry(ips[j], ui->thread, cb, arg) : 0;
719	}
720
721	return ret;
722}
723
724static int _unwind__get_entries(unwind_entry_cb_t cb, void *arg,
725			struct thread *thread,
726			struct perf_sample *data, int max_stack)
727{
728	struct unwind_info ui = {
729		.sample       = data,
730		.thread       = thread,
731		.machine      = thread->mg->machine,
732	};
733
734	if (!data->user_regs.regs)
735		return -EINVAL;
736
737	if (max_stack <= 0)
738		return -EINVAL;
739
740	return get_entries(&ui, cb, arg, max_stack);
741}
742
743static struct unwind_libunwind_ops
744_unwind_libunwind_ops = {
745	.prepare_access = _unwind__prepare_access,
746	.flush_access   = _unwind__flush_access,
747	.finish_access  = _unwind__finish_access,
748	.get_entries    = _unwind__get_entries,
749};
750
751#ifndef REMOTE_UNWIND_LIBUNWIND
752struct unwind_libunwind_ops *
753local_unwind_libunwind_ops = &_unwind_libunwind_ops;
754#endif
v5.4
  1// SPDX-License-Identifier: GPL-2.0
  2/*
  3 * Post mortem Dwarf CFI based unwinding on top of regs and stack dumps.
  4 *
  5 * Lots of this code have been borrowed or heavily inspired from parts of
  6 * the libunwind 0.99 code which are (amongst other contributors I may have
  7 * forgotten):
  8 *
  9 * Copyright (C) 2002-2007 Hewlett-Packard Co
 10 *	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
 11 *
 12 * And the bugs have been added by:
 13 *
 14 * Copyright (C) 2010, Frederic Weisbecker <fweisbec@gmail.com>
 15 * Copyright (C) 2012, Jiri Olsa <jolsa@redhat.com>
 16 *
 17 */
 18
 19#include <elf.h>
 20#include <errno.h>
 21#include <gelf.h>
 22#include <fcntl.h>
 23#include <inttypes.h>
 24#include <string.h>
 25#include <unistd.h>
 26#include <sys/mman.h>
 27#include <linux/list.h>
 28#include <linux/zalloc.h>
 29#ifndef REMOTE_UNWIND_LIBUNWIND
 30#include <libunwind.h>
 31#include <libunwind-ptrace.h>
 32#endif
 33#include "callchain.h"
 34#include "thread.h"
 35#include "session.h"
 36#include "perf_regs.h"
 37#include "unwind.h"
 38#include "map.h"
 39#include "symbol.h"
 
 40#include "debug.h"
 41#include "asm/bug.h"
 42#include "dso.h"
 43
 44extern int
 45UNW_OBJ(dwarf_search_unwind_table) (unw_addr_space_t as,
 46				    unw_word_t ip,
 47				    unw_dyn_info_t *di,
 48				    unw_proc_info_t *pi,
 49				    int need_unwind_info, void *arg);
 50
 51#define dwarf_search_unwind_table UNW_OBJ(dwarf_search_unwind_table)
 52
 53extern int
 54UNW_OBJ(dwarf_find_debug_frame) (int found, unw_dyn_info_t *di_debug,
 55				 unw_word_t ip,
 56				 unw_word_t segbase,
 57				 const char *obj_name, unw_word_t start,
 58				 unw_word_t end);
 59
 60#define dwarf_find_debug_frame UNW_OBJ(dwarf_find_debug_frame)
 61
 62#define DW_EH_PE_FORMAT_MASK	0x0f	/* format of the encoded value */
 63#define DW_EH_PE_APPL_MASK	0x70	/* how the value is to be applied */
 64
 65/* Pointer-encoding formats: */
 66#define DW_EH_PE_omit		0xff
 67#define DW_EH_PE_ptr		0x00	/* pointer-sized unsigned value */
 68#define DW_EH_PE_udata4		0x03	/* unsigned 32-bit value */
 69#define DW_EH_PE_udata8		0x04	/* unsigned 64-bit value */
 70#define DW_EH_PE_sdata4		0x0b	/* signed 32-bit value */
 71#define DW_EH_PE_sdata8		0x0c	/* signed 64-bit value */
 72
 73/* Pointer-encoding application: */
 74#define DW_EH_PE_absptr		0x00	/* absolute value */
 75#define DW_EH_PE_pcrel		0x10	/* rel. to addr. of encoded value */
 76
 77/*
 78 * The following are not documented by LSB v1.3, yet they are used by
 79 * GCC, presumably they aren't documented by LSB since they aren't
 80 * used on Linux:
 81 */
 82#define DW_EH_PE_funcrel	0x40	/* start-of-procedure-relative */
 83#define DW_EH_PE_aligned	0x50	/* aligned pointer */
 84
 85/* Flags intentionaly not handled, since they're not needed:
 86 * #define DW_EH_PE_indirect      0x80
 87 * #define DW_EH_PE_uleb128       0x01
 88 * #define DW_EH_PE_udata2        0x02
 89 * #define DW_EH_PE_sleb128       0x09
 90 * #define DW_EH_PE_sdata2        0x0a
 91 * #define DW_EH_PE_textrel       0x20
 92 * #define DW_EH_PE_datarel       0x30
 93 */
 94
 95struct unwind_info {
 96	struct perf_sample	*sample;
 97	struct machine		*machine;
 98	struct thread		*thread;
 99};
100
101#define dw_read(ptr, type, end) ({	\
102	type *__p = (type *) ptr;	\
103	type  __v;			\
104	if ((__p + 1) > (type *) end)	\
105		return -EINVAL;		\
106	__v = *__p++;			\
107	ptr = (typeof(ptr)) __p;	\
108	__v;				\
109	})
110
111static int __dw_read_encoded_value(u8 **p, u8 *end, u64 *val,
112				   u8 encoding)
113{
114	u8 *cur = *p;
115	*val = 0;
116
117	switch (encoding) {
118	case DW_EH_PE_omit:
119		*val = 0;
120		goto out;
121	case DW_EH_PE_ptr:
122		*val = dw_read(cur, unsigned long, end);
123		goto out;
124	default:
125		break;
126	}
127
128	switch (encoding & DW_EH_PE_APPL_MASK) {
129	case DW_EH_PE_absptr:
130		break;
131	case DW_EH_PE_pcrel:
132		*val = (unsigned long) cur;
133		break;
134	default:
135		return -EINVAL;
136	}
137
138	if ((encoding & 0x07) == 0x00)
139		encoding |= DW_EH_PE_udata4;
140
141	switch (encoding & DW_EH_PE_FORMAT_MASK) {
142	case DW_EH_PE_sdata4:
143		*val += dw_read(cur, s32, end);
144		break;
145	case DW_EH_PE_udata4:
146		*val += dw_read(cur, u32, end);
147		break;
148	case DW_EH_PE_sdata8:
149		*val += dw_read(cur, s64, end);
150		break;
151	case DW_EH_PE_udata8:
152		*val += dw_read(cur, u64, end);
153		break;
154	default:
155		return -EINVAL;
156	}
157
158 out:
159	*p = cur;
160	return 0;
161}
162
163#define dw_read_encoded_value(ptr, end, enc) ({			\
164	u64 __v;						\
165	if (__dw_read_encoded_value(&ptr, end, &__v, enc)) {	\
166		return -EINVAL;                                 \
167	}                                                       \
168	__v;                                                    \
169	})
170
171static u64 elf_section_offset(int fd, const char *name)
172{
173	Elf *elf;
174	GElf_Ehdr ehdr;
175	GElf_Shdr shdr;
176	u64 offset = 0;
177
178	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
179	if (elf == NULL)
180		return 0;
181
182	do {
183		if (gelf_getehdr(elf, &ehdr) == NULL)
184			break;
185
186		if (!elf_section_by_name(elf, &ehdr, &shdr, name, NULL))
187			break;
188
189		offset = shdr.sh_offset;
190	} while (0);
191
192	elf_end(elf);
193	return offset;
194}
195
196#ifndef NO_LIBUNWIND_DEBUG_FRAME
197static int elf_is_exec(int fd, const char *name)
198{
199	Elf *elf;
200	GElf_Ehdr ehdr;
201	int retval = 0;
202
203	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
204	if (elf == NULL)
205		return 0;
206	if (gelf_getehdr(elf, &ehdr) == NULL)
207		goto out;
208
209	retval = (ehdr.e_type == ET_EXEC);
210
211out:
212	elf_end(elf);
213	pr_debug("unwind: elf_is_exec(%s): %d\n", name, retval);
214	return retval;
215}
216#endif
217
218struct table_entry {
219	u32 start_ip_offset;
220	u32 fde_offset;
221};
222
223struct eh_frame_hdr {
224	unsigned char version;
225	unsigned char eh_frame_ptr_enc;
226	unsigned char fde_count_enc;
227	unsigned char table_enc;
228
229	/*
230	 * The rest of the header is variable-length and consists of the
231	 * following members:
232	 *
233	 *	encoded_t eh_frame_ptr;
234	 *	encoded_t fde_count;
235	 */
236
237	/* A single encoded pointer should not be more than 8 bytes. */
238	u64 enc[2];
239
240	/*
241	 * struct {
242	 *    encoded_t start_ip;
243	 *    encoded_t fde_addr;
244	 * } binary_search_table[fde_count];
245	 */
246	char data[0];
247} __packed;
248
249static int unwind_spec_ehframe(struct dso *dso, struct machine *machine,
250			       u64 offset, u64 *table_data, u64 *segbase,
251			       u64 *fde_count)
252{
253	struct eh_frame_hdr hdr;
254	u8 *enc = (u8 *) &hdr.enc;
255	u8 *end = (u8 *) &hdr.data;
256	ssize_t r;
257
258	r = dso__data_read_offset(dso, machine, offset,
259				  (u8 *) &hdr, sizeof(hdr));
260	if (r != sizeof(hdr))
261		return -EINVAL;
262
263	/* We dont need eh_frame_ptr, just skip it. */
264	dw_read_encoded_value(enc, end, hdr.eh_frame_ptr_enc);
265
266	*fde_count  = dw_read_encoded_value(enc, end, hdr.fde_count_enc);
267	*segbase    = offset;
268	*table_data = (enc - (u8 *) &hdr) + offset;
269	return 0;
270}
271
272static int read_unwind_spec_eh_frame(struct dso *dso, struct machine *machine,
273				     u64 *table_data, u64 *segbase,
274				     u64 *fde_count)
275{
276	int ret = -EINVAL, fd;
277	u64 offset = dso->data.eh_frame_hdr_offset;
278
279	if (offset == 0) {
280		fd = dso__data_get_fd(dso, machine);
281		if (fd < 0)
282			return -EINVAL;
283
284		/* Check the .eh_frame section for unwinding info */
285		offset = elf_section_offset(fd, ".eh_frame_hdr");
286		dso->data.eh_frame_hdr_offset = offset;
287		dso__data_put_fd(dso);
288	}
289
290	if (offset)
291		ret = unwind_spec_ehframe(dso, machine, offset,
292					  table_data, segbase,
293					  fde_count);
294
295	return ret;
296}
297
298#ifndef NO_LIBUNWIND_DEBUG_FRAME
299static int read_unwind_spec_debug_frame(struct dso *dso,
300					struct machine *machine, u64 *offset)
301{
302	int fd;
303	u64 ofs = dso->data.debug_frame_offset;
304
305	/* debug_frame can reside in:
306	 *  - dso
307	 *  - debug pointed by symsrc_filename
308	 *  - gnu_debuglink, which doesn't necessary
309	 *    has to be pointed by symsrc_filename
310	 */
311	if (ofs == 0) {
312		fd = dso__data_get_fd(dso, machine);
313		if (fd >= 0) {
314			ofs = elf_section_offset(fd, ".debug_frame");
315			dso__data_put_fd(dso);
316		}
317
318		if (ofs <= 0) {
319			fd = open(dso->symsrc_filename, O_RDONLY);
320			if (fd >= 0) {
321				ofs = elf_section_offset(fd, ".debug_frame");
322				close(fd);
323			}
324		}
325
326		if (ofs <= 0) {
327			char *debuglink = malloc(PATH_MAX);
328			int ret = 0;
329
330			ret = dso__read_binary_type_filename(
331				dso, DSO_BINARY_TYPE__DEBUGLINK,
332				machine->root_dir, debuglink, PATH_MAX);
333			if (!ret) {
334				fd = open(debuglink, O_RDONLY);
335				if (fd >= 0) {
336					ofs = elf_section_offset(fd,
337							".debug_frame");
338					close(fd);
339				}
340			}
341			if (ofs > 0) {
342				if (dso->symsrc_filename != NULL) {
343					pr_warning(
344						"%s: overwrite symsrc(%s,%s)\n",
345							__func__,
346							dso->symsrc_filename,
347							debuglink);
348					zfree(&dso->symsrc_filename);
349				}
350				dso->symsrc_filename = debuglink;
351			} else {
352				free(debuglink);
353			}
354		}
355
356		dso->data.debug_frame_offset = ofs;
357	}
358
359	*offset = ofs;
360	if (*offset)
361		return 0;
362
363	return -EINVAL;
364}
365#endif
366
367static struct map *find_map(unw_word_t ip, struct unwind_info *ui)
368{
369	struct addr_location al;
370	return thread__find_map(ui->thread, PERF_RECORD_MISC_USER, ip, &al);
 
 
 
 
 
 
 
 
 
 
 
 
371}
372
373static int
374find_proc_info(unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
375	       int need_unwind_info, void *arg)
376{
377	struct unwind_info *ui = arg;
378	struct map *map;
379	unw_dyn_info_t di;
380	u64 table_data, segbase, fde_count;
381	int ret = -EINVAL;
382
383	map = find_map(ip, ui);
384	if (!map || !map->dso)
385		return -EINVAL;
386
387	pr_debug("unwind: find_proc_info dso %s\n", map->dso->name);
388
389	/* Check the .eh_frame section for unwinding info */
390	if (!read_unwind_spec_eh_frame(map->dso, ui->machine,
391				       &table_data, &segbase, &fde_count)) {
392		memset(&di, 0, sizeof(di));
393		di.format   = UNW_INFO_FORMAT_REMOTE_TABLE;
394		di.start_ip = map->start;
395		di.end_ip   = map->end;
396		di.u.rti.segbase    = map->start + segbase - map->pgoff;
397		di.u.rti.table_data = map->start + table_data - map->pgoff;
398		di.u.rti.table_len  = fde_count * sizeof(struct table_entry)
399				      / sizeof(unw_word_t);
400		ret = dwarf_search_unwind_table(as, ip, &di, pi,
401						need_unwind_info, arg);
402	}
403
404#ifndef NO_LIBUNWIND_DEBUG_FRAME
405	/* Check the .debug_frame section for unwinding info */
406	if (ret < 0 &&
407	    !read_unwind_spec_debug_frame(map->dso, ui->machine, &segbase)) {
408		int fd = dso__data_get_fd(map->dso, ui->machine);
409		int is_exec = elf_is_exec(fd, map->dso->name);
410		unw_word_t base = is_exec ? 0 : map->start;
411		const char *symfile;
412
413		if (fd >= 0)
414			dso__data_put_fd(map->dso);
415
416		symfile = map->dso->symsrc_filename ?: map->dso->name;
417
418		memset(&di, 0, sizeof(di));
419		if (dwarf_find_debug_frame(0, &di, ip, base, symfile,
420					   map->start, map->end))
421			return dwarf_search_unwind_table(as, ip, &di, pi,
422							 need_unwind_info, arg);
423	}
424#endif
425
426	return ret;
427}
428
429static int access_fpreg(unw_addr_space_t __maybe_unused as,
430			unw_regnum_t __maybe_unused num,
431			unw_fpreg_t __maybe_unused *val,
432			int __maybe_unused __write,
433			void __maybe_unused *arg)
434{
435	pr_err("unwind: access_fpreg unsupported\n");
436	return -UNW_EINVAL;
437}
438
439static int get_dyn_info_list_addr(unw_addr_space_t __maybe_unused as,
440				  unw_word_t __maybe_unused *dil_addr,
441				  void __maybe_unused *arg)
442{
443	return -UNW_ENOINFO;
444}
445
446static int resume(unw_addr_space_t __maybe_unused as,
447		  unw_cursor_t __maybe_unused *cu,
448		  void __maybe_unused *arg)
449{
450	pr_err("unwind: resume unsupported\n");
451	return -UNW_EINVAL;
452}
453
454static int
455get_proc_name(unw_addr_space_t __maybe_unused as,
456	      unw_word_t __maybe_unused addr,
457		char __maybe_unused *bufp, size_t __maybe_unused buf_len,
458		unw_word_t __maybe_unused *offp, void __maybe_unused *arg)
459{
460	pr_err("unwind: get_proc_name unsupported\n");
461	return -UNW_EINVAL;
462}
463
464static int access_dso_mem(struct unwind_info *ui, unw_word_t addr,
465			  unw_word_t *data)
466{
467	struct map *map;
468	ssize_t size;
469
470	map = find_map(addr, ui);
471	if (!map) {
472		pr_debug("unwind: no map for %lx\n", (unsigned long)addr);
473		return -1;
474	}
475
476	if (!map->dso)
477		return -1;
478
479	size = dso__data_read_addr(map->dso, map, ui->machine,
480				   addr, (u8 *) data, sizeof(*data));
481
482	return !(size == sizeof(*data));
483}
484
485static int access_mem(unw_addr_space_t __maybe_unused as,
486		      unw_word_t addr, unw_word_t *valp,
487		      int __write, void *arg)
488{
489	struct unwind_info *ui = arg;
490	struct stack_dump *stack = &ui->sample->user_stack;
491	u64 start, end;
492	int offset;
493	int ret;
494
495	/* Don't support write, probably not needed. */
496	if (__write || !stack || !ui->sample->user_regs.regs) {
497		*valp = 0;
498		return 0;
499	}
500
501	ret = perf_reg_value(&start, &ui->sample->user_regs,
502			     LIBUNWIND__ARCH_REG_SP);
503	if (ret)
504		return ret;
505
506	end = start + stack->size;
507
508	/* Check overflow. */
509	if (addr + sizeof(unw_word_t) < addr)
510		return -EINVAL;
511
512	if (addr < start || addr + sizeof(unw_word_t) >= end) {
513		ret = access_dso_mem(ui, addr, valp);
514		if (ret) {
515			pr_debug("unwind: access_mem %p not inside range"
516				 " 0x%" PRIx64 "-0x%" PRIx64 "\n",
517				 (void *) (uintptr_t) addr, start, end);
518			*valp = 0;
519			return ret;
520		}
521		return 0;
522	}
523
524	offset = addr - start;
525	*valp  = *(unw_word_t *)&stack->data[offset];
526	pr_debug("unwind: access_mem addr %p val %lx, offset %d\n",
527		 (void *) (uintptr_t) addr, (unsigned long)*valp, offset);
528	return 0;
529}
530
531static int access_reg(unw_addr_space_t __maybe_unused as,
532		      unw_regnum_t regnum, unw_word_t *valp,
533		      int __write, void *arg)
534{
535	struct unwind_info *ui = arg;
536	int id, ret;
537	u64 val;
538
539	/* Don't support write, I suspect we don't need it. */
540	if (__write) {
541		pr_err("unwind: access_reg w %d\n", regnum);
542		return 0;
543	}
544
545	if (!ui->sample->user_regs.regs) {
546		*valp = 0;
547		return 0;
548	}
549
550	id = LIBUNWIND__ARCH_REG_ID(regnum);
551	if (id < 0)
552		return -EINVAL;
553
554	ret = perf_reg_value(&val, &ui->sample->user_regs, id);
555	if (ret) {
556		pr_err("unwind: can't read reg %d\n", regnum);
557		return ret;
558	}
559
560	*valp = (unw_word_t) val;
561	pr_debug("unwind: reg %d, val %lx\n", regnum, (unsigned long)*valp);
562	return 0;
563}
564
565static void put_unwind_info(unw_addr_space_t __maybe_unused as,
566			    unw_proc_info_t *pi __maybe_unused,
567			    void *arg __maybe_unused)
568{
569	pr_debug("unwind: put_unwind_info called\n");
570}
571
572static int entry(u64 ip, struct thread *thread,
573		 unwind_entry_cb_t cb, void *arg)
574{
575	struct unwind_entry e;
576	struct addr_location al;
577
578	e.sym = thread__find_symbol(thread, PERF_RECORD_MISC_USER, ip, &al);
579	e.ip  = ip;
 
 
580	e.map = al.map;
 
581
582	pr_debug("unwind: %s:ip = 0x%" PRIx64 " (0x%" PRIx64 ")\n",
583		 al.sym ? al.sym->name : "''",
584		 ip,
585		 al.map ? al.map->map_ip(al.map, ip) : (u64) 0);
586
587	return cb(&e, arg);
588}
589
590static void display_error(int err)
591{
592	switch (err) {
593	case UNW_EINVAL:
594		pr_err("unwind: Only supports local.\n");
595		break;
596	case UNW_EUNSPEC:
597		pr_err("unwind: Unspecified error.\n");
598		break;
599	case UNW_EBADREG:
600		pr_err("unwind: Register unavailable.\n");
601		break;
602	default:
603		break;
604	}
605}
606
607static unw_accessors_t accessors = {
608	.find_proc_info		= find_proc_info,
609	.put_unwind_info	= put_unwind_info,
610	.get_dyn_info_list_addr	= get_dyn_info_list_addr,
611	.access_mem		= access_mem,
612	.access_reg		= access_reg,
613	.access_fpreg		= access_fpreg,
614	.resume			= resume,
615	.get_proc_name		= get_proc_name,
616};
617
618static int _unwind__prepare_access(struct map_groups *mg)
619{
620	mg->addr_space = unw_create_addr_space(&accessors, 0);
621	if (!mg->addr_space) {
 
 
622		pr_err("unwind: Can't create unwind address space.\n");
623		return -ENOMEM;
624	}
625
626	unw_set_caching_policy(mg->addr_space, UNW_CACHE_GLOBAL);
627	return 0;
628}
629
630static void _unwind__flush_access(struct map_groups *mg)
631{
632	unw_flush_cache(mg->addr_space, 0, 0);
 
 
633}
634
635static void _unwind__finish_access(struct map_groups *mg)
636{
637	unw_destroy_addr_space(mg->addr_space);
 
 
638}
639
640static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
641		       void *arg, int max_stack)
642{
643	u64 val;
644	unw_word_t ips[max_stack];
645	unw_addr_space_t addr_space;
646	unw_cursor_t c;
647	int ret, i = 0;
648
649	ret = perf_reg_value(&val, &ui->sample->user_regs,
650			     LIBUNWIND__ARCH_REG_IP);
651	if (ret)
652		return ret;
653
654	ips[i++] = (unw_word_t) val;
655
656	/*
657	 * If we need more than one entry, do the DWARF
658	 * unwind itself.
659	 */
660	if (max_stack - 1 > 0) {
661		WARN_ONCE(!ui->thread, "WARNING: ui->thread is NULL");
662		addr_space = ui->thread->mg->addr_space;
663
664		if (addr_space == NULL)
665			return -1;
666
667		ret = unw_init_remote(&c, addr_space, ui);
668		if (ret)
669			display_error(ret);
670
671		while (!ret && (unw_step(&c) > 0) && i < max_stack) {
672			unw_get_reg(&c, UNW_REG_IP, &ips[i]);
673
674			/*
675			 * Decrement the IP for any non-activation frames.
676			 * this is required to properly find the srcline
677			 * for caller frames.
678			 * See also the documentation for dwfl_frame_pc(),
679			 * which this code tries to replicate.
680			 */
681			if (unw_is_signal_frame(&c) <= 0)
682				--ips[i];
683
684			++i;
685		}
686
687		max_stack = i;
688	}
689
690	/*
691	 * Display what we got based on the order setup.
692	 */
693	for (i = 0; i < max_stack && !ret; i++) {
694		int j = i;
695
696		if (callchain_param.order == ORDER_CALLER)
697			j = max_stack - i - 1;
698		ret = ips[j] ? entry(ips[j], ui->thread, cb, arg) : 0;
699	}
700
701	return ret;
702}
703
704static int _unwind__get_entries(unwind_entry_cb_t cb, void *arg,
705			struct thread *thread,
706			struct perf_sample *data, int max_stack)
707{
708	struct unwind_info ui = {
709		.sample       = data,
710		.thread       = thread,
711		.machine      = thread->mg->machine,
712	};
713
714	if (!data->user_regs.regs)
715		return -EINVAL;
716
717	if (max_stack <= 0)
718		return -EINVAL;
719
720	return get_entries(&ui, cb, arg, max_stack);
721}
722
723static struct unwind_libunwind_ops
724_unwind_libunwind_ops = {
725	.prepare_access = _unwind__prepare_access,
726	.flush_access   = _unwind__flush_access,
727	.finish_access  = _unwind__finish_access,
728	.get_entries    = _unwind__get_entries,
729};
730
731#ifndef REMOTE_UNWIND_LIBUNWIND
732struct unwind_libunwind_ops *
733local_unwind_libunwind_ops = &_unwind_libunwind_ops;
734#endif