linux/arch/arc/include/asm/ptrace.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License version 2 as
   6 * published by the Free Software Foundation.
   7 *
   8 * Amit Bhor, Sameer Dhavale: Codito Technologies 2004
   9 */
  10#ifndef __ASM_ARC_PTRACE_H
  11#define __ASM_ARC_PTRACE_H
  12
  13#include <uapi/asm/ptrace.h>
  14
  15#ifndef __ASSEMBLY__
  16
  17/* THE pt_regs: Defines how regs are saved during entry into kernel */
  18
  19struct pt_regs {
  20        /*
  21         * 1 word gutter after reg-file has been saved
  22         * Technically not needed, Since SP always points to a "full" location
  23         * (vs. "empty"). But pt_regs is shared with tools....
  24         */
  25        long res;
  26
  27        /* Real registers */
  28        long bta;       /* bta_l1, bta_l2, erbta */
  29        long lp_start;
  30        long lp_end;
  31        long lp_count;
  32        long status32;  /* status32_l1, status32_l2, erstatus */
  33        long ret;       /* ilink1, ilink2 or eret */
  34        long blink;
  35        long fp;
  36        long r26;       /* gp */
  37        long r12;
  38        long r11;
  39        long r10;
  40        long r9;
  41        long r8;
  42        long r7;
  43        long r6;
  44        long r5;
  45        long r4;
  46        long r3;
  47        long r2;
  48        long r1;
  49        long r0;
  50        long sp;        /* user/kernel sp depending on where we came from  */
  51        long orig_r0;
  52
  53        /*to distinguish bet excp, syscall, irq */
  54        union {
  55                struct {
  56#ifdef CONFIG_CPU_BIG_ENDIAN
  57                /* so that assembly code is same for LE/BE */
  58                unsigned long orig_r8:16, event:16;
  59#else
  60                unsigned long event:16, orig_r8:16;
  61#endif
  62                };
  63                long orig_r8_word;
  64        };
  65};
  66
  67/* Callee saved registers - need to be saved only when you are scheduled out */
  68
  69struct callee_regs {
  70        long res;       /* Again this is not needed */
  71        long r25;
  72        long r24;
  73        long r23;
  74        long r22;
  75        long r21;
  76        long r20;
  77        long r19;
  78        long r18;
  79        long r17;
  80        long r16;
  81        long r15;
  82        long r14;
  83        long r13;
  84};
  85
  86#define instruction_pointer(regs)       ((regs)->ret)
  87#define profile_pc(regs)                instruction_pointer(regs)
  88
  89/* return 1 if user mode or 0 if kernel mode */
  90#define user_mode(regs) (regs->status32 & STATUS_U_MASK)
  91
  92#define user_stack_pointer(regs)\
  93({  unsigned int sp;            \
  94        if (user_mode(regs))    \
  95                sp = (regs)->sp;\
  96        else                    \
  97                sp = -1;        \
  98        sp;                     \
  99})
 100
 101/* return 1 if PC in delay slot */
 102#define delay_mode(regs) ((regs->status32 & STATUS_DE_MASK) == STATUS_DE_MASK)
 103
 104#define in_syscall(regs)    (regs->event & orig_r8_IS_SCALL)
 105#define in_brkpt_trap(regs) (regs->event & orig_r8_IS_BRKPT)
 106
 107#define syscall_wont_restart(regs) (regs->event |= orig_r8_IS_SCALL_RESTARTED)
 108#define syscall_restartable(regs) !(regs->event &  orig_r8_IS_SCALL_RESTARTED)
 109
 110#define current_pt_regs()                                       \
 111({                                                              \
 112        /* open-coded current_thread_info() */                  \
 113        register unsigned long sp asm ("sp");                   \
 114        unsigned long pg_start = (sp & ~(THREAD_SIZE - 1));     \
 115        (struct pt_regs *)(pg_start + THREAD_SIZE - 4) - 1;     \
 116})
 117
 118static inline long regs_return_value(struct pt_regs *regs)
 119{
 120        return regs->r0;
 121}
 122
 123#endif /* !__ASSEMBLY__ */
 124
 125#define orig_r8_IS_SCALL                0x0001
 126#define orig_r8_IS_SCALL_RESTARTED      0x0002
 127#define orig_r8_IS_BRKPT                0x0004
 128#define orig_r8_IS_EXCPN                0x0008
 129#define orig_r8_IS_IRQ1                 0x0010
 130#define orig_r8_IS_IRQ2                 0x0020
 131
 132#endif /* __ASM_PTRACE_H */
 133