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