[Xenomai-git] Jan Kiszka : testsuite: Fix posix mutex test for non-auto-shadow setups

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: for-upstream
Commit: 4267625909c441affac187c3b05adab071c1f65e
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=4267625909c441affac187c3b05adab071c1f65e

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 20:06:56 2010 +0100

testsuite: Fix posix mutex test for non-auto-shadow setups

sched_setscheduler is not wrapped by the POSIX skin, only
pthread_setschedparam. So the main thread of the test remained
unshadowed of auto-shadowing was disabled.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 src/testsuite/unit/mutex-torture.c |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/src/testsuite/unit/mutex-torture.c 
b/src/testsuite/unit/mutex-torture.c
index 70bda14..ebdd4f2 100644
--- a/src/testsuite/unit/mutex-torture.c
+++ b/src/testsuite/unit/mutex-torture.c
@@ -657,7 +657,7 @@ int main(void)
/* Set scheduling parameters for the current process */
 #ifdef XENO_POSIX
sparam.sched_priority = 2;
-   sched_setscheduler(0, SCHED_FIFO, sparam);
+   pthread_setschedparam(pthread_self(), SCHED_FIFO, sparam);
 #else /* __NATIVE_SKIN__ */
rt_task_shadow(main_tid, main_task, 2, 0);
 #endif /* __NATIVE_SKIN__ */


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


[Xenomai-git] Jan Kiszka : testsuite: Add timed mutex test

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: for-upstream
Commit: 766431f4982bb03708590ab3672f9f00d2754530
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=766431f4982bb03708590ab3672f9f00d2754530

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 22:35:13 2010 +0100

testsuite: Add timed mutex test

Add test for timeouts while waiting on a mutexe. At this chance, also
tag the output on errors more clearly.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 src/testsuite/unit/mutex-torture.c |  133 
 1 files changed, 104 insertions(+), 29 deletions(-)

diff --git a/src/testsuite/unit/mutex-torture.c 
b/src/testsuite/unit/mutex-torture.c
index ebdd4f2..ebcb882 100644
--- a/src/testsuite/unit/mutex-torture.c
+++ b/src/testsuite/unit/mutex-torture.c
@@ -27,17 +27,18 @@
 #include asm-generic/bits/current.h /* For internal use, do not use
 in your code. */
 
-#define MUTEX_CREATE   1
-#define MUTEX_LOCK 2
-#define MUTEX_TRYLOCK  3
-#define MUTEX_UNLOCK   4
-#define MUTEX_DESTROY  5
-#define COND_CREATE6
-#define COND_SIGNAL7
-#define COND_WAIT  8
-#define COND_DESTROY   9
-#define THREAD_DETACH  10
-#define THREAD_CREATE  11
+#define MUTEX_CREATE   1
+#define MUTEX_LOCK 2
+#define MUTEX_TRYLOCK  3
+#define MUTEX_TIMED_LOCK   4
+#define MUTEX_UNLOCK   5
+#define MUTEX_DESTROY  6
+#define COND_CREATE7
+#define COND_SIGNAL8
+#define COND_WAIT  9
+#define COND_DESTROY   10
+#define THREAD_DETACH  11
+#define THREAD_CREATE  12
 
 #define NS_PER_MS  100
 
@@ -51,6 +52,16 @@ typedef RT_TASK thread_t;
 typedef RT_COND cond_t;
 #endif /* __NATIVE_SKIN__ */
 
