00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef _RTAI_ASM_ARM_LXRT_H
00040 #define _RTAI_ASM_ARM_LXRT_H
00041
00042
00043
00044
00045
00046 #define RTAI_SYSCALL_NR 0x70000000
00047
00048 #define RTAI_SYSCALL_ARGS ARM_r0
00049 #define SET_LXRT_RETVAL_IN_SYSCALL(retval) \
00050 (*(long long)&r->r0 = (retval))
00051
00052 #define LINUX_SYSCALL_NR ARM_ip
00053 #define LINUX_SYSCALL_REG1 ARM_r0
00054 #define LINUX_SYSCALL_REG2 ARM_r1
00055 #define LINUX_SYSCALL_REG3 ARM_r2
00056 #define LINUX_SYSCALL_REG4 ARM_r3
00057 #define LINUX_SYSCALL_REG5 ARM_r4
00058 #define LINUX_SYSCALL_REG6 ARM_r5
00059 #define LINUX_SYSCALL_RETREG ARM_r0
00060
00061 #define NR_syscalls 322
00062
00063 #define LXRT_DO_IMMEDIATE_LINUX_SYSCALL(regs) \
00064 do { } while (0)
00065
00066
00067 #define LOW 0
00068 #define HIGH 1
00069
00070
00071 #define USE_LINUX_TIMER
00072 #define TIMER_NAME RTAI_TIMER_NAME
00073 #define TIMER_FREQ RTAI_TIMER_FREQ
00074 #define TIMER_LATENCY RTAI_TIMER_LATENCY
00075 #define TIMER_SETUP_TIME RTAI_TIMER_SETUP_TIME
00076 #define ONESHOT_SPAN \
00077 (((long long)RTAI_TIMER_MAXVAL * RTAI_TSC_FREQ) / RTAI_TIMER_FREQ)
00078
00079 #define update_linux_timer(cpuid) \
00080 do { \
00081 if (!IS_FUSION_TIMER_RUNNING()) { \
00082 hal_pend_uncond(__ipipe_mach_timerint, cpuid); \
00083 } \
00084 } while (0)
00085
00086
00087
00088 #define IN_INTERCEPT_IRQ_ENABLE() do { } while (0)
00089 #define IN_INTERCEPT_IRQ_DISABLE() do { } while (0)
00090
00091 union rtai_lxrt_t {
00092 RTIME rt;
00093 int i[2];
00094 void *v[2];
00095 };
00096
00097 #ifdef __cplusplus
00098 extern "C" {
00099 #endif
00100
00101 #ifdef __KERNEL__
00102
00103 #include <asm/system.h>
00104 #include <asm/mmu_context.h>
00105
00106
00107
00108 extern inline void
00109 _lxrt_context_switch(struct task_struct *prev, struct task_struct *next, int cpuid)
00110 {
00111 extern void context_switch(void *, void *, void *);
00112 context_switch(0, prev, next);
00113 }
00114
00115 static inline void kthread_fun_set_jump(struct task_struct *lnxtsk) { }
00116 static inline void kthread_fun_long_jump(struct task_struct *lnxtsk) { }
00117
00118 #define rt_copy_from_user(a, b, c) \
00119 ( { int ret = __copy_from_user_inatomic(a, b, c); ret; } )
00120
00121 #define rt_copy_to_user(a, b, c) \
00122 ( { int ret = __copy_to_user_inatomic(a, b, c); ret; } )
00123
00124 #define rt_put_user __put_user
00125 #define rt_get_user __get_user
00126
00127 #define rt_strncpy_from_user(a, b, c) \
00128 ( { int ret = strncpy_from_user(a, b, c); ret; } )
00129
00130 #else
00131
00132 #ifdef CONFIG_RTAI_LXRT_USE_LINUX_SYSCALL
00133 #define USE_LINUX_SYSCALL
00134 #include <unistd.h>
00135 #else
00136 #undef USE_LINUX_SYSCALL
00137 #include <asm/rtai_vectors.h>
00138 #endif
00139
00140 #define RTAI_SRQ_SYSCALL_NR 0x70000000
00141
00142 static inline long long _rtai_lxrt(long srq, void *args)
00143 {
00144 long long retval;
00145 #ifdef USE_LINUX_SYSCALL
00146 syscall(RTAI_SRQ_SYSCALL_NR, srq, args, &retval);
00147 #else
00148 #warning "RTAI_DO_SWI is not working yet. Please configure RTAI with --enable-lxrt-use-linux-syscall."
00149 retval = RTAI_DO_SWI(RTAI_SYS_VECTOR, (srq), (args));
00150 #endif
00151 return retval;
00152 }
00153
00154 static inline union rtai_lxrt_t
00155 rtai_lxrt(short int dynx, short int lsize, int srq, void *arg)
00156 {
00157 union rtai_lxrt_t retval;
00158 retval.rt = _rtai_lxrt(ENCODE_LXRT_REQ(dynx, srq, lsize), arg);
00159 return retval;
00160 }
00161
00162 #define rtai_iopl() do { } while (0)
00163
00164 #endif
00165
00166 #ifdef __cplusplus
00167 }
00168 #endif
00169
00170 #endif