Logo Search packages:      
Sourcecode: linux version File versions  Download package

registers.h

/* registers.h: register frame declarations
 *
 * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
 * Written by David Howells (dhowells@redhat.com)
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 */

/*
 * notes:
 *
 * (1) that the members of all these structures are carefully aligned to permit
 *     usage of STD/STDF instructions
 *
 * (2) if you change these structures, you must change the code in
 *     arch/frvnommu/kernel/{break.S,entry.S,switch_to.S,gdb-stub.c}
 *
 *
 * the kernel stack space block looks like this:
 *
 *    +0x2000     +----------------------
 *          | union {
 *          |     struct frv_frame0 {
 *          |           struct user_context {
 *          |                 struct user_int_regs
 *          |                 struct user_fpmedia_regs
 *          |           }
 *          |           struct frv_debug_regs
 *          |     }
 *          |     struct pt_regs [user exception]
 *          | }
 *          +---------------------- <-- __kernel_frame0_ptr (maybe GR28)
 *          |
 *          | kernel stack
 *          |
 *          |......................
 *          | struct pt_regs [kernel exception]
 *          |...................... <-- __kernel_frame0_ptr (maybe GR28)
 *          |
 *          | kernel stack
 *          |
 *          |...................... <-- stack pointer (GR1)
 *          |
 *          | unused stack space
 *          |
 *          +----------------------
 *          | struct thread_info
 *    +0x0000     +---------------------- <-- __current_thread_info (GR15);
 *
 * note that GR28 points to the current exception frame
 */

#ifndef _ASM_REGISTERS_H
#define _ASM_REGISTERS_H

#ifndef __ASSEMBLY__
#define __OFFSET(X,N)   ((X)+(N)*4)
#define __OFFSETC(X,N)  xxxxxxxxxxxxxxxxxxxxxxxx
#else
#define __OFFSET(X,N)   ((X)+(N)*4)
#define __OFFSETC(X,N)  ((X)+(N))
#endif

/*****************************************************************************/
/*
 * Exception/Interrupt frame
 * - held on kernel stack
 * - 8-byte aligned on stack (old SP is saved in frame)
 * - GR0 is fixed 0, so we don't save it
 */
#ifndef __ASSEMBLY__

struct pt_regs {
      unsigned long           psr;        /* Processor Status Register */
      unsigned long           isr;        /* Integer Status Register */
      unsigned long           ccr;        /* Condition Code Register */
      unsigned long           cccr;       /* Condition Code for Conditional Insns Register */
      unsigned long           lr;         /* Link Register */
      unsigned long           lcr;        /* Loop Count Register */
      unsigned long           pc;         /* Program Counter Register */
      unsigned long           __status;   /* exception status */
      unsigned long           syscallno;  /* syscall number or -1 */
      unsigned long           orig_gr8;   /* original syscall arg #1 */
      unsigned long           gner0;
      unsigned long           gner1;
      unsigned long long      iacc0;
      unsigned long           tbr;        /* GR0 is fixed zero, so we use this for TBR */
      unsigned long           sp;         /* GR1: USP/KSP */
      unsigned long           fp;         /* GR2: FP */
      unsigned long           gr3;
      unsigned long           gr4;
      unsigned long           gr5;
      unsigned long           gr6;
      unsigned long           gr7;        /* syscall number */
      unsigned long           gr8;        /* 1st syscall param; syscall return */
      unsigned long           gr9;        /* 2nd syscall param */
      unsigned long           gr10;       /* 3rd syscall param */
      unsigned long           gr11;       /* 4th syscall param */
      unsigned long           gr12;       /* 5th syscall param */
      unsigned long           gr13;       /* 6th syscall param */
      unsigned long           gr14;
      unsigned long           gr15;
      unsigned long           gr16;       /* GP pointer */
      unsigned long           gr17;       /* small data */
      unsigned long           gr18;       /* PIC/PID */
      unsigned long           gr19;
      unsigned long           gr20;
      unsigned long           gr21;
      unsigned long           gr22;
      unsigned long           gr23;
      unsigned long           gr24;
      unsigned long           gr25;
      unsigned long           gr26;
      unsigned long           gr27;
      struct pt_regs          *next_frame;      /* GR28 - next exception frame */
      unsigned long           gr29;       /* GR29 - OS reserved */
      unsigned long           gr30;       /* GR30 - OS reserved */
      unsigned long           gr31;       /* GR31 - OS reserved */
} __attribute__((aligned(8)));

