Module Name: src
Committed By: joerg
Date: Tue Nov 30 18:38:54 UTC 2010
Modified Files:
src/tests/lib/csu: Makefile h_initfini_common.cxx
src/tests/lib/csu/dso: Makefile h_initfini3_dso.cxx
src/tests/lib/libpthread: Makefile t_join.c
Added Files:
src/tests/lib/csu: Makefile.check_stack
src/tests/lib/csu/dso: h_initfini_align.S h_initfini_align.S
Log Message:
Test alignment of constructor / destructor calls as well as the stack
of new threads. Currently implement for i386 and AMD64.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/tests/lib/csu/Makefile
cvs rdiff -u -r0 -r1.1 src/tests/lib/csu/Makefile.check_stack
cvs rdiff -u -r1.1 -r1.2 src/tests/lib/csu/h_initfini_common.cxx
cvs rdiff -u -r1.3 -r1.4 src/tests/lib/csu/dso/Makefile
cvs rdiff -u -r1.1 -r1.2 src/tests/lib/csu/dso/h_initfini3_dso.cxx
cvs rdiff -u -r0 -r1.1 src/tests/lib/csu/dso/h_initfini_align.S
cvs rdiff -u -r0 -r1.2 src/tests/lib/csu/dso/h_initfini_align.S
cvs rdiff -u -r1.2 -r1.3 src/tests/lib/libpthread/Makefile
cvs rdiff -u -r1.4 -r1.5 src/tests/lib/libpthread/t_join.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/tests/lib/csu/Makefile
diff -u src/tests/lib/csu/Makefile:1.2 src/tests/lib/csu/Makefile:1.3
--- src/tests/lib/csu/Makefile:1.2 Wed Jul 28 13:51:38 2010
+++ src/tests/lib/csu/Makefile Tue Nov 30 18:38:53 2010
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.2 2010/07/28 13:51:38 joerg Exp $
+# $NetBSD: Makefile,v 1.3 2010/11/30 18:38:53 joerg Exp $
NOMAN= # defined
@@ -9,12 +9,19 @@
TESTS_SUBDIRS=
SUBDIR+= dso
+.include "Makefile.check_stack"
+
+CPPFLAGS+= ${CPPFLAGS_CHECK_STACK}
+
BINDIR= ${TESTSDIR}
PROG_CXX= h_initfini1 h_initfini2 h_initfini3
-SRCS.h_initfini1= h_initfini1.cxx h_initfini_common.cxx
-SRCS.h_initfini2= h_initfini1.cxx h_initfini_common.cxx
+SRCS.h_initfini1= h_initfini1.cxx h_initfini_common.cxx \
+ ${SRCS_CHECK_STACK}
+SRCS.h_initfini2= h_initfini1.cxx h_initfini_common.cxx \
+ ${SRCS_CHECK_STACK}
LDADD.h_initfini2+= -static
-SRCS.h_initfini3= h_initfini3.cxx h_initfini_common.cxx
+SRCS.h_initfini3= h_initfini3.cxx h_initfini_common.cxx \
+ ${SRCS_CHECK_STACK}
LDADD.h_initfini3+= -Wl,-rpath,${TESTSDIR}
.include <bsd.test.mk>
Index: src/tests/lib/csu/h_initfini_common.cxx
diff -u src/tests/lib/csu/h_initfini_common.cxx:1.1 src/tests/lib/csu/h_initfini_common.cxx:1.2
--- src/tests/lib/csu/h_initfini_common.cxx:1.1 Wed Jul 28 13:51:38 2010
+++ src/tests/lib/csu/h_initfini_common.cxx Tue Nov 30 18:38:53 2010
@@ -1,16 +1,36 @@
#include <unistd.h>
+#ifdef CHECK_STACK_ALIGNMENT
+#include <stdlib.h>
+
+extern "C" int check_stack_alignment(void);
+#endif
+
class Test {
public:
Test()
{
static const char msg[] = "constructor executed\n";
write(STDOUT_FILENO, msg, sizeof(msg) - 1);
+#ifdef CHECK_STACK_ALIGNMENT
+ if (!check_stack_alignment()) {
+ static const char msg2[] = "stack unaligned \n";
+ write(STDOUT_FILENO, msg2, sizeof(msg2) - 1);
+ exit(1);
+ }
+#endif
}
~Test()
{
static const char msg[] = "destructor executed\n";
write(STDOUT_FILENO, msg, sizeof(msg) - 1);
+#ifdef CHECK_STACK_ALIGNMENT
+ if (!check_stack_alignment()) {
+ static const char msg2[] = "stack unaligned \n";
+ write(STDOUT_FILENO, msg2, sizeof(msg2) - 1);
+ exit(1);
+ }
+#endif
}
};
Index: src/tests/lib/csu/dso/Makefile
diff -u src/tests/lib/csu/dso/Makefile:1.3 src/tests/lib/csu/dso/Makefile:1.4
--- src/tests/lib/csu/dso/Makefile:1.3 Wed Aug 4 13:56:10 2010
+++ src/tests/lib/csu/dso/Makefile Tue Nov 30 18:38:53 2010
@@ -1,11 +1,14 @@
-# $NetBSD: Makefile,v 1.3 2010/08/04 13:56:10 joerg Exp $
+# $NetBSD: Makefile,v 1.4 2010/11/30 18:38:53 joerg Exp $
NOMAN= # defined
.include <bsd.own.mk>
+.include "${.PARSEDIR}/../Makefile.check_stack"
+
LIB= h_initfini3_dso
-SRCS= h_initfini3_dso.cxx
+SRCS= h_initfini3_dso.cxx ${SRCS_CHECK_STACK}
+CPPFLAGS+= ${CPPFLAGS_CHECK_STACK}
LIBDIR= ${TESTSBASE}/lib/csu
SHLIBDIR= ${TESTSBASE}/lib/csu
@@ -14,4 +17,5 @@
LIBISMODULE= yes
LIBISCXX= yes
+
.include <bsd.lib.mk>
Index: src/tests/lib/csu/dso/h_initfini3_dso.cxx
diff -u src/tests/lib/csu/dso/h_initfini3_dso.cxx:1.1 src/tests/lib/csu/dso/h_initfini3_dso.cxx:1.2
--- src/tests/lib/csu/dso/h_initfini3_dso.cxx:1.1 Wed Jul 28 13:51:40 2010
+++ src/tests/lib/csu/dso/h_initfini3_dso.cxx Tue Nov 30 18:38:54 2010
@@ -1,16 +1,36 @@
#include <unistd.h>
+#ifdef CHECK_STACK_ALIGNMENT
+#include <stdlib.h>
+
+extern "C" int check_stack_alignment(void);
+#endif
+
class Test2 {
public:
Test2()
{
static const char msg[] = "constructor2 executed\n";
write(STDOUT_FILENO, msg, sizeof(msg) - 1);
+#ifdef CHECK_STACK_ALIGNMENT
+ if (!check_stack_alignment()) {
+ static const char msg2[] = "stack unaligned \n";
+ write(STDOUT_FILENO, msg2, sizeof(msg2) - 1);
+ exit(1);
+ }
+#endif
}
~Test2()
{
static const char msg[] = "destructor2 executed\n";
write(STDOUT_FILENO, msg, sizeof(msg) - 1);
+#ifdef CHECK_STACK_ALIGNMENT
+ if (!check_stack_alignment()) {
+ static const char msg2[] = "stack unaligned \n";
+ write(STDOUT_FILENO, msg2, sizeof(msg2) - 1);
+ exit(1);
+ }
+#endif
}
};
Index: src/tests/lib/libpthread/Makefile
diff -u src/tests/lib/libpthread/Makefile:1.2 src/tests/lib/libpthread/Makefile:1.3
--- src/tests/lib/libpthread/Makefile:1.2 Wed Jul 28 21:29:15 2010
+++ src/tests/lib/libpthread/Makefile Tue Nov 30 18:38:54 2010
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.2 2010/07/28 21:29:15 jruoho Exp $
+# $NetBSD: Makefile,v 1.3 2010/11/30 18:38:54 joerg Exp $
NOMAN= # defined
@@ -7,6 +7,11 @@
TESTSDIR= ${TESTSBASE}/lib/libpthread
LDADD+= -lpthread
+.include "${.PARSEDIR}/../csu/Makefile.check_stack"
+
+SRCS.t_join= t_join.c ${SRCS_CHECK_STACK}
+CPPFLAGS.t_join.c+= ${CPPFLAGS_CHECK_STACK}
+
TESTS_SH+= t_atexit
TESTS_C+= t_barrier
TESTS_SH+= t_cancel
Index: src/tests/lib/libpthread/t_join.c
diff -u src/tests/lib/libpthread/t_join.c:1.4 src/tests/lib/libpthread/t_join.c:1.5
--- src/tests/lib/libpthread/t_join.c:1.4 Thu Jul 29 12:56:16 2010
+++ src/tests/lib/libpthread/t_join.c Tue Nov 30 18:38:54 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: t_join.c,v 1.4 2010/07/29 12:56:16 hans Exp $ */
+/* $NetBSD: t_join.c,v 1.5 2010/11/30 18:38:54 joerg Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_join.c,v 1.4 2010/07/29 12:56:16 hans Exp $");
+__RCSID("$NetBSD: t_join.c,v 1.5 2010/11/30 18:38:54 joerg Exp $");
#include <errno.h>
#include <pthread.h>
@@ -38,6 +38,10 @@
#include "h_common.h"
+#ifdef CHECK_STACK_ALIGNMENT
+extern int check_stack_alignment(void);
+#endif
+
static bool error;
static void *threadfunc1(void *);
@@ -70,6 +74,13 @@
caller = pthread_self();
+#ifdef CHECK_STACK_ALIGNMENT
+ /*
+ * Check alignment of thread stack, if supported.
+ */
+ ATF_REQUIRE(check_stack_alignment());
+#endif
+
/*
* The behavior is undefined, but should error
* out, if we try to join the calling thread.
Added files:
Index: src/tests/lib/csu/Makefile.check_stack
diff -u /dev/null src/tests/lib/csu/Makefile.check_stack:1.1
--- /dev/null Tue Nov 30 18:38:54 2010
+++ src/tests/lib/csu/Makefile.check_stack Tue Nov 30 18:38:53 2010
@@ -0,0 +1,10 @@
+# $NetBSD: Makefile.check_stack,v 1.1 2010/11/30 18:38:53 joerg Exp $
+
+.include <bsd.own.mk>
+
+CSU_ARCHDIR= ${.PARSEDIR}/arch/${MACHINE_ARCH}
+.PATH: ${CSU_ARCHDIR}
+.if exists(${CSU_ARCHDIR}/h_initfini_align.S)
+SRCS_CHECK_STACK= h_initfini_align.S
+CPPFLAGS_CHECK_STACK+= -DCHECK_STACK_ALIGNMENT
+.endif
Index: src/tests/lib/csu/dso/h_initfini_align.S
diff -u /dev/null src/tests/lib/csu/dso/h_initfini_align.S:1.1
--- /dev/null Tue Nov 30 18:38:54 2010
+++ src/tests/lib/csu/dso/h_initfini_align.S Tue Nov 30 18:38:53 2010
@@ -0,0 +1,15 @@
+/* $NetBSD: h_initfini_align.S,v 1.1 2010/11/30 18:38:53 joerg Exp $ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: h_initfini_align.S,v 1.1 2010/11/30 18:38:53 joerg Exp $")
+
+_ENTRY(check_stack_alignment)
+ movl %esp, %eax
+ andl $3, %eax
+ jz 1f
+ xorl %eax, %eax
+ ret
+1:
+ incl %eax
+ ret
Index: src/tests/lib/csu/dso/h_initfini_align.S
diff -u /dev/null src/tests/lib/csu/dso/h_initfini_align.S:1.2
--- /dev/null Tue Nov 30 18:38:54 2010
+++ src/tests/lib/csu/dso/h_initfini_align.S Tue Nov 30 18:38:53 2010
@@ -0,0 +1,16 @@
+/* $NetBSD: h_initfini_align.S,v 1.2 2010/11/30 18:38:53 joerg Exp $ */
+
+#include <machine/asm.h>
+
+RCSID("$NetBSD: h_initfini_align.S,v 1.2 2010/11/30 18:38:53 joerg Exp $")
+
+_ENTRY(check_stack_alignment)
+ movl %esp, %eax
+ andl $15, %eax
+ subl $8, %eax
+ jz 1f
+ xorl %eax, %eax
+ ret
+1:
+ incl %eax
+ ret