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

ptrace.h (4304B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (C) 2012 Regents of the University of California
      4 */
      5
      6#ifndef _ASM_RISCV_PTRACE_H
      7#define _ASM_RISCV_PTRACE_H
      8
      9#include <uapi/asm/ptrace.h>
     10#include <asm/csr.h>
     11#include <linux/compiler.h>
     12
     13#ifndef __ASSEMBLY__
     14
     15struct pt_regs {
     16	unsigned long epc;
     17	unsigned long ra;
     18	unsigned long sp;
     19	unsigned long gp;
     20	unsigned long tp;
     21	unsigned long t0;
     22	unsigned long t1;
     23	unsigned long t2;
     24	unsigned long s0;
     25	unsigned long s1;
     26	unsigned long a0;
     27	unsigned long a1;
     28	unsigned long a2;
     29	unsigned long a3;
     30	unsigned long a4;
     31	unsigned long a5;
     32	unsigned long a6;
     33	unsigned long a7;
     34	unsigned long s2;
     35	unsigned long s3;
     36	unsigned long s4;
     37	unsigned long s5;
     38	unsigned long s6;
     39	unsigned long s7;
     40	unsigned long s8;
     41	unsigned long s9;
     42	unsigned long s10;
     43	unsigned long s11;
     44	unsigned long t3;
     45	unsigned long t4;
     46	unsigned long t5;
     47	unsigned long t6;
     48	/* Supervisor/Machine CSRs */
     49	unsigned long status;
     50	unsigned long badaddr;
     51	unsigned long cause;
     52	/* a0 value before the syscall */
     53	unsigned long orig_a0;
     54};
     55
     56#ifdef CONFIG_64BIT
     57#define REG_FMT "%016lx"
     58#else
     59#define REG_FMT "%08lx"
     60#endif
     61
     62#define user_mode(regs) (((regs)->status & SR_PP) == 0)
     63
     64#define MAX_REG_OFFSET offsetof(struct pt_regs, orig_a0)
     65
     66/* Helpers for working with the instruction pointer */
     67static inline unsigned long instruction_pointer(struct pt_regs *regs)
     68{
     69	return regs->epc;
     70}
     71static inline void instruction_pointer_set(struct pt_regs *regs,
     72					   unsigned long val)
     73{
     74	regs->epc = val;
     75}
     76
     77#define profile_pc(regs) instruction_pointer(regs)
     78
     79/* Helpers for working with the user stack pointer */
     80static inline unsigned long user_stack_pointer(struct pt_regs *regs)
     81{
     82	return regs->sp;
     83}
     84static inline void user_stack_pointer_set(struct pt_regs *regs,
     85					  unsigned long val)
     86{
     87	regs->sp =  val;
     88}
     89
     90/* Valid only for Kernel mode traps. */
     91static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
     92{
     93	return regs->sp;
     94}
     95
     96/* Helpers for working with the frame pointer */
     97static inline unsigned long frame_pointer(struct pt_regs *regs)
     98{
     99	return regs->s0;
    100}
    101static inline void frame_pointer_set(struct pt_regs *regs,
    102				     unsigned long val)
    103{
    104	regs->s0 = val;
    105}
    106
    107static inline unsigned long regs_return_value(struct pt_regs *regs)
    108{
    109	return regs->a0;
    110}
    111
    112static inline void regs_set_return_value(struct pt_regs *regs,
    113					 unsigned long val)
    114{
    115	regs->a0 = val;
    116}
    117
    118extern int regs_query_register_offset(const char *name);
    119extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
    120					       unsigned int n);
    121
    122void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
    123			   unsigned long frame_pointer);
    124int do_syscall_trace_enter(struct pt_regs *regs);
    125void do_syscall_trace_exit(struct pt_regs *regs);
    126
    127/**
    128 * regs_get_register() - get register value from its offset
    129 * @regs:	pt_regs from which register value is gotten
    130 * @offset:	offset of the register.
    131 *
    132 * regs_get_register returns the value of a register whose offset from @regs.
    133 * The @offset is the offset of the register in struct pt_regs.
    134 * If @offset is bigger than MAX_REG_OFFSET, this returns 0.
    135 */
    136static inline unsigned long regs_get_register(struct pt_regs *regs,
    137					      unsigned int offset)
    138{
    139	if (unlikely(offset > MAX_REG_OFFSET))
    140		return 0;
    141
    142	return *(unsigned long *)((unsigned long)regs + offset);
    143}
    144
    145/**
    146 * regs_get_kernel_argument() - get Nth function argument in kernel
    147 * @regs:       pt_regs of that context
    148 * @n:          function argument number (start from 0)
    149 *
    150 * regs_get_argument() returns @n th argument of the function call.
    151 *
    152 * Note you can get the parameter correctly if the function has no
    153 * more than eight arguments.
    154 */
    155static inline unsigned long regs_get_kernel_argument(struct pt_regs *regs,
    156						unsigned int n)
    157{
    158	static const int nr_reg_arguments = 8;
    159	static const unsigned int argument_offs[] = {
    160		offsetof(struct pt_regs, a0),
    161		offsetof(struct pt_regs, a1),
    162		offsetof(struct pt_regs, a2),
    163		offsetof(struct pt_regs, a3),
    164		offsetof(struct pt_regs, a4),
    165		offsetof(struct pt_regs, a5),
    166		offsetof(struct pt_regs, a6),
    167		offsetof(struct pt_regs, a7),
    168	};
    169
    170	if (n < nr_reg_arguments)
    171		return regs_get_register(regs, argument_offs[n]);
    172	return 0;
    173}
    174
    175#endif /* __ASSEMBLY__ */
    176
    177#endif /* _ASM_RISCV_PTRACE_H */