linux/arch/powerpc/include/asm/ptrace.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 * Copyright (C) 2001 PPC64 Team, IBM Corp
   4 *
   5 * This struct defines the way the registers are stored on the
   6 * kernel stack during a system call or other kernel entry.
   7 *
   8 * this should only contain volatile regs
   9 * since we can keep non-volatile in the thread_struct
  10 * should set this up when only volatiles are saved
  11 * by intr code.
  12 *
  13 * Since this is going on the stack, *CARE MUST BE TAKEN* to insure
  14 * that the overall structure is a multiple of 16 bytes in length.
  15 *
  16 * Note that the offsets of the fields in this struct correspond with
  17 * the PT_* values below.  This simplifies arch/powerpc/kernel/ptrace.c.
  18 */
  19#ifndef _ASM_POWERPC_PTRACE_H
  20#define _ASM_POWERPC_PTRACE_H
  21
  22#include <linux/err.h>
  23#include <uapi/asm/ptrace.h>
  24#include <asm/asm-const.h>
  25
  26#ifndef __ASSEMBLY__
  27struct pt_regs
  28{
  29        union {
  30                struct user_pt_regs user_regs;
  31                struct {
  32                        unsigned long gpr[32];
  33                        unsigned long nip;
  34                        unsigned long msr;
  35                        unsigned long orig_gpr3;
  36                        unsigned long ctr;
  37                        unsigned long link;
  38                        unsigned long xer;
  39                        unsigned long ccr;
  40#ifdef CONFIG_PPC64
  41                        unsigned long softe;
  42#else
  43                        unsigned long mq;
  44#endif
  45                        unsigned long trap;
  46                        unsigned long dar;
  47                        unsigned long dsisr;
  48                        unsigned long result;
  49                };
  50        };
  51#if defined(CONFIG_PPC64) || defined(CONFIG_PPC_KUAP)
  52        union {
  53                struct {
  54#ifdef CONFIG_PPC64
  55                        unsigned long ppr;
  56                        unsigned long exit_result;
  57#endif
  58                        union {
  59#ifdef CONFIG_PPC_KUAP
  60                                unsigned long kuap;
  61#endif
  62#ifdef CONFIG_PPC_PKEY
  63                                unsigned long amr;
  64#endif
  65                        };
  66#ifdef CONFIG_PPC_PKEY
  67                        unsigned long iamr;
  68#endif
  69                };
  70                unsigned long __pad[4]; /* Maintain 16 byte interrupt stack alignment */
  71        };
  72#endif
  73#if defined(CONFIG_PPC32) && defined(CONFIG_BOOKE)
  74        struct { /* Must be a multiple of 16 bytes */
  75                unsigned long mas0;
  76                unsigned long mas1;
  77                unsigned long mas2;
  78                unsigned long mas3;
  79                unsigned long mas6;
  80                unsigned long mas7;
  81                unsigned long srr0;
  82                unsigned long srr1;
  83                unsigned long csrr0;
  84                unsigned long csrr1;
  85                unsigned long dsrr0;
  86                unsigned long dsrr1;
  87        };
  88#endif
  89};
  90#endif
  91
  92
  93#define STACK_FRAME_WITH_PT_REGS (STACK_FRAME_OVERHEAD + sizeof(struct pt_regs))
  94
  95#ifdef __powerpc64__
  96
  97/*
  98 * Size of redzone that userspace is allowed to use below the stack
  99 * pointer.  This is 288 in the 64-bit big-endian ELF ABI, and 512 in
 100 * the new ELFv2 little-endian ABI, so we allow the larger amount.
 101 *
 102 * For kernel code we allow a 288-byte redzone, in order to conserve
 103 * kernel stack space; gcc currently only uses 288 bytes, and will
 104 * hopefully allow explicit control of the redzone size in future.
 105 */
 106#define USER_REDZONE_SIZE       512
 107#define KERNEL_REDZONE_SIZE     288
 108
 109#define STACK_FRAME_OVERHEAD    112     /* size of minimum stack frame */
 110#define STACK_FRAME_LR_SAVE     2       /* Location of LR in stack frame */
 111#define STACK_FRAME_REGS_MARKER ASM_CONST(0x7265677368657265)
 112#define STACK_INT_FRAME_SIZE    (sizeof(struct pt_regs) + \
 113                                 STACK_FRAME_OVERHEAD + KERNEL_REDZONE_SIZE)
 114#define STACK_FRAME_MARKER      12
 115
 116#ifdef PPC64_ELF_ABI_v2
 117#define STACK_FRAME_MIN_SIZE    32
 118#else
 119#define STACK_FRAME_MIN_SIZE    STACK_FRAME_OVERHEAD
 120#endif
 121
 122/* Size of dummy stack frame allocated when calling signal handler. */
 123#define __SIGNAL_FRAMESIZE      128
 124#define __SIGNAL_FRAMESIZE32    64
 125
 126#else /* __powerpc64__ */
 127
 128#define USER_REDZONE_SIZE       0
 129#define KERNEL_REDZONE_SIZE     0
 130#define STACK_FRAME_OVERHEAD    16      /* size of minimum stack frame */
 131#define STACK_FRAME_LR_SAVE     1       /* Location of LR in stack frame */
 132#define STACK_FRAME_REGS_MARKER ASM_CONST(0x72656773)
 133#define STACK_INT_FRAME_SIZE    (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD)
 134#define STACK_FRAME_MARKER      2
 135#define STACK_FRAME_MIN_SIZE    STACK_FRAME_OVERHEAD
 136
 137/* Size of stack frame allocated when calling signal handler. */
 138#define __SIGNAL_FRAMESIZE      64
 139
 140#endif /* __powerpc64__ */
 141
 142#ifndef __ASSEMBLY__
 143#include <asm/paca.h>
 144
 145#ifdef CONFIG_SMP
 146extern unsigned long profile_pc(struct pt_regs *regs);
 147#else
 148#define profile_pc(regs) instruction_pointer(regs)
 149#endif
 150
 151long do_syscall_trace_enter(struct pt_regs *regs);
 152void do_syscall_trace_leave(struct pt_regs *regs);
 153
 154static inline void set_return_regs_changed(void)
 155{
 156#ifdef CONFIG_PPC_BOOK3S_64
 157        local_paca->hsrr_valid = 0;
 158        local_paca->srr_valid = 0;
 159#endif
 160}
 161
 162static inline void regs_set_return_ip(struct pt_regs *regs, unsigned long ip)
 163{
 164        regs->nip = ip;
 165        set_return_regs_changed();
 166}
 167
 168static inline void regs_set_return_msr(struct pt_regs *regs, unsigned long msr)
 169{
 170        regs->msr = msr;
 171        set_return_regs_changed();
 172}
 173
 174static inline void regs_add_return_ip(struct pt_regs *regs, long offset)
 175{
 176        regs_set_return_ip(regs, regs->nip + offset);
 177}
 178
 179static inline unsigned long instruction_pointer(struct pt_regs *regs)
 180{
 181        return regs->nip;
 182}
 183
 184static inline void instruction_pointer_set(struct pt_regs *regs,
 185                unsigned long val)
 186{
 187        regs_set_return_ip(regs, val);
 188}
 189
 190static inline unsigned long user_stack_pointer(struct pt_regs *regs)
 191{
 192        return regs->gpr[1];
 193}
 194
 195static inline unsigned long frame_pointer(struct pt_regs *regs)
 196{
 197        return 0;
 198}
 199
 200#ifdef __powerpc64__
 201#define user_mode(regs) ((((regs)->msr) >> MSR_PR_LG) & 0x1)
 202#else
 203#define user_mode(regs) (((regs)->msr & MSR_PR) != 0)
 204#endif
 205
 206#define force_successful_syscall_return()   \
 207        do { \
 208                set_thread_flag(TIF_NOERROR); \
 209        } while(0)
 210
 211#define current_pt_regs() \
 212        ((struct pt_regs *)((unsigned long)task_stack_page(current) + THREAD_SIZE) - 1)
 213
 214/*
 215 * The 4 low bits (0xf) are available as flags to overload the trap word,
 216 * because interrupt vectors have minimum alignment of 0x10. TRAP_FLAGS_MASK
 217 * must cover the bits used as flags, including bit 0 which is used as the
 218 * "norestart" bit.
 219 */
 220#ifdef __powerpc64__
 221#define TRAP_FLAGS_MASK         0x1
 222#else
 223/*
 224 * On 4xx we use bit 1 in the trap word to indicate whether the exception
 225 * is a critical exception (1 means it is).
 226 */
 227#define TRAP_FLAGS_MASK         0xf
 228#define IS_CRITICAL_EXC(regs)   (((regs)->trap & 2) != 0)
 229#define IS_MCHECK_EXC(regs)     (((regs)->trap & 4) != 0)
 230#define IS_DEBUG_EXC(regs)      (((regs)->trap & 8) != 0)
 231#endif /* __powerpc64__ */
 232#define TRAP(regs)              ((regs)->trap & ~TRAP_FLAGS_MASK)
 233
 234static __always_inline void set_trap(struct pt_regs *regs, unsigned long val)
 235{
 236        regs->trap = (regs->trap & TRAP_FLAGS_MASK) | (val & ~TRAP_FLAGS_MASK);
 237}
 238
 239static inline bool trap_is_scv(struct pt_regs *regs)
 240{
 241        return (IS_ENABLED(CONFIG_PPC_BOOK3S_64) && TRAP(regs) == 0x3000);
 242}
 243
 244static inline bool trap_is_unsupported_scv(struct pt_regs *regs)
 245{
 246        return IS_ENABLED(CONFIG_PPC_BOOK3S_64) && TRAP(regs) == 0x7ff0;
 247}
 248
 249static inline bool trap_is_syscall(struct pt_regs *regs)
 250{
 251        return (trap_is_scv(regs) || TRAP(regs) == 0xc00);
 252}
 253
 254static inline bool trap_norestart(struct pt_regs *regs)
 255{
 256        return regs->trap & 0x1;
 257}
 258
 259static __always_inline void set_trap_norestart(struct pt_regs *regs)
 260{
 261        regs->trap |= 0x1;
 262}
 263
 264#define kernel_stack_pointer(regs) ((regs)->gpr[1])
 265static inline int is_syscall_success(struct pt_regs *regs)
 266{
 267        if (trap_is_scv(regs))
 268                return !IS_ERR_VALUE((unsigned long)regs->gpr[3]);
 269        else
 270                return !(regs->ccr & 0x10000000);
 271}
 272
 273static inline long regs_return_value(struct pt_regs *regs)
 274{
 275        if (trap_is_scv(regs))
 276                return regs->gpr[3];
 277
 278        if (is_syscall_success(regs))
 279                return regs->gpr[3];
 280        else
 281                return -regs->gpr[3];
 282}
 283
 284static inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc)
 285{
 286        regs->gpr[3] = rc;
 287}
 288
 289#define arch_has_single_step()  (1)
 290#define arch_has_block_step()   (true)
 291#define ARCH_HAS_USER_SINGLE_STEP_REPORT
 292
 293/*
 294 * kprobe-based event tracer support
 295 */
 296
 297#include <linux/stddef.h>
 298#include <linux/thread_info.h>
 299extern int regs_query_register_offset(const char *name);
 300extern const char *regs_query_register_name(unsigned int offset);
 301#define MAX_REG_OFFSET (offsetof(struct pt_regs, dsisr))
 302
 303/**
 304 * regs_get_register() - get register value from its offset
 305 * @regs:          pt_regs from which register value is gotten
 306 * @offset:    offset number of the register.
 307 *
 308 * regs_get_register returns the value of a register whose offset from @regs.
 309 * The @offset is the offset of the register in struct pt_regs.
 310 * If @offset is bigger than MAX_REG_OFFSET, this returns 0.
 311 */
 312static inline unsigned long regs_get_register(struct pt_regs *regs,
 313                                                unsigned int offset)
 314{
 315        if (unlikely(offset > MAX_REG_OFFSET))
 316                return 0;
 317        return *(unsigned long *)((unsigned long)regs + offset);
 318}
 319
 320/**
 321 * regs_within_kernel_stack() - check the address in the stack
 322 * @regs:      pt_regs which contains kernel stack pointer.
 323 * @addr:      address which is checked.
 324 *
 325 * regs_within_kernel_stack() checks @addr is within the kernel stack page(s).
 326 * If @addr is within the kernel stack, it returns true. If not, returns false.
 327 */
 328
 329static inline bool regs_within_kernel_stack(struct pt_regs *regs,
 330                                                unsigned long addr)
 331{
 332        return ((addr & ~(THREAD_SIZE - 1))  ==
 333                (kernel_stack_pointer(regs) & ~(THREAD_SIZE - 1)));
 334}
 335
 336/**
 337 * regs_get_kernel_stack_nth() - get Nth entry of the stack
 338 * @regs:       pt_regs which contains kernel stack pointer.
 339 * @n:          stack entry number.
 340 *
 341 * regs_get_kernel_stack_nth() returns @n th entry of the kernel stack which
 342 * is specified by @regs. If the @n th entry is NOT in the kernel stack,
 343 * this returns 0.
 344 */
 345static inline unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
 346                                                      unsigned int n)
 347{
 348        unsigned long *addr = (unsigned long *)kernel_stack_pointer(regs);
 349        addr += n;
 350        if (regs_within_kernel_stack(regs, (unsigned long)addr))
 351                return *addr;
 352        else
 353                return 0;
 354}
 355
 356#endif /* __ASSEMBLY__ */
 357
 358#ifndef __powerpc64__
 359/* We need PT_SOFTE defined at all time to avoid #ifdefs */
 360#define PT_SOFTE PT_MQ
 361#else /* __powerpc64__ */
 362#define PT_FPSCR32 (PT_FPR0 + 2*32 + 1) /* each FP reg occupies 2 32-bit userspace slots */
 363#define PT_VR0_32 164   /* each Vector reg occupies 4 slots in 32-bit */
 364#define PT_VSCR_32 (PT_VR0 + 32*4 + 3)
 365#define PT_VRSAVE_32 (PT_VR0 + 33*4)
 366#define PT_VSR0_32 300  /* each VSR reg occupies 4 slots in 32-bit */
 367#endif /* __powerpc64__ */
 368#endif /* _ASM_POWERPC_PTRACE_H */
 369