/* * Copyright (C) 2005 Stelian Pop * * Xenomai 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. * * Xenomai is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xenomai; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #ifndef _COBALT_ARM_ASM_THREAD_H #define _COBALT_ARM_ASM_THREAD_H #include #ifdef CONFIG_XENO_ARCH_FPU #ifdef CONFIG_VFP #include #endif /* CONFIG_VFP */ #endif /* !CONFIG_XENO_ARCH_FPU */ struct xnarchtcb { struct xntcb core; #ifdef CONFIG_XENO_ARCH_FPU #ifdef CONFIG_VFP union vfp_state *fpup; #define xnarch_fpu_ptr(tcb) ((tcb)->fpup) #else #define xnarch_fpu_ptr(tcb) NULL #endif #endif }; #define xnarch_fault_regs(d) ((d)->regs) #define xnarch_fault_trap(d) ((d)->exception) #define xnarch_fault_code(d) (0) #define xnarch_fault_pc(d) ((d)->regs->ARM_pc - (thumb_mode((d)->regs) ? 2 : 4)) /* XXX ? */ #define xnarch_fault_pf_p(d) ((d)->exception == IPIPE_TRAP_ACCESS) #define xnarch_fault_bp_p(d) ((current->ptrace & PT_PTRACED) && \ ((d)->exception == IPIPE_TRAP_BREAK || \ (d)->exception == IPIPE_TRAP_UNDEFINSTR)) #define xnarch_fault_notify(d) (!xnarch_fault_bp_p(d)) static inline struct task_struct *xnarch_host_task(struct xnarchtcb *tcb) { return tcb->core.host_task; } void xnarch_switch_to(struct xnthread *out, struct xnthread *in); static inline void xnarch_enter_root(struct xnthread *root) { } static inline int xnarch_escalate(void) { if (ipipe_root_p) { ipipe_raise_irq(cobalt_pipeline.escalate_virq); return 1; } return 0; } #if defined(CONFIG_XENO_ARCH_FPU) && defined(CONFIG_VFP) void xnarch_init_root_tcb(struct xnthread *thread); void xnarch_init_shadow_tcb(struct xnthread *thread); int xnarch_fault_fpu_p(struct ipipe_trap_data *d); void xnarch_leave_root(struct xnthread *root); void xnarch_switch_fpu(struct xnthread *from, struct xnthread *thread); int xnarch_handle_fpu_fault(struct xnthread *from, struct xnthread *to, struct ipipe_trap_data *d); #else /* !CONFIG_XENO_ARCH_FPU || !CONFIG_VFP */ static inline void xnarch_init_root_tcb(struct xnthread *thread) { } static inline void xnarch_init_shadow_tcb(struct xnthread *thread) { } /* * Userland may raise FPU faults with FPU-enabled kernels, regardless * of whether real-time threads actually use FPU, so we simply ignore * these faults. */ static inline int xnarch_fault_fpu_p(struct ipipe_trap_data *d) { return 0; } static inline void xnarch_leave_root(struct xnthread *root) { } static inline void xnarch_switch_fpu(struct xnthread *f, struct xnthread *t) { } static inline int xnarch_handle_fpu_fault(struct xnthread *from, struct xnthread *to, struct ipipe_trap_data *d) { return 0; } #endif /* !CONFIG_XENO_ARCH_FPU || !CONFIG_VFP */ static inline void xnarch_enable_kfpu(void) { } static inline void xnarch_disable_kfpu(void) { } #endif /* !_COBALT_ARM_ASM_THREAD_H */