summaryrefslogtreecommitdiffstats
path: root/sys/compat/freebsd32
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2006-09-22 15:04:28 +0000
committerdavidxu <davidxu@FreeBSD.org>2006-09-22 15:04:28 +0000
commita2dd6344c030d244faa26914eef8b07174d8d17a (patch)
tree7d2bb2f3f83c1c91a2809fed7db73be3c84171ce /sys/compat/freebsd32
parent04676f904a987e62b1967615a3e4ded7d310562b (diff)
downloadFreeBSD-src-a2dd6344c030d244faa26914eef8b07174d8d17a.zip
FreeBSD-src-a2dd6344c030d244faa26914eef8b07174d8d17a.tar.gz
Add compatible code to let 32bit libthr work on 64bit kernel.
Diffstat (limited to 'sys/compat/freebsd32')
-rw-r--r--sys/compat/freebsd32/freebsd32.h14
-rw-r--r--sys/compat/freebsd32/freebsd32_misc.c56
-rw-r--r--sys/compat/freebsd32/syscalls.master11
3 files changed, 76 insertions, 5 deletions
diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h
index cea8687..f740d89 100644
--- a/sys/compat/freebsd32/freebsd32.h
+++ b/sys/compat/freebsd32/freebsd32.h
@@ -103,4 +103,18 @@ struct statfs32 {
int32_t f_spare[2];
};
+struct thr_param32 {
+ uint32_t start_func;
+ uint32_t arg;
+ uint32_t stack_base;
+ uint32_t stack_size;
+ uint32_t tls_base;
+ uint32_t tls_size;
+ uint32_t child_tid;
+ uint32_t parent_tid;
+ int32_t flags;
+ uint32_t rtp;
+ uint32_t spare[3];
+};
+
#endif /* !_COMPAT_FREEBSD32_FREEBSD32_H_ */
diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c
index 8076d23..2c56687 100644
--- a/sys/compat/freebsd32/freebsd32_misc.c
+++ b/sys/compat/freebsd32/freebsd32_misc.c
@@ -67,7 +67,9 @@ __FBSDID("$FreeBSD$");
#include <sys/sysent.h>
#include <sys/sysproto.h>
#include <sys/systm.h>
+#include <sys/thr.h>
#include <sys/unistd.h>
+#include <sys/ucontext.h>
#include <sys/vnode.h>
#include <sys/wait.h>
#include <sys/ipc.h>
@@ -2121,6 +2123,60 @@ freebsd32_clock_getres(struct thread *td,
return (error);
}
+int
+freebsd32_thr_new(struct thread *td,
+ struct freebsd32_thr_new_args *uap)
+{
+ struct thr_param32 param32;
+ struct thr_param param;
+ int error;
+
+ if (uap->param_size < 0 ||
+ uap->param_size > sizeof(struct thr_param32))
+ return (EINVAL);
+ bzero(&param, sizeof(struct thr_param));
+ bzero(&param32, sizeof(struct thr_param32));
+ error = copyin(uap->param, &param32, uap->param_size);
+ if (error != 0)
+ return (error);
+ param.start_func = PTRIN(param32.start_func);
+ param.arg = PTRIN(param32.arg);
+ param.stack_base = PTRIN(param32.stack_base);
+ param.stack_size = param32.stack_size;
+ param.tls_base = PTRIN(param32.tls_base);
+ param.tls_size = param32.tls_size;
+ param.child_tid = PTRIN(param32.child_tid);
+ param.parent_tid = PTRIN(param32.parent_tid);
+ param.flags = param32.flags;
+ param.rtp = PTRIN(param32.rtp);
+ param.spare[0] = PTRIN(param32.spare[0]);
+ param.spare[1] = PTRIN(param32.spare[1]);
+ param.spare[2] = PTRIN(param32.spare[2]);
+
+ return (kern_thr_new(td, &param));
+}
+
+int
+freebsd32_thr_suspend(struct thread *td, struct freebsd32_thr_suspend_args *uap)
+{
+ struct timespec32 ts32;
+ struct timespec ts, *tsp;
+ int error;
+
+ error = 0;
+ tsp = NULL;
+ if (uap->timeout != NULL) {
+ error = copyin((const void *)uap->timeout, (void *)&ts32,
+ sizeof(struct timespec32));
+ if (error != 0)
+ return (error);
+ ts.tv_sec = ts32.tv_sec;
+ ts.tv_nsec = ts32.tv_nsec;
+ tsp = &ts;
+ }
+ return (kern_thr_suspend(td, tsp));
+}
+
#if 0
int
diff --git a/sys/compat/freebsd32/syscalls.master b/sys/compat/freebsd32/syscalls.master
index 93e63e9..7afe985 100644
--- a/sys/compat/freebsd32/syscalls.master
+++ b/sys/compat/freebsd32/syscalls.master
@@ -715,8 +715,7 @@
428 AUE_NULL UNIMPL __acl_aclcheck_link
; XXX implement
429 AUE_SIGWAIT UNIMPL sigwait
-430 AUE_NULL NOPROTO { int thr_create(ucontext_t *ctx, long *id, \
- int flag s); }
+430 AUE_NULL UNIMPL thr_create;
431 AUE_NULL NOPROTO { void thr_exit(long *state); }
432 AUE_NULL NOPROTO { int thr_self(long *id); }
433 AUE_NULL NOPROTO { int thr_kill(long id, int sig); }
@@ -728,8 +727,8 @@
439 AUE_EXTATTR_LIST_LINK UNIMPL extattr_list_link
440 AUE_NULL UNIMPL kse_switchin
441 AUE_NULL UNIMPL ksem_timedwait
-442 AUE_NULL NOPROTO { int thr_suspend( \
- const struct timespec *timeout); }
+442 AUE_NULL STD { int freebsd32_thr_suspend( \
+ const struct timespec32 *timeout); }
443 AUE_NULL NOPROTO { int thr_wake(long id); }
444 AUE_MODUNLOAD NOPROTO { int kldunloadf(int fileid, int flags); }
445 AUE_AUDIT UNIMPL audit
@@ -744,7 +743,9 @@
454 AUE_NULL STD { int freebsd32_umtx_op(void *obj, int op,\
uintptr_t val, void *uaddr, \
void *uaddr2); }
-455 AUE_NULL UNIMPL thr_new
+455 AUE_NULL STD { int freebsd32_thr_new( \
+ struct thr_param32 *param, \
+ int param_size); }
456 AUE_NULL NOPROTO { int sigqueue(pid_t pid, int signum, \
void *value); }
457 AUE_NULL UNIMPL kmq_open
OpenPOWER on IntegriCloud