+void timespec_add(struct timespec *ts, unsigned long long value)
+{
+   ts-tv_sec += value / 10;
+   ts-tv_nsec += value % 10;
+   if (ts-tv_nsec  10) {
+   ts-tv_sec++;
+   ts-tv_nsec -= 10;
+   }
+}
+
 void ms_sleep(int time)
 {
 #ifdef XENO_POSIX
@@ -82,14 +93,16 @@ void check_current_prio(int expected_prio)
RT_TASK_INFO task_info;
 
if ((ret = rt_task_inquire(NULL, task_info))  0) {
-   fprintf(stderr, Task inquire: %i (%s)\n, -ret, 
strerror(-ret));
+   fprintf(stderr,
+   FAILURE: Task inquire: %i (%s)\n, -ret, 
strerror(-ret));
exit(EXIT_FAILURE);
}
current_prio = task_info.cprio;
 #endif /* __NATIVE_SKIN__ */
 
if (current_prio != expected_prio) {
-   fprintf(stderr, current prio (%d) != expected prio (%d)\n,
+   fprintf(stderr,
+   FAILURE: current prio (%d) != expected prio (%d)\n,
current_prio, expected_prio);
exit(EXIT_FAILURE);
}
@@ -105,7 +118,8 @@ void check_current_mode(int expected_primary_mode)
current_in_primary = !(xeno_get_current_mode()  XNRELAX);

if (current_in_primary != expected_primary_mode) {
-   fprintf(stderr, current mode (%d) != expected mode (%d)\n,
+   fprintf(stderr,
+   FAILURE: current mode (%d) != expected mode (%d)\n,
current_in_primary, expected_primary_mode);
exit(EXIT_FAILURE);
}
@@ -122,16 +136,18 @@ void yield(void)
 
 int dispatch(const char *service_name, int service_type, int check, ...)
 {
+   unsigned long long timeout;
thread_t *thread;
cond_t *cond;
void *handler;
va_list ap;
int status;
+   mutex_t *mutex;
 #ifdef XENO_POSIX
struct sched_param param;
pthread_attr_t threadattr;
pthread_mutexattr_t mutexattr;
-   pthread_mutex_t *mutex;
+   struct timespec ts;
 #else /* __NATIVE_SKIN__ */
int prio;
 #endif /* __NATIVE_SKIN__ */
@@ -174,6 +190,18 @@ int dispatch(const char *service_name, int service_type, 
int check, ...)
 #endif /* __NATIVE_SKIN__ */
break;
 
+   case MUTEX_TIMED_LOCK:
+   mutex = va_arg(ap, mutex_t *);
+   timeout = va_arg(ap, unsigned long long);
+#ifdef XENO_POSIX
+   clock_gettime(CLOCK_REALTIME, ts);
+   timespec_add(ts, timeout);
+   status = pthread_mutex_timedlock(mutex, ts);
+#else /* __NATIVE_SKIN__ */
+   status = -rt_mutex_acquire(mutex, timeout);
+#endif /* __NATIVE_SKIN__ */
+   break;
+
case MUTEX_UNLOCK:
 #ifdef XENO_POSIX
status = pthread_mutex_unlock(va_arg(ap, pthread_mutex_t *));
@@ -264,7 +292,7 @@ int dispatch(const char *service_name, int service_type, 
int check, ...)
va_end(ap);
 
if (status  0  check) {
-   fprintf(stderr, %s: %i (%s)\n, 
+   fprintf(stderr, FAILURE: %s: %i (%s)\n, 
service_name, status, 

[Xenomai-git] Jan Kiszka : Native: Work around for error code corruption in rt_cond_wait[ _until]

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: for-upstream
Commit: cfbac77b474b8750756f0e124d9874fb74606d43
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=cfbac77b474b8750756f0e124d9874fb74606d43

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 16:24:59 2010 +0100

Native: Work around for error code corruption in rt_cond_wait[_until]

User space suffers from losing the error code of the cond wait prologue.
We would actually have to return the prologue error to user space and
use that one after the epilogue succeeded, but the existing kernel ABI
does not allow this nor is existing user space prepared for it.

As a workaround, keep the prologue error code in xnthread's errcode and
restore it from there when user space re-enters the kernel for the
epilogue. This requires no ABI changes, but suffers from potential
overwriting if the same or some other errcode touching service is called
from a user space signal handler in between the calls. Moreover, current
user space also prevents that we can return -EINTR on interruption while
blocked on the condition variable, which was possible before.

A true fix will require a new syscall and updated user space libs.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/skins/native/syscall.c |   26 ++
 1 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/ksrc/skins/native/syscall.c b/ksrc/skins/native/syscall.c
index 462ee7e..ee6c829 100644
--- a/ksrc/skins/native/syscall.c
+++ b/ksrc/skins/native/syscall.c
@@ -1841,7 +1841,7 @@ static int __rt_cond_wait_prologue(struct pt_regs *regs)
RT_MUTEX *mutex;
RT_COND *cond;
RTIME timeout;
-   int err;
+   int err, epilogue_err;
 
if (__xn_safe_copy_from_user(cph, (void __user *)__xn_reg_arg1(regs),
 sizeof(cph)))
@@ -1869,10 +1869,21 @@ static int __rt_cond_wait_prologue(struct pt_regs *regs)
 
err = rt_cond_wait_prologue(cond, mutex, lockcnt, timeout_mode, 
timeout);
 
+   /* Old user space prevents that we can return -EINTR (it would loop
+  forever if we did). So drop this error. */
+   xnpod_current_thread()-errcode = err != -EINTR ? err : 0;
+
/* Reacquire the mutex if it was unlocked in the prologue and we were
   not interrupted. */
-   if (lockcnt  err != -EINTR)
-   err = rt_cond_wait_epilogue(mutex, lockcnt);
+   if (lockcnt  err != -EINTR) {
+   epilogue_err = rt_cond_wait_epilogue(mutex, lockcnt);
+
+   /* Only overwrite the prologue if we need to signal -EINTR or
+  the previous error was less fatal. */
+   if (epilogue_err  0 
+   (epilogue_err == -EINTR || err != -EIDRM))
+   err = epilogue_err;
+   }
 
if (err == -EINTR  __xn_reg_arg3(regs)
 __xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs),
@@ -1891,6 +1902,7 @@ static int __rt_cond_wait_epilogue(struct pt_regs *regs)
RT_COND_PLACEHOLDER mph;
unsigned lockcnt;
RT_MUTEX *mutex;
+   int prologue_err, err;
 
if (__xn_safe_copy_from_user(mph, (void __user *)__xn_reg_arg1(regs),
 sizeof(mph)))
@@ -1903,7 +1915,13 @@ static int __rt_cond_wait_epilogue(struct pt_regs *regs)
 
lockcnt = __xn_reg_arg2(regs);
 
-   return rt_cond_wait_epilogue(mutex, lockcnt);
+   err = rt_cond_wait_epilogue(mutex, lockcnt);
+   if (err == -EINTR)
+   return err;
+
+   prologue_err = xnpod_current_thread()-errcode;
+
+   return (err  0  prologue_err != -EIDRM) ? err : prologue_err;
 }
 
 /*


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


[Xenomai-git] Jan Kiszka : POSIX: Fix signedness issue in EFAULT path of cond_wait_prologue

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: for-upstream
Commit: 788d667aedb7f72b8bb12e413d45b64cd19ebf22
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=788d667aedb7f72b8bb12e413d45b64cd19ebf22

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 23:29:57 2010 +0100

POSIX: Fix signedness issue in EFAULT path of cond_wait_prologue

Fix this bug and use a consistent pattern for other occurrences as well.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/skins/posix/syscall.c |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
index 61b8cee..6c3ec3a 100644
--- a/ksrc/skins/posix/syscall.c
+++ b/ksrc/skins/posix/syscall.c
@@ -1568,13 +1568,13 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
   umx-shadow_mutex.lockcnt,
   mx.shadow_mutex.lockcnt,
   sizeof(umx-shadow_mutex.lockcnt)))
-   err = -EFAULT;
+   return -EFAULT;
}
 
if (err == EINTR
 __xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs),
  count, sizeof(count)))
-   err = EFAULT;
+   return -EFAULT;

return -err;
 }


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


[Xenomai-git] Jan Kiszka : Native: Fix error signedness in rt_cont_wait_until

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: for-upstream
Commit: b06173579eaea24f40c4b5957c4e729457d8ea5c
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=b06173579eaea24f40c4b5957c4e729457d8ea5c

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 12:22:06 2010 +0100

Native: Fix error signedness in rt_cont_wait_until

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 src/skins/native/cond.c |6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/skins/native/cond.c b/src/skins/native/cond.c
index 478321d..f874678 100644
--- a/src/skins/native/cond.c
+++ b/src/skins/native/cond.c
@@ -96,9 +96,9 @@ int rt_cond_wait_until(RT_COND *cond, RT_MUTEX *mutex, RTIME 
timeout)
saved_lockcnt, XN_REALTIME, timeout);
 
while (err == -EINTR)
-   err = -XENOMAI_SKINCALL2(__native_muxid,
-__native_cond_wait_epilogue, mutex,
-saved_lockcnt);
+   err = XENOMAI_SKINCALL2(__native_muxid,
+   __native_cond_wait_epilogue, mutex,
+   saved_lockcnt);
 #endif /* !CONFIG_XENO_FASTSYNCH */
 
return err;


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


[Xenomai-git] Jan Kiszka : Native: Ensure to re-acquire the mutex on cond_wait return

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: for-upstream
Commit: 6506037a393f1db40697a6c8703d0dc5bd83912c
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=6506037a393f1db40697a6c8703d0dc5bd83912c

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 13:17:35 2010 +0100

Native: Ensure to re-acquire the mutex on cond_wait return

Always try to reacquire the mutex if the prologue released it. The only
exception is user space return on interruption.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/skins/native/cond.c|   17 +++--
 ksrc/skins/native/syscall.c |6 --
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/ksrc/skins/native/cond.c b/ksrc/skins/native/cond.c
index d6c8546..6076472 100644
--- a/ksrc/skins/native/cond.c
+++ b/ksrc/skins/native/cond.c
@@ -380,6 +380,8 @@ int rt_cond_wait_prologue(RT_COND *cond, RT_MUTEX *mutex, 
unsigned *plockcnt,
spl_t s;
int err;
 
+   *plockcnt = 0;
+
if (timeout == TM_NONBLOCK)
return -EWOULDBLOCK;
 
@@ -467,15 +469,18 @@ static int rt_cond_wait_inner(RT_COND *cond, RT_MUTEX 
*mutex,
  xntmode_t timeout_mode, RTIME timeout)
 {
unsigned lockcnt;
-   int err, epilogue_err = 0;
+   int err, epilogue_err;
 
-   err = rt_cond_wait_prologue(cond, mutex, lockcnt, 
+   err = rt_cond_wait_prologue(cond, mutex, lockcnt,
timeout_mode, timeout);
 
-   if(!err || err == -ETIMEDOUT || err == -EINTR)
-   do {
-   epilogue_err = rt_cond_wait_epilogue(mutex, lockcnt);
-   } while (epilogue_err == -EINTR);
+   if (!lockcnt)
+   return err;
+
+   /* Reacquire the mutex if it was unlocked in the prologue. */
+   do {
+   epilogue_err = rt_cond_wait_epilogue(mutex, lockcnt);
+   } while (epilogue_err == -EINTR);
 
return err ? err : epilogue_err;
 }
diff --git a/ksrc/skins/native/syscall.c b/ksrc/skins/native/syscall.c
index 40e5cfd..462ee7e 100644
--- a/ksrc/skins/native/syscall.c
+++ b/ksrc/skins/native/syscall.c
@@ -1869,9 +1869,11 @@ static int __rt_cond_wait_prologue(struct pt_regs *regs)
 
err = rt_cond_wait_prologue(cond, mutex, lockcnt, timeout_mode, 
timeout);
 
-   if (err == 0 || err == -ETIMEDOUT)
+   /* Reacquire the mutex if it was unlocked in the prologue and we were
+  not interrupted. */
+   if (lockcnt  err != -EINTR)
err = rt_cond_wait_epilogue(mutex, lockcnt);
-   
+
if (err == -EINTR  __xn_reg_arg3(regs)
 __xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs),
  lockcnt, sizeof(lockcnt)))


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


[Xenomai-git] Jan Kiszka : POSIX: Work around for error code corruption in pthread_cond_[ timed]wait

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: for-upstream
Commit: c94e685bbc9dd5ee7859ead6b3fb77bda45d4cd5
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=c94e685bbc9dd5ee7859ead6b3fb77bda45d4cd5

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 23:22:22 2010 +0100

POSIX: Work around for error code corruption in pthread_cond_[timed]wait

This is the some work around for POSIX as already applied on Native. The
temporary storage of the prologue error in xnthread's errcode is a bit
more fragile here as POSIX services uses this variable for saving errno.
Therefore, user space that makes use of signal handlers should better
migrate to revised syscalls that will be added later on.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/skins/posix/syscall.c |   23 ++-
 1 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
index 6c3ec3a..0032f4d 100644
--- a/ksrc/skins/posix/syscall.c
+++ b/ksrc/skins/posix/syscall.c
@@ -1520,7 +1520,7 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
union __xeno_mutex mx, *umx;
unsigned timed, count;
struct timespec ts;
-   int err;
+   int err, epilogue_err;
 
ucnd = (union __xeno_cond *)__xn_reg_arg1(regs);
umx = (union __xeno_mutex *)__xn_reg_arg2(regs);
@@ -1560,14 +1560,19 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
mx.shadow_mutex,
count, timed, XN_INFINITE);
 
+   cur-errcode = err != EINTR ? err : 0;
+
if (err == 0 || err == ETIMEDOUT) {
-   err = -pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond,
-   mx.shadow_mutex, count);
-   if (err == 0 
-   __xn_safe_copy_to_user((void __user *)
-  umx-shadow_mutex.lockcnt,
-  mx.shadow_mutex.lockcnt,
-  sizeof(umx-shadow_mutex.lockcnt)))
+   epilogue_err =
+   -pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond,
+  mx.shadow_mutex,
+  count);
+   if (epilogue_err != 0)
+   err = epilogue_err;
+   else if (__xn_safe_copy_to_user((void __user *)
+   umx-shadow_mutex.lockcnt,
+   mx.shadow_mutex.lockcnt,
+   
sizeof(umx-shadow_mutex.lockcnt)))
return -EFAULT;
}
 
@@ -1618,7 +1623,7 @@ static int __pthread_cond_wait_epilogue(struct pt_regs 
*regs)
  sizeof(umx-shadow_mutex.lockcnt)))
return -EFAULT;
 
-   return err;
+   return err ? err : -cur-errcode;
 }
 
 static int __pthread_cond_signal(struct pt_regs *regs)


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


