From b14f942ac6d84b4205b7a3031c1859c82ef887b7 Mon Sep 17 00:00:00 2001 From: guenther Date: Fri, 15 Aug 2014 04:14:36 +0000 Subject: [PATCH] XPG requires insque() and remque() to work with linear lists and not just circular lists. Amazingly, they managed to extend the requirements to no longer match the behavior of the VAX instructions they were modeled after, so the trivial VAX ASM versions have to go. Nice job breaking it, X/Open! Based on a diff from enh (at) google.com ok miod@ --- lib/libc/arch/vax/stdlib/insque.S | 40 ------------------------------- lib/libc/arch/vax/stdlib/remque.S | 40 ------------------------------- lib/libc/stdlib/Makefile.inc | 15 ++++-------- lib/libc/stdlib/insque.c | 20 ++++++++++------ lib/libc/stdlib/remque.c | 12 ++++++---- 5 files changed, 26 insertions(+), 101 deletions(-) delete mode 100644 lib/libc/arch/vax/stdlib/insque.S delete mode 100644 lib/libc/arch/vax/stdlib/remque.S diff --git a/lib/libc/arch/vax/stdlib/insque.S b/lib/libc/arch/vax/stdlib/insque.S deleted file mode 100644 index ba606ad5287..00000000000 --- a/lib/libc/arch/vax/stdlib/insque.S +++ /dev/null @@ -1,40 +0,0 @@ -/* $OpenBSD: insque.S,v 1.4 2013/07/05 21:10:50 miod Exp $ */ - -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * From: "@(#)insque.s 8.1 (Berkeley) 6/4/93" - */ - -/* insque(new, pred) */ - -#include "DEFS.h" - -ENTRY(insque, 0) - insque *4(%ap), *8(%ap) - ret diff --git a/lib/libc/arch/vax/stdlib/remque.S b/lib/libc/arch/vax/stdlib/remque.S deleted file mode 100644 index e22acfdf807..00000000000 --- a/lib/libc/arch/vax/stdlib/remque.S +++ /dev/null @@ -1,40 +0,0 @@ -/* $OpenBSD: remque.S,v 1.4 2013/07/05 21:10:50 miod Exp $ */ - -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * From: "@(#)remque.s 8.1 (Berkeley) 6/4/93" - */ - -/* remque(entry) */ - -#include "DEFS.h" - -ENTRY(remque, 0) - remque *4(%ap),%r0 - ret diff --git a/lib/libc/stdlib/Makefile.inc b/lib/libc/stdlib/Makefile.inc index 80c3e5f5a1e..0c0b1499f8b 100644 --- a/lib/libc/stdlib/Makefile.inc +++ b/lib/libc/stdlib/Makefile.inc @@ -1,13 +1,14 @@ -# $OpenBSD: Makefile.inc,v 1.53 2014/05/08 21:43:49 deraadt Exp $ +# $OpenBSD: Makefile.inc,v 1.54 2014/08/15 04:14:36 guenther Exp $ # stdlib sources .PATH: ${LIBCSRCDIR}/arch/${MACHINE_CPU}/stdlib ${LIBCSRCDIR}/stdlib SRCS+= a64l.c abort.c atexit.c atoi.c atof.c atol.c atoll.c bsearch.c \ cfree.c exit.c ecvt.c gcvt.c getenv.c getopt_long.c \ - getsubopt.c hcreate.c heapsort.c imaxabs.c imaxdiv.c l64a.c llabs.c \ - lldiv.c lsearch.c malloc.c reallocarray.c merge.c posix_pty.c \ - qsort.c radixsort.c rand.c random.c realpath.c setenv.c strtoimax.c \ + getsubopt.c hcreate.c heapsort.c imaxabs.c imaxdiv.c insque.c \ + l64a.c llabs.c lldiv.c lsearch.c malloc.c reallocarray.c \ + merge.c posix_pty.c qsort.c radixsort.c rand.c random.c \ + realpath.c remque.c setenv.c strtoimax.c \ strtol.c strtoll.c strtonum.c strtoul.c strtoull.c strtoumax.c \ system.c tfind.c tsearch.c _rand48.c drand48.c erand48.c jrand48.c \ lcong48.c lrand48.c mrand48.c nrand48.c seed48.c srand48.c qabs.c \ @@ -24,12 +25,6 @@ SRCS+= abs.c div.c labs.c ldiv.c SRCS+= abs.c div.c labs.c ldiv.c .endif -.if (${MACHINE_CPU} == "vax") -SRCS+= insque.S remque.S -.else -SRCS+= insque.c remque.c -.endif - MAN+= a64l.3 abort.3 abs.3 alloca.3 atexit.3 atof.3 atoi.3 atol.3 atoll.3 \ bsearch.3 div.3 ecvt.3 exit.3 getenv.3 getopt.3 getopt_long.3 \ getsubopt.3 hcreate.3 imaxabs.3 imaxdiv.3 insque.3 labs.3 ldiv.3 \ diff --git a/lib/libc/stdlib/insque.c b/lib/libc/stdlib/insque.c index 8724efec74a..590ff837b82 100644 --- a/lib/libc/stdlib/insque.c +++ b/lib/libc/stdlib/insque.c @@ -1,4 +1,4 @@ -/* $OpenBSD: insque.c,v 1.2 2005/08/08 08:05:36 espie Exp $ */ +/* $OpenBSD: insque.c,v 1.3 2014/08/15 04:14:36 guenther Exp $ */ /* * Copyright (c) 1993 John Brezak @@ -28,6 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include #include struct qelem { @@ -38,11 +39,16 @@ struct qelem { void insque(void *entry, void *pred) { - struct qelem *e = (struct qelem *) entry; - struct qelem *p = (struct qelem *) pred; + struct qelem *e = entry; + struct qelem *p = pred; - e->q_forw = p->q_forw; - e->q_back = p; - p->q_forw->q_back = e; - p->q_forw = e; + if (p == NULL) + e->q_forw = e->q_back = NULL; + else { + e->q_forw = p->q_forw; + e->q_back = p; + if (p->q_forw != NULL) + p->q_forw->q_back = e; + p->q_forw = e; + } } diff --git a/lib/libc/stdlib/remque.c b/lib/libc/stdlib/remque.c index ae249ae0538..71b74b2dce0 100644 --- a/lib/libc/stdlib/remque.c +++ b/lib/libc/stdlib/remque.c @@ -1,4 +1,4 @@ -/* $OpenBSD: remque.c,v 1.2 2005/08/08 08:05:37 espie Exp $ */ +/* $OpenBSD: remque.c,v 1.3 2014/08/15 04:14:36 guenther Exp $ */ /* * Copyright (c) 1993 John Brezak @@ -28,6 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include #include struct qelem { @@ -38,7 +39,10 @@ struct qelem { void remque(void *element) { - struct qelem *e = (struct qelem *) element; - e->q_forw->q_back = e->q_back; - e->q_back->q_forw = e->q_forw; + struct qelem *e = element; + + if (e->q_forw != NULL) + e->q_forw->q_back = e->q_back; + if (e->q_back != NULL) + e->q_back->q_forw = e->q_forw; } -- 2.20.1