Index: kern_synch.c =================================================================== RCS file: /cvs/src/sys/kern/kern_synch.c,v retrieving revision 1.135 diff -u -p -r1.135 kern_synch.c --- kern_synch.c 13 Sep 2016 08:32:44 -0000 1.135 +++ kern_synch.c 23 Jan 2017 06:37:31 -0000 @@ -635,6 +635,68 @@ sys___thrwakeup(struct proc *p, void *v, return (0); } +struct rwlock sys_cas_lock = RWLOCK_INITIALIZER("cas"); + +int +sys_cas_uint(struct proc *p, void *v, register_t *retval) +{ + struct sys_cas_uint_args /* { + syscallarg(unsigned int *) p; + syscallarg(unsigned int) e; + syscallarg(unsigned int) n; + } */ *uap = v; + unsigned int *uip = SCARG(uap, p); + unsigned int n, o = 0; + int error; + + rw_enter_write(&sys_cas_lock); + error = copyin(uip, &o, sizeof(*uip)); + if (error == 0 && o == SCARG(uap, e)) { + n = SCARG(uap, n); + error = copyout(&n, uip, sizeof(*uip)); + } + rw_exit_write(&sys_cas_lock); + + if (error) { + KERNEL_LOCK(); + psignal(p, SIGSEGV); + KERNEL_UNLOCK(); + } + + *retval = o; + return (error); +} + +int +sys_cas_ulong(struct proc *p, void *v, register_t *retval) +{ + struct sys_cas_ulong_args /* { + syscallarg(u_long *) p; + syscallarg(u_long) e; + syscallarg(u_long) n; + } */ *uap = v; + u_long *uip = SCARG(uap, p); + u_long n, o = 0; + int error; + + rw_enter_write(&sys_cas_lock); + error = copyin(uip, &o, sizeof(*uip)); + if (error == 0 && o == SCARG(uap, e)) { + n = SCARG(uap, n); + error = copyout(&n, uip, sizeof(*uip)); + } + rw_exit_write(&sys_cas_lock); + + if (error) { + KERNEL_LOCK(); + psignal(p, SIGSEGV); + KERNEL_UNLOCK(); + } + + *retval = o; + return (error); +} + void refcnt_init(struct refcnt *r) { Index: syscalls.master =================================================================== RCS file: /cvs/src/sys/kern/syscalls.master,v retrieving revision 1.174 diff -u -p -r1.174 syscalls.master --- syscalls.master 4 Sep 2016 17:22:40 -0000 1.174 +++ syscalls.master 23 Jan 2017 06:37:31 -0000 @@ -299,8 +299,10 @@ 156 OBSOL ogetdirentries 157 OBSOL statfs25 158 OBSOL fstatfs25 -159 UNIMPL -160 UNIMPL +159 STD NOLOCK { u_int sys_cas_uint(u_int *p, u_int e, \ + u_int n); } +160 STD NOLOCK { u_long sys_cas_ulong(u_long *p, u_long e, \ + u_long n); } 161 STD { int sys_getfh(const char *fname, fhandle_t *fhp); } 162 OBSOL ogetdomainname 163 OBSOL osetdomainname