[Xenomai-git] Jan Kiszka : POSIX: Add and use fixed syscalls for pthread_cond_[timed]wait

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: for-upstream
Commit: 0a1ca2dd9c5f9439eccfcb8b678abe8db143b9a0
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=0a1ca2dd9c5f9439eccfcb8b678abe8db143b9a0

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Sat Mar  6 09:30:20 2010 +0100

POSIX: Add and use fixed syscalls for pthread_cond_[timed]wait

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 include/posix/pthread.h|5 +++
 include/posix/syscall.h|2 +
 ksrc/skins/posix/syscall.c |   82 ++
 src/skins/posix/cond.c |   87 ++--
 src/skins/posix/init.c |3 ++
 5 files changed, 153 insertions(+), 26 deletions(-)

diff --git a/include/posix/pthread.h b/include/posix/pthread.h
index 685b356..b4f9531 100644
--- a/include/posix/pthread.h
+++ b/include/posix/pthread.h
@@ -184,6 +184,11 @@ union __xeno_cond {
} shadow_cond;
 };
 
+struct pse51_cond_wait_state {
+   unsigned count;
+   int prologue_err;
+};
+
 struct pse51_interrupt;
 
 typedef struct pse51_interrupt *pthread_intr_t;
diff --git a/include/posix/syscall.h b/include/posix/syscall.h
index 04a528d..8bb64bd 100644
--- a/include/posix/syscall.h
+++ b/include/posix/syscall.h
@@ -104,6 +104,8 @@
 #define __pse51_select77
 #define __pse51_thread_setschedparam_ex78
 #define __pse51_thread_getschedparam_ex79
+#define __pse51_cond_wait_prologue280
+#define __pse51_cond_wait_epilogue281
 
 #ifdef __KERNEL__
 
diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
index 0032f4d..584708e 100644
--- a/ksrc/skins/posix/syscall.c
+++ b/ksrc/skins/posix/syscall.c
@@ -1512,13 +1512,14 @@ static int __pthread_cond_destroy(struct pt_regs *regs)
  cnd.shadow_cond, 
sizeof(ucnd-shadow_cond));
 }
 
-/* pthread_cond_wait_prologue(cond, mutex, count_ptr, timed, timeout) */
-static int __pthread_cond_wait_prologue(struct pt_regs *regs)
+static int
+__pthread_cond_wait_prologue_inner(struct pt_regs *regs,
+  struct pse51_cond_wait_state *state)
 {
xnthread_t *cur = xnshadow_thread(current);
union __xeno_cond cnd, *ucnd;
union __xeno_mutex mx, *umx;
-   unsigned timed, count;
+   unsigned timed;
struct timespec ts;
int err, epilogue_err;
 
@@ -1551,22 +1552,23 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
err = pse51_cond_timedwait_prologue(cur,
cnd.shadow_cond,
mx.shadow_mutex,
-   count,
+   state-count,
timed,
ts2ticks_ceil(ts) + 1);
} else
err = pse51_cond_timedwait_prologue(cur,
cnd.shadow_cond,
mx.shadow_mutex,
-   count, timed, XN_INFINITE);
+   state-count,
+   timed, XN_INFINITE);
 
-   cur-errcode = err != EINTR ? err : 0;
+   state-prologue_err = err != EINTR ? err : 0;
 
if (err == 0 || err == ETIMEDOUT) {
epilogue_err =
-pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond,
   mx.shadow_mutex,
-  count);
+  state-count);
if (epilogue_err != 0)
err = epilogue_err;
else if (__xn_safe_copy_to_user((void __user *)
@@ -1575,17 +1577,45 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)

sizeof(umx-shadow_mutex.lockcnt)))
return -EFAULT;
}
-
-   if (err == EINTR
-__xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs),
- count, sizeof(count)))
-   return -EFAULT;

return -err;
 }
 
