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 (1295B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Stack trace management functions
      4 *
      5 *  Copyright IBM Corp. 2006
      6 */
      7
      8#include <linux/stacktrace.h>
      9#include <asm/stacktrace.h>
     10#include <asm/unwind.h>
     11#include <asm/kprobes.h>
     12
     13void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
     14		     struct task_struct *task, struct pt_regs *regs)
     15{
     16	struct unwind_state state;
     17	unsigned long addr;
     18
     19	unwind_for_each_frame(&state, task, regs, 0) {
     20		addr = unwind_get_return_address(&state);
     21		if (!addr || !consume_entry(cookie, addr))
     22			break;
     23	}
     24}
     25
     26int arch_stack_walk_reliable(stack_trace_consume_fn consume_entry,
     27			     void *cookie, struct task_struct *task)
     28{
     29	struct unwind_state state;
     30	unsigned long addr;
     31
     32	unwind_for_each_frame(&state, task, NULL, 0) {
     33		if (state.stack_info.type != STACK_TYPE_TASK)
     34			return -EINVAL;
     35
     36		if (state.regs)
     37			return -EINVAL;
     38
     39		addr = unwind_get_return_address(&state);
     40		if (!addr)
     41			return -EINVAL;
     42
     43#ifdef CONFIG_KPROBES
     44		/*
     45		 * Mark stacktraces with kretprobed functions on them
     46		 * as unreliable.
     47		 */
     48		if (state.ip == (unsigned long)__kretprobe_trampoline)
     49			return -EINVAL;
     50#endif
     51
     52		if (!consume_entry(cookie, addr))
     53			return -EINVAL;
     54	}
     55
     56	/* Check for stack corruption */
     57	if (unwind_error(&state))
     58		return -EINVAL;
     59	return 0;
     60}