summaryrefslogtreecommitdiffstats
path: root/contrib/netbsd-tests/dev
diff options
context:
space:
mode:
authorngie <ngie@FreeBSD.org>2014-10-02 23:26:49 +0000
committerngie <ngie@FreeBSD.org>2014-10-02 23:26:49 +0000
commit3f09b8d0af642c2aeb96a4d667cefb7fe3bce443 (patch)
tree544932e2a2c5a5a202b752beefba0b3e327b3858 /contrib/netbsd-tests/dev
parentb941fec92da62b0eab650295f4e8a381dbbc04b4 (diff)
parente1f2d32c0e0678782c353c48364cddedfae58b0a (diff)
downloadFreeBSD-src-3f09b8d0af642c2aeb96a4d667cefb7fe3bce443.zip
FreeBSD-src-3f09b8d0af642c2aeb96a4d667cefb7fe3bce443.tar.gz
Import the NetBSD test suite from ^/vendor/NetBSD/tests/09.30.2014_20.45 ,
minus the vendor Makefiles Provide directions for how to bootstrap the vendor sources in FREEBSD-upgrade MFC after 2 weeks Discussed with: rpaulo Sponsored by: EMC / Isilon Storage Division
Diffstat (limited to 'contrib/netbsd-tests/dev')
-rw-r--r--contrib/netbsd-tests/dev/audio/h_pad.c76
-rw-r--r--contrib/netbsd-tests/dev/audio/h_pad_musa.c344
-rwxr-xr-xcontrib/netbsd-tests/dev/audio/t_pad.sh47
-rw-r--r--contrib/netbsd-tests/dev/audio/t_pad_output.bz2.uue998
-rw-r--r--contrib/netbsd-tests/dev/cgd/paramsfile8
-rwxr-xr-xcontrib/netbsd-tests/dev/cgd/t_cgd.sh159
-rw-r--r--contrib/netbsd-tests/dev/dm/dm_targets_cmd.plist20
-rw-r--r--contrib/netbsd-tests/dev/dm/dm_version_cmd.plist20
-rw-r--r--contrib/netbsd-tests/dev/dm/h_dm.c146
-rwxr-xr-xcontrib/netbsd-tests/dev/dm/t_dm.sh47
-rw-r--r--contrib/netbsd-tests/dev/md/h_mdserv.c109
-rwxr-xr-xcontrib/netbsd-tests/dev/md/t_md.sh65
-rwxr-xr-xcontrib/netbsd-tests/dev/raidframe/t_raid.sh323
-rw-r--r--contrib/netbsd-tests/dev/scsipi/libscsitest/SCSITEST.ioconf12
-rw-r--r--contrib/netbsd-tests/dev/scsipi/libscsitest/scsitest.c259
-rw-r--r--contrib/netbsd-tests/dev/scsipi/libscsitest/scsitest.h38
-rw-r--r--contrib/netbsd-tests/dev/scsipi/libscsitest/scsitest_component.c46
-rw-r--r--contrib/netbsd-tests/dev/scsipi/t_cd.c81
-rwxr-xr-xcontrib/netbsd-tests/dev/sysmon/t_swsensor.sh398
-rw-r--r--contrib/netbsd-tests/dev/sysmon/t_swwdog.c192
20 files changed, 3388 insertions, 0 deletions
diff --git a/contrib/netbsd-tests/dev/audio/h_pad.c b/contrib/netbsd-tests/dev/audio/h_pad.c
new file mode 100644
index 0000000..dd481ac
--- /dev/null
+++ b/contrib/netbsd-tests/dev/audio/h_pad.c
@@ -0,0 +1,76 @@
+/* $NetBSD: h_pad.c,v 1.1 2010/08/04 13:15:15 pooka Exp $ */
+
+/*
+ * Copyright (c) 2010 Antti Kantee. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+#include <sys/types.h>
+
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+
+#include <err.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "h_pad_musa.c"
+
+/*
+ * Stuff some audio into /dev/audio, read it from /dev/pad. Use in
+ * conjunction with t_pad, which tests that we got sensible output
+ * by comparing against a previous audibly good result.
+ */
+
+#define BUFSIZE 1024
+
+int
+main(int argc, char *argv[])
+{
+ char buf[BUFSIZE];
+ char zeros[BUFSIZE];
+ int padfd, audiofd;
+ ssize_t n;
+
+ rump_init();
+ audiofd = rump_sys_open("/dev/audio0", O_RDWR);
+ if (audiofd == -1)
+ err(1, "open audio");
+
+ padfd = rump_sys_open("/dev/pad0", O_RDONLY);
+ if (padfd == -1)
+ err(1, "open pad");
+
+ if ((n = rump_sys_write(audiofd, musa, sizeof(musa))) != sizeof(musa))
+ err(1, "write");
+
+ memset(zeros, 0, sizeof(zeros));
+ while ((n = rump_sys_read(padfd, buf, sizeof(buf))) > 0) {
+ if (memcmp(buf, zeros, sizeof(buf)) == 0)
+ break;
+ write(STDOUT_FILENO, buf, n);
+ }
+}
diff --git a/contrib/netbsd-tests/dev/audio/h_pad_musa.c b/contrib/netbsd-tests/dev/audio/h_pad_musa.c
new file mode 100644
index 0000000..322305e
--- /dev/null
+++ b/contrib/netbsd-tests/dev/audio/h_pad_musa.c
@@ -0,0 +1,344 @@
+unsigned char musa[] = {
+0x46, 0xdb, 0x76, 0x67, 0x61, 0xff, 0xfc, 0x67, 0xff, 0xe9, 0xdb, 0x79,
+0x5d, 0x53, 0x5b, 0x79, 0xef, 0x65, 0x67, 0x5b, 0x67, 0x67, 0x72, 0x66,
+0x4f, 0x5b, 0xe7, 0xf5, 0x5e, 0x53, 0x61, 0xe7, 0x5c, 0x53, 0x67, 0x67,
+0x67, 0x5b, 0x54, 0x60, 0x4e, 0xec, 0xef, 0x5b, 0x5b, 0x6f, 0x69, 0xff,
+0x71, 0x53, 0x77, 0x67, 0x67, 0x5b, 0x5b, 0x5b, 0x75, 0x6c, 0x67, 0x6d,
+0x67, 0x7e, 0xff, 0x63, 0x66, 0x61, 0x67, 0x5b, 0x5b, 0x67, 0x67, 0x5f,
+0x5b, 0x64, 0x5b, 0x5b, 0x55, 0x53, 0x5c, 0x5d, 0x67, 0x53, 0x63, 0x5e,
+0xe7, 0xf5, 0x51, 0x5b, 0x5e, 0x5e, 0x67, 0x5b, 0x67, 0xff, 0x67, 0x67,
+0xe9, 0x6e, 0x67, 0x5c, 0x60, 0x67, 0x7a, 0xff, 0xe7, 0xff, 0x58, 0x5b,
+0x64, 0x6e, 0x67, 0x55, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x56, 0x5b, 0x53,
+0x5b, 0x67, 0x54, 0x58, 0x67, 0x67, 0x6e, 0x67, 0x5c, 0x58, 0x67, 0x67,
+0x5b, 0x65, 0x64, 0x70, 0x5b, 0x5b, 0x67, 0xfc, 0xf7, 0xf2, 0xff, 0xec,
+0x73, 0x67, 0x67, 0xff, 0x67, 0x74, 0xff, 0x67, 0x5e, 0x5e, 0x67, 0x72,
+0x77, 0x7c, 0x67, 0x5d, 0x5b, 0x67, 0x5b, 0x55, 0x67, 0x5c, 0x67, 0x60,
+0x5b, 0x5b, 0x61, 0x54, 0x67, 0x5b, 0xe8, 0x75, 0xe2, 0x67, 0xff, 0x62,
+0x5b, 0x5b, 0xff, 0xe8, 0xff, 0xe7, 0x6a, 0xee, 0x78, 0x67, 0xff, 0x67,
+0x7a, 0xff, 0x6a, 0xff, 0xff, 0x67, 0xff, 0x71, 0xfd, 0x6c, 0x5e, 0xfe,
+0xff, 0x6d, 0xe7, 0xff, 0xec, 0x68, 0x5b, 0xff, 0x5c, 0x6a, 0xeb, 0x69,
+0x60, 0xff, 0x67, 0x67, 0x67, 0x7a, 0xdf, 0xec, 0x55, 0x5b, 0x5b, 0x5b,
+0x71, 0x5c, 0x77, 0x72, 0x68, 0xe7, 0x6d, 0xff, 0xff, 0xff, 0xdb, 0xe7,
+0xde, 0xdb, 0xff, 0xff, 0x69, 0xee, 0x78, 0x67, 0xef, 0xea, 0x5b, 0x5b,
+0x67, 0x5d, 0x6f, 0xff, 0xff, 0x67, 0x67, 0x67, 0x61, 0x54, 0x5b, 0xff,
+0x67, 0x67, 0x5b, 0x67, 0xf4, 0x67, 0x67, 0x67, 0x5b, 0x65, 0xf2, 0x67,
+0xff, 0xe7, 0xe7, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xfc,
+0xf7, 0xf2, 0x7d, 0x5b, 0x56, 0x67, 0x5e, 0xe2, 0x7f, 0x67, 0x75, 0x67,
+0x6d, 0x63, 0x66, 0x67, 0x5b, 0x5b, 0x5b, 0x5b, 0x65, 0xf0, 0x6a, 0xe7,
+0x5f, 0x67, 0xff, 0x6f, 0x7b, 0x67, 0x5b, 0xff, 0xff, 0x72, 0x67, 0xff,
+0xff, 0xff, 0xff, 0x67, 0x7e, 0x6d, 0xff, 0xff, 0xff, 0x67, 0xff, 0xee,
+0xe7, 0xff, 0xff, 0x6a, 0xe7, 0xe7, 0x7a, 0x67, 0xff, 0xff, 0xff, 0x67,
+0x67, 0xff, 0xff, 0x67, 0x67, 0x67, 0x5c, 0x5b, 0x67, 0x7f, 0x67, 0xdb,
+0xfe, 0xde, 0xec, 0x5c, 0x61, 0x5b, 0x67, 0x6e, 0x67, 0x67, 0xfe, 0xff,
+0xe7, 0xff, 0xe7, 0xff, 0xff, 0xe6, 0xd9, 0xe7, 0xff, 0xff, 0x73, 0x68,
+0x6c, 0x55, 0xe7, 0xe7, 0xec, 0x67, 0x5b, 0x71, 0xfd, 0xff, 0xff, 0xff,
+0x71, 0x67, 0x5b, 0x53, 0x5e, 0x5e, 0x5b, 0x5d, 0x79, 0x70, 0x67, 0x67,
+0x60, 0x5c, 0x67, 0xff, 0x7d, 0x75, 0xff, 0xff, 0xe7, 0xec, 0xff, 0xff,
+0xe7, 0xfd, 0x67, 0xf7, 0xdc, 0xf1, 0x6b, 0xe9, 0xff, 0x79, 0x7a, 0x6f,
+0xfa, 0xf9, 0xff, 0x5b, 0x53, 0x5b, 0x67, 0x77, 0x67, 0x66, 0x67, 0x5b,
+0x67, 0x5b, 0x67, 0x67, 0x74, 0x75, 0x7e, 0xf3, 0x67, 0x5c, 0x67, 0x67,
+0x5c, 0x67, 0x6a, 0xea, 0xff, 0xff, 0x67, 0xff, 0x7b, 0x78, 0xdf, 0xff,
+0xdd, 0xee, 0xfd, 0xf6, 0x67, 0xe7, 0xff, 0x74, 0x67, 0x67, 0xe7, 0xfe,
+0xff, 0xec, 0x5c, 0x61, 0xe7, 0x6a, 0x5b, 0xf8, 0xfb, 0xef, 0x79, 0x65,
+0x5f, 0x5b, 0x67, 0x60, 0x67, 0x55, 0xf2, 0xff, 0xe7, 0x61, 0x5b, 0x67,
+0x67, 0x5b, 0x5e, 0x5e, 0xe8, 0xf3, 0x67, 0xe8, 0xe7, 0xdd, 0xff, 0xe7,
+0xdb, 0xf7, 0x70, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xe7, 0x67, 0xff, 0x60,
+0x5c, 0x5d, 0x6e, 0xff, 0xec, 0xff, 0x67, 0x67, 0x67, 0x5b, 0x5b, 0x67,
+0x5c, 0xff, 0xff, 0x67, 0x6e, 0x67, 0x67, 0x60, 0x67, 0x67, 0x67, 0x67,
+0x67, 0x70, 0xff, 0xff, 0x67, 0xff, 0xff, 0xff, 0xfd, 0xf6, 0xff, 0xff,
+0xf5, 0xff, 0xff, 0xe2, 0x6c, 0x67, 0x67, 0xff, 0x67, 0xff, 0x63, 0x5b,
+0x67, 0x5b, 0x7b, 0x67, 0x67, 0x5d, 0x49, 0x5b, 0x67, 0xe7, 0xff, 0xdf,
+0xe5, 0x4d, 0x3b, 0x55, 0xbe, 0xbf, 0x66, 0x41, 0x5b, 0xc3, 0xd3, 0x47,
+0x43, 0x79, 0xcf, 0x67, 0x3e, 0x51, 0xc4, 0xbc, 0x6d, 0x3e, 0x50, 0xdf,
+0xe7, 0xf9, 0xd4, 0xca, 0x46, 0x37, 0xee, 0xaf, 0xba, 0x40, 0x34, 0x4b,
+0xc9, 0xc7, 0x56, 0x39, 0x46, 0xc5, 0xbc, 0x4f, 0x33, 0x4f, 0xbc, 0xc8,
+0x4b, 0x39, 0x7e, 0xb6, 0xbc, 0x4b, 0x39, 0x45, 0xcc, 0xc1, 0xec, 0x41,
+0x4a, 0xc5, 0xce, 0x48, 0x4c, 0xc9, 0xc4, 0x59, 0x41, 0x53, 0xd9, 0xdb,
+0x56, 0x56, 0xdd, 0xcd, 0xdf, 0x4e, 0x5c, 0xda, 0xc6, 0xf0, 0x5b, 0x5b,
+0x53, 0x4f, 0x67, 0x71, 0x53, 0x49, 0x4f, 0xfa, 0xd9, 0xff, 0x5b, 0x4d,
+0x5b, 0x45, 0x5e, 0xcb, 0xcd, 0x63, 0x49, 0x49, 0xdf, 0xc9, 0xd3, 0x45,
+0x4b, 0xdf, 0xbf, 0xcc, 0x3e, 0x39, 0xc6, 0xb4, 0xc9, 0x44, 0x3c, 0x69,
+0xbe, 0xcd, 0x45, 0x37, 0x46, 0xc4, 0xbd, 0x62, 0x3c, 0x4d, 0xbe, 0xce,
+0x3d, 0x32, 0x47, 0xc7, 0xc2, 0x69, 0x3f, 0x42, 0xce, 0xbd, 0xcb, 0x4b,
+0x38, 0x47, 0xcc, 0xc1, 0xd7, 0xdb, 0xef, 0x42, 0x3f, 0x5f, 0xd8, 0xce,
+0xe7, 0xdb, 0xff, 0x51, 0xff, 0xff, 0x73, 0xe7, 0xe7, 0x7a, 0x6b, 0xd4,
+0x66, 0x5d, 0x7a, 0x6f, 0x55, 0xed, 0xd3, 0xdc, 0x6b, 0x50, 0x5b, 0x53,
+0x6e, 0x68, 0x4c, 0x50, 0x54, 0xd0, 0xc5, 0xe7, 0x48, 0x49, 0xdc, 0xdd,
+0xff, 0x5c, 0x3a, 0x4e, 0xce, 0xc1, 0xda, 0x4a, 0x5c, 0x67, 0x67, 0x67,
+0x52, 0x5a, 0xf0, 0xd3, 0xd3, 0xd7, 0xcd, 0xdb, 0xed, 0x5b, 0x57, 0xcf,
+0xd4, 0x51, 0x47, 0x4d, 0x48, 0x5d, 0xe6, 0xff, 0x59, 0x79, 0xcf, 0xf4,
+0x46, 0x4c, 0xd0, 0xc1, 0xcf, 0x4c, 0x3c, 0x41, 0xe0, 0xbd, 0xd5, 0x3e,
+0x3e, 0x4e, 0xc5, 0xd4, 0x61, 0x53, 0x56, 0x74, 0xcd, 0xc7, 0xe6, 0x4e,
+0x6b, 0xd9, 0xce, 0xe0, 0x52, 0x4a, 0x54, 0xd2, 0xd2, 0xe8, 0x4d, 0x46,
+0x4d, 0x69, 0xeb, 0xee, 0x5d, 0xff, 0xff, 0x7d, 0x67, 0x55, 0x4a, 0x67,
+0xff, 0xff, 0xdb, 0xf5, 0x68, 0x53, 0x71, 0xdc, 0xe7, 0xeb, 0x54, 0x4d,
+0x6b, 0xdc, 0xdb, 0xed, 0x4b, 0x4f, 0xfb, 0xce, 0xdb, 0x53, 0x4a, 0x4b,
+0xe4, 0xc3, 0xc5, 0x65, 0x40, 0x4c, 0x67, 0xdb, 0xe7, 0xfe, 0x5b, 0xe7,
+0x5c, 0x61, 0x6f, 0xfc, 0x60, 0xff, 0x67, 0x5b, 0x4b, 0x65, 0xe7, 0x65,
+0x5a, 0x6f, 0x5a, 0x52, 0x7a, 0xcd, 0xd1, 0x55, 0x5c, 0xdb, 0x4c, 0x54,
+0xd1, 0xd6, 0x54, 0x4c, 0x72, 0xdb, 0x4f, 0xef, 0xdb, 0x65, 0x4e, 0xed,
+0xc9, 0xd0, 0x4f, 0x6f, 0xff, 0x56, 0x5b, 0xe7, 0x5f, 0x65, 0xe6, 0xf7,
+0x4c, 0x46, 0x4c, 0xdd, 0xdc, 0x5e, 0x51, 0x45, 0x56, 0xdf, 0xc6, 0xfa,
+0x4c, 0x49, 0x55, 0xd9, 0xe6, 0x5f, 0x53, 0x4d, 0x4f, 0xe7, 0xe7, 0x70,
+0x5b, 0x78, 0x71, 0x69, 0xdb, 0xcd, 0xe9, 0x5b, 0x4d, 0x68, 0xe7, 0xd9,
+0xd3, 0x75, 0x51, 0x53, 0x6b, 0xd3, 0xe6, 0x67, 0x59, 0x53, 0x49, 0x4e,
+0x65, 0x67, 0x6a, 0x5e, 0x4b, 0x53, 0x49, 0xf0, 0xe7, 0xdb, 0x63, 0x4e,
+0x77, 0xff, 0xfc, 0xcd, 0xe3, 0x53, 0x49, 0x4f, 0x5b, 0x4b, 0x61, 0xd4,
+0xd0, 0xeb, 0xe7, 0xe0, 0xeb, 0xff, 0xe7, 0x61, 0x49, 0xef, 0xd3, 0x6d,
+0x53, 0xfb, 0xe7, 0xff, 0xfc, 0xce, 0x79, 0x41, 0x43, 0x48, 0x42, 0x4f,
+0xcf, 0xc1, 0xcc, 0xcc, 0xc9, 0x64, 0x40, 0x45, 0x61, 0x78, 0xeb, 0xd7,
+0xdd, 0x4f, 0x3d, 0x46, 0x4d, 0x4b, 0x6c, 0xdb, 0xc8, 0xca, 0xd1, 0xe4,
+0x52, 0x45, 0x51, 0x68, 0xd8, 0xd3, 0xcd, 0xec, 0x59, 0x4e, 0x53, 0x56,
+0x7d, 0x6e, 0x55, 0x7c, 0x67, 0xf8, 0xd4, 0xd3, 0xde, 0x55, 0x53, 0x5a,
+0x42, 0x56, 0xcd, 0xd1, 0xd3, 0xcd, 0xc9, 0x57, 0x3c, 0x35, 0x35, 0x3b,
+0xe2, 0xbc, 0xb7, 0xbd, 0xcb, 0x6a, 0x47, 0x41, 0x52, 0x71, 0x5a, 0x77,
+0xcd, 0xce, 0xe7, 0xdb, 0x59, 0x46, 0x3c, 0x3f, 0x58, 0xe3, 0xc1, 0xc0,
+0xc1, 0xe9, 0x58, 0x45, 0x4e, 0x67, 0xe2, 0xe7, 0xd3, 0xd3, 0x69, 0x47,
+0x44, 0x45, 0x4a, 0x67, 0xdd, 0x7c, 0x6e, 0xd5, 0xdf, 0xff, 0xdd, 0xdf,
+0x4d, 0x64, 0xd8, 0xd3, 0xca, 0xbc, 0xbd, 0x5c, 0x35, 0x2d, 0x2c, 0x34,
+0xe8, 0xb7, 0xab, 0xae, 0xb1, 0xc6, 0x43, 0x39, 0x38, 0x34, 0x4a, 0x67,
+0x5b, 0x67, 0xd2, 0xcd, 0xd3, 0xce, 0x52, 0x3e, 0x39, 0x47, 0x65, 0xc9,
+0xb4, 0xb3, 0xbf, 0x73, 0x4b, 0x3a, 0x43, 0x66, 0xce, 0xcc, 0xc8, 0xcd,
+0xea, 0x48, 0x3f, 0x3c, 0x3f, 0x49, 0x72, 0xc9, 0xc1, 0xcb, 0xca, 0x67,
+0x38, 0x3d, 0xe6, 0xb5, 0xab, 0xa8, 0xb1, 0x4c, 0x28, 0x1f, 0x23, 0x32,
+0xc4, 0xaa, 0xa2, 0xa5, 0xb6, 0x53, 0x2f, 0x29, 0x2b, 0x2f, 0x4b, 0xe7,
+0xc9, 0xc9, 0xdb, 0x4d, 0x50, 0xff, 0xd2, 0xcd, 0xe5, 0x48, 0x37, 0x3c,
+0x55, 0xc9, 0xb4, 0xad, 0xb3, 0xc9, 0x4a, 0x39, 0x3d, 0x49, 0xde, 0xcc,
+0xc1, 0xd9, 0x4b, 0x3c, 0x38, 0x3f, 0x52, 0xff, 0xda, 0xca, 0xc5, 0xcf,
+0x4b, 0x3c, 0x37, 0x54, 0xc1, 0xa8, 0xa7, 0xad, 0x50, 0x23, 0x1e, 0x1f,
+0x31, 0xc2, 0xa2, 0x9f, 0xa4, 0xbb, 0x36, 0x25, 0x27, 0x34, 0xea, 0xbb,
+0xb6, 0xbc, 0x4c, 0x3b, 0x37, 0x43, 0xe1, 0xc2, 0xda, 0x55, 0x49, 0x49,
+0x5e, 0xc1, 0xb8, 0xba, 0xbd, 0xdb, 0x62, 0x4a, 0x66, 0xe3, 0xfd, 0x5b,
+0x49, 0x45, 0x49, 0x45, 0x51, 0x53, 0x5b, 0x53, 0x67, 0xe7, 0x6d, 0x5f,
+0x67, 0x5b, 0xd4, 0xc5, 0x5e, 0x35, 0x3f, 0x6e, 0xbe, 0xaa, 0xa4, 0xb4,
+0x3d, 0x28, 0x1d, 0x23, 0x44, 0xaf, 0xa6, 0xa3, 0xb2, 0x51, 0x2a, 0x29,
+0x3a, 0x69, 0xaf, 0xb0, 0xc3, 0x47, 0x2d, 0x28, 0x31, 0x4d, 0xc2, 0xb8,
+0xbc, 0x52, 0x3a, 0x3b, 0xde, 0xb0, 0xa6, 0xa9, 0xc1, 0x40, 0x2b, 0x28,
+0x2f, 0x66, 0xb7, 0xb6, 0xb6, 0xd6, 0x3d, 0x38, 0x30, 0x3d, 0x57, 0xe7,
+0xc2, 0xcf, 0xdd, 0xf5, 0x46, 0x4d, 0x78, 0xcd, 0xcb, 0x3c, 0x39, 0x49,
+0xbf, 0xa7, 0x9f, 0xa0, 0xbd, 0x39, 0x1e, 0x17, 0x1e, 0x3a, 0xbd, 0xa2,
+0xa4, 0xac, 0x60, 0x2c, 0x29, 0x32, 0xdc, 0xb2, 0xbc, 0xc7, 0x38, 0x2a,
+0x28, 0x2e, 0x53, 0xb2, 0xad, 0xaf, 0xc5, 0x42, 0x3f, 0x79, 0xba, 0xaa,
+0xa7, 0xbf, 0x3e, 0x29, 0x26, 0x2d, 0x52, 0xb5, 0xad, 0xaf, 0xbf, 0x3c,
+0x2f, 0x2d, 0x37, 0x4d, 0xbd, 0xbe, 0xc3, 0xd3, 0x66, 0x49, 0x48, 0x45,
+0x7d, 0xc3, 0x5d, 0x37, 0x3f, 0x78, 0xba, 0xa3, 0x9d, 0xa9, 0x66, 0x24,
+0x19, 0x1c, 0x2b, 0xd9, 0xab, 0x9f, 0xa6, 0xc5, 0x43, 0x33, 0x33, 0xf3,
+0xbc, 0xbf, 0x4e, 0x37, 0x28, 0x27, 0x33, 0x65, 0xb5, 0xaa, 0xad, 0xbf,
+0x5f, 0x42, 0x41, 0xdb, 0xb5, 0xac, 0xac, 0xcc, 0x35, 0x25, 0x20, 0x29,
+0x4e, 0xb1, 0xab, 0xab, 0xbb, 0x42, 0x2a, 0x28, 0x2d, 0x4a, 0xc7, 0xb4,
+0xb4, 0xc8, 0x46, 0x3b, 0x37, 0x3f, 0xbe, 0xb1, 0x4d, 0x48, 0x49, 0x41,
+0xb6, 0x9c, 0x9d, 0xab, 0x5d, 0x1c, 0x14, 0x1c, 0x2d, 0xca, 0xa3, 0x9d,
+0xa9, 0xb7, 0x5a, 0x38, 0x36, 0x5b, 0x44, 0x3e, 0x39, 0x2e, 0x2d, 0x38,
+0x42, 0xc9, 0xb3, 0xad, 0xaf, 0xbc, 0xdc, 0x5a, 0x4a, 0x4d, 0x60, 0xc7,
+0xb5, 0xb7, 0xca, 0x3f, 0x2e, 0x28, 0x30, 0x4a, 0xb5, 0xa8, 0xaa, 0xb6,
+0x47, 0x2e, 0x27, 0x2d, 0x51, 0xbd, 0xad, 0xb2, 0xed, 0x3a, 0x39, 0x38,
+0x3c, 0xc9, 0xb0, 0x4e, 0x36, 0x3f, 0xee, 0xad, 0x9b, 0x9e, 0xb2, 0x32,
+0x17, 0x12, 0x1b, 0x2d, 0xc4, 0x9d, 0x98, 0x9e, 0xae, 0x5f, 0x2d, 0x2b,
+0x2c, 0x32, 0x3d, 0x3f, 0x38, 0x3d, 0x4c, 0x5f, 0xc2, 0xaf, 0xae, 0xac,
+0xb9, 0xd9, 0x41, 0x3c, 0x3c, 0x3d, 0x5c, 0xc0, 0xae, 0xaf, 0xbc, 0x3b,
+0x28, 0x24, 0x2a, 0x4b, 0xb5, 0xa8, 0xab, 0xbe, 0x40, 0x2a, 0x29, 0x33,
+0x54, 0xbb, 0xb4, 0xc9, 0x63, 0x4a, 0x3d, 0x3d, 0x4a, 0xb9, 0xbb, 0x48,
+0x37, 0x5d, 0xbd, 0xa5, 0x9a, 0xa1, 0xc6, 0x23, 0x13, 0x11, 0x20, 0x39,
+0xaa, 0x99, 0x97, 0xa2, 0xb9, 0x45, 0x2c, 0x28, 0x2a, 0x2e, 0x34, 0x38,
+0x35, 0x43, 0x6b, 0xc5, 0xba, 0xad, 0xad, 0xb5, 0xcc, 0x41, 0x32, 0x34,
+0x41, 0xe3, 0xd3, 0xc6, 0xbc, 0xbb, 0xbe, 0xe2, 0x38, 0x2a, 0x2b, 0x32,
+0x5c, 0xb8, 0xad, 0xae, 0xbb, 0x59, 0x36, 0x2c, 0x31, 0x57, 0xc2, 0xb6,
+0xbb, 0xd1, 0x45, 0x3b, 0x36, 0x53, 0xaa, 0xaf, 0x33, 0x3b, 0x4a, 0x4c,
+0xa8, 0x9c, 0xad, 0x48, 0x1e, 0x13, 0x19, 0x2e, 0xc5, 0x9d, 0x94, 0x9c,
+0xb0, 0x70, 0x2d, 0x24, 0x28, 0x2d, 0x36, 0x46, 0x4b, 0x4e, 0xd3, 0xc0,
+0xb6, 0xaf, 0xae, 0xbc, 0xe4, 0x3f, 0x30, 0x34, 0x5d, 0xc8, 0xbb, 0xba,
+0xc4, 0xe4, 0xf0, 0xc9, 0x79, 0x38, 0x30, 0x2e, 0x36, 0x56, 0xb9, 0xaf,
+0xb1, 0xc3, 0x4d, 0x36, 0x38, 0x3a, 0x3c, 0x6b, 0xd9, 0xca, 0xd0, 0xd3,
+0xf9, 0x5b, 0x5f, 0xc3, 0xba, 0x46, 0x34, 0x3d, 0x51, 0xb5, 0xa3, 0xab,
+0xd0, 0x32, 0x1f, 0x21, 0x2f, 0xf4, 0xad, 0xa5, 0xa8, 0xb9, 0xfe, 0x3d,
+0x38, 0x3d, 0x45, 0x48, 0x48, 0x49, 0x4d, 0x6b, 0xcb, 0xbe, 0xbe, 0xbe,
+0xcd, 0x5a, 0x4a, 0x45, 0x4e, 0x71, 0xce, 0xc1, 0xc4, 0xdf, 0x7d, 0x67,
+0xf3, 0xe7, 0x6c, 0x4c, 0x41, 0x40, 0x4c, 0xe9, 0xc3, 0xc1, 0xc5, 0xd0,
+0x58, 0x46, 0x43, 0x42, 0x49, 0x4f, 0xfa, 0xd5, 0xc9, 0xc5, 0xd0, 0x71,
+0x49, 0x4f, 0xd9, 0xd7, 0x33, 0x31, 0x46, 0xcd, 0xa9, 0xa0, 0xae, 0x3c,
+0x1e, 0x19, 0x1e, 0x35, 0xb5, 0x9f, 0x9e, 0xa9, 0xca, 0x47, 0x36, 0x30,
+0x34, 0x3b, 0x34, 0x32, 0x3b, 0x4e, 0xd1, 0xb9, 0xb0, 0xb7, 0xc9, 0x66,
+0x44, 0x3b, 0x41, 0x4b, 0xd1, 0xbb, 0xbc, 0xcd, 0x5c, 0x53, 0xef, 0xe6,
+0x57, 0x35, 0x2c, 0x2f, 0x44, 0x49, 0xbc, 0xb7, 0xc4, 0xe7, 0x77, 0x3b,
+0x2f, 0x3f, 0x42, 0x49, 0x3e, 0x59, 0xb1, 0xb7, 0x62, 0xed, 0xc2, 0xd2,
+0x36, 0x36, 0xc3, 0xaf, 0x2d, 0x21, 0x3a, 0xa6, 0x9c, 0xa4, 0xc0, 0x2b,
+0x21, 0x1a, 0x18, 0x37, 0xa3, 0xa0, 0xa9, 0xa7, 0xb1, 0x4b, 0x26, 0x2b,
+0x37, 0x4f, 0x43, 0x2c, 0x2f, 0xc8, 0xb9, 0xb5, 0xcf, 0xe6, 0x6e, 0x59,
+0x3f, 0x2f, 0x52, 0xba, 0xd8, 0xc3, 0xb8, 0xc3, 0xc4, 0xb5, 0x6d, 0x2f,
+0x27, 0x2b, 0x33, 0xed, 0xbb, 0xad, 0xb3, 0x70, 0x35, 0x40, 0x4d, 0x42,
+0x3e, 0x48, 0xea, 0xc8, 0xdb, 0xc6, 0xbe, 0xce, 0x6d, 0x3c, 0x34, 0x3f,
+0xc9, 0xd5, 0xdd, 0xf0, 0xde, 0x4d, 0x6e, 0x6a, 0xca, 0xb4, 0xbf, 0x48,
+0x2d, 0x29, 0x31, 0x3f, 0x53, 0xbf, 0xab, 0xb0, 0xc2, 0xf0, 0x5b, 0x52,
+0x3e, 0x39, 0x36, 0x3e, 0x5b, 0xcf, 0xbc, 0xb9, 0xbd, 0x63, 0x4d, 0x4f,
+0x5b, 0x67, 0x4c, 0x4d, 0x5f, 0xc8, 0xba, 0xb6, 0xbe, 0xe7, 0x37, 0x2c,
+0x32, 0x3e, 0xd5, 0xbf, 0xbc, 0xc2, 0xda, 0x4f, 0x3c, 0x39, 0x36, 0x37,
+0x4f, 0xbe, 0xb8, 0xb8, 0xc5, 0xd6, 0x55, 0x53, 0x4d, 0x59, 0xff, 0xe7,
+0xd6, 0xde, 0xdb, 0xc8, 0xdb, 0x68, 0x67, 0x56, 0x54, 0x50, 0xe3, 0xfc,
+0x52, 0x46, 0x45, 0x54, 0xd7, 0xc9, 0xcd, 0xec, 0x5d, 0x50, 0x4e, 0x5b,
+0x5b, 0xe7, 0x60, 0x57, 0x5c, 0xde, 0xc8, 0xce, 0xff, 0x67, 0x67, 0x5e,
+0x4f, 0x45, 0x4d, 0xef, 0xc6, 0xc4, 0xcf, 0xff, 0x57, 0x52, 0x49, 0x5f,
+0xd1, 0xc9, 0xd7, 0xd2, 0xc9, 0xd2, 0x63, 0x3f, 0x3c, 0x42, 0x4f, 0x67,
+0xdb, 0xe2, 0xe2, 0xff, 0x5b, 0x67, 0x7e, 0xe7, 0xec, 0x5b, 0x67, 0xd9,
+0xd3, 0xe7, 0x79, 0x4e, 0x5b, 0x55, 0x79, 0x60, 0x54, 0x78, 0xdb, 0xff,
+0x57, 0x5a, 0xdc, 0x6c, 0xff, 0x7e, 0x62, 0xff, 0x5b, 0x5e, 0xde, 0xdc,
+0xe7, 0x67, 0xe9, 0xe7, 0xdd, 0xe7, 0xe0, 0xe7, 0xce, 0xf0, 0x5a, 0x5a,
+0x6f, 0x6a, 0xe7, 0x67, 0xe5, 0xf0, 0x4e, 0x49, 0x45, 0x5d, 0xdc, 0xe7,
+0xd3, 0xe7, 0xe7, 0xf4, 0x5c, 0x4f, 0x59, 0x53, 0xff, 0xff, 0xff, 0x57,
+0x57, 0xe9, 0x6f, 0xe4, 0xd3, 0xef, 0xde, 0x67, 0xe7, 0xff, 0xdd, 0xd8,
+0xe7, 0xe7, 0x58, 0x5c, 0x67, 0x5b, 0x5b, 0x4f, 0x5b, 0x67, 0xf6, 0xd6,
+0xdb, 0x67, 0x77, 0x67, 0x57, 0x55, 0x5b, 0x70, 0x67, 0x67, 0x5b, 0x5e,
+0xff, 0x5f, 0xe7, 0xff, 0x5b, 0xff, 0xeb, 0xe7, 0xff, 0xff, 0xdb, 0xe7,
+0xe7, 0xff, 0xff, 0x5e, 0x67, 0xff, 0x6d, 0x6c, 0xe7, 0x72, 0xff, 0x69,
+0x60, 0x67, 0x67, 0xdb, 0xed, 0x7a, 0x6f, 0x5b, 0x78, 0x67, 0xff, 0x67,
+0xff, 0x7d, 0x67, 0x67, 0x5b, 0x5b, 0x6d, 0x5b, 0x74, 0x5e, 0xdc, 0x67,
+0xdb, 0xce, 0x79, 0x5f, 0xe7, 0x67, 0x6f, 0x55, 0x60, 0xf9, 0xe5, 0xdf,
+0xff, 0xdd, 0xfd, 0x69, 0xff, 0x5b, 0x67, 0x67, 0x78, 0xdc, 0x76, 0x73,
+0x68, 0xf5, 0x62, 0x5b, 0x73, 0xff, 0xe8, 0xe7, 0xe3, 0xfc, 0x71, 0xe7,
+0x6b, 0x58, 0x53, 0x65, 0x6f, 0x7a, 0x67, 0xff, 0x7b, 0x67, 0x5b, 0x5b,
+0x53, 0x6e, 0x66, 0x76, 0xed, 0xfe, 0xd6, 0x67, 0x7f, 0xf4, 0xe7, 0xfe,
+0xff, 0xff, 0xff, 0x72, 0xeb, 0x67, 0x71, 0xff, 0x67, 0x6f, 0x6a, 0xdb,
+0x70, 0xe7, 0x6b, 0x6e, 0x7c, 0x67, 0x5b, 0x53, 0x4d, 0x4d, 0x5c, 0x67,
+0xf4, 0xe7, 0xe2, 0xe7, 0xfe, 0x5e, 0x67, 0x67, 0xe7, 0xeb, 0xff, 0x5f,
+0x67, 0x67, 0xef, 0x67, 0x5b, 0xff, 0xff, 0xe7, 0xdb, 0xe7, 0xe7, 0x71,
+0x67, 0xeb, 0xff, 0x7d, 0x62, 0xed, 0xe7, 0xed, 0x75, 0xff, 0xe7, 0x63,
+0x66, 0x5f, 0x5b, 0x66, 0xe7, 0xff, 0xff, 0x67, 0x6a, 0xe7, 0x5f, 0x5d,
+0x67, 0x5b, 0xff, 0x6b, 0x5f, 0xe7, 0xff, 0xe7, 0xe8, 0x56, 0x6d, 0x67,
+0x59, 0xff, 0x53, 0x66, 0xd0, 0x67, 0x67, 0xf6, 0x68, 0xff, 0xff, 0x67,
+0xdf, 0xea, 0xdd, 0xdc, 0x5d, 0xde, 0x5c, 0x50, 0xdb, 0x71, 0xe7, 0xff,
+0x72, 0xff, 0x6c, 0x67, 0x67, 0x5b, 0x5b, 0xff, 0xff, 0x5b, 0xe8, 0xff,
+0x5b, 0x53, 0x5b, 0x67, 0x67, 0x74, 0xdb, 0xfb, 0x70, 0xed, 0x7a, 0xe7,
+0xec, 0x5b, 0x67, 0x64, 0x52, 0xe1, 0xe8, 0xe7, 0x73, 0x68, 0xde, 0x74,
+0x68, 0xdb, 0xdb, 0x68, 0x5b, 0xff, 0xff, 0x6e, 0x67, 0x5c, 0x60, 0x53,
+0x5a, 0x70, 0x61, 0x52, 0x5b, 0xff, 0x5b, 0xe7, 0xfb, 0xf8, 0x6e, 0x7c,
+0x5d, 0x78, 0x7d, 0x5b, 0xff, 0x7e, 0x5b, 0x5b, 0x67, 0x6d, 0xff, 0x5c,
+0x72, 0xf7, 0xe7, 0xe7, 0x67, 0xff, 0x5f, 0x6a, 0xff, 0x67, 0xe7, 0xf9,
+0x67, 0xff, 0x67, 0x60, 0x5c, 0xff, 0x67, 0x66, 0x63, 0xff, 0xe7, 0xe7,
+0x6d, 0xe7, 0x5e, 0xf5, 0xfe, 0x67, 0x56, 0x67, 0xe7, 0xff, 0x67, 0x67,
+0x78, 0x4b, 0x5c, 0xd6, 0x5d, 0xdf, 0xe7, 0xff, 0xff, 0x5b, 0x77, 0xff,
+0xff, 0xff, 0x53, 0x7e, 0x5b, 0x6d, 0xe7, 0x56, 0x73, 0xfd, 0xe7, 0xf6,
+0xfd, 0xff, 0x6f, 0x5b, 0xfb, 0xee, 0x7b, 0xff, 0x79, 0x5b, 0x53, 0x55,
+0x53, 0x58, 0x49, 0x5a, 0x6e, 0xdc, 0xff, 0xff, 0xe8, 0x67, 0x67, 0xdb,
+0x67, 0x56, 0x54, 0x5b, 0x51, 0x4d, 0x58, 0x5b, 0xea, 0xf1, 0x5d, 0xff,
+0xe7, 0xda, 0xe5, 0xd7, 0xde, 0xea, 0xef, 0x67, 0xff, 0x60, 0x5b, 0x67,
+0x53, 0x67, 0x50, 0xeb, 0x5b, 0x67, 0x5b, 0x67, 0xed, 0x4a, 0x65, 0xff,
+0x5b, 0xd5, 0x57, 0xdd, 0xff, 0x5c, 0xbe, 0x3c, 0xd3, 0x47, 0x5c, 0x68,
+0x63, 0x4d, 0xd3, 0x4d, 0xf6, 0x5b, 0x5f, 0xbe, 0x50, 0xdb, 0xe2, 0x74,
+0xe7, 0xd8, 0x4f, 0xce, 0x5f, 0x44, 0x41, 0x5f, 0x4e, 0x3d, 0x5d, 0xeb,
+0x5c, 0xd3, 0xdd, 0xff, 0xd7, 0xbd, 0x53, 0xca, 0x5e, 0x43, 0xd1, 0xf4,
+0x38, 0x67, 0x5b, 0x47, 0x56, 0x5b, 0x67, 0x59, 0x46, 0x57, 0xc5, 0xc5,
+0xbc, 0xe4, 0x3f, 0x4b, 0x37, 0xec, 0xc8, 0xcd, 0x49, 0xd7, 0x48, 0x40,
+0xe8, 0xd9, 0xbd, 0xca, 0x55, 0xcc, 0xdd, 0x52, 0x3a, 0x4c, 0xe6, 0xc1,
+0x74, 0x4d, 0xe7, 0x61, 0x4e, 0x3d, 0xcb, 0xfa, 0x5b, 0x5b, 0xeb, 0x7c,
+0x5d, 0xff, 0x5f, 0xfa, 0x45, 0x3c, 0x5e, 0x67, 0xd0, 0xe9, 0xdd, 0x78,
+0x3f, 0xed, 0xc7, 0x5b, 0x53, 0x75, 0xff, 0xcf, 0xce, 0x67, 0x6d, 0xf6,
+0x68, 0xf9, 0xe7, 0xfc, 0xfb, 0xe1, 0x4b, 0x45, 0x4e, 0x53, 0xdf, 0xea,
+0xdf, 0x69, 0xe5, 0xe4, 0x72, 0x67, 0x56, 0x3c, 0x4a, 0xe7, 0x59, 0x53,
+0x49, 0x67, 0x46, 0x4d, 0xd7, 0xc6, 0xc1, 0xeb, 0xe7, 0x60, 0xdd, 0xff,
+0xe7, 0x67, 0xea, 0xe7, 0x4d, 0xd5, 0xcd, 0x49, 0x46, 0x49, 0xcd, 0xca,
+0xda, 0xdb, 0x72, 0x4c, 0x68, 0xde, 0xec, 0x5b, 0xd9, 0x4d, 0x5b, 0x3c,
+0x5a, 0xfc, 0x48, 0xdd, 0x4a, 0xfc, 0x57, 0x4d, 0x5f, 0x7a, 0x67, 0xdc,
+0xc2, 0xd0, 0xcd, 0xe9, 0xd7, 0x4d, 0x45, 0x43, 0xd8, 0xe7, 0x5b, 0x40,
+0x5b, 0xd9, 0xf5, 0xce, 0xe3, 0xd8, 0xdd, 0xca, 0x6b, 0xff, 0xcf, 0xee,
+0x5b, 0x4b, 0x5d, 0x67, 0x4c, 0xf6, 0x5f, 0xe0, 0xff, 0x77, 0xd7, 0xe7,
+0xe7, 0x53, 0x5c, 0x5e, 0x59, 0xe7, 0x5b, 0x61, 0x68, 0x3b, 0x4a, 0x5c,
+0x58, 0x40, 0xef, 0xc9, 0xf4, 0x53, 0xe6, 0xce, 0xf5, 0x5b, 0xe5, 0xce,
+0xd0, 0xc6, 0x53, 0x52, 0xe7, 0xf7, 0x4a, 0x5c, 0xff, 0x61, 0x68, 0xf5,
+0x4b, 0x7e, 0xff, 0xcb, 0xda, 0x58, 0xff, 0x5c, 0x6a, 0x4d, 0x5a, 0x4f,
+0x5e, 0x5d, 0x5f, 0x5e, 0xe7, 0x53, 0xd6, 0x4d, 0xe0, 0xe6, 0xeb, 0x61,
+0xeb, 0x4f, 0x65, 0x5c, 0x5e, 0x4d, 0x53, 0x5e, 0x5b, 0x67, 0xff, 0x59,
+0xeb, 0xea, 0x55, 0xeb, 0xc5, 0xbf, 0x6e, 0x68, 0xce, 0xd5, 0x60, 0x57,
+0xdb, 0x6b, 0x46, 0x59, 0xda, 0x4d, 0x3f, 0x6a, 0xdc, 0x48, 0x54, 0xe7,
+0xcc, 0x68, 0x4a, 0x52, 0xd7, 0xc2, 0xe4, 0x5b, 0x53, 0x57, 0x43, 0x77,
+0xdf, 0xed, 0x4f, 0x53, 0xfa, 0x6a, 0x7c, 0xd5, 0x55, 0x6e, 0x69, 0xdd,
+0xcb, 0xff, 0xd6, 0xff, 0x4d, 0x43, 0xed, 0xc2, 0xcd, 0x4d, 0x4d, 0x79,
+0xd1, 0xda, 0x5f, 0x53, 0x4a, 0x53, 0xda, 0xe2, 0x4f, 0x5d, 0x67, 0x5b,
+0x54, 0xdd, 0x60, 0x55, 0xe7, 0xf2, 0xd4, 0x5e, 0xe7, 0x53, 0x62, 0x4f,
+0x5b, 0xd3, 0x57, 0x4d, 0x73, 0xec, 0x5b, 0x5b, 0x5f, 0xfb, 0x53, 0xf9,
+0xfa, 0x5f, 0xcd, 0xda, 0x68, 0x6e, 0xcd, 0x67, 0xf9, 0xd9, 0xee, 0x5b,
+0x59, 0x4c, 0x4a, 0x75, 0x4c, 0xff, 0x59, 0x54, 0x45, 0xed, 0xec, 0x54,
+0x77, 0xc9, 0x6c, 0xd3, 0x5e, 0x72, 0x66, 0x4c, 0xd5, 0x4e, 0x55, 0x53,
+0xff, 0x52, 0x49, 0x7a, 0xe8, 0x67, 0xd8, 0xe7, 0xd1, 0x67, 0x7f, 0xed,
+0xe2, 0xfe, 0x67, 0x5e, 0xdc, 0x53, 0x59, 0x5b, 0x67, 0xff, 0x5d, 0x58,
+0x53, 0x5a, 0xef, 0x67, 0x79, 0xee, 0x6b, 0xd3, 0xf1, 0xd5, 0xeb, 0x5d,
+0x54, 0x56, 0x63, 0xdb, 0xe2, 0x59, 0xdc, 0x76, 0x53, 0x53, 0x53, 0x5d,
+0x54, 0x57, 0x5f, 0xe7, 0xf0, 0xcf, 0xd0, 0x57, 0xd7, 0xde, 0x5b, 0x77,
+0x60, 0xd7, 0x5b, 0x59, 0xd7, 0x53, 0x76, 0x6d, 0x5c, 0xec, 0x4d, 0x7f,
+0x5e, 0xff, 0x5c, 0xe3, 0xf1, 0x5b, 0x5f, 0xf7, 0x5d, 0x60, 0x64, 0x7b,
+0x6f, 0x55, 0xea, 0x53, 0x5b, 0x5b, 0x71, 0x5b, 0x5d, 0x67, 0x66, 0x63,
+0xe7, 0xe8, 0xff, 0xd9, 0xd3, 0xf4, 0xe7, 0x68, 0xed, 0xd6, 0x5c, 0x6a,
+0x77, 0x7c, 0x65, 0x53, 0x65, 0x4d, 0x4f, 0x67, 0x5b, 0x65, 0x53, 0x70,
+0x5d, 0xdd, 0x5b, 0xff, 0xeb, 0xda, 0xfc, 0xe9, 0x4c, 0xff, 0x67, 0x6d,
+0x53, 0x67, 0x5b, 0x5b, 0x5b, 0x5f, 0x4d, 0xdb, 0x5b, 0xff, 0xe6, 0xea,
+0xea, 0xef, 0xe5, 0xe7, 0xe7, 0xda, 0xe0, 0xff, 0x67, 0xe7, 0x4e, 0x68,
+0x50, 0x59, 0x5c, 0xec, 0xff, 0xe7, 0x5b, 0xf5, 0xfe, 0x73, 0xf6, 0xe7,
+0xff, 0x63, 0xeb, 0x6e, 0x67, 0x5d, 0x68, 0x65, 0x5b, 0x57, 0xff, 0xff,
+0xe0, 0xff, 0x5d, 0x5f, 0x68, 0xff, 0xff, 0x68, 0xde, 0x5e, 0x67, 0x74,
+0xff, 0x68, 0x73, 0xf6, 0xfd, 0xe7, 0xff, 0xfc, 0xdf, 0xff, 0xe7, 0x67,
+0x67, 0xea, 0xdf, 0x7a, 0x5b, 0x67, 0xff, 0x5b, 0x60, 0x5b, 0x53, 0x56,
+0xfe, 0xf5, 0x74, 0x67, 0x62, 0xff, 0x67, 0x6d, 0x5b, 0x7d, 0x72, 0xe7,
+0x5c, 0xe7, 0x5b, 0x65, 0xf0, 0xff, 0x6a, 0xef, 0xfa, 0xe4, 0x67, 0x69,
+0xff, 0x5b, 0xdb, 0xe3, 0xdf, 0x67, 0x76, 0xe7, 0x7e, 0x5b, 0xff, 0x67,
+0x67, 0xe7, 0x5c, 0x61, 0x53, 0xea, 0x5b, 0x64, 0x65, 0x7c, 0x5d, 0x67,
+0x6f, 0x67, 0x5d, 0x5b, 0xfb, 0xff, 0xd7, 0xff, 0xdd, 0x6a, 0x67, 0x6c,
+0x56, 0xe8, 0xec, 0xe2, 0x5b, 0x67, 0x6c, 0xfe, 0x5e, 0x60, 0xe6, 0x53,
+0x67, 0x7c, 0x5f, 0xf8, 0xfb, 0x67, 0xe7, 0xff, 0xe7, 0xe7, 0xdb, 0xdf,
+0x67, 0x55, 0x61, 0x5c, 0x6c, 0x53, 0x69, 0xe7, 0x5b, 0x67, 0x62, 0x56,
+0x67, 0x61, 0x67, 0xe8, 0xdb, 0x77, 0xdd, 0xdb, 0xeb, 0x67, 0x5b, 0xff,
+0x5d, 0x6f, 0x67, 0x67, 0xe7, 0xff, 0x67, 0xe0, 0xe9, 0xeb, 0xe4, 0x67,
+0xff, 0x67, 0x67, 0x75, 0x5b, 0x7f, 0xf4, 0xff, 0xff, 0x72, 0x77, 0x5b,
+0x67, 0x5b, 0x67, 0xe7, 0x5b, 0x7a, 0x6f, 0x5d, 0xea, 0x61, 0x4d, 0x60,
+0xe7, 0x79, 0x59, 0xff, 0x7d, 0x56, 0x5e, 0x67, 0x59, 0x5b, 0xe7, 0xde,
+0x75, 0x7e, 0xf7, 0x6f, 0x66, 0x67, 0xf0, 0xfc, 0xe7, 0x67, 0xff, 0x7e,
+0x6a, 0x6a, 0x67, 0x67, 0xff, 0xee, 0x67, 0x77, 0xee, 0x67, 0x67, 0x61,
+0x67, 0x67, 0x67, 0x67, 0x51, 0xe7, 0x5c, 0x5b, 0xff, 0x5c, 0x72, 0x67,
+0x67, 0xff, 0x5d, 0xff, 0x53, 0x6a, 0x5e, 0x57, 0x5d, 0xea, 0xe7, 0xfb,
+0xe7, 0xe7, 0xfc, 0xe7, 0xdb, 0xff, 0xff, 0xf3, 0xe7, 0x67, 0xff, 0xff,
+0xe7, 0x76, 0x66, 0x5b, 0xff, 0x69, 0xff, 0x64, 0x4e, 0x60, 0xea, 0x5b,
+0x67, 0x67, 0x67, 0x5b, 0x67, 0x5b, 0x57, 0x67, 0x77, 0xee, 0xe7, 0xe7,
+0xed, 0xff, 0xff, 0x62, 0x5b, 0x67, 0x6c, 0xff, 0x5b, 0x6c, 0xdc, 0x5a,
+0x5d, 0x67, 0x71, 0x79, 0x67, 0xd3, 0xe7, 0xff, 0xe7, 0xfb, 0xff, 0xe0,
+0x66, 0x67, 0xe7, 0x67, 0x76, 0xe7, 0x67, 0x67, 0x5e, 0xff, 0x6d, 0x5e,
+0x68, 0x61, 0x6c, 0xff, 0x53, 0x5d, 0xe9, 0x5f, 0x55, 0xe9, 0x5b, 0x67,
+0x67, 0x5f, 0xfa, 0x57, 0x66, 0xe7, 0x6b, 0x67, 0xff, 0xff, 0xe7, 0xff,
+0xd8, 0xed, 0xff, 0x74, 0xec, 0x68, 0x67, 0xe7, 0x68, 0xee, 0xff, 0x7c,
+0xf1, 0x64, 0x5a, 0x67, 0x53, 0x65, 0x67, 0x5b, 0x79, 0x70, 0x67, 0x5d,
+0x4f, 0x54, 0xff, 0xf2, 0x7d, 0x76, 0xe7, 0xe8, 0x75, 0xde, 0xff, 0x5b,
+0x75, 0x5b, 0xed, 0x76, 0x66, 0x6e, 0x67, 0x7b, 0x5f, 0x67, 0x67, 0x5b,
+0x5d, 0xdd, 0xef, 0xf7, 0xda, 0x60, 0xe6, 0xe3, 0x61, 0xfd, 0xf6, 0xff,
+0x67, 0x62, 0x59, 0x53, 0x74, 0x6d, 0x5b, 0xff, 0x5b, 0x67, 0x72, 0x6f,
+0x5b, 0xff, 0x6b, 0xe7, 0xe7, 0x67, 0x67, 0xef, 0xdd, 0x6a, 0x60, 0x67,
+0xe7, 0xe7, 0x65, 0x63, 0xf3, 0xe9, 0x62, 0x74, 0x67, 0xff, 0xf5, 0xe7,
+0xff, 0xff, 0x68, 0x53, 0x6b, 0x69, 0xff, 0xe7, 0xe7, 0xf0, 0x79, 0x55,
+0x53, 0x5d, 0xff, 0x67, 0xdb, 0xf8, 0x6e, 0x7a, 0x53, 0xff, 0x5b, 0x51,
+0x5e, 0x67, 0x5e, 0x5e, 0x67, 0x67, 0x5b, 0x5b, 0x5b, 0x5b, 0x67, 0xe7,
+0x78, 0x7b, 0xf0, 0xea, 0x67, 0xff, 0x67, 0x79, 0xff, 0xe7, 0xf8, 0x6e,
+0xe9, 0xff, 0x61, 0xff, 0x58, 0x67, 0x5b, 0x75, 0x67, 0xff, 0x5b, 0x67,
+0x67, 0x6d, 0x5b, 0x5b, 0x5f, 0x5d, 0x67, 0x5b, 0x53, 0x5b, 0x67, 0x79,
+0xff, 0xf0, 0xe9, 0x67, 0x60, 0x5b, 0x67, 0x6e, 0x67, 0xff, 0xe7, 0xe8,
+0x6c, 0xf4, 0x67, 0x67, 0xf5, 0xdc, 0x6d, 0xff, 0xff, 0x6e, 0x67, 0xff,
+0x65, 0xf8, 0xf7, 0x5c, 0xea, 0xff, 0xd7, 0xff, 0xff, 0x70, 0x5b, 0x5d,
+0xff, 0x66, 0x53, 0x6e, 0x66, 0x76, 0xff, 0x67, 0x67, 0x53, 0x5b, 0x73,
+0x76, 0x67, 0xe7, 0xdd, 0x67, 0xff, 0x5b, 0x65, 0x67, 0x67, 0xff, 0x6f,
+0x7a, 0x79, 0x67, 0x69, 0xe7, 0xee, 0xe7, 0xe7, 0xe7, 0xff, 0x4d, 0xe7,
+0xe8, 0xff, 0x67, 0x7f, 0xff, 0x67, 0x67, 0x6d, 0x58, 0xe7, 0x67, 0x6b,
+0xff, 0x5b, 0x67, 0x5d, 0x5b, 0x52, 0x59, 0xfe, 0x53, 0x78, 0xff, 0x53,
+0x63, 0x72, 0x5b, 0x51, 0x5b, 0x5c, 0xec, 0xf4, 0xe7, 0xd9, 0xd6, 0xfe,
+0xed, 0x63, 0x5b, 0xff, 0x67, 0x7c, 0xff, 0x67, 0xe9, 0x6f, 0x67, 0x67,
+0xff, 0xdb, 0xe4, 0x67, 0x5c, 0x67, 0x5f, 0x5b, 0x5b, 0x5b, 0x5b, 0x75,
+0x67, 0x67, 0x67, 0xe7, 0x67, 0x5b, 0x67, 0x67, 0x5f, 0x67, 0xe9, 0xff,
+0x5b, 0x65, 0xe7, 0xea, 0x7a, 0xff, 0x7a, 0x67, 0x5f, 0x67, 0x6b, 0x5b,
+0x67, 0x67, 0x61, 0x67, 0x67, 0xff, 0xe8, 0x5b, 0xff, 0xe7, 0xe7, 0xe7,
+0xe7, 0xe7, 0x67, 0x5c, 0x5b, 0x5b, 0x67, 0xff, 0x67, 0xea, 0x6f, 0x67,
+0x67, 0x67, 0x4e, 0x53, 0xe9, 0x79, 0x59, 0xdd, 0xd4, 0xe3, 0xdd, 0xe8,
+0x5b, 0x62, 0x7f, 0xd1, 0x6d, 0x53, 0xed, 0x6e, 0x66, 0x67, 0x67, 0x67,
+0x67, 0xff, 0x69, 0x67, 0xea, 0x5d, 0x6f, 0xdb, 0x5f, 0x5b, 0xe7, 0xf7,
+0xd0, 0xe8, 0xec, 0x73, 0x5b, 0x67, 0xf4, 0x67, 0x74, 0x67, 0x5b, 0x5b,
+0x5b, 0x66, 0x53, 0x55, 0x5b, 0x71, 0x5b, 0x5c, 0x70, 0xed, 0x4e, 0x4d,
+0x6a, 0xe7, 0x6f, 0xfb, 0xd5, 0xdf, 0x67, 0x77, 0x72, 0xfd, 0xe7, 0xed,
+0x68, 0xff, 0x74, 0x67, 0x61, 0xff, 0x68, 0x6e, 0x53, 0x5b, 0x67, 0x5a,
+0x5a, 0xff, 0xdd, 0x5e, 0x57, 0xea, 0xff, 0x4d, 0x6b, 0xf8, 0x53, 0x67,
+0x67, 0xf2, 0x7b, 0x53, 0x58, 0x5b, 0x56, 0x67, 0xe7, 0xf4, 0x6c, 0xff,
+0xe7, 0xff, 0x68, 0xee, 0x77, 0x7c, 0xf1, 0x67, 0xe7, 0x5f, 0x6a, 0xff,
+0xff, 0xff, 0xff, 0x60, 0xfc, 0xe7, 0x72, 0x54, 0x76, 0x67, 0x67, 0x67,
+0xd9, 0xdb, 0x4f, 0x67, 0x5b, 0x5b, 0x56, 0x67, 0xe7, 0x4e, 0xea, 0x7b,
+};
diff --git a/contrib/netbsd-tests/dev/audio/t_pad.sh b/contrib/netbsd-tests/dev/audio/t_pad.sh
new file mode 100755
index 0000000..8caf23a
--- /dev/null
+++ b/contrib/netbsd-tests/dev/audio/t_pad.sh
@@ -0,0 +1,47 @@
+# $NetBSD: t_pad.sh,v 1.3 2010/11/07 17:51:17 jmmv Exp $
+#
+# Copyright (c) 2010 The NetBSD Foundation, Inc.
+# 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.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+#
+
+atf_test_case pad_output
+pad_output_head()
+{
+
+ atf_set "descr" "Check pad driver output against known-good output"
+}
+
+pad_output_body()
+{
+
+ atf_check -s exit:0 uudecode $(atf_get_srcdir)/t_pad_output.bz2.uue
+ atf_check -s exit:0 bunzip2 t_pad_output.bz2
+ atf_check -s exit:0 -o file:t_pad_output $(atf_get_srcdir)/h_pad
+}
+
+atf_init_test_cases()
+{
+
+ atf_add_test_case pad_output
+}
diff --git a/contrib/netbsd-tests/dev/audio/t_pad_output.bz2.uue b/contrib/netbsd-tests/dev/audio/t_pad_output.bz2.uue
new file mode 100644
index 0000000..0aadfa7
--- /dev/null
+++ b/contrib/netbsd-tests/dev/audio/t_pad_output.bz2.uue
@@ -0,0 +1,998 @@
+begin 644 t_pad_output.bz2
+M0EIH.3%!629368,\S/H`A(]_____________________________________
+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
+&A(09YF?0
+`
+end
diff --git a/contrib/netbsd-tests/dev/cgd/paramsfile b/contrib/netbsd-tests/dev/cgd/paramsfile
new file mode 100644
index 0000000..066eab6
--- /dev/null
+++ b/contrib/netbsd-tests/dev/cgd/paramsfile
@@ -0,0 +1,8 @@
+algorithm aes-cbc;
+iv-method encblkno1;
+keylength 128;
+verify_method none;
+keygen pkcs5_pbkdf2/sha1 {
+ iterations 42;
+ salt AAAAgKajcCnHR7sR1k1RKQ9Q0uY=;
+};
diff --git a/contrib/netbsd-tests/dev/cgd/t_cgd.sh b/contrib/netbsd-tests/dev/cgd/t_cgd.sh
new file mode 100755
index 0000000..9cd50a5
--- /dev/null
+++ b/contrib/netbsd-tests/dev/cgd/t_cgd.sh
@@ -0,0 +1,159 @@
+# $NetBSD: t_cgd.sh,v 1.11 2013/02/19 21:08:24 joerg Exp $
+#
+# Copyright (c) 2010 The NetBSD Foundation, Inc.
+# 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.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+#
+
+rawpart=`sysctl -n kern.rawpartition | tr '01234' 'abcde'`
+rawcgd=/dev/rcgd0${rawpart}
+cgdserver=\
+"rump_server -lrumpvfs -lrumpkern_crypto -lrumpdev -lrumpdev_disk -lrumpdev_cgd"
+
+atf_test_case basic cleanup
+basic_head()
+{
+
+ atf_set "descr" "Tests that encrypt/decrypt works"
+ atf_set "require.progs" "rump_server"
+}
+
+basic_body()
+{
+
+ d=$(atf_get_srcdir)
+ atf_check -s exit:0 \
+ ${cgdserver} -d key=/dev/dk,hostpath=dk.img,size=1m unix://csock
+
+ export RUMP_SERVER=unix://csock
+ atf_check -s exit:0 -x "echo 12345 | \
+ rump.cgdconfig -p cgd0 /dev/dk ${d}/paramsfile"
+ atf_check -s exit:0 -e ignore -x \
+ "dd if=${d}/t_cgd count=2 | rump.dd of=${rawcgd}"
+ atf_check -s exit:0 -e ignore dd if=${d}/t_cgd of=testfile count=2
+ atf_check -s exit:0 -e ignore -o file:testfile \
+ rump.dd if=${rawcgd} count=2
+}
+
+basic_cleanup()
+{
+
+ env RUMP_SERVER=unix://csock rump.halt || true
+}
+
+atf_test_case wrongpass cleanup
+wrongpass_head()
+{
+
+ atf_set "descr" "Tests that wrong password does not give original " \
+ "plaintext"
+ atf_set "require.progs" "rump_server"
+}
+
+wrongpass_body()
+{
+
+ d=$(atf_get_srcdir)
+ atf_check -s exit:0 \
+ ${cgdserver} -d key=/dev/dk,hostpath=dk.img,size=1m unix://csock
+
+ export RUMP_SERVER=unix://csock
+ atf_check -s exit:0 -x "echo 12345 | \
+ rump.cgdconfig -p cgd0 /dev/dk ${d}/paramsfile"
+ atf_check -s exit:0 -e ignore -x \
+ "dd if=${d}/t_cgd | rump.dd of=${rawcgd} count=2"
+
+ # unconfig and reconfig cgd
+ atf_check -s exit:0 rump.cgdconfig -u cgd0
+ atf_check -s exit:0 -x "echo 54321 | \
+ rump.cgdconfig -p cgd0 /dev/dk ${d}/paramsfile"
+
+ atf_check -s exit:0 -e ignore dd if=${d}/t_cgd of=testfile count=2
+ atf_check -s exit:0 -e ignore -o not-file:testfile \
+ rump.dd if=${rawcgd} count=2
+}
+
+wrongpass_cleanup()
+{
+
+ env RUMP_SERVER=unix://csock rump.halt || true
+}
+
+
+atf_test_case unaligned_write cleanup
+unaligned_write_head()
+{
+
+ atf_set "descr" "Attempt unaligned writes to a raw cgd device"
+ atf_set "require.progs" "rump_server"
+}
+
+unaligned_write_body()
+{
+ d=$(atf_get_srcdir)
+ atf_check -s exit:0 \
+ ${cgdserver} -d key=/dev/dk,hostpath=dk.img,size=1m unix://csock
+
+ export RUMP_SERVER=unix://csock
+ atf_check -s exit:0 -x "echo 12345 | \
+ rump.cgdconfig -p cgd0 /dev/dk ${d}/paramsfile"
+
+ # Check that cgd rejects writes of totally bogus lengths.
+ atf_check -s not-exit:0 -e ignore -x \
+ "echo die hard | rump.dd of=${rawcgd} bs=123 conv=sync"
+
+ # Check that cgd rejects non-sector-length writes even if they
+ # are integral multiples of the block size.
+ atf_check -s not-exit:0 -e ignore -x \
+ "echo die hard | rump.dd of=${rawcgd} bs=64 conv=sync"
+ atf_check -s not-exit:0 -e ignore -x \
+ "echo die hard | rump.dd of=${rawcgd} bs=256 conv=sync"
+
+ # Check that cgd rejects misaligned buffers, produced by
+ # packetizing the input on bogus boundaries and using the
+ # bizarre behaviour of `bs=N' in dd.
+ atf_check -s not-exit:0 -e ignore -x \
+ "(echo -n x && sleep 1 && head -c 511 </dev/zero) \
+ | rump.dd of=${rawcgd} bs=512"
+
+ # Check that cgd rejects sector-length writes if they are not
+ # on sector boundaries. Doesn't work because dd can't be
+ # persuaded to seek a non-integral multiple of the output
+ # buffer size and I can't be arsed to find the another way to
+ # do that.
+ #atf_check -s not-exit:0 -e ignore -x \
+ # "echo die hard | rump.dd of=${rawcgd} seek=1 bs=512 conv=sync"
+}
+
+unaligned_write_cleanup()
+{
+ env RUMP_SERVER=unix://csock rump.halt || true
+}
+
+atf_init_test_cases()
+{
+
+ atf_add_test_case basic
+ atf_add_test_case wrongpass
+ atf_add_test_case unaligned_write
+}
diff --git a/contrib/netbsd-tests/dev/dm/dm_targets_cmd.plist b/contrib/netbsd-tests/dev/dm/dm_targets_cmd.plist
new file mode 100644
index 0000000..f029dfb
--- /dev/null
+++ b/contrib/netbsd-tests/dev/dm/dm_targets_cmd.plist
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>cmd_data</key>
+ <array/>
+ <key>command</key>
+ <string>targets</string>
+ <key>event_nr</key>
+ <integer>0x0</integer>
+ <key>flags</key>
+ <integer>0x4</integer>
+ <key>version</key>
+ <array>
+ <integer>0x4</integer>
+ <integer>0x1</integer>
+ <integer>0x0</integer>
+ </array>
+</dict>
+</plist> \ No newline at end of file
diff --git a/contrib/netbsd-tests/dev/dm/dm_version_cmd.plist b/contrib/netbsd-tests/dev/dm/dm_version_cmd.plist
new file mode 100644
index 0000000..e40e53e
--- /dev/null
+++ b/contrib/netbsd-tests/dev/dm/dm_version_cmd.plist
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>cmd_data</key>
+ <array/>
+ <key>command</key>
+ <string>version</string>
+ <key>event_nr</key>
+ <integer>0x0</integer>
+ <key>flags</key>
+ <integer>0x4</integer>
+ <key>version</key>
+ <array>
+ <integer>0x4</integer>
+ <integer>0x0</integer>
+ <integer>0x0</integer>
+ </array>
+</dict>
+</plist> \ No newline at end of file
diff --git a/contrib/netbsd-tests/dev/dm/h_dm.c b/contrib/netbsd-tests/dev/dm/h_dm.c
new file mode 100644
index 0000000..3380ad3
--- /dev/null
+++ b/contrib/netbsd-tests/dev/dm/h_dm.c
@@ -0,0 +1,146 @@
+/* $NetBSD: h_dm.c,v 1.1 2010/10/06 11:24:55 haad Exp $ */
+
+/*
+ * Copyright (c) 2010 Antti Kantee. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+#include <sys/types.h>
+
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/disklabel.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <util.h>
+
+#include <dev/dm/netbsd-dm.h>
+
+int dm_test_targets(void);
+int dm_test_versions(void);
+
+/*
+ * Test simple dm versions command on device-mapper device.
+ */
+int
+dm_test_versions(void) {
+ int fd;
+ int error;
+ prop_dictionary_t dict_in, dict_out;
+ struct plistref prefp;
+ char *xml;
+
+ error = 0;
+
+ error = rump_init();
+ if (error != 0)
+ err(1, "Rump init failed");
+
+ fd = rump_sys_open("/dev/mapper/control", O_RDWR, 0);
+ if (fd == -1)
+ err(1, "Open dm device failed");
+
+ dict_in = prop_dictionary_internalize_from_file("dm_version_cmd.plist");
+ dict_out = prop_dictionary_create();
+
+ prop_dictionary_externalize_to_pref(dict_in, &prefp);
+
+ error = rump_sys_ioctl(fd, NETBSD_DM_IOCTL, &prefp);
+ if (error < 0)
+ err(1, "Dm control ioctl failed");
+
+ dict_out = prop_dictionary_internalize(prefp.pref_plist);
+
+ xml = prop_dictionary_externalize(dict_out);
+
+ rump_sys_close(fd);
+
+ return error;
+}
+
+/*
+ * Test simple dm targets command on device-mapper device.
+ */
+int
+dm_test_targets(void) {
+ int fd;
+ int error;
+ prop_dictionary_t dict_in, dict_out;
+ struct plistref prefp;
+ char *xml;
+
+ error = 0;
+
+ error = rump_init();
+ if (error != 0)
+ err(1, "Rump init failed");
+
+ fd = rump_sys_open("/dev/mapper/control", O_RDWR, 0);
+ if (fd == -1)
+ err(1, "Open dm device failed");
+
+ dict_in = prop_dictionary_internalize_from_file("dm_targets_cmd.plist");
+ dict_out = prop_dictionary_create();
+
+ prop_dictionary_externalize_to_pref(dict_in, &prefp);
+
+ error = rump_sys_ioctl(fd, NETBSD_DM_IOCTL, &prefp);
+ if (error < 0)
+ err(1, "Dm control ioctl failed");
+
+ dict_out = prop_dictionary_internalize(prefp.pref_plist);
+
+ xml = prop_dictionary_externalize(dict_out);
+
+ rump_sys_close(fd);
+
+ return error;
+}
+
+int
+main(int argc, char **argv) {
+ int error;
+
+ error = 0;
+
+ error = dm_test_versions();
+ if (error != 0)
+ err(1, "dm_test_versions failed");
+
+ error = dm_test_targets();
+ if (error != 0)
+ err(1, "dm_test_targets failed");
+
+ return error;
+}
diff --git a/contrib/netbsd-tests/dev/dm/t_dm.sh b/contrib/netbsd-tests/dev/dm/t_dm.sh
new file mode 100755
index 0000000..02d1ee3
--- /dev/null
+++ b/contrib/netbsd-tests/dev/dm/t_dm.sh
@@ -0,0 +1,47 @@
+# $NetBSD: t_dm.sh,v 1.2 2010/11/07 17:51:17 jmmv Exp $
+#
+# Copyright (c) 2010 The NetBSD Foundation, Inc.
+# 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.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+#
+
+atf_test_case dm_test
+dm_test_head()
+{
+ atf_set "descr" "Check dm driver routines and create lineary, stripe mapped disks"
+}
+
+dm_test_body()
+{
+ # XXX Actually we need disks than 1 for stripe check let it leave for later now.
+ #atf_check -s exit:0 uudecode $(atf_get_srcdir)/t_dm_disk_1.bz2.uue
+ #atf_check -s exit:0 bunzip2 t_dm_disk_1.bz2
+ #atf_check -s exit:0 -o file:t_dm_disk_1 $(atf_get_srcdir)/h_dm
+ atf_check -s exit:0 $(atf_get_srcdir)/h_dm
+}
+
+atf_init_test_cases()
+{
+
+ atf_add_test_case dm_test
+}
diff --git a/contrib/netbsd-tests/dev/md/h_mdserv.c b/contrib/netbsd-tests/dev/md/h_mdserv.c
new file mode 100644
index 0000000..f5ac6a9
--- /dev/null
+++ b/contrib/netbsd-tests/dev/md/h_mdserv.c
@@ -0,0 +1,109 @@
+/* $NetBSD: h_mdserv.c,v 1.4 2011/02/10 13:29:02 pooka Exp $ */
+
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/ioctl.h>
+
+#include <dev/md.h>
+
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+
+#define MDSIZE (1024*1024)
+
+#define REQUIRE(a, msg) if ((a) != 0) err(1, msg);
+
+static void *
+prober(void *arg)
+{
+ int fd, error;
+ char buf[4];
+ ssize_t n;
+
+ fd = rump_sys_open(arg, O_RDONLY);
+ for (;;) {
+ n = rump_sys_read(fd, buf, sizeof(buf));
+
+ switch (n) {
+ case 4:
+ error = 0;
+ goto out;
+
+ case -1:
+ if (errno == ENXIO) {
+ usleep(1000);
+ continue;
+ }
+
+ /* FALLTHROUGH */
+ default:
+ error = EPIPE;
+ goto out;
+ }
+ }
+ out:
+
+ error = rump_daemonize_done(error);
+ REQUIRE(error, "rump_daemonize_done");
+
+ if (error)
+ exit(1);
+
+ return NULL;
+}
+
+int
+main(int argc, char *argv[])
+{
+ pthread_t pt;
+ struct md_conf md;
+ int fd, error;
+
+ if (argc != 2)
+ exit(1);
+
+ md.md_addr = calloc(1, MDSIZE);
+ md.md_size = MDSIZE;
+ md.md_type = MD_UMEM_SERVER;
+
+ error = rump_daemonize_begin();
+ REQUIRE(error, "rump_daemonize_begin");
+
+ error = rump_init();
+ REQUIRE(error, "rump_init");
+
+ error = rump_init_server("unix://commsock");
+ REQUIRE(error, "init server");
+
+ if ((fd = rump_sys_open(argv[1], O_RDWR)) == -1)
+ err(1, "open");
+
+ /*
+ * Now, configuring the md driver also causes our process
+ * to start acting as the worker for the md. Splitting it
+ * into two steps in the driver is not easy, since md is
+ * supposed to be unconfigured when the process dies
+ * (process may exit between calling ioctl1 and ioctl2).
+ * So, start a probe thread which attempts to read the md
+ * and declares the md as configured when the read is
+ * succesful.
+ */
+ error = pthread_create(&pt, NULL, prober, argv[1]);
+ REQUIRE(error, "pthread_create");
+ pthread_detach(pt);
+
+ if (rump_sys_ioctl(fd, MD_SETCONF, &md) == -1) {
+ rump_daemonize_done(errno);
+ exit(1);
+ }
+
+ return 0;
+}
diff --git a/contrib/netbsd-tests/dev/md/t_md.sh b/contrib/netbsd-tests/dev/md/t_md.sh
new file mode 100755
index 0000000..85de73e
--- /dev/null
+++ b/contrib/netbsd-tests/dev/md/t_md.sh
@@ -0,0 +1,65 @@
+# $NetBSD: t_md.sh,v 1.7 2011/05/14 17:42:28 jmmv Exp $
+#
+# Copyright (c) 2010 The NetBSD Foundation, Inc.
+# 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.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+#
+
+rawpart=`sysctl -n kern.rawpartition | tr '01234' 'abcde'`
+rawmd=/dev/rmd0${rawpart}
+
+atf_test_case basic cleanup
+basic_head()
+{
+
+ atf_set "descr" "Check that md can be created, read and written"
+}
+
+basic_body()
+{
+
+ # Scope out raw part. This is actually the *host* raw partition,
+ # but just let it slide for now, since they *should* be the same.
+ rawpart=`sysctl -n kern.rawpartition | tr '01234' 'abcde'`
+
+ atf_check -s exit:0 $(atf_get_srcdir)/h_mdserv ${rawmd}
+
+ export RUMP_SERVER=unix://commsock
+ atf_check -s exit:0 -e ignore -x \
+ "dd if=/bin/ls count=10 | rump.dd of=${rawmd} seek=100"
+ atf_check -s exit:0 -e ignore -x \
+ "rump.dd if=${rawmd} skip=100 count=10 | dd of=testfile"
+ atf_check -s exit:0 -e ignore -o file:testfile dd if=/bin/ls count=10
+}
+
+basic_cleanup()
+{
+
+ env RUMP_SERVER=unix://commsock rump.halt
+}
+
+atf_init_test_cases()
+{
+
+ atf_add_test_case basic
+}
diff --git a/contrib/netbsd-tests/dev/raidframe/t_raid.sh b/contrib/netbsd-tests/dev/raidframe/t_raid.sh
new file mode 100755
index 0000000..ae21eed
--- /dev/null
+++ b/contrib/netbsd-tests/dev/raidframe/t_raid.sh
@@ -0,0 +1,323 @@
+#! /usr/bin/atf-sh
+# $NetBSD: t_raid.sh,v 1.12 2013/02/19 21:08:24 joerg Exp $
+#
+# Copyright (c) 2010 The NetBSD Foundation, Inc.
+# 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.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+#
+
+rawpart=`sysctl -n kern.rawpartition | tr '01234' 'abcde'`
+rawraid=/dev/rraid0${rawpart}
+raidserver="rump_server -lrumpvfs -lrumpdev -lrumpdev_disk -lrumpdev_raidframe"
+
+makecfg()
+{
+ level=${1}
+ ncol=${2}
+
+ printf "START array\n1 ${ncol} 0\nSTART disks\n" > raid.conf
+ diskn=0
+ while [ ${ncol} -gt ${diskn} ] ; do
+ echo "/disk${diskn}" >> raid.conf
+ diskn=$((diskn+1))
+ done
+
+ printf "START layout\n32 1 1 ${level}\nSTART queue\nfifo 100\n" \
+ >> raid.conf
+}
+
+atf_test_case smalldisk cleanup
+smalldisk_head()
+{
+ atf_set "descr" "Checks the raidframe works on small disks " \
+ "(PR kern/44239)"
+ atf_set "require.progs" "rump_server"
+}
+
+smalldisk_body()
+{
+ makecfg 1 2
+ export RUMP_SERVER=unix://sock
+ atf_check -s exit:0 ${raidserver} \
+ -d key=/disk0,hostpath=disk0.img,size=1m \
+ -d key=/disk1,hostpath=disk1.img,size=1m \
+ ${RUMP_SERVER}
+
+ atf_check -s exit:0 rump.raidctl -C raid.conf raid0
+}
+
+smalldisk_cleanup()
+{
+ export RUMP_SERVER=unix://sock
+ rump.halt
+}
+
+
+# make this smaller once 44239 is fixed
+export RAID_MEDIASIZE=32m
+
+atf_test_case raid1_compfail cleanup
+raid1_compfail_head()
+{
+ atf_set "descr" "Checks that RAID1 works after component failure"
+ atf_set "require.progs" "rump_server"
+}
+
+raid1_compfail_body()
+{
+ makecfg 1 2
+ export RUMP_SERVER=unix://sock
+ atf_check -s exit:0 ${raidserver} \
+ -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
+ -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
+ ${RUMP_SERVER}
+
+ atf_check -s exit:0 rump.raidctl -C raid.conf raid0
+ atf_check -s exit:0 rump.raidctl -I 12345 raid0
+ atf_check -s exit:0 -o ignore rump.raidctl -iv raid0
+
+ # put some data there
+ atf_check -s exit:0 -e ignore \
+ dd if=$(atf_get_srcdir)/t_raid of=testfile count=4
+ atf_check -s exit:0 -e ignore -x \
+ "dd if=testfile | rump.dd of=${rawraid} conv=sync"
+
+ # restart server with failed component
+ rump.halt
+ rm disk1.img # FAIL
+ atf_check -s exit:0 ${raidserver} \
+ -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
+ -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
+ ${RUMP_SERVER}
+
+ atf_check -s exit:0 rump.raidctl -c raid.conf raid0
+
+ # check if we we get what we wrote
+ atf_check -s exit:0 -o file:testfile -e ignore \
+ rump.dd if=${rawraid} count=4
+}
+
+raid1_compfail_cleanup()
+{
+ export RUMP_SERVER=unix://sock
+ rump.halt
+}
+
+
+
+atf_test_case raid1_comp0fail cleanup
+raid1_comp0fail_head()
+{
+ atf_set "descr" "Checks configuring RAID1 after component 0 fails" \
+ "(PR kern/44251)"
+ atf_set "require.progs" "rump_server"
+}
+
+raid1_comp0fail_body()
+{
+ makecfg 1 2
+ export RUMP_SERVER=unix://sock
+ atf_check -s exit:0 ${raidserver} \
+ -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
+ -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
+ ${RUMP_SERVER}
+
+ atf_check -s exit:0 rump.raidctl -C raid.conf raid0
+ atf_check -s exit:0 rump.raidctl -I 12345 raid0
+ atf_check -s exit:0 -o ignore rump.raidctl -iv raid0
+
+ # restart server with failed component
+ rump.halt
+ rm disk0.img # FAIL
+ atf_check -s exit:0 ${raidserver} \
+ -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
+ -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
+ ${RUMP_SERVER}
+
+ atf_check -s exit:0 rump.raidctl -c raid.conf raid0
+}
+
+raid1_comp0fail_cleanup()
+{
+ export RUMP_SERVER=unix://sock
+ rump.halt
+}
+
+atf_test_case raid1_normal cleanup
+raid1_normal_head()
+{
+ atf_set "descr" "Checks that RAID1 -c configurations work " \
+ "in the normal case"
+ atf_set "require.progs" "rump_server"
+}
+
+raid1_normal_body()
+{
+ makecfg 1 2
+ export RUMP_SERVER=unix://sock
+ atf_check -s exit:0 ${raidserver} \
+ -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
+ -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
+ ${RUMP_SERVER}
+
+ atf_check -s exit:0 rump.raidctl -C raid.conf raid0
+ atf_check -s exit:0 rump.raidctl -I 12345 raid0
+ atf_check -s exit:0 -o ignore rump.raidctl -iv raid0
+
+ # put some data there
+ atf_check -s exit:0 -e ignore \
+ dd if=$(atf_get_srcdir)/t_raid of=testfile count=4
+ atf_check -s exit:0 -e ignore -x \
+ "dd if=testfile | rump.dd of=${rawraid} conv=sync"
+
+ # restart server, disks remain normal
+ rump.halt
+
+ atf_check -s exit:0 ${raidserver} \
+ -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
+ -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
+ ${RUMP_SERVER}
+
+ atf_check -s exit:0 rump.raidctl -c raid.conf raid0
+
+ # check if we we get what we wrote
+ atf_check -s exit:0 -o file:testfile -e ignore \
+ rump.dd if=${rawraid} count=4
+
+}
+
+raid1_normal_cleanup()
+{
+ export RUMP_SERVER=unix://sock
+ rump.halt
+}
+
+
+atf_test_case raid5_compfail cleanup
+raid5_compfail_head()
+{
+ atf_set "descr" "Checks that RAID5 works after component failure"
+ atf_set "require.progs" "rump_server"
+}
+
+raid5_compfail_body()
+{
+ makecfg 5 3
+ export RUMP_SERVER=unix://sock
+ atf_check -s exit:0 ${raidserver} \
+ -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
+ -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
+ -d key=/disk2,hostpath=disk2.img,size=${RAID_MEDIASIZE} \
+ ${RUMP_SERVER}
+
+ atf_check -s exit:0 rump.raidctl -C raid.conf raid0
+ atf_check -s exit:0 rump.raidctl -I 12345 raid0
+ atf_check -s exit:0 -o ignore rump.raidctl -iv raid0
+
+ # put some data there
+ atf_check -s exit:0 -e ignore \
+ dd if=$(atf_get_srcdir)/t_raid of=testfile count=4
+ atf_check -s exit:0 -e ignore -x \
+ "dd if=testfile | rump.dd of=${rawraid} conv=sync"
+
+ # restart server with failed component
+ rump.halt
+ rm disk2.img # FAIL
+ atf_check -s exit:0 ${raidserver} \
+ -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
+ -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
+ -d key=/disk2,hostpath=disk2.img,size=${RAID_MEDIASIZE} \
+ ${RUMP_SERVER}
+
+ atf_check -s exit:0 rump.raidctl -c raid.conf raid0
+
+ # check if we we get what we wrote
+ atf_check -s exit:0 -o file:testfile -e ignore \
+ rump.dd if=${rawraid} count=4
+}
+
+raid5_compfail_cleanup()
+{
+ export RUMP_SERVER=unix://sock
+ rump.halt
+}
+
+atf_test_case raid5_normal cleanup
+raid5_normal_head()
+{
+ atf_set "descr" "Checks that RAID5 works after normal shutdown " \
+ "and 'raidctl -c' startup"
+ atf_set "require.progs" "rump_server"
+}
+
+raid5_normal_body()
+{
+ makecfg 5 3
+ export RUMP_SERVER=unix://sock
+ atf_check -s exit:0 ${raidserver} \
+ -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
+ -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
+ -d key=/disk2,hostpath=disk2.img,size=${RAID_MEDIASIZE} \
+ ${RUMP_SERVER}
+
+ atf_check -s exit:0 rump.raidctl -C raid.conf raid0
+ atf_check -s exit:0 rump.raidctl -I 12345 raid0
+ atf_check -s exit:0 -o ignore rump.raidctl -iv raid0
+
+ # put some data there
+ atf_check -s exit:0 -e ignore \
+ dd if=$(atf_get_srcdir)/t_raid of=testfile count=4
+ atf_check -s exit:0 -e ignore -x \
+ "dd if=testfile | rump.dd of=${rawraid} conv=sync"
+
+ # restart server after normal shutdown
+ rump.halt
+
+ atf_check -s exit:0 ${raidserver} \
+ -d key=/disk0,hostpath=disk0.img,size=${RAID_MEDIASIZE} \
+ -d key=/disk1,hostpath=disk1.img,size=${RAID_MEDIASIZE} \
+ -d key=/disk2,hostpath=disk2.img,size=${RAID_MEDIASIZE} \
+ ${RUMP_SERVER}
+
+ atf_check -s exit:0 rump.raidctl -c raid.conf raid0
+
+ # check if we we get what we wrote
+ atf_check -s exit:0 -o file:testfile -e ignore \
+ rump.dd if=${rawraid} count=4
+}
+
+raid5_normal_cleanup()
+{
+ export RUMP_SERVER=unix://sock
+ rump.halt
+}
+
+atf_init_test_cases()
+{
+ atf_add_test_case smalldisk
+ atf_add_test_case raid1_normal
+ atf_add_test_case raid1_comp0fail
+ atf_add_test_case raid1_compfail
+ atf_add_test_case raid5_normal
+ atf_add_test_case raid5_compfail
+}
diff --git a/contrib/netbsd-tests/dev/scsipi/libscsitest/SCSITEST.ioconf b/contrib/netbsd-tests/dev/scsipi/libscsitest/SCSITEST.ioconf
new file mode 100644
index 0000000..afee6c8
--- /dev/null
+++ b/contrib/netbsd-tests/dev/scsipi/libscsitest/SCSITEST.ioconf
@@ -0,0 +1,12 @@
+# $NetBSD: SCSITEST.ioconf,v 1.1 2014/04/24 21:46:44 pooka Exp $
+#
+
+ioconf scsitest
+
+include "conf/files"
+include "dev/scsipi/files.scsipi"
+include "rump/dev/files.rump"
+
+pseudo-root mainbus*
+
+scsitest0 at mainbus?
diff --git a/contrib/netbsd-tests/dev/scsipi/libscsitest/scsitest.c b/contrib/netbsd-tests/dev/scsipi/libscsitest/scsitest.c
new file mode 100644
index 0000000..8f214f7
--- /dev/null
+++ b/contrib/netbsd-tests/dev/scsipi/libscsitest/scsitest.c
@@ -0,0 +1,259 @@
+/* $NetBSD: scsitest.c,v 1.2 2014/04/25 00:24:39 pooka Exp $ */
+
+/*
+ * Copyright (c) 2010 Antti Kantee. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+/*
+ * A SCSI target which is useful for debugging our scsipi driver stack.
+ * Currently it pretends to be a single CD.
+ *
+ * Freely add the necessary features for your tests. Just remember to
+ * run the atf test suite to make sure you didn't cause regressions to
+ * other tests.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: scsitest.c,v 1.2 2014/04/25 00:24:39 pooka Exp $");
+
+#include <sys/param.h>
+#include <sys/atomic.h>
+#include <sys/buf.h>
+#include <sys/device.h>
+#include <sys/malloc.h>
+#include <sys/fcntl.h>
+
+#include <dev/scsipi/scsiconf.h>
+#include <dev/scsipi/scsipiconf.h>
+#include <dev/scsipi/scsi_disk.h>
+#include <dev/scsipi/scsipi_cd.h>
+#include <dev/scsipi/scsipi_all.h>
+
+#include <rump/rumpuser.h>
+
+#include "scsitest.h"
+
+int scsitest_match(device_t, cfdata_t, void *);
+void scsitest_attach(device_t, device_t, void *);
+
+struct scsitest {
+ struct scsipi_channel sc_channel;
+ struct scsipi_adapter sc_adapter;
+};
+
+CFATTACH_DECL_NEW(scsitest, sizeof(struct scsitest), scsitest_match,
+ scsitest_attach, NULL, NULL);
+
+/*
+ * tosi.iso can be used to deliver CD requests to a host file with the
+ * name in USE_TOSI_ISO (yes, it's extrasimplistic).
+ */
+//#define USE_TOSI_ISO
+
+#define CDBLOCKSIZE 2048
+static uint32_t mycdsize = 2048;
+static int isofd;
+
+#define MYCDISO "tosi.iso"
+
+unsigned rump_scsitest_err[RUMP_SCSITEST_MAXERROR];
+
+static void
+sense_notready(struct scsipi_xfer *xs)
+{
+ struct scsi_sense_data *sense = &xs->sense.scsi_sense;
+
+ xs->error = XS_SENSE;
+
+ sense->response_code = 0x70;
+ sense->flags = SKEY_NOT_READY;
+ sense->asc = 0x3A;
+ sense->ascq = 0x00;
+ sense->extra_len = 6;
+}
+
+/*
+ * This is pretty much a CD target for now
+ */
+static void
+scsitest_request(struct scsipi_channel *chan,
+ scsipi_adapter_req_t req, void *arg)
+{
+ struct scsipi_xfer *xs = arg;
+ struct scsipi_generic *cmd = xs->cmd;
+#ifdef USE_TOSI_ISO
+ int error;
+#endif
+
+ if (req != ADAPTER_REQ_RUN_XFER)
+ return;
+
+ //show_scsipi_xs(xs);
+
+ switch (cmd->opcode) {
+ case SCSI_TEST_UNIT_READY:
+ if (isofd == -1)
+ sense_notready(xs);
+
+ break;
+ case INQUIRY: {
+ struct scsipi_inquiry_data *inqbuf = (void *)xs->data;
+
+ memset(inqbuf, 0, sizeof(*inqbuf));
+ inqbuf->device = T_CDROM;
+ inqbuf->dev_qual2 = SID_REMOVABLE;
+ strcpy(inqbuf->vendor, "RUMPHOBO");
+ strcpy(inqbuf->product, "It's a LIE");
+ strcpy(inqbuf->revision, "0.00");
+ break;
+ }
+ case READ_CD_CAPACITY: {
+ struct scsipi_read_cd_cap_data *ret = (void *)xs->data;
+
+ _lto4b(CDBLOCKSIZE, ret->length);
+ _lto4b(mycdsize, ret->addr);
+
+ break;
+ }
+ case READ_DISCINFO: {
+ struct scsipi_read_discinfo_data *ret = (void *)xs->data;
+
+ memset(ret, 0, sizeof(*ret));
+ break;
+ }
+ case READ_TRACKINFO: {
+ struct scsipi_read_trackinfo_data *ret = (void *)xs->data;
+
+ _lto4b(mycdsize, ret->track_size);
+ break;
+ }
+ case READ_TOC: {
+ struct scsipi_toc_header *ret = (void *)xs->data;
+
+ memset(ret, 0, sizeof(*ret));
+ break;
+ }
+ case START_STOP: {
+ struct scsipi_start_stop *param = (void *)cmd;
+
+ if (param->how & SSS_LOEJ) {
+#ifdef USE_TOSI_ISO
+ rumpuser_close(isofd, &error);
+#endif
+ isofd = -1;
+ }
+ break;
+ }
+ case SCSI_SYNCHRONIZE_CACHE_10: {
+ if (isofd == -1) {
+ if ((xs->xs_control & XS_CTL_SILENT) == 0)
+ atomic_inc_uint(&rump_scsitest_err
+ [RUMP_SCSITEST_NOISYSYNC]);
+
+ sense_notready(xs);
+ }
+
+ break;
+ }
+ case GET_CONFIGURATION: {
+ memset(xs->data, 0, sizeof(struct scsipi_get_conf_data));
+ break;
+ }
+ case SCSI_READ_6_COMMAND: {
+#ifdef USE_TOSI_ISO
+ struct scsi_rw_6 *param = (void *)cmd;
+
+ printf("reading %d bytes from %d\n",
+ param->length * CDBLOCKSIZE,
+ _3btol(param->addr) * CDBLOCKSIZE);
+ rumpuser_pread(isofd, xs->data,
+ param->length * CDBLOCKSIZE,
+ _3btol(param->addr) * CDBLOCKSIZE,
+ &error);
+#endif
+
+ break;
+ }
+ case SCSI_PREVENT_ALLOW_MEDIUM_REMOVAL:
+ /* hardcoded for now */
+ break;
+ default:
+ printf("unhandled opcode 0x%x\n", cmd->opcode);
+ break;
+ }
+
+ scsipi_done(xs);
+}
+
+int
+scsitest_match(device_t parent, cfdata_t match, void *aux)
+{
+#ifdef USE_TOSI_ISO
+ uint64_t fsize;
+ int error, ft;
+
+ if (rumpuser_getfileinfo(MYCDISO, &fsize, &ft, &error))
+ return 0;
+ if (ft != RUMPUSER_FT_REG)
+ return 0;
+ mycdsize = fsize / CDBLOCKSIZE;
+
+ if ((isofd = rumpuser_open(MYCDISO, RUMPUSER_OPEN_RDWR, &error)) == -1)
+ return 0;
+#else
+ /*
+ * We pretend to have a medium present initially, so != -1.
+ */
+ isofd = -2;
+#endif
+
+ return 1;
+}
+
+void
+scsitest_attach(device_t parent, device_t self, void *aux)
+{
+ struct scsitest *sc = device_private(self);
+
+ aprint_naive("\n");
+ aprint_normal("\n");
+
+ memset(&sc->sc_adapter, 0, sizeof(sc->sc_adapter));
+ sc->sc_adapter.adapt_nchannels = 1;
+ sc->sc_adapter.adapt_request = scsitest_request;
+ sc->sc_adapter.adapt_minphys = minphys;
+ sc->sc_adapter.adapt_dev = self;
+ sc->sc_adapter.adapt_max_periph = 1;
+ sc->sc_adapter.adapt_openings = 1;
+
+ memset(&sc->sc_channel, 0, sizeof(sc->sc_channel));
+ sc->sc_channel.chan_bustype = &scsi_bustype;
+ sc->sc_channel.chan_ntargets = 2;
+ sc->sc_channel.chan_nluns = 1;
+ sc->sc_channel.chan_id = 0;
+ sc->sc_channel.chan_flags = SCSIPI_CHAN_NOSETTLE;
+ sc->sc_channel.chan_adapter = &sc->sc_adapter;
+
+ config_found_ia(self, "scsi", &sc->sc_channel, scsiprint);
+}
diff --git a/contrib/netbsd-tests/dev/scsipi/libscsitest/scsitest.h b/contrib/netbsd-tests/dev/scsipi/libscsitest/scsitest.h
new file mode 100644
index 0000000..ba9b84a
--- /dev/null
+++ b/contrib/netbsd-tests/dev/scsipi/libscsitest/scsitest.h
@@ -0,0 +1,38 @@
+/* $NetBSD: scsitest.h,v 1.1 2014/04/25 00:24:39 pooka Exp $ */
+
+/*
+ * Copyright (c) 2010 Antti Kantee. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+#ifndef _RUMP_SCSITEST_H_
+#define _RUMP_SCSITEST_H_
+
+enum {
+ RUMP_SCSITEST_NOISYSYNC,
+ RUMP_SCSITEST_MAXERROR
+};
+
+extern unsigned rump_scsitest_err[RUMP_SCSITEST_MAXERROR];
+
+#endif /* _RUMP_SCSITEST_H_ */
diff --git a/contrib/netbsd-tests/dev/scsipi/libscsitest/scsitest_component.c b/contrib/netbsd-tests/dev/scsipi/libscsitest/scsitest_component.c
new file mode 100644
index 0000000..db0e209
--- /dev/null
+++ b/contrib/netbsd-tests/dev/scsipi/libscsitest/scsitest_component.c
@@ -0,0 +1,46 @@
+/* $NetBSD: scsitest_component.c,v 1.1 2014/04/24 21:46:44 pooka Exp $ */
+
+/*
+ * Copyright (c) 2010 Antti Kantee. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: scsitest_component.c,v 1.1 2014/04/24 21:46:44 pooka Exp $");
+
+#include <sys/param.h>
+#include <sys/conf.h>
+#include <sys/device.h>
+#include <sys/mbuf.h>
+#include <sys/stat.h>
+
+#include "ioconf.c"
+
+#include "rump_private.h"
+
+RUMP_COMPONENT(RUMP_COMPONENT_DEV)
+{
+
+ config_init_component(cfdriver_ioconf_scsitest,
+ cfattach_ioconf_scsitest, cfdata_ioconf_scsitest);
+}
diff --git a/contrib/netbsd-tests/dev/scsipi/t_cd.c b/contrib/netbsd-tests/dev/scsipi/t_cd.c
new file mode 100644
index 0000000..58e61a5
--- /dev/null
+++ b/contrib/netbsd-tests/dev/scsipi/t_cd.c
@@ -0,0 +1,81 @@
+/* $NetBSD: t_cd.c,v 1.7 2014/04/25 00:24:39 pooka Exp $ */
+
+/*
+ * Copyright (c) 2010 Antti Kantee. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+
+#include <atf-c.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <util.h>
+
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+
+#include "scsitest.h"
+
+#include "../../h_macros.h"
+
+ATF_TC(noisyeject);
+ATF_TC_HEAD(noisyeject, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr", "test for CD eject noisyness "
+ "(PR kern/43785)");
+}
+
+ATF_TC_BODY(noisyeject, tc)
+{
+ static char fname[] = "/dev/rcd0_";
+ int part, fd, arg = 0;
+
+ RL(part = getrawpartition());
+ fname[strlen(fname)-1] = 'a' + part;
+ rump_init();
+ /*
+ * Rump CD emulation has been fixed, so no longer a problem.
+ *
+ atf_tc_expect_signal(SIGSEGV, "PR kern/47646: Broken test or "
+ "a real problem in rump or the driver");
+ */
+ RL(fd = rump_sys_open(fname, O_RDWR));
+ RL(rump_sys_ioctl(fd, DIOCEJECT, &arg));
+
+ ATF_REQUIRE_EQ(rump_scsitest_err[RUMP_SCSITEST_NOISYSYNC], 0);
+ RL(rump_sys_close(fd));
+ // atf_tc_expect_fail("PR kern/43785");
+ ATF_REQUIRE_EQ(rump_scsitest_err[RUMP_SCSITEST_NOISYSYNC], 0);
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+ ATF_TP_ADD_TC(tp, noisyeject);
+
+ return atf_no_error();
+}
diff --git a/contrib/netbsd-tests/dev/sysmon/t_swsensor.sh b/contrib/netbsd-tests/dev/sysmon/t_swsensor.sh
new file mode 100755
index 0000000..5b54431
--- /dev/null
+++ b/contrib/netbsd-tests/dev/sysmon/t_swsensor.sh
@@ -0,0 +1,398 @@
+# $NetBSD: t_swsensor.sh,v 1.7 2013/04/14 16:07:46 martin Exp $
+
+get_sensor_info() {
+ rump.envstat -x | \
+ sed -e "\;swsensor;,\;/array;p" -e "d"
+}
+
+get_sensor_key() {
+ get_sensor_info | grep -A1 $1 | grep integer | sed -e 's;<[/a-z]*>;;g'
+}
+
+get_powerd_event_count() {
+ grep "not running" powerd.log | wc -l
+}
+
+get_rnd_bits_count() {
+ env RUMPHIJACK=blanket=/dev/random:/dev/urandom \
+ RUMP_SERVER=unix://t_swsensor_socket \
+ LD_PRELOAD=/usr/lib/librumphijack.so rndctl -l | \
+ grep "swsensor-sensor" | \
+ awk '{print $2}'
+}
+
+check_powerd_event() {
+ event=$(grep "not running" powerd.log | \
+ sed -e "$1p" -e "d" )
+ event=${event##*//}
+ script=${event%% *}
+ event=${event#* }
+ device=${event%% *}
+ event=${event#* }
+ state=${event%% *}
+ sensor=${event#* }
+ sensor=${sensor% *}
+
+ if [ "${script}" != "sensor_indicator" ] ; then
+ echo "Event uses wrong script: ${script}"
+ elif [ "${device}" != "swsensor" ] ; then
+ echo "Event uses wrong device: ${device}"
+ elif [ "${sensor}" != "sensor" ] ; then
+ echo "Event uses wrong sensor: ${sensor}"
+ elif [ "${state}" != "$2" ] ; then
+ echo "Event uses wrong state: ${state}"
+ fi
+}
+
+# Start the rump server, then load the swsensor module with the
+# requested properties
+
+start_rump() {
+ rump_allserver -l rumpvfs -l rumpdev -l rumpdev_sysmon ${RUMP_SERVER}
+ if [ $( get_sensor_info | wc -l ) -ne 0 ] ; then
+ rump.modunload swsensor
+ rump.modload -f $1 swsensor
+ else
+ rump.modload $1 swsensor
+ fi
+ return $?
+}
+
+common_head() {
+ atf_set descr "$1"
+ atf_set timeout 60
+ atf_set require.progs rump.powerd rump.envstat rump.modload \
+ rump.halt rump.sysctl rump_server \
+ sed grep awk \
+ rndctl expr
+}
+
+common_cleanup() {
+ rump.modunload swsensor
+ rump.halt
+}
+
+create_envsys_conf_files() {
+ cat << ENV0 > env0.conf
+ swsensor {
+ refresh-timeout = 2s;
+ }
+ENV0
+ cat << ENV1 > env1.conf
+ swsensor {
+ sensor0 { critical-min = $(( $1 - $2 )); }
+ }
+ENV1
+ cat << ENV2 > env2.conf
+ swsensor {
+ sensor0 { critical-min = $1; }
+ }
+ENV2
+}
+
+# Test body common to all sensors
+# $1 sensor mode
+# $2 initial sensor value
+# $3 initial limit
+# $4 amount to lower limit
+# $5 difference from limit to trigger event
+# $6 sensor flags, for FHAS_ENTROPY and FMONNOTSUPP
+
+common_body() {
+ # Start the rump-server process and load the module
+ modload_args="-i mode=$1 -i value=$2 -i limit=$3 ${6:+-i flags=$6}"
+ start_rump "$modload_args"
+
+ # create configuration files for updates
+ create_envsys_conf_files $3 $4
+
+ if [ $? -ne 0 ] ; then
+ atf_skip "Cannot set-up rump environment"
+ fi
+
+ # start powerd so we can detect sensor events
+ rump.powerd -n -d > powerd.log 2>&1 &
+ if [ -z "$(jobs)" ] ; then
+ skip_events=1
+ echo "Skipping event sub-tests - powerd did not start"
+ else
+ skip_events=0
+ expected_event=1
+ fi
+
+ # Step 0 - verify that sensor is registered
+ get_sensor_info | grep -q swsensor ||
+ atf_fail "0: Device swsensor not registered"
+
+ # Step 1 - update the refresh-timeout and verify
+ # (use $(( ... )) since the timeout is displayed in hex!)
+ rump.envstat -c env0.conf
+ if [ $(( $( get_sensor_key refresh-timeout ) )) -ne 2 ] ; then
+ atf_fail "1: Could not set refresh-timout to 2s"
+ fi
+
+ # Step 2 - verify that we can read sensor's value
+ if [ $1 -ne 0 -a $( get_sensor_key cur-value ) -ne $2 ] ; then
+ atf_fail "2: Value not available"
+ fi
+
+ # Step 3 - verify that changes in sensor value are seen
+ rump.sysctl -w hw.swsensor.cur_value=$(( $2 + 1 ))
+ if [ $( get_sensor_key cur-value ) -ne $(( $2 + 1 )) ] ; then
+ atf_fail "3: Value not updated"
+ fi
+
+ # Step 4 - if sensor provides hw limit, make sure we can read it
+ if [ $1 -ne 0 ] ; then
+ if [ $( get_sensor_key critical-min ) -ne $3 ] ; then
+ atf_fail "4: Limit not set by device"
+ fi
+ fi
+
+ # Step 5 - if sensor provides hw limit, make sure it works
+ if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then
+ rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $5 ))
+ sleep 5
+ cnt=$(get_powerd_event_count)
+ if [ ${cnt} -lt ${expected_event} ] ; then
+ atf_fail "5: No event triggered"
+ elif [ ${cnt} -gt ${expected_event} ] ; then
+ atf_fail "5: Multiple events triggered"
+ fi
+ evt=$( check_powerd_event ${cnt} "critical-under")
+ if [ -n "${evt}" ] ; then
+ atf_fail "5: ${evt}"
+ fi
+ expected_event=$(( 1 + ${expected_event} ))
+ fi
+
+ # Step 6 - verify that we return to normal state
+ if [ $1 -ne 0 -a ${skip_events} -eq 0 ] ; then
+ rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $5 ))
+ sleep 5
+ cnt=$(get_powerd_event_count)
+ if [ ${cnt} -lt ${expected_event} ] ; then
+ atf_fail "6: No event triggered"
+ elif [ ${cnt} -gt ${expected_event} ] ; then
+ atf_fail "6: Multiple events triggered"
+ fi
+ evt=$( check_powerd_event ${cnt} "normal")
+ if [ -n "${evt}" ] ; then
+ atf_fail "6: ${evt}"
+ fi
+ expected_event=$(( 1 + ${expected_event} ))
+ fi
+
+ # Step 7 - verify that we can set our own limit
+
+ # Steps 7 thru 12 are skipped if the sensor cannot be monitored
+ if [ $( expr \( 0$6 / 2048 \) % 2 ) -ne 1 ] ; then
+ rump.envstat -c env1.conf
+ if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then
+ atf_fail "7: Limit not set by envstat -c"
+ fi
+
+ # Step 8 - make sure user-set limit works
+ if [ ${skip_events} -eq 0 ] ; then
+ rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 ))
+ sleep 5
+ cnt=$(get_powerd_event_count)
+ if [ ${cnt} -lt ${expected_event} ] ; then
+ atf_fail "8: No event triggered"
+ elif [ ${cnt} -gt ${expected_event} ] ; then
+ atf_fail "8: Multiple events triggered"
+ fi
+ evt=$( check_powerd_event ${cnt} "critical-under")
+ if [ -n "${evt}" ] ; then
+ atf_fail "8: ${evt}"
+ fi
+ expected_event=$(( 1 + ${expected_event} ))
+ fi
+
+ # Step 9 - verify that we return to normal state
+ if [ ${skip_events} -eq 0 ] ; then
+ rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 + $5 ))
+ sleep 5
+ cnt=$(get_powerd_event_count)
+ if [ ${cnt} -lt ${expected_event} ] ; then
+ atf_fail "9: No event triggered"
+ elif [ ${cnt} -gt ${expected_event} ] ; then
+ atf_fail "9: Multiple events triggered"
+ fi
+ evt=$( check_powerd_event ${cnt} "normal")
+ if [ -n "${evt}" ] ; then
+ atf_fail "9: ${evt}"
+ fi
+ expected_event=$(( 1 + ${expected_event} ))
+ fi
+
+ # Step 10 - reset to defaults
+ rump.envstat -S
+ if [ $1 -eq 0 ] ; then
+ get_sensor_info | grep -q critical-min &&
+ atf_fail "10: Failed to clear a limit with envstat -S"
+ else
+ if [ $( get_sensor_key critical-min ) -ne $3 ] ; then
+ atf_fail "10: Limit not reset to initial value"
+ fi
+ fi
+
+ # Step 11 - see if more events occur
+ if [ ${skip_events} -eq 0 ] ; then
+ rump.envstat -c env0.conf
+ rump.sysctl -w hw.swsensor.cur_value=$(( $3 - $4 - $5 ))
+ sleep 5
+ cnt=$(get_powerd_event_count)
+ if [ ${cnt} -ge ${expected_event} ] ; then
+ if [ $1 -ne 2 ] ; then
+ atf_fail "11b Event triggered after reset"
+ fi
+ evt=$( check_powerd_event ${cnt} "critical-under")
+ if [ -n "${evt}" ] ; then
+ atf_fail "11a: ${evt}"
+ fi
+ fi
+ fi
+
+ # Step 12 - make sure we can set new limits once more
+ rump.envstat -c env2.conf
+ if [ $( get_sensor_key critical-min ) -ne $3 ] ; then
+ atf_fail "12a: Limit not reset to same value"
+ fi
+ rump.envstat -c env1.conf
+ if [ $( get_sensor_key critical-min ) -ne $(( $3 - $4 )) ] ; then
+ atf_fail "12b: Limit not reset to new value"
+ fi
+ fi
+
+ # Step 13 - confirm registration (or lack thereof) with rndctl
+ rnd_bits=$( get_rnd_bits_count )
+ if [ $( expr \( 0$6 / 8192 \) % 2 ) -eq 1 ] ; then
+ if [ -z "$rnd_bits" ] ; then
+ atf_fail "13a: Not registered with rndctl"
+ fi
+ else
+ if [ -n "$rnd_bits" ] ; then
+ atf_fail "13b: Wrongly registered with rndctl"
+ fi
+ fi
+
+ # Steps 14 and 15 are only if sensor is providing entropy
+ if [ $( expr \( 0$6 / 8192 \) % 2 ) -ne 1 ] ; then
+ return
+ fi
+
+ # Step 14 - make sure entropy collected when device is being polled
+ rump.envstat -c env0.conf
+ rump.sysctl -w hw.swsensor.cur_value=$3
+ sleep 5
+ rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 ))
+ sleep 5
+ new_rnd_bits=$( get_rnd_bits_count )
+ if [ $new_rnd_bits -le $rnd_bits ] ; then
+ atf_expect_fail "PR kern/47661"
+ atf_fail "14a: entropy bits did not increase after polling"
+ fi
+ rnd_bits=$new_rnd_bits
+ sleep 5
+ new_rnd_bits=$( get_rnd_bits_count )
+ if [ $new_rnd_bits -gt $rnd_bits ] ; then
+ atf_expect_fail "PR kern/47661"
+ atf_fail "14b: entropy bits increased after poll with no value change"
+ fi
+
+ # Step 15 - make sure entropy collected when device is interrogated
+ #
+ rump.envstat -c env0.conf
+ rump.sysctl -w hw.swsensor.cur_value=$3
+ get_sensor_key cur-value
+ rnd_bits=$( get_rnd_bits_count )
+ rump.sysctl -w hw.swsensor.cur_value=$(( $3 + $4 ))
+ get_sensor_key cur-value
+ new_rnd_bits=$( get_rnd_bits_count )
+ if [ $new_rnd_bits -le $rnd_bits ] ; then
+ atf_expect_fail "PR kern/47661"
+ atf_fail "15a: entropy bits did not increase after interrogation"
+ fi
+ rnd_bits=$new_rnd_bits
+ get_sensor_key cur-value
+ new_rnd_bits=$( get_rnd_bits_count )
+ if [ $new_rnd_bits -gt $rnd_bits ] ; then
+ atf_expect_fail "PR kern/47661"
+ atf_fail "15b: entropy bits increased after interrogation with no value change"
+ fi
+}
+
+atf_test_case simple_sensor cleanup
+simple_sensor_head() {
+ common_head "Test a simple sensor"
+}
+
+simple_sensor_body() {
+ common_body 0 50 30 10 1
+}
+
+simple_sensor_cleanup() {
+ common_cleanup
+}
+
+atf_test_case limit_sensor cleanup
+limit_sensor_head() {
+ common_head "Test a sensor with internal limit"
+}
+
+limit_sensor_body() {
+ common_body 1 45 25 8 2
+}
+
+limit_sensor_cleanup() {
+ common_cleanup
+}
+
+atf_test_case alarm_sensor cleanup
+alarm_sensor_head() {
+ common_head "Test a sensor with internal checking"
+}
+
+alarm_sensor_body() {
+ common_body 2 40 20 6 3
+}
+
+alarm_sensor_cleanup() {
+ common_cleanup
+}
+
+atf_test_case entropy_polled_sensor cleanup
+entropy_polled_sensor_head() {
+ common_head "Test a simple sensor that provides entropy"
+}
+
+entropy_polled_sensor_body() {
+ common_body 0 50 30 10 1 8192
+}
+
+entropy_polled_sensor_cleanup() {
+ common_cleanup
+}
+
+atf_test_case entropy_interrupt_sensor cleanup
+entropy_interrupt_sensor_head() {
+ common_head "Test a sensor that provides entropy without polling"
+}
+
+entropy_interrupt_sensor_body() {
+ common_body 0 50 30 10 1 10240
+}
+
+entropy_interrupt_sensor_cleanup() {
+ common_cleanup
+}
+
+atf_init_test_cases() {
+ RUMP_SERVER="unix://t_swsensor_socket" ; export RUMP_SERVER
+ atf_add_test_case simple_sensor
+ atf_add_test_case limit_sensor
+ atf_add_test_case alarm_sensor
+ atf_add_test_case entropy_polled_sensor
+ atf_add_test_case entropy_interrupt_sensor
+}
diff --git a/contrib/netbsd-tests/dev/sysmon/t_swwdog.c b/contrib/netbsd-tests/dev/sysmon/t_swwdog.c
new file mode 100644
index 0000000..19e3795
--- /dev/null
+++ b/contrib/netbsd-tests/dev/sysmon/t_swwdog.c
@@ -0,0 +1,192 @@
+/* $NetBSD: t_swwdog.c,v 1.5 2011/06/26 12:14:59 christos Exp $ */
+
+/*
+ * Copyright (c) 2010 Antti Kantee. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/wdog.h>
+
+#include <assert.h>
+#include <atf-c.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+
+#include "../../h_macros.h"
+
+static volatile sig_atomic_t tcount;
+
+static void
+sigcount(int sig)
+{
+
+ assert(sig == SIGUSR1);
+ tcount++;
+}
+
+/*
+ * Since we are testing for swwdog's ability to reboot/panic, we need
+ * to fork and monitor the exit status from the parent and report
+ * something sensible back to atf.
+ */
+static int
+testbody(int max)
+{
+ char wname[WDOG_NAMESIZE];
+ struct wdog_conf wc;
+ struct wdog_mode wm;
+ pid_t p1, p2;
+ int status;
+ int fd;
+
+ signal(SIGUSR1, sigcount);
+
+ switch ((p1 = fork())) {
+ case 0:
+ break;
+ case -1:
+ atf_tc_fail_errno("fork");
+ break;
+ default:
+ p2 = wait(&status);
+ ATF_REQUIRE_EQ(p1, p2);
+ ATF_REQUIRE_EQ(tcount, max);
+ return status;
+ }
+
+ rump_init();
+
+ fd = rump_sys_open("/dev/watchdog", O_RDWR);
+ if (fd == -1)
+ err(1, "open watchdog");
+
+ wc.wc_count = 1;
+ wc.wc_names = wname;
+
+ if (rump_sys_ioctl(fd, WDOGIOC_GWDOGS, &wc) == -1)
+ err(1, "can't fetch watchdog names");
+
+ if (wc.wc_count) {
+ assert(wc.wc_count == 1);
+
+ strlcpy(wm.wm_name, wc.wc_names, sizeof(wm.wm_name));
+ wm.wm_mode = WDOG_MODE_ETICKLE;
+ wm.wm_period = 1;
+ if (rump_sys_ioctl(fd, WDOGIOC_SMODE, &wm) == -1)
+ atf_tc_fail_errno("failed to set tickle");
+
+ usleep(400000);
+ if (max == 1)
+ rump_sys_ioctl(fd, WDOGIOC_TICKLE);
+ else {
+ wm.wm_mode = WDOG_MODE_DISARMED;
+ rump_sys_ioctl(fd, WDOGIOC_SMODE, &wm);
+ }
+ kill(getppid(), SIGUSR1);
+
+ sleep(2);
+ printf("staying alive\n");
+ kill(getppid(), SIGUSR1);
+ _exit(2);
+ }
+ /* fail */
+ _exit(1);
+}
+
+ATF_TC(reboot);
+ATF_TC_HEAD(reboot, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr", "check swwdog reboot capability");
+}
+
+ATF_TC_BODY(reboot, tc)
+{
+ extern bool rumpns_swwdog_reboot;
+ int status;
+
+ /* XXX: should use sysctl */
+ rumpns_swwdog_reboot = true;
+ status = testbody(1);
+
+ ATF_REQUIRE(WIFEXITED(status));
+ ATF_REQUIRE_EQ(WEXITSTATUS(status), 0);
+}
+
+ATF_TC(panic);
+ATF_TC_HEAD(panic, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr", "check swwdog panic capability");
+}
+
+ATF_TC_BODY(panic, tc)
+{
+ extern bool rumpns_swwdog_reboot;
+ int status;
+
+ /* XXX: should use sysctl */
+ rumpns_swwdog_reboot = false;
+ status = testbody(1);
+
+ ATF_REQUIRE(WIFSIGNALED(status));
+ ATF_REQUIRE_EQ(WTERMSIG(status), SIGABRT);
+}
+
+ATF_TC(disarm);
+ATF_TC_HEAD(disarm, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr", "check swwdog disarm capability");
+}
+
+ATF_TC_BODY(disarm, tc)
+{
+ int status;
+
+ status = testbody(2);
+
+ ATF_REQUIRE(WIFEXITED(status));
+ ATF_REQUIRE_EQ(WEXITSTATUS(status), 2);
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+ ATF_TP_ADD_TC(tp, panic);
+ ATF_TP_ADD_TC(tp, reboot);
+ ATF_TP_ADD_TC(tp, disarm);
+
+ return atf_no_error();
+}
OpenPOWER on IntegriCloud