-/* pthread_cond_wait_epilogue(cond, mutex, count) */
-static int __pthread_cond_wait_epilogue(struct pt_regs *regs)
+/* pthread_cond_wait_prologue(cond, mutex, count_ptr, timed, timeout) */
+static int __pthread_cond_wait_prologue(struct pt_regs *regs)
+{
+   struct pse51_cond_wait_state state;
+   int err;
+
+   err = __pthread_cond_wait_prologue_inner(regs, state);
+
+   xnshadow_thread(current)-errcode = state.prologue_err;
+
+   if (err == -EINTR
+__xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs),
+   

[Xenomai-git] Jan Kiszka : Allow for deregistering current mode user space address

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: for-upstream
Commit: 054cc32ccb15e882a7c0f70af1d47c4a3f42a9be
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=054cc32ccb15e882a7c0f70af1d47c4a3f42a9be

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Fri Mar  5 12:30:17 2010 +0100

Allow for deregistering current mode user space address

This adds __xn_sys_drop_u_mode, a syscall to deregister the u_mode user
space address passed on shadow creation for the current thread. We need
this in order to safely shut down a thread that wants to release its
u_mode memory (either malloc'ed or TLS-allocated). So far, the kernel
might have touched this memory even after the release which caused
subtle corruptions.

After we released u_mode, we can no longer make reliable decisions based
on it. For the fast mutex use case, we then assume the worst case, ie.
we enforce syscall-based acquisitions unconditionally. For the
assert_nrt case, we simply acquire the required information via
__xn_sys_current_info. The mutex torture test requires no special care
as it cannot retrieve invalid u_mode states.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 include/asm-generic/bits/current.h |   24 +++
 include/asm-generic/syscall.h  |1 +
 ksrc/nucleus/shadow.c  |   51 +---
 src/rtdk/assert_context.c  |9 +++-
 src/skins/common/current.c |   78 +++
 5 files changed, 137 insertions(+), 26 deletions(-)

diff --git a/include/asm-generic/bits/current.h 
b/include/asm-generic/bits/current.h
index 0c3166b..f0e569c 100644
--- a/include/asm-generic/bits/current.h
+++ b/include/asm-generic/bits/current.h
@@ -2,7 +2,9 @@
 #define _XENO_ASM_GENERIC_CURRENT_H
 
 #include pthread.h
-#include nucleus/types.h
+#include nucleus/thread.h
+
+extern pthread_key_t xeno_current_mode_key;
 
 #ifdef HAVE___THREAD
 extern __thread xnhandle_t xeno_current __attribute__ ((tls_model 
(initial-exec)));
@@ -19,15 +21,13 @@ static inline unsigned long xeno_get_current_mode(void)
return xeno_current_mode;
 }
 
-static inline unsigned long *xeno_init_current_mode(void)
+static inline int xeno_primary_mode(void)
 {
-   return xeno_current_mode;
+   return xeno_current_mode  XNRELAX;
 }
 
-#define xeno_init_current_keys() do { } while (0)
 #else /* ! HAVE___THREAD */
 extern pthread_key_t xeno_current_key;
-extern pthread_key_t xeno_current_mode_key;
 
 static inline xnhandle_t xeno_get_current(void)
 {
@@ -41,14 +41,22 @@ static inline xnhandle_t xeno_get_current(void)
 
 static inline unsigned long xeno_get_current_mode(void)
 {
-   return *(unsigned long *)pthread_getspecific(xeno_current_mode_key);
+   unsigned long *mode = pthread_getspecific(xeno_current_mode_key);
+
+   return mode ? *mode : -1;
 }
 
-unsigned long *xeno_init_current_mode(void);
+static inline int xeno_primary_mode(void)
+{
+   unsigned long *mode = pthread_getspecific(xeno_current_mode_key);
 
-void xeno_init_current_keys(void);
+   return mode ? (*mode  XNRELAX) : 0;
+}
 #endif /* ! HAVE___THREAD */
 
 void xeno_set_current(void);
 
+unsigned long *xeno_init_current_mode(void);
+void xeno_init_current_keys(void);
+
 #endif /* _XENO_ASM_GENERIC_CURRENT_H */
diff --git a/include/asm-generic/syscall.h b/include/asm-generic/syscall.h
index 315822e..62f7aa2 100644
--- a/include/asm-generic/syscall.h
+++ b/include/asm-generic/syscall.h
@@ -46,6 +46,7 @@
 #define __xn_sys_current   8   /* threadh = xnthread_handle(cur) */
 #define __xn_sys_current_info  9   /* r = xnshadow_current_info(info) */
 #define __xn_sys_get_next_sigs 10  /* only unqueue pending signals. */
+#define __xn_sys_drop_u_mode   11  /* stop updating thread-u_mode */
 
 #define XENOMAI_LINUX_DOMAIN  0
 #define XENOMAI_XENO_DOMAIN   1
diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index d82d6c7..21f085a 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -1018,7 +1018,8 @@ redo:
/* Grab the request token. */
return -ERESTARTSYS;
 
-   __xn_put_user(0, thread-u_mode);
+   if (thread-u_mode)
+   __xn_put_user(0, thread-u_mode);
 
preempt_disable();
 
@@ -1208,7 +1209,8 @@ void xnshadow_relax(int notify, int reason)
/* current is now running into the Linux domain on behalf of the
   root thread. */
 
-   __xn_put_user(XNRELAX, thread-u_mode);
+   if (thread-u_mode)
+   __xn_put_user(XNRELAX, thread-u_mode);
 
trace_mark(xn_nucleus, shadow_relaxed,
  thread %p thread_name %s comm %s,
@@ -1382,7 +1384,8 @@ int xnshadow_map(xnthread_t *thread, xncompletion_t 
__user *u_completion,
if (ret)
return ret;
 
-   __xn_put_user(XNRELAX, u_mode);
+   if (thread-u_mode)
+   __xn_put_user(XNRELAX, u_mode);
 
ret = xnshadow_harden();
 
@@ -1967,6 +1970,18 @@ static int xnshadow_sys_get_next_sigs(struct 

[Xenomai-git] Jan Kiszka : sigtest: Fix hard lock-up on disabled auto-shadowing

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: for-upstream
Commit: 80c13398bcce74db69b24adc2aae1a4b661ef434
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=80c13398bcce74db69b24adc2aae1a4b661ef434

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Sat Mar  6 09:45:33 2010 +0100

sigtest: Fix hard lock-up on disabled auto-shadowing

Perform manual shadowing of the sigtest main thread and catch the case
that this did not happen in the kernel part.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/drivers/testing/sigtest_module.c |3 +++
 src/testsuite/sigtest/sigtest.c   |4 
 2 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/ksrc/drivers/testing/sigtest_module.c 
b/ksrc/drivers/testing/sigtest_module.c
index e4235f1..f123382 100644
--- a/ksrc/drivers/testing/sigtest_module.c
+++ b/ksrc/drivers/testing/sigtest_module.c
@@ -28,6 +28,9 @@ static void sigtest_timer_handler(xntimer_t *timer)
 static int __sigtest_queue(struct pt_regs *regs)
 {
target = xnshadow_thread(current);
+   if (!target)
+   return -EPERM;
+
nr_sigs = (size_t)__xn_reg_arg2(regs);
sigs = xnmalloc(sizeof(*sigs) * nr_sigs);
next_sig = 0;
diff --git a/src/testsuite/sigtest/sigtest.c b/src/testsuite/sigtest/sigtest.c
index 93c3e5a..09043ad 100644
--- a/src/testsuite/sigtest/sigtest.c
+++ b/src/testsuite/sigtest/sigtest.c
@@ -166,8 +166,12 @@ void *dual_signals2(void *cookie)
 
 int main(void)
 {
+   struct sched_param sparam = { .sched_priority = 1 };
+
mlockall(MCL_CURRENT | MCL_FUTURE);
 
+   pthread_setschedparam(pthread_self(), SCHED_FIFO, sparam);
+
int one_restart[] = { -ERESTART, };
mysh = mark_seen;
seen = 0;


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


[Xenomai-git] Jan Kiszka : testsuite: Fix posix mutex test for non-auto-shadow setups

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: queues/assorted
Commit: 4267625909c441affac187c3b05adab071c1f65e
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=4267625909c441affac187c3b05adab071c1f65e

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 20:06:56 2010 +0100

testsuite: Fix posix mutex test for non-auto-shadow setups

sched_setscheduler is not wrapped by the POSIX skin, only
pthread_setschedparam. So the main thread of the test remained
unshadowed of auto-shadowing was disabled.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 src/testsuite/unit/mutex-torture.c |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/src/testsuite/unit/mutex-torture.c 
b/src/testsuite/unit/mutex-torture.c
index 70bda14..ebdd4f2 100644
--- a/src/testsuite/unit/mutex-torture.c
+++ b/src/testsuite/unit/mutex-torture.c
@@ -657,7 +657,7 @@ int main(void)
/* Set scheduling parameters for the current process */
 #ifdef XENO_POSIX
sparam.sched_priority = 2;
-   sched_setscheduler(0, SCHED_FIFO, sparam);
+   pthread_setschedparam(pthread_self(), SCHED_FIFO, sparam);
 #else /* __NATIVE_SKIN__ */
rt_task_shadow(main_tid, main_task, 2, 0);
 #endif /* __NATIVE_SKIN__ */


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


[Xenomai-git] Jan Kiszka : Native: Fix error signedness in rt_cont_wait_until

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: queues/assorted
Commit: b06173579eaea24f40c4b5957c4e729457d8ea5c
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=b06173579eaea24f40c4b5957c4e729457d8ea5c

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 12:22:06 2010 +0100

Native: Fix error signedness in rt_cont_wait_until

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 src/skins/native/cond.c |6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/skins/native/cond.c b/src/skins/native/cond.c
index 478321d..f874678 100644
--- a/src/skins/native/cond.c
+++ b/src/skins/native/cond.c
@@ -96,9 +96,9 @@ int rt_cond_wait_until(RT_COND *cond, RT_MUTEX *mutex, RTIME 
timeout)
saved_lockcnt, XN_REALTIME, timeout);
 
while (err == -EINTR)
-   err = -XENOMAI_SKINCALL2(__native_muxid,
-__native_cond_wait_epilogue, mutex,
-saved_lockcnt);
+   err = XENOMAI_SKINCALL2(__native_muxid,
+   __native_cond_wait_epilogue, mutex,
+   saved_lockcnt);
 #endif /* !CONFIG_XENO_FASTSYNCH */
 
return err;


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


[Xenomai-git] Jan Kiszka : Native: Fix return code of in-kernel rt_cond_wait[_until]

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: queues/assorted
Commit: 7d3e9b176dfadda8aa734e4449b552b6f695073e
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=7d3e9b176dfadda8aa734e4449b552b6f695073e

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 15:45:51 2010 +0100

Native: Fix return code of in-kernel rt_cond_wait[_until]

Return the error of the cond wait epilogue only if the prologue did not
fail. Otherwise use the latter.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/skins/native/cond.c |8 
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/ksrc/skins/native/cond.c b/ksrc/skins/native/cond.c
index 10727d1..d6c8546 100644
--- a/ksrc/skins/native/cond.c
+++ b/ksrc/skins/native/cond.c
@@ -467,17 +467,17 @@ static int rt_cond_wait_inner(RT_COND *cond, RT_MUTEX 
*mutex,
  xntmode_t timeout_mode, RTIME timeout)
 {
unsigned lockcnt;
-   int err;
+   int err, epilogue_err = 0;
 
err = rt_cond_wait_prologue(cond, mutex, lockcnt, 
timeout_mode, timeout);
 
if(!err || err == -ETIMEDOUT || err == -EINTR)
do {
-   err = rt_cond_wait_epilogue(mutex, lockcnt);
-   } while (err == -EINTR);
+   epilogue_err = rt_cond_wait_epilogue(mutex, lockcnt);
+   } while (epilogue_err == -EINTR);
 
-   return err;
+   return err ? err : epilogue_err;
 }
 /**
  * @fn int rt_cond_wait(RT_COND *cond, RT_MUTEX *mutex, RTIME timeout)


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


[Xenomai-git] Jan Kiszka : testsuite: Add timed mutex test

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: queues/assorted
Commit: 766431f4982bb03708590ab3672f9f00d2754530
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=766431f4982bb03708590ab3672f9f00d2754530

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 22:35:13 2010 +0100

testsuite: Add timed mutex test

Add test for timeouts while waiting on a mutexe. At this chance, also
tag the output on errors more clearly.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 src/testsuite/unit/mutex-torture.c |  133 
 1 files changed, 104 insertions(+), 29 deletions(-)

diff --git a/src/testsuite/unit/mutex-torture.c 
b/src/testsuite/unit/mutex-torture.c
index ebdd4f2..ebcb882 100644
--- a/src/testsuite/unit/mutex-torture.c
+++ b/src/testsuite/unit/mutex-torture.c
@@ -27,17 +27,18 @@
 #include asm-generic/bits/current.h /* For internal use, do not use
 in your code. */
 
-#define MUTEX_CREATE   1
-#define MUTEX_LOCK 2
-#define MUTEX_TRYLOCK  3
-#define MUTEX_UNLOCK   4
-#define MUTEX_DESTROY  5
-#define COND_CREATE6
-#define COND_SIGNAL7
-#define COND_WAIT  8
-#define COND_DESTROY   9
-#define THREAD_DETACH  10
-#define THREAD_CREATE  11
+#define MUTEX_CREATE   1
+#define MUTEX_LOCK 2
+#define MUTEX_TRYLOCK  3
+#define MUTEX_TIMED_LOCK   4
+#define MUTEX_UNLOCK   5
+#define MUTEX_DESTROY  6
+#define COND_CREATE7
+#define COND_SIGNAL8
+#define COND_WAIT  9
+#define COND_DESTROY   10
+#define THREAD_DETACH  11
+#define THREAD_CREATE  12
 
 #define NS_PER_MS  100
 
@@ -51,6 +52,16 @@ typedef RT_TASK thread_t;
 typedef RT_COND cond_t;
 #endif /* __NATIVE_SKIN__ */
 
+void timespec_add(struct timespec *ts, unsigned long long value)
+{
+   ts-tv_sec += value / 10;
+   ts-tv_nsec += value % 10;
+   if (ts-tv_nsec  10) {
+   ts-tv_sec++;
+   ts-tv_nsec -= 10;
+   }
+}
+
 void ms_sleep(int time)
 {
 #ifdef XENO_POSIX
@@ -82,14 +93,16 @@ void check_current_prio(int expected_prio)
RT_TASK_INFO task_info;
 
if ((ret = rt_task_inquire(NULL, task_info))  0) {
-   fprintf(stderr, Task inquire: %i (%s)\n, -ret, 
strerror(-ret));
+   fprintf(stderr,
+   FAILURE: Task inquire: %i (%s)\n, -ret, 
strerror(-ret));
exit(EXIT_FAILURE);
}
current_prio = task_info.cprio;
 #endif /* __NATIVE_SKIN__ */
 
if (current_prio != expected_prio) {
-   fprintf(stderr, current prio (%d) != expected prio (%d)\n,
+   fprintf(stderr,
+   FAILURE: current prio (%d) != expected prio (%d)\n,
current_prio, expected_prio);
exit(EXIT_FAILURE);
}
@@ -105,7 +118,8 @@ void check_current_mode(int expected_primary_mode)
current_in_primary = !(xeno_get_current_mode()  XNRELAX);

if (current_in_primary != expected_primary_mode) {
-   fprintf(stderr, current mode (%d) != expected mode (%d)\n,
+   fprintf(stderr,
+   FAILURE: current mode (%d) != expected mode (%d)\n,
current_in_primary, expected_primary_mode);
exit(EXIT_FAILURE);
}
@@ -122,16 +136,18 @@ void yield(void)
 
 int dispatch(const char *service_name, int service_type, int check, ...)
 {
+   unsigned long long timeout;
thread_t *thread;
cond_t *cond;
void *handler;
va_list ap;
int status;
+   mutex_t *mutex;
 #ifdef XENO_POSIX
struct sched_param param;
pthread_attr_t threadattr;
pthread_mutexattr_t mutexattr;
-   pthread_mutex_t *mutex;
+   struct timespec ts;
 #else /* __NATIVE_SKIN__ */
int prio;
 #endif /* __NATIVE_SKIN__ */
@@ -174,6 +190,18 @@ int dispatch(const char *service_name, int service_type, 
int check, ...)
 #endif /* __NATIVE_SKIN__ */
break;
 
+   case MUTEX_TIMED_LOCK:
+   mutex = va_arg(ap, mutex_t *);
+   timeout = va_arg(ap, unsigned long long);
+#ifdef XENO_POSIX
+   clock_gettime(CLOCK_REALTIME, ts);
+   timespec_add(ts, timeout);
+   status = pthread_mutex_timedlock(mutex, ts);
+#else /* __NATIVE_SKIN__ */
+   status = -rt_mutex_acquire(mutex, timeout);
+#endif /* __NATIVE_SKIN__ */
+   break;
+
case MUTEX_UNLOCK:
 #ifdef XENO_POSIX
status = pthread_mutex_unlock(va_arg(ap, pthread_mutex_t *));
@@ -264,7 +292,7 @@ int dispatch(const char *service_name, int service_type, 
int check, ...)
va_end(ap);
 
if (status  0  check) {
-   fprintf(stderr, %s: %i (%s)\n, 
+   fprintf(stderr, FAILURE: %s: %i (%s)\n, 
service_name, status, 

[Xenomai-git] Jan Kiszka : Native: Work around for error code corruption in rt_cond_wait[ _until]

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: queues/assorted
Commit: cfbac77b474b8750756f0e124d9874fb74606d43
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=cfbac77b474b8750756f0e124d9874fb74606d43

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 16:24:59 2010 +0100

Native: Work around for error code corruption in rt_cond_wait[_until]

User space suffers from losing the error code of the cond wait prologue.
We would actually have to return the prologue error to user space and
use that one after the epilogue succeeded, but the existing kernel ABI
does not allow this nor is existing user space prepared for it.

As a workaround, keep the prologue error code in xnthread's errcode and
restore it from there when user space re-enters the kernel for the
epilogue. This requires no ABI changes, but suffers from potential
overwriting if the same or some other errcode touching service is called
from a user space signal handler in between the calls. Moreover, current
user space also prevents that we can return -EINTR on interruption while
blocked on the condition variable, which was possible before.

A true fix will require a new syscall and updated user space libs.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/skins/native/syscall.c |   26 ++
 1 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/ksrc/skins/native/syscall.c b/ksrc/skins/native/syscall.c
index 462ee7e..ee6c829 100644
--- a/ksrc/skins/native/syscall.c
+++ b/ksrc/skins/native/syscall.c
@@ -1841,7 +1841,7 @@ static int __rt_cond_wait_prologue(struct pt_regs *regs)
RT_MUTEX *mutex;
RT_COND *cond;
RTIME timeout;
-   int err;
+   int err, epilogue_err;
 
if (__xn_safe_copy_from_user(cph, (void __user *)__xn_reg_arg1(regs),
 sizeof(cph)))
@@ -1869,10 +1869,21 @@ static int __rt_cond_wait_prologue(struct pt_regs *regs)
 
err = rt_cond_wait_prologue(cond, mutex, lockcnt, timeout_mode, 
timeout);
 
+   /* Old user space prevents that we can return -EINTR (it would loop
+  forever if we did). So drop this error. */
+   xnpod_current_thread()-errcode = err != -EINTR ? err : 0;
+
/* Reacquire the mutex if it was unlocked in the prologue and we were
   not interrupted. */
-   if (lockcnt  err != -EINTR)
-   err = rt_cond_wait_epilogue(mutex, lockcnt);
+   if (lockcnt  err != -EINTR) {
+   epilogue_err = rt_cond_wait_epilogue(mutex, lockcnt);
+
+   /* Only overwrite the prologue if we need to signal -EINTR or
+  the previous error was less fatal. */
+   if (epilogue_err  0 
+   (epilogue_err == -EINTR || err != -EIDRM))
+   err = epilogue_err;
+   }
 
if (err == -EINTR  __xn_reg_arg3(regs)
 __xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs),
@@ -1891,6 +1902,7 @@ static int __rt_cond_wait_epilogue(struct pt_regs *regs)
RT_COND_PLACEHOLDER mph;
unsigned lockcnt;
RT_MUTEX *mutex;
+   int prologue_err, err;
 
if (__xn_safe_copy_from_user(mph, (void __user *)__xn_reg_arg1(regs),
 sizeof(mph)))
@@ -1903,7 +1915,13 @@ static int __rt_cond_wait_epilogue(struct pt_regs *regs)
 
lockcnt = __xn_reg_arg2(regs);
 
-   return rt_cond_wait_epilogue(mutex, lockcnt);
+   err = rt_cond_wait_epilogue(mutex, lockcnt);
+   if (err == -EINTR)
+   return err;
+
+   prologue_err = xnpod_current_thread()-errcode;
+
+   return (err  0  prologue_err != -EIDRM) ? err : prologue_err;
 }
 
 /*


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


[Xenomai-git] Jan Kiszka : Native: Ensure to re-acquire the mutex on cond_wait return

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: queues/assorted
Commit: 6506037a393f1db40697a6c8703d0dc5bd83912c
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=6506037a393f1db40697a6c8703d0dc5bd83912c

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 13:17:35 2010 +0100

Native: Ensure to re-acquire the mutex on cond_wait return

Always try to reacquire the mutex if the prologue released it. The only
exception is user space return on interruption.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/skins/native/cond.c|   17 +++--
 ksrc/skins/native/syscall.c |6 --
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/ksrc/skins/native/cond.c b/ksrc/skins/native/cond.c
index d6c8546..6076472 100644
--- a/ksrc/skins/native/cond.c
+++ b/ksrc/skins/native/cond.c
@@ -380,6 +380,8 @@ int rt_cond_wait_prologue(RT_COND *cond, RT_MUTEX *mutex, 
unsigned *plockcnt,
spl_t s;
int err;
 
+   *plockcnt = 0;
+
if (timeout == TM_NONBLOCK)
return -EWOULDBLOCK;
 
@@ -467,15 +469,18 @@ static int rt_cond_wait_inner(RT_COND *cond, RT_MUTEX 
*mutex,
  xntmode_t timeout_mode, RTIME timeout)
 {
unsigned lockcnt;
-   int err, epilogue_err = 0;
+   int err, epilogue_err;
 
-   err = rt_cond_wait_prologue(cond, mutex, lockcnt, 
+   err = rt_cond_wait_prologue(cond, mutex, lockcnt,
timeout_mode, timeout);
 
-   if(!err || err == -ETIMEDOUT || err == -EINTR)
-   do {
-   epilogue_err = rt_cond_wait_epilogue(mutex, lockcnt);
-   } while (epilogue_err == -EINTR);
+   if (!lockcnt)
+   return err;
+
+   /* Reacquire the mutex if it was unlocked in the prologue. */
+   do {
+   epilogue_err = rt_cond_wait_epilogue(mutex, lockcnt);
+   } while (epilogue_err == -EINTR);
 
return err ? err : epilogue_err;
 }
diff --git a/ksrc/skins/native/syscall.c b/ksrc/skins/native/syscall.c
index 40e5cfd..462ee7e 100644
--- a/ksrc/skins/native/syscall.c
+++ b/ksrc/skins/native/syscall.c
@@ -1869,9 +1869,11 @@ static int __rt_cond_wait_prologue(struct pt_regs *regs)
 
err = rt_cond_wait_prologue(cond, mutex, lockcnt, timeout_mode, 
timeout);
 
-   if (err == 0 || err == -ETIMEDOUT)
+   /* Reacquire the mutex if it was unlocked in the prologue and we were
+  not interrupted. */
+   if (lockcnt  err != -EINTR)
err = rt_cond_wait_epilogue(mutex, lockcnt);
-   
+
if (err == -EINTR  __xn_reg_arg3(regs)
 __xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs),
  lockcnt, sizeof(lockcnt)))


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


[Xenomai-git] Jan Kiszka : POSIX: Fix signedness in mutex re-acquisition on cond wait

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: queues/assorted
Commit: 426edd8fce33ba56e0a2517a074a4c8d709de1b3
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=426edd8fce33ba56e0a2517a074a4c8d709de1b3

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Fri Mar  5 19:56:10 2010 +0100

POSIX: Fix signedness in mutex re-acquisition on cond wait

pse51_cond_timedwait_epilogue returns negative error codes.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/skins/posix/cond.c |8 
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/ksrc/skins/posix/cond.c b/ksrc/skins/posix/cond.c
index 1b74b80..f86e85e 100644
--- a/ksrc/skins/posix/cond.c
+++ b/ksrc/skins/posix/cond.c
@@ -423,8 +423,8 @@ int pthread_cond_wait(pthread_cond_t * cnd, pthread_mutex_t 
* mx)
count, 0, XN_INFINITE);
 
if (!err || err == EINTR)
-   while (EINTR == pse51_cond_timedwait_epilogue(cur, cond,
- mutex, count))
+   while (-EINTR == pse51_cond_timedwait_epilogue(cur, cond,
+  mutex, count))
;
 
 #ifdef CONFIG_XENO_FASTSYNCH
@@ -491,8 +491,8 @@ int pthread_cond_timedwait(pthread_cond_t * cnd,
ts2ticks_ceil(abstime) + 1);
 
if (!err || err == EINTR || err == ETIMEDOUT)
-   while (EINTR == pse51_cond_timedwait_epilogue(cur, cond,
- mutex, count))
+   while (-EINTR == pse51_cond_timedwait_epilogue(cur, cond,
+  mutex, count))
;
 
 #ifdef CONFIG_XENO_FASTSYNCH


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


[Xenomai-git] Jan Kiszka : POSIX: Fix signedness issue in EFAULT path of cond_wait_prologue

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: queues/assorted
Commit: 788d667aedb7f72b8bb12e413d45b64cd19ebf22
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=788d667aedb7f72b8bb12e413d45b64cd19ebf22

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 23:29:57 2010 +0100

POSIX: Fix signedness issue in EFAULT path of cond_wait_prologue

Fix this bug and use a consistent pattern for other occurrences as well.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/skins/posix/syscall.c |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
index 61b8cee..6c3ec3a 100644
--- a/ksrc/skins/posix/syscall.c
+++ b/ksrc/skins/posix/syscall.c
@@ -1568,13 +1568,13 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
   umx-shadow_mutex.lockcnt,
   mx.shadow_mutex.lockcnt,
   sizeof(umx-shadow_mutex.lockcnt)))
-   err = -EFAULT;
+   return -EFAULT;
}
 
if (err == EINTR
 __xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs),
  count, sizeof(count)))
-   err = EFAULT;
+   return -EFAULT;

return -err;
 }


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


[Xenomai-git] Jan Kiszka : POSIX: Work around for error code corruption in pthread_cond_[ timed]wait

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: queues/assorted
Commit: c94e685bbc9dd5ee7859ead6b3fb77bda45d4cd5
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=c94e685bbc9dd5ee7859ead6b3fb77bda45d4cd5

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 23:22:22 2010 +0100

POSIX: Work around for error code corruption in pthread_cond_[timed]wait

This is the some work around for POSIX as already applied on Native. The
temporary storage of the prologue error in xnthread's errcode is a bit
more fragile here as POSIX services uses this variable for saving errno.
Therefore, user space that makes use of signal handlers should better
migrate to revised syscalls that will be added later on.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/skins/posix/syscall.c |   23 ++-
 1 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
index 6c3ec3a..0032f4d 100644
--- a/ksrc/skins/posix/syscall.c
+++ b/ksrc/skins/posix/syscall.c
@@ -1520,7 +1520,7 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
union __xeno_mutex mx, *umx;
unsigned timed, count;
struct timespec ts;
-   int err;
+   int err, epilogue_err;
 
ucnd = (union __xeno_cond *)__xn_reg_arg1(regs);
umx = (union __xeno_mutex *)__xn_reg_arg2(regs);
@@ -1560,14 +1560,19 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
mx.shadow_mutex,
count, timed, XN_INFINITE);
 
