164 lines
		
	
	
	
		
			3.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			164 lines
		
	
	
	
		
			3.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) | ||
|  |  * | ||
|  |  * This program is free software; you can redistribute it and/or modify | ||
|  |  * it under the terms of the GNU General Public License version 2 as | ||
|  |  * published by the Free Software Foundation. | ||
|  |  */ | ||
|  | 
 | ||
|  | #ifndef _ASM_ARC_UNWIND_H
 | ||
|  | #define _ASM_ARC_UNWIND_H
 | ||
|  | 
 | ||
|  | #ifdef CONFIG_ARC_DW2_UNWIND
 | ||
|  | 
 | ||
|  | #include <linux/sched.h>
 | ||
|  | 
 | ||
|  | struct arc700_regs { | ||
|  | 	unsigned long r0; | ||
|  | 	unsigned long r1; | ||
|  | 	unsigned long r2; | ||
|  | 	unsigned long r3; | ||
|  | 	unsigned long r4; | ||
|  | 	unsigned long r5; | ||
|  | 	unsigned long r6; | ||
|  | 	unsigned long r7; | ||
|  | 	unsigned long r8; | ||
|  | 	unsigned long r9; | ||
|  | 	unsigned long r10; | ||
|  | 	unsigned long r11; | ||
|  | 	unsigned long r12; | ||
|  | 	unsigned long r13; | ||
|  | 	unsigned long r14; | ||
|  | 	unsigned long r15; | ||
|  | 	unsigned long r16; | ||
|  | 	unsigned long r17; | ||
|  | 	unsigned long r18; | ||
|  | 	unsigned long r19; | ||
|  | 	unsigned long r20; | ||
|  | 	unsigned long r21; | ||
|  | 	unsigned long r22; | ||
|  | 	unsigned long r23; | ||
|  | 	unsigned long r24; | ||
|  | 	unsigned long r25; | ||
|  | 	unsigned long r26; | ||
|  | 	unsigned long r27;	/* fp */ | ||
|  | 	unsigned long r28;	/* sp */ | ||
|  | 	unsigned long r29; | ||
|  | 	unsigned long r30; | ||
|  | 	unsigned long r31;	/* blink */ | ||
|  | 	unsigned long r63;	/* pc */ | ||
|  | }; | ||
|  | 
 | ||
|  | struct unwind_frame_info { | ||
|  | 	struct arc700_regs regs; | ||
|  | 	struct task_struct *task; | ||
|  | 	unsigned call_frame:1; | ||
|  | }; | ||
|  | 
 | ||
|  | #define UNW_PC(frame)		((frame)->regs.r63)
 | ||
|  | #define UNW_SP(frame)		((frame)->regs.r28)
 | ||
|  | #define UNW_BLINK(frame)	((frame)->regs.r31)
 | ||
|  | 
 | ||
|  | /* Rajesh FIXME */ | ||
|  | #ifdef CONFIG_FRAME_POINTER
 | ||
|  | #define UNW_FP(frame)		((frame)->regs.r27)
 | ||
|  | #define FRAME_RETADDR_OFFSET	4
 | ||
|  | #define FRAME_LINK_OFFSET	0
 | ||
|  | #define STACK_BOTTOM_UNW(tsk)	STACK_LIMIT((tsk)->thread.ksp)
 | ||
|  | #define STACK_TOP_UNW(tsk)	((tsk)->thread.ksp)
 | ||
|  | #else
 | ||
|  | #define UNW_FP(frame)		((void)(frame), 0)
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #define STACK_LIMIT(ptr)	(((ptr) - 1) & ~(THREAD_SIZE - 1))
 | ||
|  | 
 | ||
|  | #define UNW_REGISTER_INFO \
 | ||
