[PATCH] FRV: Introduce asm-offsets for FRV arch
Introduce the use of asm-offsets into the FRV architecture. Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
6d8c4e3b01
commit
84e8cd6dbc
@@ -89,6 +89,7 @@ extern void gdbstub_do_rx(void);
|
||||
|
||||
extern asmlinkage void __debug_stub_init_break(void);
|
||||
extern asmlinkage void __break_hijack_kernel_event(void);
|
||||
extern asmlinkage void __break_hijack_kernel_event_breaks_here(void);
|
||||
extern asmlinkage void start_kernel(void);
|
||||
|
||||
extern asmlinkage void gdbstub_rx_handler(void);
|
||||
@@ -114,5 +115,26 @@ extern void console_set_baud(unsigned baud);
|
||||
#define gdbstub_proto(FMT,...) ({ 0; })
|
||||
#endif
|
||||
|
||||
/*
|
||||
* we dedicate GR31 to keeping a pointer to the gdbstub exception frame
|
||||
* - gr31 is destroyed on entry to the gdbstub if !MMU
|
||||
* - gr31 is saved in scr3 on entry to the gdbstub if in !MMU
|
||||
*/
|
||||
register struct frv_frame0 *__debug_frame0 asm("gr31");
|
||||
|
||||
#define __debug_frame (&__debug_frame0->regs)
|
||||
#define __debug_user_context (&__debug_frame0->uc)
|
||||
#define __debug_regs (&__debug_frame0->debug)
|
||||
#define __debug_reg(X) ((unsigned long *) ((unsigned long) &__debug_frame0 + (X)))
|
||||
|
||||
struct frv_debug_status {
|
||||
unsigned long bpsr;
|
||||
unsigned long dcr;
|
||||
unsigned long brr;
|
||||
unsigned long nmar;
|
||||
};
|
||||
|
||||
extern struct frv_debug_status __debug_status;
|
||||
|
||||
#endif /* _LANGUAGE_ASSEMBLY */
|
||||
#endif /* __ASM_GDB_STUB_H */
|
||||
|
||||
@@ -62,18 +62,10 @@
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/*
|
||||
* dedicate GR28; to keeping the a pointer to the current exception frame
|
||||
* we dedicate GR28 to keeping a pointer to the current exception frame
|
||||
* - gr28 is destroyed on entry to the kernel from userspace
|
||||
*/
|
||||
register struct pt_regs *__frame asm("gr28");
|
||||
register struct pt_regs *__debug_frame asm("gr31");
|
||||
|
||||
#ifndef container_of
|
||||
#define container_of(ptr, type, member) ({ \
|
||||
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
||||
(type *)( (char *)__mptr - offsetof(type,member) );})
|
||||
#endif
|
||||
|
||||
#define __debug_regs container_of(__debug_frame, struct pt_debug_regs, normal_regs)
|
||||
|
||||
#define user_mode(regs) (!((regs)->psr & PSR_S))
|
||||
#define instruction_pointer(regs) ((regs)->pc)
|
||||
|
||||
+35
-58
@@ -23,7 +23,13 @@
|
||||
*
|
||||
* +0x2000 +----------------------
|
||||
* | union {
|
||||
* | struct user_context
|
||||
* | 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)
|
||||
@@ -51,11 +57,11 @@
|
||||
#define _ASM_REGISTERS_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#define __OFFSET(X) (X)
|
||||
#define __OFFSET(X,N) ((X)+(N)*4)
|
||||
#define __OFFSETC(X,N) xxxxxxxxxxxxxxxxxxxxxxxx
|
||||
#else
|
||||
#define __OFFSET(X) ((X)*4)
|
||||
#define __OFFSETC(X,N) ((X)*4+(N))
|
||||
#define __OFFSET(X,N) ((X)+(N)*4)
|
||||
#define __OFFSETC(X,N) ((X)+(N))
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -117,30 +123,13 @@ struct pt_regs {
|
||||
|
||||
#endif
|
||||
|
||||
#define REG_PSR __OFFSET( 0) /* Processor Status Register */
|
||||
#define REG_ISR __OFFSET( 1) /* Integer Status Register */
|
||||
#define REG_CCR __OFFSET( 2) /* Condition Code Register */
|
||||
#define REG_CCCR __OFFSET( 3) /* Condition Code for Conditional Insns Register */
|
||||
#define REG_LR __OFFSET( 4) /* Link Register */
|
||||
#define REG_LCR __OFFSET( 5) /* Loop Count Register */
|
||||
#define REG_PC __OFFSET( 6) /* Program Counter */
|
||||
|
||||
#define REG__STATUS __OFFSET( 7) /* exception status */
|
||||
#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_SYSCALLNO __OFFSET( 8) /* syscall number or -1 */
|
||||
#define REG_ORIG_GR8 __OFFSET( 9) /* saved GR8 for signal handling */
|
||||
#define REG_GNER0 __OFFSET(10)
|
||||
#define REG_GNER1 __OFFSET(11)
|
||||
#define REG_IACC0 __OFFSET(12)
|
||||
|
||||
#define REG_TBR __OFFSET(14) /* Trap Vector Register */
|
||||
#define REG_GR(R) __OFFSET((14+(R)))
|
||||
#define REG__END REG_GR(32)
|
||||
#define REG_GR(R) __OFFSET(REG_GR0, (R))
|
||||
|
||||
#define REG_SP REG_GR(1)
|
||||
#define REG_FP REG_GR(2)
|
||||
@@ -149,27 +138,21 @@ struct pt_regs {
|
||||
|
||||
/*****************************************************************************/
|
||||
/*
|
||||
* extension tacked in front of the exception frame in debug mode
|
||||
* debugging registers
|
||||
*/
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
struct pt_debug_regs
|
||||
struct frv_debug_regs
|
||||
{
|
||||
unsigned long bpsr;
|
||||
unsigned long dcr;
|
||||
unsigned long brr;
|
||||
unsigned long nmar;
|
||||
struct pt_regs normal_regs;
|
||||
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
|
||||
|
||||
#define REG_NMAR __OFFSET(-1)
|
||||
#define REG_BRR __OFFSET(-2)
|
||||
#define REG_DCR __OFFSET(-3)
|
||||
#define REG_BPSR __OFFSET(-4)
|
||||
#define REG__DEBUG_XTRA __OFFSET(4)
|
||||
|
||||
/*****************************************************************************/
|
||||
/*
|
||||
* userspace registers
|
||||
@@ -223,33 +206,27 @@ struct user_context
|
||||
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 NR_USER_INT_REGS (14 + 64)
|
||||
#define NR_USER_FPMEDIA_REGS (64 + 2 + 2 + 8 + 8/4 + 1)
|
||||
#define NR_USER_CONTEXT (NR_USER_INT_REGS + NR_USER_FPMEDIA_REGS + 1)
|
||||
#define __INT_GR(R) __OFFSET(__INT_GR0, (R))
|
||||
|
||||
#define USER_CONTEXT_SIZE (((NR_USER_CONTEXT + 1) & ~1) * 4)
|
||||
#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_FRAME __OFFSET(0)
|
||||
#define __THREAD_CURR __OFFSET(1)
|
||||
#define __THREAD_SP __OFFSET(2)
|
||||
#define __THREAD_FP __OFFSET(3)
|
||||
#define __THREAD_LR __OFFSET(4)
|
||||
#define __THREAD_PC __OFFSET(5)
|
||||
#define __THREAD_GR(R) __OFFSET(6 + (R) - 16)
|
||||
#define __THREAD_FRAME0 __OFFSET(19)
|
||||
#define __THREAD_USER __OFFSET(19)
|
||||
|
||||
#define __USER_INT __OFFSET(0)
|
||||
#define __INT_GR(R) __OFFSET(14 + (R))
|
||||
|
||||
#define __USER_FPMEDIA __OFFSET(NR_USER_INT_REGS)
|
||||
#define __FPMEDIA_FR(R) __OFFSET(NR_USER_INT_REGS + (R))
|
||||
#define __FPMEDIA_FNER(R) __OFFSET(NR_USER_INT_REGS + 64 + (R))
|
||||
#define __FPMEDIA_MSR(R) __OFFSET(NR_USER_INT_REGS + 66 + (R))
|
||||
#define __FPMEDIA_ACC(R) __OFFSET(NR_USER_INT_REGS + 68 + (R))
|
||||
#define __FPMEDIA_ACCG(R) __OFFSETC(NR_USER_INT_REGS + 76, (R))
|
||||
#define __FPMEDIA_FSR(R) __OFFSET(NR_USER_INT_REGS + 78 + (R))
|
||||
#define __THREAD_GR(R) __OFFSET(__THREAD_GR16, (R) - 16)
|
||||
|
||||
#endif /* _ASM_REGISTERS_H */
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
#include <asm/processor.h>
|
||||
#endif
|
||||
|
||||
#define THREAD_SIZE 8192
|
||||
|
||||
/*
|
||||
* low level task data that entry.S needs immediate access to
|
||||
* - this struct should fit entirely inside of one cache line
|
||||
@@ -46,15 +48,7 @@ struct thread_info {
|
||||
|
||||
#else /* !__ASSEMBLY__ */
|
||||
|
||||
/* offsets into the thread_info struct for assembly code access */
|
||||
#define TI_TASK 0x00000000
|
||||
#define TI_EXEC_DOMAIN 0x00000004
|
||||
#define TI_FLAGS 0x00000008
|
||||
#define TI_STATUS 0x0000000C
|
||||
#define TI_CPU 0x00000010
|
||||
#define TI_PRE_COUNT 0x00000014
|
||||
#define TI_ADDR_LIMIT 0x00000018
|
||||
#define TI_RESTART_BLOCK 0x0000001C
|
||||
#include <asm/asm-offsets.h>
|
||||
|
||||
#endif
|
||||
|
||||
@@ -83,12 +77,6 @@ struct thread_info {
|
||||
#define init_thread_info (init_thread_union.thread_info)
|
||||
#define init_stack (init_thread_union.stack)
|
||||
|
||||
#ifdef CONFIG_SMALL_TASKS
|
||||
#define THREAD_SIZE 4096
|
||||
#else
|
||||
#define THREAD_SIZE 8192
|
||||
#endif
|
||||
|
||||
/* how to get the thread information struct from C */
|
||||
register struct thread_info *__current_thread_info asm("gr15");
|
||||
|
||||
@@ -111,11 +99,7 @@ register struct thread_info *__current_thread_info asm("gr15");
|
||||
|
||||
#define free_thread_info(info) kfree(info)
|
||||
|
||||
#else /* !__ASSEMBLY__ */
|
||||
|
||||
#define THREAD_SIZE 8192
|
||||
|
||||
#endif
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
/*
|
||||
* thread information flags
|
||||
|
||||
Reference in New Issue
Block a user