+   cur-errcode = err != EINTR ? err : 0;
+
if (err == 0 || err == ETIMEDOUT) {
-   err = -pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond,
-   mx.shadow_mutex, count);
-   if (err == 0 
-   __xn_safe_copy_to_user((void __user *)
-  umx-shadow_mutex.lockcnt,
-  mx.shadow_mutex.lockcnt,
-  sizeof(umx-shadow_mutex.lockcnt)))
+   epilogue_err =
+   -pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond,
+  mx.shadow_mutex,
+  count);
+   if (epilogue_err != 0)
+   err = epilogue_err;
+   else if (__xn_safe_copy_to_user((void __user *)
+   umx-shadow_mutex.lockcnt,
+   mx.shadow_mutex.lockcnt,
+   
sizeof(umx-shadow_mutex.lockcnt)))
return -EFAULT;
}
 
@@ -1618,7 +1623,7 @@ static int __pthread_cond_wait_epilogue(struct pt_regs 
*regs)
  sizeof(umx-shadow_mutex.lockcnt)))
return -EFAULT;
 
-   return err;
+   return err ? err : -cur-errcode;
 }
 
 static int __pthread_cond_signal(struct pt_regs *regs)


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


[Xenomai-git] Jan Kiszka : POSIX: Consolidate __pthread_cond_wait and __pthread_cond_timedwait

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: queues/assorted
Commit: 91d84f3e333e3bdc4f9a73498987509bcb340165
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=91d84f3e333e3bdc4f9a73498987509bcb340165

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Sat Mar  6 09:02:34 2010 +0100

