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
v6.8
  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 intentionally 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	bool			 best_effort;
100};
101
102#define dw_read(ptr, type, end) ({	\
103	type *__p = (type *) ptr;	\
104	type  __v;			\
105	if ((__p + 1) > (type *) end)	\
106		return -EINVAL;		\
107	__v = *__p++;			\
108	ptr = (typeof(ptr)) __p;	\
109	__v;				\
110	})
111
112static int __dw_read_encoded_value(u8 **p, u8 *end, u64 *val,
113				   u8 encoding)
114{
115	u8 *cur = *p;
116	*val = 0;
117
118	switch (encoding) {
119	case DW_EH_PE_omit:
120		*val = 0;
121		goto out;
122	case DW_EH_PE_ptr:
123		*val = dw_read(cur, unsigned long, end);
124		goto out;
125	default:
126		break;
127	}
128
129	switch (encoding & DW_EH_PE_APPL_MASK) {
130	case DW_EH_PE_absptr:
131		break;
132	case DW_EH_PE_pcrel:
133		*val = (unsigned long) cur;
134		break;
135	default:
136		return -EINVAL;
137	}
138
139	if ((encoding & 0x07) == 0x00)
140		encoding |= DW_EH_PE_udata4;
141
142	switch (encoding & DW_EH_PE_FORMAT_MASK) {
143	case DW_EH_PE_sdata4:
144		*val += dw_read(cur, s32, end);
145		break;
146	case DW_EH_PE_udata4:
147		*val += dw_read(cur, u32, end);
148		break;
149	case DW_EH_PE_sdata8:
150		*val += dw_read(cur, s64, end);
151		break;
152	case DW_EH_PE_udata8:
153		*val += dw_read(cur, u64, end);
154		break;
155	default:
156		return -EINVAL;
157	}
158
159 out:
160	*p = cur;
161	return 0;
162}
163
164#define dw_read_encoded_value(ptr, end, enc) ({			\
165	u64 __v;						\
166	if (__dw_read_encoded_value(&ptr, end, &__v, enc)) {	\
167		return -EINVAL;                                 \
168	}                                                       \
169	__v;                                                    \
170	})
171
172static int elf_section_address_and_offset(int fd, const char *name, u64 *address, u64 *offset)
173{
174	Elf *elf;
175	GElf_Ehdr ehdr;
176	GElf_Shdr shdr;
177	int ret = -1;
178
179	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
180	if (elf == NULL)
181		return -1;
182
183	if (gelf_getehdr(elf, &ehdr) == NULL)
184		goto out_err;
185
186	if (!elf_section_by_name(elf, &ehdr, &shdr, name, NULL))
187		goto out_err;
188
189	*address = shdr.sh_addr;
190	*offset = shdr.sh_offset;
191	ret = 0;
192out_err:
193	elf_end(elf);
194	return ret;
195}
196
197#ifndef NO_LIBUNWIND_DEBUG_FRAME
198static u64 elf_section_offset(int fd, const char *name)
199{
200	u64 address, offset = 0;
201
202	if (elf_section_address_and_offset(fd, name, &address, &offset))
203		return 0;
204
205	return offset;
206}
207#endif
208
209static u64 elf_base_address(int fd)
210{
211	Elf *elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
212	GElf_Phdr phdr;
213	u64 retval = 0;
214	size_t i, phdrnum = 0;
215
216	if (elf == NULL)
217		return 0;
218	(void)elf_getphdrnum(elf, &phdrnum);
219	/* PT_LOAD segments are sorted by p_vaddr, so the first has the minimum p_vaddr. */
220	for (i = 0; i < phdrnum; i++) {
221		if (gelf_getphdr(elf, i, &phdr) && phdr.p_type == PT_LOAD) {
222			retval = phdr.p_vaddr & -getpagesize();
223			break;
224		}
225	}
226
227	elf_end(elf);
228	return retval;
229}
230
231#ifndef NO_LIBUNWIND_DEBUG_FRAME
232static int elf_is_exec(int fd, const char *name)
233{
234	Elf *elf;
235	GElf_Ehdr ehdr;
236	int retval = 0;
237
238	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
239	if (elf == NULL)
240		return 0;
241	if (gelf_getehdr(elf, &ehdr) == NULL)
242		goto out;
243
244	retval = (ehdr.e_type == ET_EXEC);
245
246out:
247	elf_end(elf);
248	pr_debug("unwind: elf_is_exec(%s): %d\n", name, retval);
249	return retval;
250}
251#endif
252
253struct table_entry {
254	u32 start_ip_offset;
255	u32 fde_offset;
256};
257
258struct eh_frame_hdr {
259	unsigned char version;
260	unsigned char eh_frame_ptr_enc;
261	unsigned char fde_count_enc;
262	unsigned char table_enc;
263
264	/*
265	 * The rest of the header is variable-length and consists of the
266	 * following members:
267	 *
268	 *	encoded_t eh_frame_ptr;
269	 *	encoded_t fde_count;
270	 */
271
272	/* A single encoded pointer should not be more than 8 bytes. */
273	u64 enc[2];
274
275	/*
276	 * struct {
277	 *    encoded_t start_ip;
278	 *    encoded_t fde_addr;
279	 * } binary_search_table[fde_count];
280	 */
281	char data[];
282} __packed;
283
284static int unwind_spec_ehframe(struct dso *dso, struct machine *machine,
285			       u64 offset, u64 *table_data_offset, u64 *fde_count)
 
