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


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * arch/arm64/kernel/return_address.c
      4 *
      5 * Copyright (C) 2013 Linaro Limited
      6 * Author: AKASHI Takahiro <takahiro.akashi@linaro.org>
      7 */
      8
      9#include <linux/export.h>
     10#include <linux/ftrace.h>
     11#include <linux/kprobes.h>
     12#include <linux/stacktrace.h>
     13
     14#include <asm/stack_pointer.h>
     15
     16struct return_address_data {
     17	unsigned int level;
     18	void *addr;
     19};
     20
     21static bool save_return_addr(void *d, unsigned long pc)
     22{
     23	struct return_address_data *data = d;
     24
     25	if (!data->level) {
     26		data->addr = (void *)pc;
     27		return false;
     28	} else {
     29		--data->level;
     30		return true;
     31	}
     32}
     33NOKPROBE_SYMBOL(save_return_addr);
     34
     35void *return_address(unsigned int level)
     36{
     37	struct return_address_data data;
     38
     39	data.level = level + 2;
     40	data.addr = NULL;
     41
     42	arch_stack_walk(save_return_addr, &data, current, NULL);
     43
     44	if (!data.level)
     45		return data.addr;
     46	else
     47		return NULL;
     48}
     49EXPORT_SYMBOL_GPL(return_address);
     50NOKPROBE_SYMBOL(return_address);