POSIX: Consolidate __pthread_cond_wait and __pthread_cond_timedwait

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 src/skins/posix/cond.c |   45 ++---
 1 files changed, 10 insertions(+), 35 deletions(-)

diff --git a/src/skins/posix/cond.c b/src/skins/posix/cond.c
index 0582367..1fd01b3 100644
--- a/src/skins/posix/cond.c
+++ b/src/skins/posix/cond.c
@@ -100,7 +100,8 @@ static void __pthread_cond_cleanup(void *data)
} while (err == EINTR);
 }
 
-int __wrap_pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
+static int __pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex,
+  int timed, const struct timespec *abstime)
 {
struct pse51_cond_cleanup_t c = {
.cond = (union __xeno_cond *)cond,
@@ -118,7 +119,8 @@ int __wrap_pthread_cond_wait(pthread_cond_t *cond, 
pthread_mutex_t *mutex)
err = -XENOMAI_SKINCALL5(__pse51_muxid,
 __pse51_cond_wait_prologue,
 c.cond-shadow_cond,
-c.mutex-shadow_mutex, c.count, 0, NULL);
+c.mutex-shadow_mutex, c.count,
+timed, abstime);
 
pthread_setcanceltype(oldtype, NULL);
 
@@ -138,43 +140,16 @@ int __wrap_pthread_cond_wait(pthread_cond_t *cond, 
pthread_mutex_t *mutex)
return err;
 }
 