286{
287	struct eh_frame_hdr hdr;
288	u8 *enc = (u8 *) &hdr.enc;
289	u8 *end = (u8 *) &hdr.data;
290	ssize_t r;
291
292	r = dso__data_read_offset(dso, machine, offset,
293				  (u8 *) &hdr, sizeof(hdr));
294	if (r != sizeof(hdr))
295		return -EINVAL;
296
297	/* We dont need eh_frame_ptr, just skip it. */
298	dw_read_encoded_value(enc, end, hdr.eh_frame_ptr_enc);
299
300	*fde_count  = dw_read_encoded_value(enc, end, hdr.fde_count_enc);
301	*table_data_offset = enc - (u8 *) &hdr;
302	return 0;
303}
304
305struct read_unwind_spec_eh_frame_maps_cb_args {
306	struct dso *dso;
307	u64 base_addr;
308};
309
310static int read_unwind_spec_eh_frame_maps_cb(struct map *map, void *data)
311{
312
313	struct read_unwind_spec_eh_frame_maps_cb_args *args = data;
314
315	if (map__dso(map) == args->dso && map__start(map) - map__pgoff(map) < args->base_addr)
316		args->base_addr = map__start(map) - map__pgoff(map);
317
318	return 0;
319}
320
321
322static int read_unwind_spec_eh_frame(struct dso *dso, struct unwind_info *ui,
323				     u64 *table_data, u64 *segbase,
324				     u64 *fde_count)
325{
326	struct read_unwind_spec_eh_frame_maps_cb_args args = {
327		.dso = dso,
328		.base_addr = UINT64_MAX,
329	};
330	int ret, fd;
331
332	if (dso->data.eh_frame_hdr_offset == 0) {
333		fd = dso__data_get_fd(dso, ui->machine);
334		if (fd < 0)
335			return -EINVAL;
336
337		/* Check the .eh_frame section for unwinding info */
338		ret = elf_section_address_and_offset(fd, ".eh_frame_hdr",
339						     &dso->data.eh_frame_hdr_addr,
340						     &dso->data.eh_frame_hdr_offset);
341		dso->data.elf_base_addr = elf_base_address(fd);
342		dso__data_put_fd(dso);
343		if (ret || dso->data.eh_frame_hdr_offset == 0)
344			return -EINVAL;
345	}
346
347	maps__for_each_map(thread__maps(ui->thread), read_unwind_spec_eh_frame_maps_cb, &args);
 
 
 
348
349	args.base_addr -= dso->data.elf_base_addr;
350	/* Address of .eh_frame_hdr */
351	*segbase = args.base_addr + dso->data.eh_frame_hdr_addr;
352	ret = unwind_spec_ehframe(dso, ui->machine, dso->data.eh_frame_hdr_offset,
353				   table_data, fde_count);
354	if (ret)
355		return ret;
356	/* binary_search_table offset plus .eh_frame_hdr address */
357	*table_data += *segbase;
358	return 0;
359}
360
361#ifndef NO_LIBUNWIND_DEBUG_FRAME
362static int read_unwind_spec_debug_frame(struct dso *dso,
363					struct machine *machine, u64 *offset)
364{
365	int fd;
366	u64 ofs = dso->data.debug_frame_offset;
367
368	/* debug_frame can reside in:
369	 *  - dso
370	 *  - debug pointed by symsrc_filename
371	 *  - gnu_debuglink, which doesn't necessary
372	 *    has to be pointed by symsrc_filename
373	 */
374	if (ofs == 0) {
375		fd = dso__data_get_fd(dso, machine);
376		if (fd >= 0) {
377			ofs = elf_section_offset(fd, ".debug_frame");
378			dso__data_put_fd(dso);
379		}
380
381		if (ofs <= 0) {
382			fd = open(dso->symsrc_filename, O_RDONLY);
383			if (fd >= 0) {
384				ofs = elf_section_offset(fd, ".debug_frame");
385				close(fd);
386			}
387		}
388
389		if (ofs <= 0) {
390			char *debuglink = malloc(PATH_MAX);
391			int ret = 0;
392
393			ret = dso__read_binary_type_filename(
394				dso, DSO_BINARY_TYPE__DEBUGLINK,
395				machine->root_dir, debuglink, PATH_MAX);
396			if (!ret) {
397				fd = open(debuglink, O_RDONLY);
398				if (fd >= 0) {
399					ofs = elf_section_offset(fd,
400							".debug_frame");
401					close(fd);
402				}
403			}
404			if (ofs > 0) {
405				if (dso->symsrc_filename != NULL) {
406					pr_warning(
407						"%s: overwrite symsrc(%s,%s)\n",
408							__func__,
409							dso->symsrc_filename,
410							debuglink);
411					zfree(&dso->symsrc_filename);
412				}
413				dso->symsrc_filename = debuglink;
414			} else {
415				free(debuglink);
416			}
417		}
418
419		dso->data.debug_frame_offset = ofs;
420	}
421
422	*offset = ofs;
423	if (*offset)
424		return 0;
425
426	return -EINVAL;
427}
428#endif
429
430static struct map *find_map(unw_word_t ip, struct unwind_info *ui)
431{
432	struct addr_location al;
433	struct map *ret;
434
435	addr_location__init(&al);
436	thread__find_map(ui->thread, PERF_RECORD_MISC_USER, ip, &al);
437	ret = map__get(al.map);
438	addr_location__exit(&al);
439	return ret;
 
 
 
 
 
 
 
440}
441
442static int
443find_proc_info(unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
444	       int need_unwind_info, void *arg)
445{
446	struct unwind_info *ui = arg;
447	struct map *map;
448	struct dso *dso;
449	unw_dyn_info_t di;
450	u64 table_data, segbase, fde_count;
451	int ret = -EINVAL;
452
453	map = find_map(ip, ui);
454	if (!map)
455		return -EINVAL;
456
457	dso = map__dso(map);
458	if (!dso) {
459		map__put(map);
460		return -EINVAL;
461	}
462
463	pr_debug("unwind: find_proc_info dso %s\n", dso->name);
464
465	/* Check the .eh_frame section for unwinding info */
466	if (!read_unwind_spec_eh_frame(dso, ui, &table_data, &segbase, &fde_count)) {
 
467		memset(&di, 0, sizeof(di));
468		di.format   = UNW_INFO_FORMAT_REMOTE_TABLE;
469		di.start_ip = map__start(map);
470		di.end_ip   = map__end(map);
471		di.u.rti.segbase    = segbase;
472		di.u.rti.table_data = table_data;
473		di.u.rti.table_len  = fde_count * sizeof(struct table_entry)
474				      / sizeof(unw_word_t);
475		ret = dwarf_search_unwind_table(as, ip, &di, pi,
476						need_unwind_info, arg);
477	}
478
479#ifndef NO_LIBUNWIND_DEBUG_FRAME
480	/* Check the .debug_frame section for unwinding info */
481	if (ret < 0 &&
482	    !read_unwind_spec_debug_frame(dso, ui->machine, &segbase)) {
483		int fd = dso__data_get_fd(dso, ui->machine);
484		int is_exec = elf_is_exec(fd, dso->name);
485		u64 start = map__start(map);
486		unw_word_t base = is_exec ? 0 : start;
487		const char *symfile;
488
489		if (fd >= 0)
490			dso__data_put_fd(dso);
491
492		symfile = dso->symsrc_filename ?: dso->name;
493
494		memset(&di, 0, sizeof(di));
495		if (dwarf_find_debug_frame(0, &di, ip, base, symfile, start, map__end(map)))
496			ret = dwarf_search_unwind_table(as, ip, &di, pi,
497							need_unwind_info, arg);
 
498	}
499#endif
500	map__put(map);
501	return ret;
502}
503
504static int access_fpreg(unw_addr_space_t __maybe_unused as,
505			unw_regnum_t __maybe_unused num,
506			unw_fpreg_t __maybe_unused *val,
507			int __maybe_unused __write,
508			void __maybe_unused *arg)
509{
510	pr_err("unwind: access_fpreg unsupported\n");
511	return -UNW_EINVAL;
512}
513
514static int get_dyn_info_list_addr(unw_addr_space_t __maybe_unused as,
515				  unw_word_t __maybe_unused *dil_addr,
516				  void __maybe_unused *arg)
517{
518	return -UNW_ENOINFO;
519}
520
521static int resume(unw_addr_space_t __maybe_unused as,
522		  unw_cursor_t __maybe_unused *cu,
523		  void __maybe_unused *arg)
524{
525	pr_err("unwind: resume unsupported\n");
526	return -UNW_EINVAL;
527}
528
529static int
530get_proc_name(unw_addr_space_t __maybe_unused as,
531	      unw_word_t __maybe_unused addr,
532		char __maybe_unused *bufp, size_t __maybe_unused buf_len,
533		unw_word_t __maybe_unused *offp, void __maybe_unused *arg)
534{
535	pr_err("unwind: get_proc_name unsupported\n");
536	return -UNW_EINVAL;
537}
538
539static int access_dso_mem(struct unwind_info *ui, unw_word_t addr,
540			  unw_word_t *data)
541{
542	struct map *map;
543	struct dso *dso;
544	ssize_t size;
545
546	map = find_map(addr, ui);
547	if (!map) {
548		pr_debug("unwind: no map for %lx\n", (unsigned long)addr);
549		return -1;
550	}
551
552	dso = map__dso(map);
553
554	if (!dso) {
555		map__put(map);
556		return -1;
557	}
558
559	size = dso__data_read_addr(dso, map, ui->machine,
560				   addr, (u8 *) data, sizeof(*data));
561	map__put(map);
562	return !(size == sizeof(*data));
563}
564
565static int access_mem(unw_addr_space_t __maybe_unused as,
566		      unw_word_t addr, unw_word_t *valp,
567		      int __write, void *arg)
568{
569	struct unwind_info *ui = arg;
570	const char *arch = perf_env__arch(ui->machine->env);
571	struct stack_dump *stack = &ui->sample->user_stack;
572	u64 start, end;
573	int offset;
574	int ret;
575
576	/* Don't support write, probably not needed. */
577	if (__write || !stack || !ui->sample->user_regs.regs) {
578		*valp = 0;
579		return 0;
580	}
581
582	ret = perf_reg_value(&start, &ui->sample->user_regs,
583			     perf_arch_reg_sp(arch));
584	if (ret)
585		return ret;
586
587	end = start + stack->size;
588
589	/* Check overflow. */
590	if (addr + sizeof(unw_word_t) < addr)
591		return -EINVAL;
592
593	if (addr < start || addr + sizeof(unw_word_t) >= end) {
594		ret = access_dso_mem(ui, addr, valp);
595		if (ret) {
596			pr_debug("unwind: access_mem %p not inside range"
597				 " 0x%" PRIx64 "-0x%" PRIx64 "\n",
598				 (void *) (uintptr_t) addr, start, end);
599			*valp = 0;
600			return ret;
601		}
602		return 0;
603	}
604
605	offset = addr - start;
606	*valp  = *(unw_word_t *)&stack->data[offset];
607	pr_debug("unwind: access_mem addr %p val %lx, offset %d\n",
608		 (void *) (uintptr_t) addr, (unsigned long)*valp, offset);
609	return 0;
610}
611
612static int access_reg(unw_addr_space_t __maybe_unused as,
613		      unw_regnum_t regnum, unw_word_t *valp,
614		      int __write, void *arg)
615{
616	struct unwind_info *ui = arg;
617	int id, ret;
618	u64 val;
619
620	/* Don't support write, I suspect we don't need it. */
621	if (__write) {
622		pr_err("unwind: access_reg w %d\n", regnum);
623		return 0;
624	}
625
626	if (!ui->sample->user_regs.regs) {
627		*valp = 0;
628		return 0;
629	}
630
631	id = LIBUNWIND__ARCH_REG_ID(regnum);
632	if (id < 0)
633		return -EINVAL;
634
635	ret = perf_reg_value(&val, &ui->sample->user_regs, id);
636	if (ret) {
637		if (!ui->best_effort)
638			pr_err("unwind: can't read reg %d\n", regnum);
639		return ret;
640	}
641
642	*valp = (unw_word_t) val;
643	pr_debug("unwind: reg %d, val %lx\n", regnum, (unsigned long)*valp);
644	return 0;
645}
646
647static void put_unwind_info(unw_addr_space_t __maybe_unused as,
648			    unw_proc_info_t *pi __maybe_unused,
649			    void *arg __maybe_unused)
650{
651	pr_debug("unwind: put_unwind_info called\n");
652}
653
654static int entry(u64 ip, struct thread *thread,
655		 unwind_entry_cb_t cb, void *arg)
656{
657	struct unwind_entry e;
658	struct addr_location al;
659	int ret;
660
661	addr_location__init(&al);
662	e.ms.sym = thread__find_symbol(thread, PERF_RECORD_MISC_USER, ip, &al);
663	e.ip     = ip;
664	e.ms.map = al.map;
665	e.ms.maps = al.maps;
 
666
667	pr_debug("unwind: %s:ip = 0x%" PRIx64 " (0x%" PRIx64 ")\n",
668		 al.sym ? al.sym->name : "''",
669		 ip,
670		 al.map ? map__map_ip(al.map, ip) : (u64) 0);
671
672	ret = cb(&e, arg);
673	addr_location__exit(&al);
674	return ret;
675}
676
677static void display_error(int err)
678{
679	switch (err) {
680	case UNW_EINVAL:
681		pr_err("unwind: Only supports local.\n");
682		break;
683	case UNW_EUNSPEC:
684		pr_err("unwind: Unspecified error.\n");
685		break;
686	case UNW_EBADREG:
687		pr_err("unwind: Register unavailable.\n");
688		break;
689	default:
690		break;
691	}
692}
693
694static unw_accessors_t accessors = {
695	.find_proc_info		= find_proc_info,
696	.put_unwind_info	= put_unwind_info,
697	.get_dyn_info_list_addr	= get_dyn_info_list_addr,
698	.access_mem		= access_mem,
699	.access_reg		= access_reg,
700	.access_fpreg		= access_fpreg,
701	.resume			= resume,
702	.get_proc_name		= get_proc_name,
703};
704
705static int _unwind__prepare_access(struct maps *maps)
706{
707	void *addr_space = unw_create_addr_space(&accessors, 0);
708
709	RC_CHK_ACCESS(maps)->addr_space = addr_space;
710	if (!addr_space) {
711		pr_err("unwind: Can't create unwind address space.\n");
712		return -ENOMEM;
713	}
714
715	unw_set_caching_policy(addr_space, UNW_CACHE_GLOBAL);
716	return 0;
717}
718
719static void _unwind__flush_access(struct maps *maps)
720{
721	unw_flush_cache(maps__addr_space(maps), 0, 0);
 
 
722}
723
724static void _unwind__finish_access(struct maps *maps)
725{
726	unw_destroy_addr_space(maps__addr_space(maps));
 
 
727}
728
729static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
730		       void *arg, int max_stack)
731{
732	const char *arch = perf_env__arch(ui->machine->env);
733	u64 val;
734	unw_word_t ips[max_stack];
735	unw_addr_space_t addr_space;
736	unw_cursor_t c;
737	int ret, i = 0;
738
739	ret = perf_reg_value(&val, &ui->sample->user_regs,
740			     perf_arch_reg_ip(arch));
741	if (ret)
742		return ret;
743
744	ips[i++] = (unw_word_t) val;
745
746	/*
747	 * If we need more than one entry, do the DWARF
748	 * unwind itself.
749	 */
750	if (max_stack - 1 > 0) {
751		WARN_ONCE(!ui->thread, "WARNING: ui->thread is NULL");
752		addr_space = maps__addr_space(thread__maps(ui->thread));
753
754		if (addr_space == NULL)
755			return -1;
756
757		ret = unw_init_remote(&c, addr_space, ui);
758		if (ret && !ui->best_effort)
759			display_error(ret);
760
761		while (!ret && (unw_step(&c) > 0) && i < max_stack) {
762			unw_get_reg(&c, UNW_REG_IP, &ips[i]);
763
764			/*
765			 * Decrement the IP for any non-activation frames.
766			 * this is required to properly find the srcline
767			 * for caller frames.
768			 * See also the documentation for dwfl_frame_pc(),
769			 * which this code tries to replicate.
770			 */
771			if (unw_is_signal_frame(&c) <= 0)
772				--ips[i];
773
774			++i;
775		}
776
777		max_stack = i;
778	}
779
780	/*
781	 * Display what we got based on the order setup.
782	 */
783	for (i = 0; i < max_stack && !ret; i++) {
784		int j = i;
785
786		if (callchain_param.order == ORDER_CALLER)
787			j = max_stack - i - 1;
788		ret = ips[j] ? entry(ips[j], ui->thread, cb, arg) : 0;
789	}
790
791	return ret;
792}
793
794static int _unwind__get_entries(unwind_entry_cb_t cb, void *arg,
795			struct thread *thread,
796			struct perf_sample *data, int max_stack,
797			bool best_effort)
798{
799	struct unwind_info ui = {
800		.sample       = data,
801		.thread       = thread,
802		.machine      = maps__machine(thread__maps(thread)),
803		.best_effort  = best_effort
804	};
805
806	if (!data->user_regs.regs)
807		return -EINVAL;
808
809	if (max_stack <= 0)
810		return -EINVAL;
811
812	return get_entries(&ui, cb, arg, max_stack);
813}
814
815static struct unwind_libunwind_ops
816_unwind_libunwind_ops = {
817	.prepare_access = _unwind__prepare_access,
818	.flush_access   = _unwind__flush_access,
819	.finish_access  = _unwind__finish_access,
820	.get_entries    = _unwind__get_entries,
821};
822
823#ifndef REMOTE_UNWIND_LIBUNWIND
824struct unwind_libunwind_ops *
825local_unwind_libunwind_ops = &_unwind_libunwind_ops;
826#endif