Pass the current FPU holder to allow enabling XNFPU dynamically.
Also pass the faults information for architectures which need to fiddle
with the PC register to restart the faulting instruction.
---
kernel/cobalt/arch/arm/include/asm/xenomai/thread.h | 4 +++-
kernel/cobalt/arch/blackfin/include/asm/xenomai/thread.h | 4 +++-
kernel/cobalt/arch/nios2/include/asm/xenomai/thread.h | 4 +++-
kernel/cobalt/arch/powerpc/include/asm/xenomai/thread.h | 4 +++-
kernel/cobalt/arch/sh/include/asm/xenomai/thread.h | 4 +++-
kernel/cobalt/arch/x86/include/asm/xenomai/thread.h | 7 +++++--
kernel/cobalt/arch/x86/thread.c | 3 ++-
kernel/cobalt/shadow.c | 2 +-
8 files changed, 23 insertions(+), 9 deletions(-)
diff --git a/kernel/cobalt/arch/arm/include/asm/xenomai/thread.h
b/kernel/cobalt/arch/arm/include/asm/xenomai/thread.h
index 8b54b97..8c42775 100644
--- a/kernel/cobalt/arch/arm/include/asm/xenomai/thread.h
+++ b/kernel/cobalt/arch/arm/include/asm/xenomai/thread.h
@@ -124,7 +124,9 @@ static inline void xnarch_leave_root(struct xnthread *root)
{ }
#endif /* !CONFIG_XENO_HW_FPU */
-static inline int xnarch_handle_fpu_fault(struct xnthread *thread)
+static inline int
+xnarch_handle_fpu_fault(struct xnthread *from,
+ struct xnthread *to, struct ipipe_trap_data *d)
{
return 0;
}
diff --git a/kernel/cobalt/arch/blackfin/include/asm/xenomai/thread.h
b/kernel/cobalt/arch/blackfin/include/asm/xenomai/thread.h
index 601fc4b..6c630e7 100644
--- a/kernel/cobalt/arch/blackfin/include/asm/xenomai/thread.h
+++ b/kernel/cobalt/arch/blackfin/include/asm/xenomai/thread.h
@@ -62,7 +62,9 @@ static inline void xnarch_enable_fpu(struct xnthread
*current_thread) { }
static inline void xnarch_save_fpu(struct xnthread *thread) { }
static inline void xnarch_restore_fpu(struct xnthread *thread) { }
-static inline int xnarch_handle_fpu_fault(struct xnthread *thread)
+static inline int
+xnarch_handle_fpu_fault(struct xnthread *from,
+ struct xnthread *to, struct ipipe_trap_data *d)
{
return 0;
}
diff --git a/kernel/cobalt/arch/nios2/include/asm/xenomai/thread.h
b/kernel/cobalt/arch/nios2/include/asm/xenomai/thread.h
index 775b92a..05de3c2 100644
--- a/kernel/cobalt/arch/nios2/include/asm/xenomai/thread.h
+++ b/kernel/cobalt/arch/nios2/include/asm/xenomai/thread.h
@@ -57,7 +57,9 @@ static inline void xnarch_enable_fpu(struct xnthread *thread)
{ }
static inline void xnarch_save_fpu(struct xnthread *thread) { }
static inline void xnarch_restore_fpu(struct xnthread *thread) { }
-static inline int xnarch_handle_fpu_fault(struct xnthread *thread)
+static inline int
+xnarch_handle_fpu_fault(struct xnthread *from,
+ struct xnthread *to, struct ipipe_trap_data *d)
{
return 0;
}
diff --git a/kernel/cobalt/arch/powerpc/include/asm/xenomai/thread.h
b/kernel/cobalt/arch/powerpc/include/asm/xenomai/thread.h
index 07a17cf..7504fba 100644
--- a/kernel/cobalt/arch/powerpc/include/asm/xenomai/thread.h
+++ b/kernel/cobalt/arch/powerpc/include/asm/xenomai/thread.h
@@ -77,7 +77,9 @@ static inline void xnarch_init_shadow_tcb(struct xnthread
*thread) { }
#endif /* !CONFIG_XENO_HW_FPU */
-static inline int xnarch_handle_fpu_fault(struct xnthread *thread)
+static inline int
+xnarch_handle_fpu_fault(struct xnthread *from,
+ struct xnthread *to, struct ipipe_trap_data *d)
{
return 0;
}
diff --git a/kernel/cobalt/arch/sh/include/asm/xenomai/thread.h
b/kernel/cobalt/arch/sh/include/asm/xenomai/thread.h
index 2c7fe88..9a78124 100644
--- a/kernel/cobalt/arch/sh/include/asm/xenomai/thread.h
+++ b/kernel/cobalt/arch/sh/include/asm/xenomai/thread.h
@@ -70,7 +70,9 @@ static inline void xnarch_init_shadow_tcb(struct xnthread
*thread) { }
#endif /* !CONFIG_XENO_HW_FPU */
-static inline int xnarch_handle_fpu_fault(struct xnthread *thread)
+static inline int
+xnarch_handle_fpu_fault(struct xnthread *from,
+ struct xnthread *to, struct ipipe_trap_data *d)
{
return 0;
}
diff --git a/kernel/cobalt/arch/x86/include/asm/xenomai/thread.h
b/kernel/cobalt/arch/x86/include/asm/xenomai/thread.h
index 570d9b5..938b25d 100644
--- a/kernel/cobalt/arch/x86/include/asm/xenomai/thread.h
+++ b/kernel/cobalt/arch/x86/include/asm/xenomai/thread.h
@@ -69,7 +69,8 @@ static inline int xnarch_shadow_p(struct xnarchtcb *tcb,
struct task_struct *tas
void xnarch_save_fpu(struct xnthread *thread);
void xnarch_restore_fpu(struct xnthread *thread);
void xnarch_enable_fpu(struct xnthread *thread);
-int xnarch_handle_fpu_fault(struct xnthread *thread);
+int xnarch_handle_fpu_fault(struct xnthread *from,
+ struct xnthread *to, struct ipipe_trap_data *d);
#else /* !CONFIG_XENO_HW_FPU */
@@ -77,7 +78,9 @@ static inline void xnarch_save_fpu(struct xnthread *thread) {
}
static inline void xnarch_restore_fpu(struct xnthread *thread) { }
static inline void xnarch_enable_fpu(struct xnthread *thread) { }
-static inline int xnarch_handle_fpu_fault(struct xnthread *thread)
+static inline int
+xnarch_handle_fpu_fault(struct xnthread *from,
+ struct xnthread *to, struct ipipe_trap_data *d)
{
return 0;
}
diff --git a/kernel/cobalt/arch/x86/thread.c b/kernel/cobalt/arch/x86/thread.c
index 4e80495..cbf3627 100644
--- a/kernel/cobalt/arch/x86/thread.c
+++ b/kernel/cobalt/arch/x86/thread.c
@@ -219,7 +219,8 @@ static inline void __do_restore_i387(x86_fpustate *fpup)
#endif /* CONFIG_X86_64 */
}
-int xnarch_handle_fpu_fault(struct xnthread *thread)
+int xnarch_handle_fpu_fault(struct xnthread *from,
+ struct xnthread *to, struct ipipe_trap_data *d)
{
struct xnarchtcb *tcb = xnthread_archtcb(to);
struct task_struct *p = tcb->core.host_task;
diff --git a/kernel/cobalt/shadow.c b/kernel/cobalt/shadow.c
index c858777..74e73d5 100644
--- a/kernel/cobalt/shadow.c
+++ b/kernel/cobalt/shadow.c
@@ -2608,7 +2608,7 @@ static inline int handle_exception(struct ipipe_trap_data
*d)
if (xnarch_fault_fpu_p(d)) {
/* FPU exception received in primary mode. */
- if (xnarch_handle_fpu_fault(thread)) {
+ if (xnarch_handle_fpu_fault(sched->fpuholder, thread, d)) {
sched->fpuholder = thread;
return 1;
}
--
1.7.10.4
_______________________________________________
Xenomai mailing list
[email protected]
http://www.xenomai.org/mailman/listinfo/xenomai