Jeff Weber wrote:
> I get a segfault when attempting to rt_mutex_acquire a mutex created in
> kernel space.  I've reduced the issue to the following sample code.
> Help finding my mistake is appreciated.
> 
> TIA,
> Jeff
> 
> 
> Kernel space Code:
> #include <linux/module.h>
> #include <linux/init.h>
> #include <native/mutex.h>
> #include "testAPI.h"  /* defines MTXNAME */
> 
> #define MODNAME  "XenoTest"
> 
> static RT_MUTEX sMtx;
> 
> static int __init mymodule_init(void)
> {
>     int status;
> 
>     status = rt_mutex_create(&sMtx, MTXNAME);
>     if (status) {
>     printk ("rt_mutex_create: %d\n", status);
>         return 1;
>     }
> 
>     printk ("loaded module %s\n", MODNAME);
>     return 0;
> }
> 
> static void __exit mymodule_exit(void)
> {
>     rt_mutex_delete(&sMtx);
> 
>     printk ("unloaded module %s\n", MODNAME);
>     return;
> }
> 
> module_init(mymodule_init);
> module_exit(mymodule_exit);
> 
> MODULE_LICENSE("GPL");
> 
> 
> 
> User space Code:
> #include <stdio.h>
> #include <sys/mman.h>
> #include <native/mutex.h>
> #include <native/task.h>
> 
> #include "testAPI.h"    /* defines MTXNAME */
> 
> #define PRIO    0
> #define MODE    0
> 
> int main(void)
> {
>     RT_MUTEX mtx;
>     RT_TASK  tsk;
>     RT_MUTEX_INFO info;
>     int status;
> 
>     mlockall(MCL_CURRENT|MCL_FUTURE);
> 
>     status = rt_task_shadow(&tsk, NULL, PRIO, MODE);
>     if (status) {
>         fprintf(stderr, "rt_task_shadow: %d\n", status);
>         return 1;
>     }
> 
>     status = rt_mutex_bind(&mtx, MTXNAME, TM_INFINITE);
>     if (status) {
>         fprintf(stderr, "rt_mutex_bind: %d\n", status);
>         return 1;
>     }
> 
>     status = rt_mutex_inquire(&mtx, &info);
>     if (status) {
>         fprintf(stderr, "rt_mutex_inquire: %d\n", status);
>         return 1;
>     }
> 
>     status = rt_mutex_acquire(&mtx, TM_INFINITE); /* SEGFAULT HERE! */
>     if (status) {
>         fprintf(stderr, "rt_mutex_acquire: %d\n", status);
>         return 1;
>     }
> 
>     status = rt_mutex_release(&mtx);
>     if (status) {
>         fprintf(stderr, "rt_mutex_release: %d\n", status);
>         return 1;
>     }
> 
>     printf("test success\n");   // back to primary mode
>     return 0;
> }
> 
> my kernel
> 
> backtrace:
> Program terminated with signal 11, Segmentation fault.
> #0  0xb770077a in xnarch_atomic_cmpxchg (v=0xb777ac00, old=0, newval=21)
>     at ../../../src/include/asm/xenomai/atomic.h:95
> 95              __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2"
> (gdb) bt full
> #0  0xb770077a in xnarch_atomic_cmpxchg (v=0xb777ac00, old=0, newval=21)
>     at ../../../src/include/asm/xenomai/atomic.h:95
>         ptr = 0xb777ac00
>         prev = 4294967295
> #1  0xb7700815 in xnsynch_fast_acquire (fastlock=0xb777ac00, new_ownerh=21)
>     at ../../../include/nucleus/synch.h:52
>         lock_state = 3077595124
> #2  0xb7700c3a in rt_mutex_acquire_inner (mutex=0xbfecd690, timeout=0,
>     mode=XN_RELATIVE) at mutex.c:83
>         err = 134513420
>         cur = 21
> #3  0xb7700e01 in rt_mutex_acquire (mutex=0xbfecd690, timeout=0) at
> mutex.c:129
> No locals.
> #4  0x0804884a in main () at uspace.c:38
>         mtx = {opaque = 19, fastlock = 0xb777ac00, lockcnt = 0}
>         tsk = {opaque = 21, opaque2 = 3075921616}
>         info = {locked = 0, nwaiters = 0,
>           name = "TestMtx\000\000\000\060\000@\236i\340\000\177%", '\000'
> <repeats 12 times>,
>           owner =
> "\000\000\000\000\364\036\331\336\020\037\331\336\365Pd\340\005\005UU\000\037\331\336\000\000\000\000\023\000\000"}
>         status = 0
> 
> my config:
> arch: x86
> linux: 2.6.35.10
> xenomai: 2.5.5.2

32 bits? 64 bits? uniprocessor? multiprocessor?

-- 
                                                                Gilles.

_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to