+int __wrap_pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
+{
+   return __pthread_cond_wait(cond, mutex, 0, NULL);
+}
+
 int __wrap_pthread_cond_timedwait(pthread_cond_t * cond,
  pthread_mutex_t * mutex,
  const struct timespec *abstime)
 {
-   struct pse51_cond_cleanup_t c = {
-   .cond = (union __xeno_cond *)cond,
-   .mutex = (union __xeno_mutex *)mutex,
-   };
-   int err, oldtype;
-
-   if (cb_try_read_lock(c.mutex-shadow_mutex.lock, s))
-   return EINVAL;
-
-   pthread_cleanup_push(__pthread_cond_cleanup, c);
-
-   pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, oldtype);
-
-   err = -XENOMAI_SKINCALL5(__pse51_muxid,
-__pse51_cond_wait_prologue,
-c.cond-shadow_cond,
-c.mutex-shadow_mutex, c.count, 1, abstime);
-   pthread_setcanceltype(oldtype, NULL);
-
-   pthread_cleanup_pop(0);
-
-   while (err == EINTR)
-   err = -XENOMAI_SKINCALL3(__pse51_muxid,
-__pse51_cond_wait_epilogue,
-c.cond-shadow_cond,
-c.mutex-shadow_mutex,
-c.count);
-
-   cb_read_unlock(c.mutex-shadow_mutex.lock, s);
-
-   pthread_testcancel();
-
-   return err;
+   return __pthread_cond_wait(cond, mutex, 1, abstime);
 }
 
 int __wrap_pthread_cond_signal(pthread_cond_t * cond)


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


[Xenomai-git] Jan Kiszka : Add __xn_linux_mux_p for Linux syscall demultiplexing

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: queues/assorted
Commit: 1eb49063b184f62cc405b1aee04f8b9563a804f6
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=1eb49063b184f62cc405b1aee04f8b9563a804f6

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Fri Mar  5 18:27:07 2010 +0100

Add __xn_linux_mux_p for Linux syscall demultiplexing

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 include/asm-arm/syscall.h  |8 ++--
 include/asm-blackfin/syscall.h |2 ++
 include/asm-nios2/syscall.h|2 ++
 include/asm-powerpc/syscall.h  |2 ++
 include/asm-x86/syscall.h  |1 +
 5 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/include/asm-arm/syscall.h b/include/asm-arm/syscall.h
index fb512b4..39311d5 100644
--- a/include/asm-arm/syscall.h
+++ b/include/asm-arm/syscall.h
@@ -55,9 +55,13 @@
 #ifdef CONFIG_OABI_COMPAT
 #define __xn_reg_mux_p(regs)( ((regs)-ARM_r7 == __NR_OABI_SYSCALL_BASE + 
XENO_ARM_SYSCALL) || \
   ((regs)-ARM_r7 == __NR_SYSCALL_BASE + 
XENO_ARM_SYSCALL) )
-#else
+#define __xn_linux_mux_p(regs, nr) \
+   ( ((regs)-ARM_r7 == __NR_OABI_SYSCALL_BASE + 
(nr)) || \
+ ((regs)-ARM_r7 == __NR_SYSCALL_BASE + (nr)) )
+#else /* !CONFIG_OABI_COMPAT */
 #define __xn_reg_mux_p(regs)  ((regs)-ARM_r7 == __NR_SYSCALL_BASE + 
XENO_ARM_SYSCALL)
-#endif
+#define __xn_linux_mux_p(regs, nr) ((regs)-ARM_r7 == __NR_SYSCALL_BASE + (nr))
+#endif /* !CONFIG_OABI_COMPAT */
 
 #define __xn_mux_id(regs)   ((__xn_reg_mux(regs)  16)  0xff)
 #define __xn_mux_op(regs)   ((__xn_reg_mux(regs)  24)  0xff)
diff --git a/include/asm-blackfin/syscall.h b/include/asm-blackfin/syscall.h
index 9f90611..9420dc8 100644
--- a/include/asm-blackfin/syscall.h
+++ b/include/asm-blackfin/syscall.h
@@ -55,6 +55,8 @@
 #define __xn_mux_id(regs)   ((__xn_reg_mux(regs)  24)  0xff)
 #define __xn_mux_op(regs)   ((__xn_reg_mux(regs)  16)  0xff)
 
+#define __xn_linux_mux_p(regs, nr)  (__xn_reg_mux(regs) == (nr))
+
 /* Purposedly used inlines and not macros for the following routines
so that we don't risk spurious side-effects on the value arg. */
 
diff --git a/include/asm-nios2/syscall.h b/include/asm-nios2/syscall.h
index 6dd81cb..8fd53dc 100644
--- a/include/asm-nios2/syscall.h
+++ b/include/asm-nios2/syscall.h
@@ -48,6 +48,8 @@
 #define __xn_mux_id(regs)   ((__xn_reg_mux(regs)  24)  0xff)
 #define __xn_mux_op(regs)   ((__xn_reg_mux(regs)  16)  0xff)
 
+#define __xn_linux_mux_p(regs, nr)  (__xn_reg_mux(regs) == (nr))
+
 /*
  * Purposedly used inlines and not macros for the following routines
  * so that we don't risk spurious side-effects on the value arg.
diff --git a/include/asm-powerpc/syscall.h b/include/asm-powerpc/syscall.h
index 6db8667..99cb9ad 100644
--- a/include/asm-powerpc/syscall.h
+++ b/include/asm-powerpc/syscall.h
@@ -49,6 +49,8 @@
 #define __xn_mux_id(regs)   ((__xn_reg_mux(regs)  16)  0xff)
 #define __xn_mux_op(regs)   ((__xn_reg_mux(regs)  24)  0xff)
 
+#define __xn_linux_mux_p(regs, nr)  (__xn_reg_mux(regs) == (nr))
+
 /* Purposedly used inlines and not macros for the following routines
so that we don't risk spurious side-effects on the value arg. */
 
diff --git a/include/asm-x86/syscall.h b/include/asm-x86/syscall.h
index f77fd55..36dcd59 100644
--- a/include/asm-x86/syscall.h
+++ b/include/asm-x86/syscall.h
@@ -77,6 +77,7 @@ struct frame {
 #define __xn_mux_id(regs) ((__xn_reg_mux(regs)  16)  0xff)
 #define __xn_mux_op(regs) ((__xn_reg_mux(regs)  24)  0xff)
 
+#define __xn_linux_mux_p(regs, nr)  (__xn_reg_mux(regs) == (nr))
 
 /* Purposedly used inlines and not macros for the following routines
so that we don't risk spurious side-effects on the value arg. */


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


[Xenomai-git] Jan Kiszka : POSIX: Add and use fixed syscalls for pthread_cond_[timed]wait

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: queues/assorted
Commit: 0a1ca2dd9c5f9439eccfcb8b678abe8db143b9a0
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=0a1ca2dd9c5f9439eccfcb8b678abe8db143b9a0

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Sat Mar  6 09:30:20 2010 +0100

POSIX: Add and use fixed syscalls for pthread_cond_[timed]wait

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 include/posix/pthread.h|5 +++
 include/posix/syscall.h|2 +
 ksrc/skins/posix/syscall.c |   82 ++
 src/skins/posix/cond.c |   87 ++--
 src/skins/posix/init.c |3 ++
 5 files changed, 153 insertions(+), 26 deletions(-)

diff --git a/include/posix/pthread.h b/include/posix/pthread.h
index 685b356..b4f9531 100644
--- a/include/posix/pthread.h
+++ b/include/posix/pthread.h
@@ -184,6 +184,11 @@ union __xeno_cond {
} shadow_cond;
 };
 
+struct pse51_cond_wait_state {
+   unsigned count;
+   int prologue_err;
+};
+
 struct pse51_interrupt;
 
 typedef struct pse51_interrupt *pthread_intr_t;