#endif

#define REG__STATUS_STEP      0x00000001  /* - reenable single stepping on return */
#define REG__STATUS_STEPPED   0x00000002  /* - single step caused exception */
#define REG__STATUS_BROKE     0x00000004  /* - BREAK insn caused exception */
#define REG__STATUS_SYSC_ENTRY      0x40000000  /* - T on syscall entry (ptrace.c only) */
#define REG__STATUS_SYSC_EXIT 0x80000000  /* - T on syscall exit (ptrace.c only) */

#define REG_GR(R) __OFFSET(REG_GR0, (R))

#define REG_SP          REG_GR(1)
#define REG_FP          REG_GR(2)
#define REG_PREV_FRAME  REG_GR(28)  /* previous exception frame pointer (old gr28 value) */
#define REG_CURR_TASK   REG_GR(29)  /* current task */

/*****************************************************************************/
/*
 * debugging registers
 */
#ifndef __ASSEMBLY__

00145 struct frv_debug_regs
{
      unsigned long           dcr;
      unsigned long           ibar[4] __attribute__((aligned(8)));
      unsigned long           dbar[4] __attribute__((aligned(8)));
      unsigned long           dbdr[4][4] __attribute__((aligned(8)));
      unsigned long           dbmr[4][4] __attribute__((aligned(8)));
} __attribute__((aligned(8)));

#endif

/*****************************************************************************/
/*
 * userspace registers
 */
#ifndef __ASSEMBLY__

00162 struct user_int_regs
{
      /* integer registers
       * - up to gr[31] mirror pt_regs
       * - total size must be multiple of 8 bytes
       */
      unsigned long           psr;        /* Processor Status Register */
      unsigned long           isr;        /* Integer Status Register */
      unsigned long           ccr;        /* Condition Code Register */
      unsigned long           cccr;       /* Condition Code for Conditional Insns Register */
      unsigned long           lr;         /* Link Register */
      unsigned long           lcr;        /* Loop Count Register */
      unsigned long           pc;         /* Program Counter Register */
      unsigned long           __status;   /* exception status */
      unsigned long           syscallno;  /* syscall number or -1 */
      unsigned long           orig_gr8;   /* original syscall arg #1 */
      unsigned long           gner[2];
      unsigned long long      iacc[1];

      union {
            unsigned long     tbr;
            unsigned long     gr[64];
      };
};

00187 struct user_fpmedia_regs
{
      /* FP/Media registers */
      unsigned long     fr[64];
      unsigned long     fner[2];
      unsigned long     msr[2];
      unsigned long     acc[8];
      unsigned char     accg[8];
      unsigned long     fsr[1];
};

00198 struct user_context
{
      struct user_int_regs          i;
      struct user_fpmedia_regs      f;

      /* we provide a context extension so that we can save the regs for CPUs that
       * implement many more of Fujitsu's lavish register spec
       */
      void *extension;
} __attribute__((aligned(8)));

00209 struct frv_frame0 {
      union {
            struct pt_regs          regs;
            struct user_context     uc;
      };

      struct frv_debug_regs         debug;

} __attribute__((aligned(32)));

#endif

#define __INT_GR(R)           __OFFSET(__INT_GR0,           (R))

#define __FPMEDIA_FR(R)       __OFFSET(__FPMEDIA_FR0,       (R))
#define __FPMEDIA_FNER(R)     __OFFSET(__FPMEDIA_FNER0,     (R))
#define __FPMEDIA_MSR(R)      __OFFSET(__FPMEDIA_MSR0,      (R))
#define __FPMEDIA_ACC(R)      __OFFSET(__FPMEDIA_ACC0,      (R))
#define __FPMEDIA_ACCG(R)     __OFFSETC(__FPMEDIA_ACCG0,    (R))
#define __FPMEDIA_FSR(R)      __OFFSET(__FPMEDIA_FSR0,      (R))

#define __THREAD_GR(R)        __OFFSET(__THREAD_GR16,       (R) - 16)

#endif /* _ASM_REGISTERS_H */

Generated by  Doxygen 1.6.0   Back to index