[Xenomai-git] Philippe Gerum : skins: sanitize heap binding
Module: xenomai-head Branch: master Commit: bcd7078ddc7ac3ece81bf45279912691932b7205 URL: http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=bcd7078ddc7ac3ece81bf45279912691932b7205 Author: Philippe Gerum r...@xenomai.org Date: Sun Jun 13 17:27:06 2010 +0200 skins: sanitize heap binding --- include/nucleus/heap.h |5 +++ ksrc/nucleus/shadow.c | 16 +++-- src/skins/common/sem_heap.c | 76 +++ src/skins/native/heap.c | 38 - src/skins/native/queue.c| 38 - src/skins/psos+/rn.c| 36 +++- src/skins/rtai/shm.c| 61 +++--- src/skins/vrtx/heap.c | 36 +++- src/skins/vrtx/pt.c | 36 +++- 9 files changed, 90 insertions(+), 252 deletions(-) diff --git a/include/nucleus/heap.h b/include/nucleus/heap.h index fecdb79..f4ebe11 100644 --- a/include/nucleus/heap.h +++ b/include/nucleus/heap.h @@ -279,4 +279,9 @@ int xnheap_check_block(xnheap_t *heap, #define XNHEAP_DEV_NAME /dev/rtheap +struct xnheap_desc { + unsigned long handle; + unsigned int size; +}; + #endif /* !_XENO_NUCLEUS_HEAP_H */ diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c index 1a32527..cc313cf 100644 --- a/ksrc/nucleus/shadow.c +++ b/ksrc/nucleus/shadow.c @@ -702,8 +702,7 @@ void __init xnheap_init_vdso(void) { nkvdso = (struct xnvdso *) xnheap_alloc(__xnsys_global_ppd.sem_heap, sizeof(*nkvdso)); - - if (!nkvdso) + if (nkvdso == NULL) xnpod_fatal(Xenomai: cannot allocate memory for xnvdso!\n); nkvdso-features = XNVDSO_FEATURES; @@ -1891,20 +1890,15 @@ static int xnshadow_sys_trace(struct pt_regs *regs) return err; } -struct heap_info { - xnheap_t *addr; - unsigned size; -}; - static int xnshadow_sys_sem_heap(struct pt_regs *regs) { - struct heap_info hinfo, __user *us_hinfo; + struct xnheap_desc hinfo, __user *us_hinfo; unsigned global; global = __xn_reg_arg2(regs); - us_hinfo = (struct heap_info __user *) __xn_reg_arg1(regs); - hinfo.addr = xnsys_ppd_get(global)-sem_heap; - hinfo.size = xnheap_extentsize(hinfo.addr); + us_hinfo = (struct xnheap_desc __user *) __xn_reg_arg1(regs); + hinfo.handle = (unsigned long)xnsys_ppd_get(global)-sem_heap; + hinfo.size = xnheap_extentsize(xnsys_ppd_get(global)-sem_heap); return __xn_safe_copy_to_user(us_hinfo, hinfo, sizeof(*us_hinfo)); } diff --git a/src/skins/common/sem_heap.c b/src/skins/common/sem_heap.c index bf7031d..acb655b 100644 --- a/src/skins/common/sem_heap.c +++ b/src/skins/common/sem_heap.c @@ -11,62 +11,68 @@ #include sys/mman.h #include nucleus/vdso.h +#include nucleus/heap.h #include asm/xenomai/syscall.h #include asm-generic/bits/current.h - #include sem_heap.h unsigned long xeno_sem_heap[2] = { 0, 0 }; + struct xnvdso *nkvdso; -static void *map_sem_heap(unsigned shared) +void *xeno_map_heap(unsigned long handle, unsigned int size) { - struct heap_info { - void *addr; - unsigned size; - } hinfo; - int fd, err; + int fd, ret; + void *addr; - fd = open(/dev/rtheap, O_RDWR, 0); + fd = open(XNHEAP_DEV_NAME, O_RDWR, 0); if (fd 0) { - fprintf(stderr, Xenomai: open: %m\n); + perror(Xenomai: open); return MAP_FAILED; } - err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared); - if (err 0) { - fprintf(stderr, Xenomai: sys_sem_heap: %m\n); + ret = ioctl(fd, 0, handle); + if (ret) { + perror(Xenomai: ioctl); return MAP_FAILED; } - err = ioctl(fd, 0, hinfo.addr); - if (err 0) { - fprintf(stderr, Xenomai: ioctl: %m\n); - return MAP_FAILED; - } + addr = mmap(NULL, size, PROT_READ|PROT_WRITE, + MAP_SHARED, fd, 0L); - hinfo.addr = mmap(NULL, hinfo.size, - PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); close(fd); - return hinfo.addr; + return addr; } -static void unmap_sem_heap(unsigned long heap_addr, unsigned shared) +static void *map_sem_heap(unsigned int shared) { - struct heap_info { - void *addr; - unsigned size; - } hinfo; - int err; + struct xnheap_desc hinfo; + int ret; - err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared); - if (err 0) { - fprintf(stderr, Xenomai: sys_sem_heap: %m\n); + ret = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared); + if (ret 0) { + errno = -ret; + perror(Xenomai: sys_sem_heap); + return MAP_FAILED; + } + + return xeno_map_heap(hinfo.handle,
[Xenomai-git] Philippe Gerum : skins: sanitize heap binding
Module: xenomai-2.5 Branch: master Commit: bcd7078ddc7ac3ece81bf45279912691932b7205 URL: http://git.xenomai.org/?p=xenomai-2.5.git;a=commit;h=bcd7078ddc7ac3ece81bf45279912691932b7205 Author: Philippe Gerum r...@xenomai.org Date: Sun Jun 13 17:27:06 2010 +0200 skins: sanitize heap binding --- include/nucleus/heap.h |5 +++ ksrc/nucleus/shadow.c | 16 +++-- src/skins/common/sem_heap.c | 76 +++ src/skins/native/heap.c | 38 - src/skins/native/queue.c| 38 - src/skins/psos+/rn.c| 36 +++- src/skins/rtai/shm.c| 61 +++--- src/skins/vrtx/heap.c | 36 +++- src/skins/vrtx/pt.c | 36 +++- 9 files changed, 90 insertions(+), 252 deletions(-) diff --git a/include/nucleus/heap.h b/include/nucleus/heap.h index fecdb79..f4ebe11 100644 --- a/include/nucleus/heap.h +++ b/include/nucleus/heap.h @@ -279,4 +279,9 @@ int xnheap_check_block(xnheap_t *heap, #define XNHEAP_DEV_NAME /dev/rtheap +struct xnheap_desc { + unsigned long handle; + unsigned int size; +}; + #endif /* !_XENO_NUCLEUS_HEAP_H */ diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c index 1a32527..cc313cf 100644 --- a/ksrc/nucleus/shadow.c +++ b/ksrc/nucleus/shadow.c @@ -702,8 +702,7 @@ void __init xnheap_init_vdso(void) { nkvdso = (struct xnvdso *) xnheap_alloc(__xnsys_global_ppd.sem_heap, sizeof(*nkvdso)); - - if (!nkvdso) + if (nkvdso == NULL) xnpod_fatal(Xenomai: cannot allocate memory for xnvdso!\n); nkvdso-features = XNVDSO_FEATURES; @@ -1891,20 +1890,15 @@ static int xnshadow_sys_trace(struct pt_regs *regs) return err; } -struct heap_info { - xnheap_t *addr; - unsigned size; -}; - static int xnshadow_sys_sem_heap(struct pt_regs *regs) { - struct heap_info hinfo, __user *us_hinfo; + struct xnheap_desc hinfo, __user *us_hinfo; unsigned global; global = __xn_reg_arg2(regs); - us_hinfo = (struct heap_info __user *) __xn_reg_arg1(regs); - hinfo.addr = xnsys_ppd_get(global)-sem_heap; - hinfo.size = xnheap_extentsize(hinfo.addr); + us_hinfo = (struct xnheap_desc __user *) __xn_reg_arg1(regs); + hinfo.handle = (unsigned long)xnsys_ppd_get(global)-sem_heap; + hinfo.size = xnheap_extentsize(xnsys_ppd_get(global)-sem_heap); return __xn_safe_copy_to_user(us_hinfo, hinfo, sizeof(*us_hinfo)); } diff --git a/src/skins/common/sem_heap.c b/src/skins/common/sem_heap.c index bf7031d..acb655b 100644 --- a/src/skins/common/sem_heap.c +++ b/src/skins/common/sem_heap.c @@ -11,62 +11,68 @@ #include sys/mman.h #include nucleus/vdso.h +#include nucleus/heap.h #include asm/xenomai/syscall.h #include asm-generic/bits/current.h - #include sem_heap.h unsigned long xeno_sem_heap[2] = { 0, 0 }; + struct xnvdso *nkvdso; -static void *map_sem_heap(unsigned shared) +void *xeno_map_heap(unsigned long handle, unsigned int size) { - struct heap_info { - void *addr; - unsigned size; - } hinfo; - int fd, err; + int fd, ret; + void *addr; - fd = open(/dev/rtheap, O_RDWR, 0); + fd = open(XNHEAP_DEV_NAME, O_RDWR, 0); if (fd 0) { - fprintf(stderr, Xenomai: open: %m\n); + perror(Xenomai: open); return MAP_FAILED; } - err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared); - if (err 0) { - fprintf(stderr, Xenomai: sys_sem_heap: %m\n); + ret = ioctl(fd, 0, handle); + if (ret) { + perror(Xenomai: ioctl); return MAP_FAILED; } - err = ioctl(fd, 0, hinfo.addr); - if (err 0) { - fprintf(stderr, Xenomai: ioctl: %m\n); - return MAP_FAILED; - } + addr = mmap(NULL, size, PROT_READ|PROT_WRITE, + MAP_SHARED, fd, 0L); - hinfo.addr = mmap(NULL, hinfo.size, - PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); close(fd); - return hinfo.addr; + return addr; } -static void unmap_sem_heap(unsigned long heap_addr, unsigned shared) +static void *map_sem_heap(unsigned int shared) { - struct heap_info { - void *addr; - unsigned size; - } hinfo; - int err; + struct xnheap_desc hinfo; + int ret; - err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared); - if (err 0) { - fprintf(stderr, Xenomai: sys_sem_heap: %m\n); + ret = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared); + if (ret 0) { + errno = -ret; + perror(Xenomai: sys_sem_heap); + return MAP_FAILED; + } + + return xeno_map_heap(hinfo.handle,
[Xenomai-git] Philippe Gerum : skins: sanitize heap binding
Module: xenomai-rpm Branch: queue/vfile Commit: bcd7078ddc7ac3ece81bf45279912691932b7205 URL: http://git.xenomai.org/?p=xenomai-rpm.git;a=commit;h=bcd7078ddc7ac3ece81bf45279912691932b7205 Author: Philippe Gerum r...@xenomai.org Date: Sun Jun 13 17:27:06 2010 +0200 skins: sanitize heap binding --- include/nucleus/heap.h |5 +++ ksrc/nucleus/shadow.c | 16 +++-- src/skins/common/sem_heap.c | 76 +++ src/skins/native/heap.c | 38 - src/skins/native/queue.c| 38 - src/skins/psos+/rn.c| 36 +++- src/skins/rtai/shm.c| 61 +++--- src/skins/vrtx/heap.c | 36 +++- src/skins/vrtx/pt.c | 36 +++- 9 files changed, 90 insertions(+), 252 deletions(-) diff --git a/include/nucleus/heap.h b/include/nucleus/heap.h index fecdb79..f4ebe11 100644 --- a/include/nucleus/heap.h +++ b/include/nucleus/heap.h @@ -279,4 +279,9 @@ int xnheap_check_block(xnheap_t *heap, #define XNHEAP_DEV_NAME /dev/rtheap +struct xnheap_desc { + unsigned long handle; + unsigned int size; +}; + #endif /* !_XENO_NUCLEUS_HEAP_H */ diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c index 1a32527..cc313cf 100644 --- a/ksrc/nucleus/shadow.c +++ b/ksrc/nucleus/shadow.c @@ -702,8 +702,7 @@ void __init xnheap_init_vdso(void) { nkvdso = (struct xnvdso *) xnheap_alloc(__xnsys_global_ppd.sem_heap, sizeof(*nkvdso)); - - if (!nkvdso) + if (nkvdso == NULL) xnpod_fatal(Xenomai: cannot allocate memory for xnvdso!\n); nkvdso-features = XNVDSO_FEATURES; @@ -1891,20 +1890,15 @@ static int xnshadow_sys_trace(struct pt_regs *regs) return err; } -struct heap_info { - xnheap_t *addr; - unsigned size; -}; - static int xnshadow_sys_sem_heap(struct pt_regs *regs) { - struct heap_info hinfo, __user *us_hinfo; + struct xnheap_desc hinfo, __user *us_hinfo; unsigned global; global = __xn_reg_arg2(regs); - us_hinfo = (struct heap_info __user *) __xn_reg_arg1(regs); - hinfo.addr = xnsys_ppd_get(global)-sem_heap; - hinfo.size = xnheap_extentsize(hinfo.addr); + us_hinfo = (struct xnheap_desc __user *) __xn_reg_arg1(regs); + hinfo.handle = (unsigned long)xnsys_ppd_get(global)-sem_heap; + hinfo.size = xnheap_extentsize(xnsys_ppd_get(global)-sem_heap); return __xn_safe_copy_to_user(us_hinfo, hinfo, sizeof(*us_hinfo)); } diff --git a/src/skins/common/sem_heap.c b/src/skins/common/sem_heap.c index bf7031d..acb655b 100644 --- a/src/skins/common/sem_heap.c +++ b/src/skins/common/sem_heap.c @@ -11,62 +11,68 @@ #include sys/mman.h #include nucleus/vdso.h +#include nucleus/heap.h #include asm/xenomai/syscall.h #include asm-generic/bits/current.h - #include sem_heap.h unsigned long xeno_sem_heap[2] = { 0, 0 }; + struct xnvdso *nkvdso; -static void *map_sem_heap(unsigned shared) +void *xeno_map_heap(unsigned long handle, unsigned int size) { - struct heap_info { - void *addr; - unsigned size; - } hinfo; - int fd, err; + int fd, ret; + void *addr; - fd = open(/dev/rtheap, O_RDWR, 0); + fd = open(XNHEAP_DEV_NAME, O_RDWR, 0); if (fd 0) { - fprintf(stderr, Xenomai: open: %m\n); + perror(Xenomai: open); return MAP_FAILED; } - err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared); - if (err 0) { - fprintf(stderr, Xenomai: sys_sem_heap: %m\n); + ret = ioctl(fd, 0, handle); + if (ret) { + perror(Xenomai: ioctl); return MAP_FAILED; } - err = ioctl(fd, 0, hinfo.addr); - if (err 0) { - fprintf(stderr, Xenomai: ioctl: %m\n); - return MAP_FAILED; - } + addr = mmap(NULL, size, PROT_READ|PROT_WRITE, + MAP_SHARED, fd, 0L); - hinfo.addr = mmap(NULL, hinfo.size, - PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); close(fd); - return hinfo.addr; + return addr; } -static void unmap_sem_heap(unsigned long heap_addr, unsigned shared) +static void *map_sem_heap(unsigned int shared) { - struct heap_info { - void *addr; - unsigned size; - } hinfo; - int err; + struct xnheap_desc hinfo; + int ret; - err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared); - if (err 0) { - fprintf(stderr, Xenomai: sys_sem_heap: %m\n); + ret = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared); + if (ret 0) { + errno = -ret; + perror(Xenomai: sys_sem_heap); + return MAP_FAILED; + } + + return
[Xenomai-git] Philippe Gerum : skins: sanitize heap binding
Module: xenomai-rpm Branch: for-upstream Commit: bcd7078ddc7ac3ece81bf45279912691932b7205 URL: http://git.xenomai.org/?p=xenomai-rpm.git;a=commit;h=bcd7078ddc7ac3ece81bf45279912691932b7205 Author: Philippe Gerum r...@xenomai.org Date: Sun Jun 13 17:27:06 2010 +0200 skins: sanitize heap binding --- include/nucleus/heap.h |5 +++ ksrc/nucleus/shadow.c | 16 +++-- src/skins/common/sem_heap.c | 76 +++ src/skins/native/heap.c | 38 - src/skins/native/queue.c| 38 - src/skins/psos+/rn.c| 36 +++- src/skins/rtai/shm.c| 61 +++--- src/skins/vrtx/heap.c | 36 +++- src/skins/vrtx/pt.c | 36 +++- 9 files changed, 90 insertions(+), 252 deletions(-) diff --git a/include/nucleus/heap.h b/include/nucleus/heap.h index fecdb79..f4ebe11 100644 --- a/include/nucleus/heap.h +++ b/include/nucleus/heap.h @@ -279,4 +279,9 @@ int xnheap_check_block(xnheap_t *heap, #define XNHEAP_DEV_NAME /dev/rtheap +struct xnheap_desc { + unsigned long handle; + unsigned int size; +}; + #endif /* !_XENO_NUCLEUS_HEAP_H */ diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c index 1a32527..cc313cf 100644 --- a/ksrc/nucleus/shadow.c +++ b/ksrc/nucleus/shadow.c @@ -702,8 +702,7 @@ void __init xnheap_init_vdso(void) { nkvdso = (struct xnvdso *) xnheap_alloc(__xnsys_global_ppd.sem_heap, sizeof(*nkvdso)); - - if (!nkvdso) + if (nkvdso == NULL) xnpod_fatal(Xenomai: cannot allocate memory for xnvdso!\n); nkvdso-features = XNVDSO_FEATURES; @@ -1891,20 +1890,15 @@ static int xnshadow_sys_trace(struct pt_regs *regs) return err; } -struct heap_info { - xnheap_t *addr; - unsigned size; -}; - static int xnshadow_sys_sem_heap(struct pt_regs *regs) { - struct heap_info hinfo, __user *us_hinfo; + struct xnheap_desc hinfo, __user *us_hinfo; unsigned global; global = __xn_reg_arg2(regs); - us_hinfo = (struct heap_info __user *) __xn_reg_arg1(regs); - hinfo.addr = xnsys_ppd_get(global)-sem_heap; - hinfo.size = xnheap_extentsize(hinfo.addr); + us_hinfo = (struct xnheap_desc __user *) __xn_reg_arg1(regs); + hinfo.handle = (unsigned long)xnsys_ppd_get(global)-sem_heap; + hinfo.size = xnheap_extentsize(xnsys_ppd_get(global)-sem_heap); return __xn_safe_copy_to_user(us_hinfo, hinfo, sizeof(*us_hinfo)); } diff --git a/src/skins/common/sem_heap.c b/src/skins/common/sem_heap.c index bf7031d..acb655b 100644 --- a/src/skins/common/sem_heap.c +++ b/src/skins/common/sem_heap.c @@ -11,62 +11,68 @@ #include sys/mman.h #include nucleus/vdso.h +#include nucleus/heap.h #include asm/xenomai/syscall.h #include asm-generic/bits/current.h - #include sem_heap.h unsigned long xeno_sem_heap[2] = { 0, 0 }; + struct xnvdso *nkvdso; -static void *map_sem_heap(unsigned shared) +void *xeno_map_heap(unsigned long handle, unsigned int size) { - struct heap_info { - void *addr; - unsigned size; - } hinfo; - int fd, err; + int fd, ret; + void *addr; - fd = open(/dev/rtheap, O_RDWR, 0); + fd = open(XNHEAP_DEV_NAME, O_RDWR, 0); if (fd 0) { - fprintf(stderr, Xenomai: open: %m\n); + perror(Xenomai: open); return MAP_FAILED; } - err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared); - if (err 0) { - fprintf(stderr, Xenomai: sys_sem_heap: %m\n); + ret = ioctl(fd, 0, handle); + if (ret) { + perror(Xenomai: ioctl); return MAP_FAILED; } - err = ioctl(fd, 0, hinfo.addr); - if (err 0) { - fprintf(stderr, Xenomai: ioctl: %m\n); - return MAP_FAILED; - } + addr = mmap(NULL, size, PROT_READ|PROT_WRITE, + MAP_SHARED, fd, 0L); - hinfo.addr = mmap(NULL, hinfo.size, - PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); close(fd); - return hinfo.addr; + return addr; } -static void unmap_sem_heap(unsigned long heap_addr, unsigned shared) +static void *map_sem_heap(unsigned int shared) { - struct heap_info { - void *addr; - unsigned size; - } hinfo; - int err; + struct xnheap_desc hinfo; + int ret; - err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared); - if (err 0) { - fprintf(stderr, Xenomai: sys_sem_heap: %m\n); + ret = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared); + if (ret 0) { + errno = -ret; + perror(Xenomai: sys_sem_heap); + return MAP_FAILED; + } + + return
[Xenomai-git] Philippe Gerum : skins: sanitize heap binding
Module: xenomai-rpm Branch: queue/mayday Commit: bcd7078ddc7ac3ece81bf45279912691932b7205 URL: http://git.xenomai.org/?p=xenomai-rpm.git;a=commit;h=bcd7078ddc7ac3ece81bf45279912691932b7205 Author: Philippe Gerum r...@xenomai.org Date: Sun Jun 13 17:27:06 2010 +0200 skins: sanitize heap binding --- include/nucleus/heap.h |5 +++ ksrc/nucleus/shadow.c | 16 +++-- src/skins/common/sem_heap.c | 76 +++ src/skins/native/heap.c | 38 - src/skins/native/queue.c| 38 - src/skins/psos+/rn.c| 36 +++- src/skins/rtai/shm.c| 61 +++--- src/skins/vrtx/heap.c | 36 +++- src/skins/vrtx/pt.c | 36 +++- 9 files changed, 90 insertions(+), 252 deletions(-) diff --git a/include/nucleus/heap.h b/include/nucleus/heap.h index fecdb79..f4ebe11 100644 --- a/include/nucleus/heap.h +++ b/include/nucleus/heap.h @@ -279,4 +279,9 @@ int xnheap_check_block(xnheap_t *heap, #define XNHEAP_DEV_NAME /dev/rtheap +struct xnheap_desc { + unsigned long handle; + unsigned int size; +}; + #endif /* !_XENO_NUCLEUS_HEAP_H */ diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c index 1a32527..cc313cf 100644 --- a/ksrc/nucleus/shadow.c +++ b/ksrc/nucleus/shadow.c @@ -702,8 +702,7 @@ void __init xnheap_init_vdso(void) { nkvdso = (struct xnvdso *) xnheap_alloc(__xnsys_global_ppd.sem_heap, sizeof(*nkvdso)); - - if (!nkvdso) + if (nkvdso == NULL) xnpod_fatal(Xenomai: cannot allocate memory for xnvdso!\n); nkvdso-features = XNVDSO_FEATURES; @@ -1891,20 +1890,15 @@ static int xnshadow_sys_trace(struct pt_regs *regs) return err; } -struct heap_info { - xnheap_t *addr; - unsigned size; -}; - static int xnshadow_sys_sem_heap(struct pt_regs *regs) { - struct heap_info hinfo, __user *us_hinfo; + struct xnheap_desc hinfo, __user *us_hinfo; unsigned global; global = __xn_reg_arg2(regs); - us_hinfo = (struct heap_info __user *) __xn_reg_arg1(regs); - hinfo.addr = xnsys_ppd_get(global)-sem_heap; - hinfo.size = xnheap_extentsize(hinfo.addr); + us_hinfo = (struct xnheap_desc __user *) __xn_reg_arg1(regs); + hinfo.handle = (unsigned long)xnsys_ppd_get(global)-sem_heap; + hinfo.size = xnheap_extentsize(xnsys_ppd_get(global)-sem_heap); return __xn_safe_copy_to_user(us_hinfo, hinfo, sizeof(*us_hinfo)); } diff --git a/src/skins/common/sem_heap.c b/src/skins/common/sem_heap.c index bf7031d..acb655b 100644 --- a/src/skins/common/sem_heap.c +++ b/src/skins/common/sem_heap.c @@ -11,62 +11,68 @@ #include sys/mman.h #include nucleus/vdso.h +#include nucleus/heap.h #include asm/xenomai/syscall.h #include asm-generic/bits/current.h - #include sem_heap.h unsigned long xeno_sem_heap[2] = { 0, 0 }; + struct xnvdso *nkvdso; -static void *map_sem_heap(unsigned shared) +void *xeno_map_heap(unsigned long handle, unsigned int size) { - struct heap_info { - void *addr; - unsigned size; - } hinfo; - int fd, err; + int fd, ret; + void *addr; - fd = open(/dev/rtheap, O_RDWR, 0); + fd = open(XNHEAP_DEV_NAME, O_RDWR, 0); if (fd 0) { - fprintf(stderr, Xenomai: open: %m\n); + perror(Xenomai: open); return MAP_FAILED; } - err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared); - if (err 0) { - fprintf(stderr, Xenomai: sys_sem_heap: %m\n); + ret = ioctl(fd, 0, handle); + if (ret) { + perror(Xenomai: ioctl); return MAP_FAILED; } - err = ioctl(fd, 0, hinfo.addr); - if (err 0) { - fprintf(stderr, Xenomai: ioctl: %m\n); - return MAP_FAILED; - } + addr = mmap(NULL, size, PROT_READ|PROT_WRITE, + MAP_SHARED, fd, 0L); - hinfo.addr = mmap(NULL, hinfo.size, - PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); close(fd); - return hinfo.addr; + return addr; } -static void unmap_sem_heap(unsigned long heap_addr, unsigned shared) +static void *map_sem_heap(unsigned int shared) { - struct heap_info { - void *addr; - unsigned size; - } hinfo; - int err; + struct xnheap_desc hinfo; + int ret; - err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared); - if (err 0) { - fprintf(stderr, Xenomai: sys_sem_heap: %m\n); + ret = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared); + if (ret 0) { + errno = -ret; + perror(Xenomai: sys_sem_heap); + return MAP_FAILED; + } + + return