diff --git a/include/posix/syscall.h b/include/posix/syscall.h
index 04a528d..8bb64bd 100644
--- a/include/posix/syscall.h
+++ b/include/posix/syscall.h
@@ -104,6 +104,8 @@
 #define __pse51_select77
 #define __pse51_thread_setschedparam_ex78
 #define __pse51_thread_getschedparam_ex79
+#define __pse51_cond_wait_prologue280
+#define __pse51_cond_wait_epilogue281
 
 #ifdef __KERNEL__
 
diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
index 0032f4d..584708e 100644
--- a/ksrc/skins/posix/syscall.c
+++ b/ksrc/skins/posix/syscall.c
@@ -1512,13 +1512,14 @@ static int __pthread_cond_destroy(struct pt_regs *regs)
  cnd.shadow_cond, 
sizeof(ucnd-shadow_cond));
 }
 
-/* pthread_cond_wait_prologue(cond, mutex, count_ptr, timed, timeout) */
-static int __pthread_cond_wait_prologue(struct pt_regs *regs)
+static int
+__pthread_cond_wait_prologue_inner(struct pt_regs *regs,
+  struct pse51_cond_wait_state *state)
 {
xnthread_t *cur = xnshadow_thread(current);
union __xeno_cond cnd, *ucnd;
union __xeno_mutex mx, *umx;
-   unsigned timed, count;
+   unsigned timed;
struct timespec ts;
int err, epilogue_err;
 
@@ -1551,22 +1552,23 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
err = pse51_cond_timedwait_prologue(cur,
cnd.shadow_cond,
mx.shadow_mutex,
-   count,
+   state-count,
timed,
ts2ticks_ceil(ts) + 1);
} else
err = pse51_cond_timedwait_prologue(cur,
cnd.shadow_cond,
mx.shadow_mutex,
-   count, timed, XN_INFINITE);
+   state-count,
+   timed, XN_INFINITE);
 
-   cur-errcode = err != EINTR ? err : 0;
+   state-prologue_err = err != EINTR ? err : 0;
 
if (err == 0 || err == ETIMEDOUT) {
epilogue_err =
-pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond,
   mx.shadow_mutex,
-  count);
+  state-count);
if (epilogue_err != 0)
err = epilogue_err;
else if (__xn_safe_copy_to_user((void __user *)
@@ -1575,17 +1577,45 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)

sizeof(umx-shadow_mutex.lockcnt)))
return -EFAULT;
}
-
-   if (err == EINTR
-__xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs),
- count, sizeof(count)))
-   return -EFAULT;

return -err;
 }
 
-/* pthread_cond_wait_epilogue(cond, mutex, count) */
-static int __pthread_cond_wait_epilogue(struct pt_regs *regs)
+/* pthread_cond_wait_prologue(cond, mutex, count_ptr, timed, timeout) */
+static int __pthread_cond_wait_prologue(struct pt_regs *regs)
+{
+   struct pse51_cond_wait_state state;
+   int err;
+
+   err = __pthread_cond_wait_prologue_inner(regs, state);
+
+   xnshadow_thread(current)-errcode = state.prologue_err;
+
+   if (err == -EINTR
+__xn_safe_copy_to_user((void __user *)__xn_reg_arg3(regs),
+

[Xenomai-git] Jan Kiszka : sigtest: Fix hard lock-up on disabled auto-shadowing

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: queues/assorted
Commit: 80c13398bcce74db69b24adc2aae1a4b661ef434
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=80c13398bcce74db69b24adc2aae1a4b661ef434

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Sat Mar  6 09:45:33 2010 +0100

sigtest: Fix hard lock-up on disabled auto-shadowing

Perform manual shadowing of the sigtest main thread and catch the case
that this did not happen in the kernel part.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/drivers/testing/sigtest_module.c |3 +++
 src/testsuite/sigtest/sigtest.c   |4 
 2 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/ksrc/drivers/testing/sigtest_module.c 
b/ksrc/drivers/testing/sigtest_module.c
index e4235f1..f123382 100644
--- a/ksrc/drivers/testing/sigtest_module.c
+++ b/ksrc/drivers/testing/sigtest_module.c
@@ -28,6 +28,9 @@ static void sigtest_timer_handler(xntimer_t *timer)
 static int __sigtest_queue(struct pt_regs *regs)
 {
target = xnshadow_thread(current);
+   if (!target)
+   return -EPERM;
+
nr_sigs = (size_t)__xn_reg_arg2(regs);
sigs = xnmalloc(sizeof(*sigs) * nr_sigs);
next_sig = 0;
diff --git a/src/testsuite/sigtest/sigtest.c b/src/testsuite/sigtest/sigtest.c
index 93c3e5a..09043ad 100644
--- a/src/testsuite/sigtest/sigtest.c
+++ b/src/testsuite/sigtest/sigtest.c
@@ -166,8 +166,12 @@ void *dual_signals2(void *cookie)
 
 int main(void)
 {
+   struct sched_param sparam = { .sched_priority = 1 };
+
mlockall(MCL_CURRENT | MCL_FUTURE);
 
+   pthread_setschedparam(pthread_self(), SCHED_FIFO, sparam);
+
int one_restart[] = { -ERESTART, };
mysh = mark_seen;
seen = 0;


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


[Xenomai-git] Andreas Glatz : native: corrected spelling mistake in macro __xeno_flush_rq ()

2010-03-06 Thread GIT version control
Module: xenomai-2.5
Branch: master
Commit: 787926f9f4e1ef9d50c2cb3a081edd065bf96176
URL:
http://git.xenomai.org/?p=xenomai-2.5.git;a=commit;h=787926f9f4e1ef9d50c2cb3a081edd065bf96176

Author: Andreas Glatz andreasgl...@ruggedcom.com
Date:   Fri Feb 12 18:36:24 2010 -0500

native: corrected spelling mistake in macro __xeno_flush_rq()

This spelling mistake causes the preprocessor not to substitute
a macro argument as it was originally intended by the author.

Signed-off-by: Andreas Glatz andreasgl...@ruggedcom.com

---

 include/native/ppd.h |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/include/native/ppd.h b/include/native/ppd.h
index 3dbda6a..a02cc06 100644
--- a/include/native/ppd.h
+++ b/include/native/ppd.h
@@ -105,7 +105,7 @@ static inline xeno_rholder_t *xeno_get_rholder(void)
if (unlikely(err)) {\
if ((__rq) != 
__native_global_rholder.__name##q) { \
xnlock_get_irqsave(nklock, s); \
-   nholder = popq((rq), holder);   \
+   nholder = popq((__rq), holder); \

appendq(__native_global_rholder.__name##q, holder); \
obj-rqueue = 
__native_global_rholder.__name##q; \
}   \


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


[Xenomai-git] Philippe Gerum : nucleus/intr: factor out attachment bit setting

2010-03-06 Thread GIT version control
Module: xenomai-2.5
Branch: master
Commit: 359a7394d4b9779fb47b62e897efbf80dbd73b4b
URL:
http://git.xenomai.org/?p=xenomai-2.5.git;a=commit;h=359a7394d4b9779fb47b62e897efbf80dbd73b4b

Author: Philippe Gerum r...@xenomai.org
Date:   Fri Mar  5 12:04:37 2010 +0100

nucleus/intr: factor out attachment bit setting

---

 ksrc/nucleus/intr.c |   15 +++
 1 files changed, 3 insertions(+), 12 deletions(-)

diff --git a/ksrc/nucleus/intr.c b/ksrc/nucleus/intr.c
index be403b3..2d149b5 100644
--- a/ksrc/nucleus/intr.c
+++ b/ksrc/nucleus/intr.c
@@ -348,8 +348,6 @@ static inline int xnintr_irq_attach(xnintr_t *intr)
return err;
}
 
-   __setbits(intr-flags, XN_ISR_ATTACHED);
-
intr-next = NULL;
 
/* Add the given interrupt object. No need to synchronise with the IRQ
@@ -412,16 +410,8 @@ static inline xnintr_t *xnintr_shirq_next(xnintr_t *prev)
 
 static inline int xnintr_irq_attach(xnintr_t *intr)
 {
-   int ret;
-
-   ret = xnarch_hook_irq(intr-irq, xnintr_irq_handler,
- (rthal_irq_ackfn_t)intr-iack, intr);
-   if (ret)
-   return ret;
-
-   __setbits(intr-flags, XN_ISR_ATTACHED);
-
-   return 0;
+   return xnarch_hook_irq(intr-irq, xnintr_irq_handler,
+  (rthal_irq_ackfn_t)intr-iack, intr);
 }
 
 static inline int xnintr_irq_detach(xnintr_t *intr)
@@ -740,6 +730,7 @@ int xnintr_attach(xnintr_t *intr, void *cookie)
if (ret)
goto out;
 
+   __setbits(intr-flags, XN_ISR_ATTACHED);
xnintr_stat_counter_inc();
 out:
xnlock_put_irqrestore(intrlock, s);


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