Implement most of the port_* calls
authorDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Sat, 6 Sep 2008 22:40:54 +0000 (22:40 +0000)
committerDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Sat, 6 Sep 2008 22:40:54 +0000 (22:40 +0000)
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Makefile
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Versions
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/port.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/port.h [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/port.h [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/syscalls.list

index d2f7d3d..7836504 100644 (file)
@@ -25,12 +25,12 @@ sysdep_routines +=  gethrtime mount umount umount2 systeminfo resolvepath \
     core_set_global_path core_set_options core_set_process_content \
     core_set_process_path getacct putacct wracct sysfs acct allocids \
     idmap_reg idmap_unreg acctctl pcsample settaskid gettaskid getprojid \
-    utssys zone
+    utssys zone port
 sysdep_routines += sys_fdsync sys_sysconfig sys_brk sys_fcntl sys_utssys \
     sys_lwp_private sys_uname sys_getloadavg sys_utimes sys_getpeerucred \
     sys_ucred_get sys_privsys sys_syslabeling sys_putmsg sys_putpmsg \
     sys_meminfo sys_pset_getloadavg sys_zone_create sys_allocids \
-    sys_settaskid sys_zone_lookup
+    sys_settaskid sys_zone_lookup sys_port
 sysdep_headers += sys/feature_tests.h sys/mount.h sys/cred.h \
     sys/systeminfo.h sys/uadmin.h sys/utssys.h sys/fstyp.h sys/fsid.h \
     sys/priocntl.h sys/procset.h sys/ptyvar.h sys/stream.h sys/synch.h \
@@ -41,9 +41,10 @@ sysdep_headers += sys/feature_tests.h sys/mount.h sys/cred.h \
     sys/elf.h sys/rctl.h sys/task.h sys/zone.h sys/refstr.h sys/refstr_impl.h \
     sys/time_impl.h sys/mutex.h sys/tsol/label.h sys/exacct.h sys/acct.h \
     sys/sid.h sys/siginfo.h sys/vm.h sys/vmparam.h sys/kd.h sys/filio.h \
-    sys/link.h sys/rctl_impl.h sys/procfs_isa.h sys/frame.h sys/kbio.h
+    sys/link.h sys/rctl_impl.h sys/procfs_isa.h sys/frame.h sys/kbio.h \
+    sys/port.h
 sysdep_headers += ucred.h priv.h bits/regset.h door.h zone.h \
-    rtld_db.h project.h pcsample.h
+    rtld_db.h project.h pcsample.h port.h
 endif
 ifeq ($(subdir),dirent)
 sysdep_routines += sys_getdents sys_getdents64
index ea4448e..8ea4018 100644 (file)
@@ -32,8 +32,10 @@ libc {
 
     # p
     pc_sample; p_online; priocntl; priocntlset; processor_bind; processor_info;
-    pset_assign; pset_bind; pset_create; pset_destroy; pset_getattr;
-    pset_getloadavg; pset_info; pset_list; pset_setattr; putacct;
+    port_alert; port_associate; port_create; port_dissociate; port_get;
+    port_getn; port_send; port_sendn; pset_assign; pset_bind; pset_create;
+    pset_destroy; pset_getattr; pset_getloadavg; pset_info; pset_list;
+    pset_setattr; putacct;
 
     # r
     resolvepath;
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/port.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/port.c
new file mode 100644 (file)
index 0000000..a64b6f3
--- /dev/null
@@ -0,0 +1,100 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <inline-syscall.h>
+#include <sys/types.h>
+#include <port.h>
+
+/* SYS_port returns a 64-bit int but the port_* calls return a 32-bit int, so
+   we can't implement these directly in syscalls.list.  Whenever the 2nd
+   argument is not a port we need to specify PORT_SYS_NOPORT.
+
+   port_getn and port_sendn are special in that they may return after only
+   some of the ports have been acted on before the timeout occured. In this
+   case, the first 32-bits of the the return specify the number of acted on
+   ports, and the second 32-bits specify the error that occured (currently
+   this is always ETIME). */
+
+DECLARE_INLINE_SYSCALL (int64_t, port, int, ...);
+
+int port_create (void)
+{
+  /* The 2nd argument is the version on PORT_CREATE, currently 0.  */
+  rval_t ret;
+  ret.rval64 = INLINE_SYSCALL (port, 2, PORT_CREATE | PORT_SYS_NOPORT, 0);
+  return ret.rval1;
+}
+
+int port_associate (int port, int source, uintptr_t object,
+      int events, void *user)
+{
+  rval_t ret;
+  ret.rval64 = INLINE_SYSCALL (port, 6, PORT_ASSOCIATE, port, source, object,
+      events, user);
+  return ret.rval1;
+}
+
+int port_dissociate (int port, int source, uintptr_t object)
+{
+  rval_t ret;
+  ret.rval64 = INLINE_SYSCALL (port, 4, PORT_DISSOCIATE, port, source, object);
+  return ret.rval1;
+}
+
+int port_send (int port, int events, void *user)
+{
+  rval_t ret;
+  ret.rval64 = INLINE_SYSCALL (port, 4, PORT_SEND, port, events, user);
+  return ret.rval1;
+}
+
+// TODO
+#if 0
+int port_sendn (int ports[], int errors[], uint_t nent, int events, void *user)
+{
+  /* Note that we cannot have more than PORT_MAX_LIST ports in a single
+     syscall so we may need to split ports across multiple syscalls.  */
+
+  // need PORT_SYS_NOPORT
+}
+#endif
+
+int port_get (int port, port_event_t *pe, struct timespec *to)
+{
+  time_t sec = to ? to->tv_sec : 0;
+  long nsec = to ? to->tv_nsec : 0;
+  rval_t ret;
+  ret.rval64 = INLINE_SYSCALL (port, 6, PORT_GET, port, pe, sec, nsec, to);
+  return ret.rval1;
+}
+
+// TODO
+#if 0
+int port_getn (int port, port_event_t list[], uint_t max, uint_t *nget,
+      struct timespec *timeout)
+{
+}
+#endif
+
+int port_alert (int port, int flags, int events, void *user)
+{
+  rval_t ret;
+  ret.rval64 = INLINE_SYSCALL (port, 5, PORT_ALERT, port, flags, events, user);
+  return ret.rval1;
+}
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/port.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/port.h
new file mode 100644 (file)
index 0000000..37915d7
--- /dev/null
@@ -0,0 +1,35 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef _PORT_H
+#define _PORT_H
+
+#include <sys/types.h>
+#include <sys/port.h>
+
+int port_create (void);
+int port_associate (int, int, uintptr_t, int, void *);
+int port_dissociate (int, int, uintptr_t);
+int port_send (int, int, void *);
+int port_sendn (int [], int [], uint_t, int, void *);
+int port_get (int, port_event_t *, struct timespec *);
+int port_getn (int, port_event_t [], uint_t, uint_t *, struct timespec *);
+int port_alert (int, int, int, void *);
+
+#endif /* _PORT_H */
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/port.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/port.h
new file mode 100644 (file)
index 0000000..181879e
--- /dev/null
@@ -0,0 +1,96 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef _SYS_PORT_H
+#define _SYS_PORT_H
+
+#include <sys/types.h>
+
+#define PORT_CREATE    0
+#define PORT_ASSOCIATE 1
+#define PORT_DISSOCIATE        2
+#define PORT_SEND      3
+#define PORT_SENDN     4
+#define PORT_GET       5
+#define PORT_GETN      6
+#define PORT_ALERT     7
+#define PORT_DISPATCH  8
+
+#define PORT_SYS_NOPORT                0x100
+#define PORT_SYS_NOSHARE       0x200
+
+#define PORT_CODE_MASK         0xFF
+
+#define PORT_SHARE_EVENT       0x01
+
+#define PORT_MAX_LIST          8192
+
+#define PORT_SOURCE_AIO                1
+#define PORT_SOURCE_TIMER      2
+#define PORT_SOURCE_USER       3
+#define PORT_SOURCE_FD         4
+#define PORT_SOURCE_ALERT      5
+#define PORT_SOURCE_MQ         6
+#define PORT_SOURCE_FILE       7
+
+typedef struct port_event
+  {
+       int portev_events;
+       unsigned short portev_source;
+       unsigned short portev_pad;
+       uintptr_t portev_object;
+       void *portev_user;
+  } port_event_t;
+
+typedef struct  port_notify
+  {
+       int portnfy_port;
+       void *portnfy_user;
+  } port_notify_t;
+
+typedef struct file_obj
+  {
+       struct timespec fo_atime;
+    struct timespec fo_mtime;
+    struct timespec fo_ctime;
+    uintptr_t fo_pad[3];
+    char *fo_name;
+  } file_obj_t;
+
+#define PORT_ALERT_SET         0x01
+#define PORT_ALERT_UPDATE      0x02
+#define PORT_ALERT_INVALID     (PORT_ALERT_SET | PORT_ALERT_UPDATE)
+
+#define FILE_ACCESS            0x00000001
+#define FILE_MODIFIED          0x00000002
+#define FILE_ATTRIB            0x00000004
+#define FILE_NOFOLLOW          0x10000000
+
+#define FILE_DELETE            0x00000010
+#define FILE_RENAME_TO         0x00000020
+#define FILE_RENAME_FROM       0x00000040
+
+#define UNMOUNTED      0x20000000
+
+#define MOUNTEDOVER    0x40000000
+
+#define FILE_EXCEPTION (UNMOUNTED | FILE_DELETE | FILE_RENAME_TO | \
+       FILE_RENAME_FROM | MOUNTEDOVER)
+
+#endif /* _SYS_PORT_H */
index 2bef358..9d5e4f1 100644 (file)
@@ -169,6 +169,7 @@ sys_open64          - open64                i:pii       __syscall_open64
 sys_openat          - fsat:openat           i:isiv      __syscall_openat
 sys_openat64        - fsat:openat64         i:isiv      __syscall_openat64
 sys_pipe            - pipe                  i:          __syscall_pipe
+sys_port            - port                  i:i         __syscall_port
 sys_priocntlsys     - priocntlsys           i:ipiv      __syscall_priocntlsys
 sys_privsys         - privsys               i:iipii     __syscall_privsys
 sys_pset_getloadavg - pset:pset_getloadavg  i:ipi       __syscall_pset_getloadavg