| /* 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__ | |
| 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__ | |
| 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]; | |
| }; | |
| }; | |
| 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]; | |
| }; | |
| 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))); | |
| 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 */ |