summaryrefslogtreecommitdiff
path: root/usr/src/lib/libc
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libc')
-rw-r--r--usr/src/lib/libc/amd64/Makefile3
-rw-r--r--usr/src/lib/libc/i386/Makefile.com3
-rw-r--r--usr/src/lib/libc/inc/thr_inlines.h12
-rw-r--r--usr/src/lib/libc/port/gen/getlogin.c1
-rw-r--r--usr/src/lib/libc/port/mapfile-vers7
-rw-r--r--usr/src/lib/libc/port/sys/epoll.c207
-rw-r--r--usr/src/lib/libc/port/sys/zone.c5
-rw-r--r--usr/src/lib/libc/sparc/Makefile.com3
-rw-r--r--usr/src/lib/libc/sparc/crt/_rtld.c9
-rw-r--r--usr/src/lib/libc/sparcv9/Makefile.com3
10 files changed, 242 insertions, 11 deletions
diff --git a/usr/src/lib/libc/amd64/Makefile b/usr/src/lib/libc/amd64/Makefile
index 59d9a684e9..4afe40c01b 100644
--- a/usr/src/lib/libc/amd64/Makefile
+++ b/usr/src/lib/libc/amd64/Makefile
@@ -20,7 +20,7 @@
#
#
# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
-# Copyright (c) 2012, Joyent, Inc. All rights reserved.
+# Copyright (c) 2014, Joyent, Inc. All rights reserved.
#
# Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved.
# Copyright 2013 Garrett D'Amore <garrett@damore.org>
@@ -852,6 +852,7 @@ PORTSYS= \
chmod.o \
chown.o \
corectl.o \
+ epoll.o \
exacctsys.o \
execl.o \
execle.o \
diff --git a/usr/src/lib/libc/i386/Makefile.com b/usr/src/lib/libc/i386/Makefile.com
index ca8e9b8970..f229dec61d 100644
--- a/usr/src/lib/libc/i386/Makefile.com
+++ b/usr/src/lib/libc/i386/Makefile.com
@@ -20,7 +20,7 @@
#
#
# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
-# Copyright (c) 2013, Joyent, Inc. All rights reserved.
+# Copyright (c) 2014, Joyent, Inc. All rights reserved.
# Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved.
# Copyright 2013 Garrett D'Amore <garrett@damore.org>
#
@@ -890,6 +890,7 @@ PORTSYS= \
chmod.o \
chown.o \
corectl.o \
+ epoll.o \
exacctsys.o \
execl.o \
execle.o \
diff --git a/usr/src/lib/libc/inc/thr_inlines.h b/usr/src/lib/libc/inc/thr_inlines.h
index f7cdc6a6bd..66d811f25b 100644
--- a/usr/src/lib/libc/inc/thr_inlines.h
+++ b/usr/src/lib/libc/inc/thr_inlines.h
@@ -47,17 +47,19 @@
extern __GNU_INLINE ulwp_t *
_curthread(void)
{
-#if defined(__amd64)
ulwp_t *__value;
- __asm__ __volatile__("movq %%fs:0, %0" : "=r" (__value));
+ __asm__ __volatile__(
+#if defined(__amd64)
+ "movq %%fs:0, %0\n\t"
#elif defined(__i386)
- ulwp_t *__value;
- __asm__ __volatile__("movl %%gs:0, %0" : "=r" (__value));
+ "movl %%gs:0, %0\n\t"
#elif defined(__sparc)
- register ulwp_t *__value __asm__("g7");
+ ".register %%g7, #scratch\n\t"
+ "mov %%g7, %0\n\t"
#else
#error "port me"
#endif
+ : "=r" (__value));
return (__value);
}
diff --git a/usr/src/lib/libc/port/gen/getlogin.c b/usr/src/lib/libc/port/gen/getlogin.c
index fadf3e055b..e4b2f62dc3 100644
--- a/usr/src/lib/libc/port/gen/getlogin.c
+++ b/usr/src/lib/libc/port/gen/getlogin.c
@@ -35,6 +35,7 @@
#include "lint.h"
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/sysmacros.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
diff --git a/usr/src/lib/libc/port/mapfile-vers b/usr/src/lib/libc/port/mapfile-vers
index c07a40aaf5..d095860439 100644
--- a/usr/src/lib/libc/port/mapfile-vers
+++ b/usr/src/lib/libc/port/mapfile-vers
@@ -24,8 +24,8 @@
# Copyright 2010 Nexenta Systems, Inc. All rights reserved.
# Use is subject to license terms.
#
+# Copyright (c) 2014, Joyent, Inc. All rights reserved.
# Copyright (c) 2012 by Delphix. All rights reserved.
-# Copyright (c) 2012, Joyent, Inc. All rights reserved.
# Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved.
# Copyright (c) 2013 Gary Mills
# Copyright 2014 Garrett D'Amore <garrett@damore.org>
@@ -2802,6 +2802,11 @@ $endif
_dgettext;
_doprnt;
_doscan;
+ epoll_create;
+ epoll_create1;
+ epoll_ctl;
+ epoll_wait;
+ epoll_pwait;
_errfp;
_errxfp;
exportfs;
diff --git a/usr/src/lib/libc/port/sys/epoll.c b/usr/src/lib/libc/port/sys/epoll.c
new file mode 100644
index 0000000000..93379b583e
--- /dev/null
+++ b/usr/src/lib/libc/port/sys/epoll.c
@@ -0,0 +1,207 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source. A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright (c) 2014, Joyent, Inc. All rights reserved.
+ */
+
+#include <sys/types.h>
+#include <sys/epoll.h>
+#include <sys/devpoll.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <poll.h>
+
+/*
+ * Events that match their epoll(7) equivalents.
+ */
+#if EPOLLIN != POLLIN
+#error value of EPOLLIN does not match value of POLLIN
+#endif
+
+#if EPOLLPRI != POLLPRI
+#error value of EPOLLPRI does not match value of POLLPRI
+#endif
+
+#if EPOLLOUT != POLLOUT
+#error value of EPOLLOUT does not match value of POLLOUT
+#endif
+
+#if EPOLLRDNORM != POLLRDNORM
+#error value of EPOLLRDNORM does not match value of POLLRDNORM
+#endif
+
+#if EPOLLRDBAND != POLLRDBAND
+#error value of EPOLLRDBAND does not match value of POLLRDBAND
+#endif
+
+#if EPOLLERR != POLLERR
+#error value of EPOLLERR does not match value of POLLERR
+#endif
+
+#if EPOLLHUP != POLLHUP
+#error value of EPOLLHUP does not match value of POLLHUP
+#endif
+
+/*
+ * Events that we ignore entirely. They can be set in events, but they will
+ * never be returned.
+ */
+#define EPOLLIGNORED (EPOLLMSG | EPOLLWAKEUP)
+
+/*
+ * Events that we swizzle into other bit positions.
+ */
+#define EPOLLSWIZZLED \
+ (EPOLLRDHUP | EPOLLONESHOT | EPOLLET | EPOLLWRBAND | EPOLLWRNORM)
+
+int
+epoll_create(int size)
+{
+ int fd;
+
+ /*
+ * From the epoll_create() man page: "Since Linux 2.6.8, the size
+ * argument is ignored, but must be greater than zero." You keep using
+ * that word "ignored"...
+ */
+ if (size <= 0) {
+ errno = EINVAL;
+ return (-1);
+ }
+
+ if ((fd = open("/dev/poll", O_RDWR)) == -1)
+ return (-1);
+
+ if (ioctl(fd, DP_EPOLLCOMPAT, 0) == -1) {
+ (void) close(fd);
+ return (-1);
+ }
+
+ return (fd);
+}
+
+int
+epoll_create1(int flags)
+{
+ int fd, oflags = O_RDWR;
+
+ if (flags & EPOLL_CLOEXEC)
+ oflags |= O_CLOEXEC;
+
+ if ((fd = open("/dev/poll", oflags)) == -1)
+ return (-1);
+
+ if (ioctl(fd, DP_EPOLLCOMPAT, 0) == -1) {
+ (void) close(fd);
+ return (-1);
+ }
+
+ return (fd);
+}
+
+int
+epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
+{
+ dvpoll_epollfd_t epoll[2];
+ uint32_t events, ev = 0;
+ int i = 0;
+
+ epoll[i].dpep_pollfd.fd = fd;
+
+ switch (op) {
+ case EPOLL_CTL_DEL:
+ ev = POLLREMOVE;
+ break;
+
+ case EPOLL_CTL_MOD:
+ /*
+ * In the modify case, we pass down two events: one to
+ * remove the event and another to add it back.
+ */
+ epoll[i++].dpep_pollfd.events = POLLREMOVE;
+ epoll[i].dpep_pollfd.fd = fd;
+ /* FALLTHROUGH */
+
+ case EPOLL_CTL_ADD:
+ /*
+ * Mask off the events that we ignore, and then swizzle the
+ * events for which our values differ from their epoll(7)
+ * equivalents.
+ */
+ events = event->events;
+ ev = events & ~(EPOLLIGNORED | EPOLLSWIZZLED);
+
+ if (events & EPOLLRDHUP)
+ ev |= POLLRDHUP;
+
+ if (events & EPOLLET)
+ ev |= POLLET;
+
+ if (events & EPOLLONESHOT)
+ ev |= POLLONESHOT;
+
+ if (events & EPOLLWRNORM)
+ ev |= POLLWRNORM;
+
+ if (events & EPOLLWRBAND)
+ ev |= POLLWRBAND;
+
+ epoll[i].dpep_data = event->data.u64;
+ break;
+
+ default:
+ errno = EOPNOTSUPP;
+ return (-1);
+ }
+
+ epoll[i].dpep_pollfd.events = ev;
+
+ return (write(epfd, epoll, sizeof (epoll[0]) * (i + 1)) == -1 ? -1 : 0);
+}
+
+int
+epoll_wait(int epfd, struct epoll_event *events,
+ int maxevents, int timeout)
+{
+ struct dvpoll arg;
+
+ if (maxevents <= 0) {
+ errno = EINVAL;
+ return (-1);
+ }
+
+ arg.dp_nfds = maxevents;
+ arg.dp_timeout = timeout;
+ arg.dp_fds = (pollfd_t *)events;
+
+ return (ioctl(epfd, DP_POLL, &arg));
+}
+
+int
+epoll_pwait(int epfd, struct epoll_event *events,
+ int maxevents, int timeout, const sigset_t *sigmask)
+{
+ struct dvpoll arg;
+
+ if (maxevents <= 0) {
+ errno = EINVAL;
+ return (-1);
+ }
+
+ arg.dp_nfds = maxevents;
+ arg.dp_timeout = timeout;
+ arg.dp_fds = (pollfd_t *)events;
+ arg.dp_setp = (sigset_t *)sigmask;
+
+ return (ioctl(epfd, DP_PPOLL, &arg));
+}
diff --git a/usr/src/lib/libc/port/sys/zone.c b/usr/src/lib/libc/port/sys/zone.c
index 4a4c70043d..182a7f22f7 100644
--- a/usr/src/lib/libc/port/sys/zone.c
+++ b/usr/src/lib/libc/port/sys/zone.c
@@ -22,6 +22,7 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright 2011 Joyent Inc. All rights reserved.
*/
#include "lint.h"
@@ -39,7 +40,8 @@
zoneid_t
zone_create(const char *name, const char *root, const struct priv_set *privs,
const char *rctls, size_t rctlsz, const char *zfs, size_t zfssz,
- int *extended_error, int match, int doi, const bslabel_t *label, int flags)
+ int *extended_error, int match, int doi, const bslabel_t *label, int flags,
+ zoneid_t req_zoneid)
{
zone_def zd;
priv_data_t *d;
@@ -59,6 +61,7 @@ zone_create(const char *name, const char *root, const struct priv_set *privs,
zd.doi = doi;
zd.label = label;
zd.flags = flags;
+ zd.zoneid = req_zoneid;
return ((zoneid_t)syscall(SYS_zone, ZONE_CREATE, &zd));
}
diff --git a/usr/src/lib/libc/sparc/Makefile.com b/usr/src/lib/libc/sparc/Makefile.com
index 15c5c2b092..b6f50d3263 100644
--- a/usr/src/lib/libc/sparc/Makefile.com
+++ b/usr/src/lib/libc/sparc/Makefile.com
@@ -20,9 +20,9 @@
#
#
# Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
-# Copyright (c) 2012, Joyent, Inc. All rights reserved.
# Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved.
# Copyright 2013 Garrett D'Amore <garrett@damore.org>
+# Copyright (c) 2014, Joyent, Inc. All rights reserved.
#
# Copyright 2011 Nexenta Systems, Inc. All rights reserved.
# Use is subject to license terms.
@@ -925,6 +925,7 @@ PORTSYS= \
chmod.o \
chown.o \
corectl.o \
+ epoll.o \
exacctsys.o \
execl.o \
execle.o \
diff --git a/usr/src/lib/libc/sparc/crt/_rtld.c b/usr/src/lib/libc/sparc/crt/_rtld.c
index a9e9c6d98a..843cfe03a5 100644
--- a/usr/src/lib/libc/sparc/crt/_rtld.c
+++ b/usr/src/lib/libc/sparc/crt/_rtld.c
@@ -62,6 +62,15 @@
#define SYSCONFIG (*(funcs[SYSCONFIG_F]))
/*
+ * GCC will not emit unused static functions unless specifically told it must
+ */
+#ifdef __GNUC__
+#define __USED __attribute__((used))
+#else
+#define __USED
+#endif
+
+/*
* Alias ld.so entry point -- receives a bootstrap structure and a vector
* of strings. The vector is "well-known" to us, and consists of pointers
* to string constants. This aliasing bootstrap requires no relocation in
diff --git a/usr/src/lib/libc/sparcv9/Makefile.com b/usr/src/lib/libc/sparcv9/Makefile.com
index 0c3f0a2e32..c67d0734d1 100644
--- a/usr/src/lib/libc/sparcv9/Makefile.com
+++ b/usr/src/lib/libc/sparcv9/Makefile.com
@@ -20,9 +20,9 @@
#
#
# Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
-# Copyright (c) 2012, Joyent, Inc. All rights reserved.
# Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved.
# Copyright 2013 Garrett D'Amore <garrett@damore.org>
+# Copyright (c) 2014, Joyent, Inc. All rights reserved.
#
# Copyright 2011 Nexenta Systems, Inc. All rights reserved.
# Use is subject to license terms.
@@ -871,6 +871,7 @@ PORTSYS= \
chmod.o \
chown.o \
corectl.o \
+ epoll.o \
exacctsys.o \
execl.o \
execle.o \