Module: xenomai-head
Branch: master
Commit: ba722b2c61e8cfb029cc2188e1e395a996846844
URL:    
http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=ba722b2c61e8cfb029cc2188e1e395a996846844

Author: Philippe Gerum <r...@xenomai.org>
Date:   Mon Jun 14 18:24:14 2010 +0200

nios2: enable MAYDAY support

---

 include/asm-nios2/bits/shadow.h |   65 +++++++++++++++++++++++++++++++++++++++
 include/asm-nios2/system.h      |    8 +++++
 2 files changed, 73 insertions(+), 0 deletions(-)

diff --git a/include/asm-nios2/bits/shadow.h b/include/asm-nios2/bits/shadow.h
index 1d1969a..8917045 100644
--- a/include/asm-nios2/bits/shadow.h
+++ b/include/asm-nios2/bits/shadow.h
@@ -24,6 +24,8 @@
 #error "Pure kernel header included from user-space!"
 #endif
 
+#include <asm/cacheflush.h>
+
 static inline void xnarch_init_shadow_tcb(xnarchtcb_t * tcb,
                                          struct xnthread *thread,
                                          const char *name)
@@ -63,4 +65,67 @@ static inline int xnarch_local_syscall(struct pt_regs *regs)
 
 #define xnarch_schedule_tail(prev) do { } while(0)
 
+#ifdef XNARCH_HAVE_MAYDAY
+
+static inline void xnarch_setup_mayday_page(void *page)
+{
+       /*
+        * We want this code to appear at the top of the MAYDAY page:
+        *
+        *      00c00334        movhi   r3,#__xn_sys_mayday
+        *      18c08ac4        addi    r3,r3,#__xn_sys_mux
+        *      00800004        movi    r2,0
+        *      02400004        movi    r9,0
+        *      003b683a        trap
+        *      003fff06        br      .
+        */
+       static const struct {
+               u32 movhi_r3h;
+               u32 addi_r3l;
+               u32 movi_r2;
+               u32 movi_r9;
+               u32 syscall;
+               u32 bug;
+       } code = {
+               .movhi_r3h = 0x00c00334,
+               .addi_r3l = 0x18c08ac4,
+               .movi_r2 = 0x00800004,
+               .movi_r9 = 0x02400004,
+               .syscall = 0x003b683a,
+               .bug = 0x003fff06
+       };
+
+       memcpy(page, &code, sizeof(code));
+
+       flush_dcache_range((unsigned long)page,
+                          (unsigned long)page + sizeof(code));
+}
+
+static inline void xnarch_call_mayday(void)
+{
+       rthal_return_intercept(current);
+}
+
+static inline void xnarch_handle_mayday(struct xnarchtcb *tcb,
+                                       struct pt_regs *regs,
+                                       unsigned long tramp)
+{
+       tcb->mayday.ea = regs->ea;
+       tcb->mayday.r2 = regs->r2;
+       tcb->mayday.r3 = regs->r3;
+       tcb->mayday.r9 = regs->r9;
+       regs->ea = tramp;
+}
+
+static inline void xnarch_fixup_mayday(struct xnarchtcb *tcb,
+                                      struct pt_regs *regs)
+{
+       regs->ea = tcb->mayday.ea;
+       regs->r2 = tcb->mayday.r2;
+       regs->r3 = tcb->mayday.r3;
+       regs->r9 = tcb->mayday.r9;
+}
+
+#endif /* XNARCH_HAVE_MAYDAY */
+
 #endif /* !_XENO_ASM_NIOS2_BITS_SHADOW_H */
diff --git a/include/asm-nios2/system.h b/include/asm-nios2/system.h
index 65426d1..a31aadf 100644
--- a/include/asm-nios2/system.h
+++ b/include/asm-nios2/system.h
@@ -48,6 +48,14 @@ typedef struct xnarchtcb {   /* Per-thread arch-dependent 
block */
        struct thread_struct ts;        /* Holds kernel-based thread context. */
        struct task_struct *user_task;  /* Shadowed user-space task */
        struct thread_struct *tsp;      /* Active thread struct */
+#ifdef XNARCH_HAVE_MAYDAY
+       struct {
+               unsigned long ea;
+               unsigned long r2;
+               unsigned long r3;
+               unsigned long r9;
+       } mayday;
+#endif
 
        /* Init block */
        struct xnthread *self;


_______________________________________________
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git

Reply via email to