cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

stacktrace.c (1174B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Stack trace management functions
      4 *
      5 *  Copyright (C) 2009-2021 Helge Deller <deller@gmx.de>
      6 *  based on arch/x86/kernel/stacktrace.c by Ingo Molnar <mingo@redhat.com>
      7 *  and parisc unwind functions by Randolph Chung <tausq@debian.org>
      8 *
      9 *  TODO: Userspace stacktrace (CONFIG_USER_STACKTRACE_SUPPORT)
     10 */
     11#include <linux/kernel.h>
     12#include <linux/stacktrace.h>
     13
     14#include <asm/unwind.h>
     15
     16static void notrace walk_stackframe(struct task_struct *task,
     17	struct pt_regs *regs, bool (*fn)(void *, unsigned long), void *cookie)
     18{
     19	struct unwind_frame_info info;
     20
     21	unwind_frame_init_task(&info, task, NULL);
     22	while (1) {
     23		if (unwind_once(&info) < 0 || info.ip == 0)
     24			break;
     25
     26		if (__kernel_text_address(info.ip))
     27			if (!fn(cookie, info.ip))
     28				break;
     29	}
     30}
     31
     32void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
     33		     struct task_struct *task, struct pt_regs *regs)
     34{
     35	walk_stackframe(task, regs, consume_entry, cookie);
     36}
     37
     38int arch_stack_walk_reliable(stack_trace_consume_fn consume_entry, void *cookie,
     39			     struct task_struct *task)
     40{
     41	walk_stackframe(task, NULL, consume_entry, cookie);
     42	return 1;
     43}