linux/arch/arc/include/asm/ptrace.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
   4 *
   5 * Amit Bhor, Sameer Dhavale: Codito Technologies 2004
   6 */
   7#ifndef __ASM_ARC_PTRACE_H
   8#define __ASM_ARC_PTRACE_H
   9
  10#include <uapi/asm/ptrace.h>
  11
  12#ifndef __ASSEMBLY__
  13
  14/* THE pt_regs: Defines how regs are saved during entry into kernel */
  15
  16#ifdef CONFIG_ISA_ARCOMPACT
  17struct pt_regs {
  18
  19#ifdef CONFIG_ARC_PLAT_EZNPS
  20        unsigned long eflags;   /* Extended FLAGS */
  21        unsigned long gpa1;     /* General Purpose Aux */
  22#endif
  23
  24        /* Real registers */
  25        unsigned long bta;      /* bta_l1, bta_l2, erbta */
  26
  27        unsigned long lp_start, lp_end, lp_count;
  28
  29        unsigned long status32; /* status32_l1, status32_l2, erstatus */
  30        unsigned long ret;      /* ilink1, ilink2 or eret */
  31        unsigned long blink;
  32        unsigned long fp;
  33        unsigned long r26;      /* gp */
  34
  35        unsigned long r12, r11, r10, r9, r8, r7, r6, r5, r4, r3, r2, r1, r0;
  36
  37        unsigned long sp;       /* User/Kernel depending on where we came from */
  38        unsigned long orig_r0;
  39
  40        /*
  41         * To distinguish bet excp, syscall, irq
  42         * For traps and exceptions, Exception Cause Register.
  43         *      ECR: <00> <VV> <CC> <PP>
  44         *      Last word used by Linux for extra state mgmt (syscall-restart)
  45         * For interrupts, use artificial ECR values to note current prio-level
  46         */
  47        union {
  48                struct {
  49#ifdef CONFIG_CPU_BIG_ENDIAN
  50                        unsigned long state:8, ecr_vec:8,
  51                                      ecr_cause:8, ecr_param:8;
  52#else
  53                        unsigned long ecr_param:8, ecr_cause:8,
  54                                      ecr_vec:8, state:8;
  55#endif
  56                };
  57                unsigned long event;
  58        };
  59
  60        unsigned long user_r25;
  61};
  62#else
  63
  64struct pt_regs {
  65
  66        unsigned long orig_r0;
  67
  68        union {
  69                struct {
  70#ifdef CONFIG_CPU_BIG_ENDIAN
  71                        unsigned long state:8, ecr_vec:8,
  72                                      ecr_cause:8, ecr_param:8;
  73#else
  74                        unsigned long ecr_param:8, ecr_cause:8,
  75                                      ecr_vec:8, state:8;
  76#endif
  77                };
  78                unsigned long event;
  79        };
  80
  81        unsigned long bta;      /* bta_l1, bta_l2, erbta */
  82
  83        unsigned long user_r25;
  84
  85        unsigned long r26;      /* gp */
  86        unsigned long fp;
  87        unsigned long sp;       /* user/kernel sp depending on where we came from  */
  88
  89        unsigned long r12, r30;
  90
  91#ifdef CONFIG_ARC_HAS_ACCL_REGS
  92        unsigned long r58, r59; /* ACCL/ACCH used by FPU / DSP MPY */
  93#endif
  94
  95        /*------- Below list auto saved by h/w -----------*/
  96        unsigned long r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11;
  97
  98        unsigned long blink;
  99        unsigned long lp_end, lp_start, lp_count;
 100
 101        unsigned long ei, ldi, jli;
 102
 103        unsigned long ret;
 104        unsigned long status32;
 105};
 106
 107#endif
 108
 109/* Callee saved registers - need to be saved only when you are scheduled out */
 110
 111struct callee_regs {
 112        unsigned long r25, r24, r23, r22, r21, r20, r19, r18, r17, r16, r15, r14, r13;
 113};
 114
 115#define instruction_pointer(regs)       ((regs)->ret)
 116#define profile_pc(regs)                instruction_pointer(regs)
 117
 118/* return 1 if user mode or 0 if kernel mode */
 119#define user_mode(regs) (regs->status32 & STATUS_U_MASK)
 120
 121#define user_stack_pointer(regs)\
 122({  unsigned int sp;            \
 123        if (user_mode(regs))    \
 124                sp = (regs)->sp;\
 125        else                    \
 126                sp = -1;        \
 127        sp;                     \
 128})
 129
 130/* return 1 if PC in delay slot */
 131#define delay_mode(regs) ((regs->status32 & STATUS_DE_MASK) == STATUS_DE_MASK)
 132
 133#define in_syscall(regs)    ((regs->ecr_vec == ECR_V_TRAP) && !regs->ecr_param)
 134#define in_brkpt_trap(regs) ((regs->ecr_vec == ECR_V_TRAP) && regs->ecr_param)
 135
 136#define STATE_SCALL_RESTARTED   0x01
 137
 138#define syscall_wont_restart(reg) (reg->state |= STATE_SCALL_RESTARTED)
 139#define syscall_restartable(reg) !(reg->state &  STATE_SCALL_RESTARTED)
 140
 141#define current_pt_regs()                                       \
 142({                                                              \
 143        /* open-coded current_thread_info() */                  \
 144        register unsigned long sp asm ("sp");                   \
 145        unsigned long pg_start = (sp & ~(THREAD_SIZE - 1));     \
 146        (struct pt_regs *)(pg_start + THREAD_SIZE) - 1; \
 147})
 148
 149static inline long regs_return_value(struct pt_regs *regs)
 150{
 151        return (long)regs->r0;
 152}
 153
 154#endif /* !__ASSEMBLY__ */
 155
 156#endif /* __ASM_PTRACE_H */
 157