|  | 	PTREGS_INFO(r0), \ | ||
|  | 	PTREGS_INFO(r1), \ | ||
|  | 	PTREGS_INFO(r2), \ | ||
|  | 	PTREGS_INFO(r3), \ | ||
|  | 	PTREGS_INFO(r4), \ | ||
|  | 	PTREGS_INFO(r5), \ | ||
|  | 	PTREGS_INFO(r6), \ | ||
|  | 	PTREGS_INFO(r7), \ | ||
|  | 	PTREGS_INFO(r8), \ | ||
|  | 	PTREGS_INFO(r9), \ | ||
|  | 	PTREGS_INFO(r10), \ | ||
|  | 	PTREGS_INFO(r11), \ | ||
|  | 	PTREGS_INFO(r12), \ | ||
|  | 	PTREGS_INFO(r13), \ | ||
|  | 	PTREGS_INFO(r14), \ | ||
|  | 	PTREGS_INFO(r15), \ | ||
|  | 	PTREGS_INFO(r16), \ | ||
|  | 	PTREGS_INFO(r17), \ | ||
|  | 	PTREGS_INFO(r18), \ | ||
|  | 	PTREGS_INFO(r19), \ | ||
|  | 	PTREGS_INFO(r20), \ | ||
|  | 	PTREGS_INFO(r21), \ | ||
|  | 	PTREGS_INFO(r22), \ | ||
|  | 	PTREGS_INFO(r23), \ | ||
|  | 	PTREGS_INFO(r24), \ | ||
|  | 	PTREGS_INFO(r25), \ | ||
|  | 	PTREGS_INFO(r26), \ | ||
|  | 	PTREGS_INFO(r27), \ | ||
|  | 	PTREGS_INFO(r28), \ | ||
|  | 	PTREGS_INFO(r29), \ | ||
|  | 	PTREGS_INFO(r30), \ | ||
|  | 	PTREGS_INFO(r31), \ | ||
|  | 	PTREGS_INFO(r63) | ||
|  | 
 | ||
|  | #define UNW_DEFAULT_RA(raItem, dataAlign) \
 | ||
|  | 	((raItem).where == Memory && !((raItem).value * (dataAlign) + 4)) | ||
|  | 
 | ||
|  | extern int arc_unwind(struct unwind_frame_info *frame); | ||
|  | extern void arc_unwind_init(void); | ||
|  | extern void arc_unwind_setup(void); | ||
|  | extern void *unwind_add_table(struct module *module, const void *table_start, | ||
|  | 			      unsigned long table_size); | ||
|  | extern void unwind_remove_table(void *handle, int init_only); | ||
|  | 
 | ||
|  | static inline int | ||
|  | arch_unwind_init_running(struct unwind_frame_info *info, | ||
|  | 			 int (*callback) (struct unwind_frame_info *info, | ||
|  | 					  void *arg), | ||
|  | 			 void *arg) | ||
|  | { | ||
|  | 	return 0; | ||
|  | } | ||
|  | 
 | ||
|  | static inline int arch_unw_user_mode(const struct unwind_frame_info *info) | ||
|  | { | ||
|  | 	return 0; | ||
|  | } | ||
|  | 
 | ||
|  | static inline void arch_unw_init_blocked(struct unwind_frame_info *info) | ||
|  | { | ||
|  | 	return; | ||
|  | } | ||
|  | 
 | ||
|  | static inline void arch_unw_init_frame_info(struct unwind_frame_info *info, | ||
|  | 					    struct pt_regs *regs) | ||
|  | { | ||
|  | 	return; | ||
|  | } | ||
|  | 
 | ||
|  | #else
 | ||
|  | 
 | ||
|  | #define UNW_PC(frame) ((void)(frame), 0)
 | ||
|  | #define UNW_SP(frame) ((void)(frame), 0)
 | ||
|  | #define UNW_FP(frame) ((void)(frame), 0)
 | ||
|  | 
 | ||
|  | static inline void arc_unwind_init(void) | ||
|  | { | ||
|  | } | ||
|  | 
 | ||
|  | static inline void arc_unwind_setup(void) | ||
|  | { | ||
|  | } | ||
|  | #define unwind_add_table(a, b, c)
 | ||
|  | #define unwind_remove_table(a, b)
 | ||
|  | 
 | ||
|  | #endif /* CONFIG_ARC_DW2_UNWIND */
 | ||
|  | 
 | ||
|  | #endif /* _ASM_ARC_UNWIND_H */
 |