/* * Copyright 2010 Tilera Corporation. All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or * NON INFRINGEMENT. See the GNU General Public License for * more details. */ #ifndef _ASM_TILE_BACKTRACE_H #define _ASM_TILE_BACKTRACE_H #include <linux/types.h> /* Reads 'size' bytes from 'address' and writes the data to 'result'. * Returns true if successful, else false (e.g. memory not readable). */ typedef bool (*BacktraceMemoryReader)(void *result, unsigned long address, unsigned int size, void *extra); typedef struct { /* Current PC. */ unsigned long pc; /* Current stack pointer value. */ unsigned long sp; /* Current frame pointer value (i.e. caller's stack pointer) */ unsigned long fp; /* Internal use only: caller's PC for first frame. */ unsigned long initial_frame_caller_pc; /* Internal use only: callback to read memory. */ BacktraceMemoryReader read_memory_func; /* Internal use only: arbitrary argument to read_memory_func. */ void *read_memory_func_extra; } BacktraceIterator; typedef enum { /* We have no idea what the caller's pc is. */ PC_LOC_UNKNOWN, /* The caller's pc is currently in lr. */ PC_LOC_IN_LR, /* The caller's pc can be found by dereferencing the caller's sp. */ PC_LOC_ON_STACK } CallerPCLocation; typedef enum { /* We have no idea what the caller's sp is. */ SP_LOC_UNKNOWN, /* The caller's sp is currently in r52. */ SP_LOC_IN_R52, /* The caller's sp can be found by adding a certain constant * to the current value of sp. */ SP_LOC_OFFSET } CallerSPLocation; /* Bit values ORed into CALLER_* values for info ops. */ enum { /* Setting the low bit on any of these values means the info op * applies only to one bundle ago. */ ONE_BUNDLE_AGO_FLAG = 1, /* Setting this bit on a CALLER_SP_* value means the PC is in LR. * If not set, PC is on the stack. */ PC_IN_LR_FLAG = 2, /* This many of the low bits of a CALLER_SP_* value are for the * flag bits above. */ NUM_INFO_OP_FLAGS = 2, /* We cannot have one in the memory pipe so this is the maximum. */ MAX_INFO_OPS_PER_BUNDLE = 2 }; /* Internal constants used to define 'info' operands. */ enum { /* 0 and 1 are reserved, as are all negative numbers. */ CALLER_UNKNOWN_BASE = 2, CALLER_SP_IN_R52_BASE = 4, CALLER_SP_OFFSET_BASE = 8, }; /* Current backtracer state describing where it thinks the caller is. */ typedef struct { /* * Public fields */ /* How do we find the caller's PC? */ CallerPCLocation pc_location : 8; /* How do we find the caller's SP? */ CallerSPLocation sp_location : 8; /* If sp_location == SP_LOC_OFFSET, then caller_sp == sp + * loc->sp_offset. Else this field is undefined. */ uint16_t sp_offset; /* In the most recently visited bundle a terminating bundle? */ bool at_terminating_bundle; /* * Private fields */ /* Will the forward scanner see someone clobbering sp * (i.e. changing it with something other than addi sp, sp, N?) */ bool sp_clobber_follows; /* Operand to next "visible" info op (no more than one bundle past * the next terminating bundle), or -32768 if none. */ int16_t next_info_operand; /* Is the info of in next_info_op in the very next bundle? */ bool is_next_info_operand_adjacent; } CallerLocation; extern void backtrace_init(BacktraceIterator *state, BacktraceMemoryReader read_memory_func, void *read_memory_func_extra, unsigned long pc, unsigned long lr, unsigned long sp, unsigned long r52); extern bool backtrace_next(BacktraceIterator *state); #endif /* _ASM_TILE_BACKTRACE_H */
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
Kbuild | File | 439 B | 0644 |
|
asm-offsets.h | File | 35 B | 0644 |
|
atomic.h | File | 5.14 KB | 0644 |
|
atomic_32.h | File | 8.91 KB | 0644 |
|
atomic_64.h | File | 5.51 KB | 0644 |
|
backtrace.h | File | 3.98 KB | 0644 |
|
barrier.h | File | 2.89 KB | 0644 |
|
bitops.h | File | 2.37 KB | 0644 |
|
bitops_32.h | File | 4.01 KB | 0644 |
|
bitops_64.h | File | 2.67 KB | 0644 |
|
cache.h | File | 2.6 KB | 0644 |
|
cacheflush.h | File | 4.94 KB | 0644 |
|
checksum.h | File | 1.23 KB | 0644 |
|
cmpxchg.h | File | 3.47 KB | 0644 |
|
compat.h | File | 7.38 KB | 0644 |
|
current.h | File | 947 B | 0644 |
|
delay.h | File | 1.1 KB | 0644 |
|
device.h | File | 978 B | 0644 |
|
div64.h | File | 319 B | 0644 |
|
dma-mapping.h | File | 1.82 KB | 0644 |
|
dma.h | File | 762 B | 0644 |
|
elf.h | File | 5.42 KB | 0644 |
|
fixmap.h | File | 2.73 KB | 0644 |
|
ftrace.h | File | 1.08 KB | 0644 |
|
futex.h | File | 4.23 KB | 0644 |
|
hardirq.h | File | 1.28 KB | 0644 |
|
hardwall.h | File | 1.08 KB | 0644 |
|
highmem.h | File | 2.08 KB | 0644 |
|
homecache.h | File | 4.21 KB | 0644 |
|
hugetlb.h | File | 3.04 KB | 0644 |
|
hv_driver.h | File | 1.92 KB | 0644 |
|
ide.h | File | 758 B | 0644 |
|
insn.h | File | 1.79 KB | 0644 |
|
io.h | File | 12.43 KB | 0644 |
|
irq.h | File | 3.11 KB | 0644 |
|
irq_work.h | File | 283 B | 0644 |
|
irqflags.h | File | 10.55 KB | 0644 |
|
jump_label.h | File | 1.47 KB | 0644 |
|
kdebug.h | File | 769 B | 0644 |
|
kexec.h | File | 2.23 KB | 0644 |
|
kgdb.h | File | 1.99 KB | 0644 |
|
kmap_types.h | File | 1.02 KB | 0644 |
|
kprobes.h | File | 2.19 KB | 0644 |
|
linkage.h | File | 1.46 KB | 0644 |
|
mmu.h | File | 965 B | 0644 |
|
mmu_context.h | File | 4.5 KB | 0644 |
|
mmzone.h | File | 2.07 KB | 0644 |
|
module.h | File | 1.12 KB | 0644 |
|
page.h | File | 10.32 KB | 0644 |
|
pci.h | File | 6.58 KB | 0644 |
|
percpu.h | File | 1.79 KB | 0644 |
|
perf_event.h | File | 766 B | 0644 |
|
pgalloc.h | File | 4.76 KB | 0644 |
|
pgtable.h | File | 15.66 KB | 0644 |
|
pgtable_32.h | File | 4.08 KB | 0644 |
|
pgtable_64.h | File | 5.11 KB | 0644 |
|
pmc.h | File | 2.15 KB | 0644 |
|
processor.h | File | 10.62 KB | 0644 |
|
ptrace.h | File | 2.96 KB | 0644 |
|
sections.h | File | 1.37 KB | 0644 |
|
setup.h | File | 1.63 KB | 0644 |
|
sigframe.h | File | 956 B | 0644 |
|
signal.h | File | 1.07 KB | 0644 |
|
smp.h | File | 3.98 KB | 0644 |
|
spinlock.h | File | 741 B | 0644 |
|
spinlock_32.h | File | 2.9 KB | 0644 |
|
spinlock_64.h | File | 3.88 KB | 0644 |
|
spinlock_types.h | File | 1.58 KB | 0644 |
|
stack.h | File | 2.59 KB | 0644 |
|
string.h | File | 1.19 KB | 0644 |
|
switch_to.h | File | 2.75 KB | 0644 |
|
syscall.h | File | 2.88 KB | 0644 |
|
syscalls.h | File | 2.35 KB | 0644 |
|
thread_info.h | File | 5.54 KB | 0644 |
|
tile-desc.h | File | 650 B | 0644 |
|
tile-desc_32.h | File | 12.54 KB | 0644 |
|
tile-desc_64.h | File | 10.83 KB | 0644 |
|
timex.h | File | 1.71 KB | 0644 |
|
tlb.h | File | 878 B | 0644 |
|
tlbflush.h | File | 3.99 KB | 0644 |
|
topology.h | File | 1.52 KB | 0644 |
|
traps.h | File | 2.44 KB | 0644 |
|
uaccess.h | File | 12.77 KB | 0644 |
|
unaligned.h | File | 1.56 KB | 0644 |
|
unistd.h | File | 777 B | 0644 |
|
user.h | File | 717 B | 0644 |
|
vdso.h | File | 1.84 KB | 0644 |
|
vga.h | File | 1.05 KB | 0644 |
|
word-at-a-time.h | File | 1.07 KB | 0644 |
|