/* * 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 */