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

return_address.c (901B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * arch/sh/kernel/return_address.c
      4 *
      5 * Copyright (C) 2009  Matt Fleming
      6 * Copyright (C) 2009  Paul Mundt
      7 */
      8#include <linux/kernel.h>
      9#include <linux/module.h>
     10#include <asm/dwarf.h>
     11
     12#ifdef CONFIG_DWARF_UNWINDER
     13
     14void *return_address(unsigned int depth)
     15{
     16	struct dwarf_frame *frame;
     17	unsigned long ra;
     18	int i;
     19
     20	for (i = 0, frame = NULL, ra = 0; i <= depth; i++) {
     21		struct dwarf_frame *tmp;
     22
     23		tmp = dwarf_unwind_stack(ra, frame);
     24		if (!tmp)
     25			return NULL;
     26
     27		if (frame)
     28			dwarf_free_frame(frame);
     29
     30		frame = tmp;
     31
     32		if (!frame || !frame->return_addr)
     33			break;
     34
     35		ra = frame->return_addr;
     36	}
     37
     38	/* Failed to unwind the stack to the specified depth. */
     39	WARN_ON(i != depth + 1);
     40
     41	if (frame)
     42		dwarf_free_frame(frame);
     43
     44	return (void *)ra;
     45}
     46
     47#else
     48
     49void *return_address(unsigned int depth)
     50{
     51	return NULL;
     52}
     53
     54#endif
     55
     56EXPORT_SYMBOL_GPL(return_address);