1*63d1fd59SEnji Cooper /* $NetBSD: t_modautoload.c,v 1.6 2017/01/13 21:30:42 christos Exp $ */
257718be8SEnji Cooper
357718be8SEnji Cooper #include <sys/types.h>
457718be8SEnji Cooper #include <sys/mount.h>
557718be8SEnji Cooper #include <sys/module.h>
657718be8SEnji Cooper #include <sys/dirent.h>
757718be8SEnji Cooper #include <sys/sysctl.h>
857718be8SEnji Cooper
957718be8SEnji Cooper #include <atf-c.h>
1057718be8SEnji Cooper #include <err.h>
1157718be8SEnji Cooper #include <errno.h>
1257718be8SEnji Cooper #include <fcntl.h>
1357718be8SEnji Cooper #include <stdio.h>
1457718be8SEnji Cooper #include <unistd.h>
1557718be8SEnji Cooper #include <string.h>
1657718be8SEnji Cooper #include <stdlib.h>
1757718be8SEnji Cooper
1857718be8SEnji Cooper #include <rump/rump.h>
1957718be8SEnji Cooper #include <rump/rump_syscalls.h>
2057718be8SEnji Cooper
2157718be8SEnji Cooper #include <miscfs/kernfs/kernfs.h>
2257718be8SEnji Cooper
23*63d1fd59SEnji Cooper #include "h_macros.h"
2457718be8SEnji Cooper
2557718be8SEnji Cooper ATF_TC(modautoload);
ATF_TC_HEAD(modautoload,tc)2657718be8SEnji Cooper ATF_TC_HEAD(modautoload, tc)
2757718be8SEnji Cooper {
2857718be8SEnji Cooper
2957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "tests that kernel module "
3057718be8SEnji Cooper "autoload works in rump");
3157718be8SEnji Cooper }
3257718be8SEnji Cooper
3357718be8SEnji Cooper static void
mountkernfs(void)3457718be8SEnji Cooper mountkernfs(void)
3557718be8SEnji Cooper {
36640235e2SEnji Cooper bool old_autoload, new_autoload;
37640235e2SEnji Cooper size_t old_len, new_len;
38640235e2SEnji Cooper int error;
3957718be8SEnji Cooper
4057718be8SEnji Cooper if (!rump_nativeabi_p())
4157718be8SEnji Cooper atf_tc_skip("host kernel modules not supported");
4257718be8SEnji Cooper
4357718be8SEnji Cooper rump_init();
4457718be8SEnji Cooper
4557718be8SEnji Cooper if (rump_sys_mkdir("/kern", 0777) == -1)
4657718be8SEnji Cooper atf_tc_fail_errno("mkdir /kern");
47640235e2SEnji Cooper
48640235e2SEnji Cooper new_autoload = true;
49cdebaff8SEnji Cooper old_len = sizeof(old_autoload);
50640235e2SEnji Cooper new_len = sizeof(new_autoload);
51640235e2SEnji Cooper error = sysctlbyname("kern.module.autoload",
52640235e2SEnji Cooper &old_autoload, &old_len,
53640235e2SEnji Cooper &new_autoload, new_len);
54640235e2SEnji Cooper if (error != 0)
55640235e2SEnji Cooper atf_tc_fail_errno("could not enable module autoload");
56640235e2SEnji Cooper
5757718be8SEnji Cooper if (rump_sys_mount(MOUNT_KERNFS, "/kern", 0, NULL, 0) == -1)
5857718be8SEnji Cooper atf_tc_fail_errno("could not mount kernfs");
5957718be8SEnji Cooper }
6057718be8SEnji Cooper
6157718be8SEnji Cooper /*
6257718be8SEnji Cooper * Why use kernfs here? It talks to plenty of other parts with the
6357718be8SEnji Cooper * kernel (e.g. vfs_attach() in modcmd), but is still easy to verify
6457718be8SEnji Cooper * it's working correctly.
6557718be8SEnji Cooper */
6657718be8SEnji Cooper
6757718be8SEnji Cooper #define MAGICNUM 1323
ATF_TC_BODY(modautoload,tc)6857718be8SEnji Cooper ATF_TC_BODY(modautoload, tc)
6957718be8SEnji Cooper {
7057718be8SEnji Cooper extern int rumpns_hz;
7157718be8SEnji Cooper char buf[64];
7257718be8SEnji Cooper int fd;
7357718be8SEnji Cooper
7457718be8SEnji Cooper mountkernfs();
7557718be8SEnji Cooper rumpns_hz = MAGICNUM;
7657718be8SEnji Cooper if ((fd = rump_sys_open("/kern/hz", O_RDONLY)) == -1)
7757718be8SEnji Cooper atf_tc_fail_errno("open /kern/hz");
7857718be8SEnji Cooper if (rump_sys_read(fd, buf, sizeof(buf)) <= 0)
7957718be8SEnji Cooper atf_tc_fail_errno("read");
8057718be8SEnji Cooper ATF_REQUIRE(atoi(buf) == MAGICNUM);
8157718be8SEnji Cooper }
8257718be8SEnji Cooper
ATF_TP_ADD_TCS(tp)8357718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
8457718be8SEnji Cooper {
8557718be8SEnji Cooper ATF_TP_ADD_TC(tp, modautoload);
8657718be8SEnji Cooper
8757718be8SEnji Cooper return atf_no_error();
8857718be8SEnji Cooper }
89