On Mon, Jan 17, 2011 at 3:47 PM, Gilles Chanteperdrix <
[email protected]> wrote:
> 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.
>
32-bit uniprocessor
Jeff
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help