1*57718be8SEnji Cooper /* $NetBSD: t_builtin.c,v 1.2 2010/11/03 16:10:23 christos Exp $ */ 2*57718be8SEnji Cooper 3*57718be8SEnji Cooper /*- 4*57718be8SEnji Cooper * Copyright (c) 2010 The NetBSD Foundation, Inc. All rights reserved. 5*57718be8SEnji Cooper * 6*57718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without 7*57718be8SEnji Cooper * modification, are permitted provided that the following conditions 8*57718be8SEnji Cooper * are met: 9*57718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 10*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer. 11*57718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 12*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 13*57718be8SEnji Cooper * documentation and/or other materials provided with the distribution. 14*57718be8SEnji Cooper * 15*57718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 16*57718be8SEnji Cooper * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 17*57718be8SEnji Cooper * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18*57718be8SEnji Cooper * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19*57718be8SEnji Cooper * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 20*57718be8SEnji Cooper * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*57718be8SEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 22*57718be8SEnji Cooper * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23*57718be8SEnji Cooper * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 24*57718be8SEnji Cooper * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25*57718be8SEnji Cooper * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26*57718be8SEnji Cooper * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27*57718be8SEnji Cooper */ 28*57718be8SEnji Cooper 29*57718be8SEnji Cooper #include <sys/types.h> 30*57718be8SEnji Cooper #include <sys/module.h> 31*57718be8SEnji Cooper #include <sys/mount.h> 32*57718be8SEnji Cooper 33*57718be8SEnji Cooper #include <atf-c.h> 34*57718be8SEnji Cooper #include <fcntl.h> 35*57718be8SEnji Cooper #include <stdbool.h> 36*57718be8SEnji Cooper 37*57718be8SEnji Cooper #include <miscfs/kernfs/kernfs.h> 38*57718be8SEnji Cooper 39*57718be8SEnji Cooper #include <rump/rump.h> 40*57718be8SEnji Cooper #include <rump/rump_syscalls.h> 41*57718be8SEnji Cooper 42*57718be8SEnji Cooper #include "../h_macros.h" 43*57718be8SEnji Cooper 44*57718be8SEnji Cooper #define MYMP "/mnt" 45*57718be8SEnji Cooper #define HZFILE MYMP "/hz" 46*57718be8SEnji Cooper 47*57718be8SEnji Cooper static char kernfs[] = "kernfs"; 48*57718be8SEnji Cooper 49*57718be8SEnji Cooper static bool 50*57718be8SEnji Cooper check_kernfs(void) 51*57718be8SEnji Cooper { 52*57718be8SEnji Cooper char buf[16]; 53*57718be8SEnji Cooper bool rv = true; 54*57718be8SEnji Cooper int fd; 55*57718be8SEnji Cooper 56*57718be8SEnji Cooper fd = rump_sys_open(HZFILE, O_RDONLY); 57*57718be8SEnji Cooper if (fd == -1) 58*57718be8SEnji Cooper return false; 59*57718be8SEnji Cooper if (rump_sys_read(fd, buf, sizeof(buf)) < 1) 60*57718be8SEnji Cooper rv = false; 61*57718be8SEnji Cooper RL(rump_sys_close(fd)); 62*57718be8SEnji Cooper 63*57718be8SEnji Cooper return rv; 64*57718be8SEnji Cooper } 65*57718be8SEnji Cooper 66*57718be8SEnji Cooper ATF_TC(disable); 67*57718be8SEnji Cooper ATF_TC_HEAD(disable, tc) 68*57718be8SEnji Cooper { 69*57718be8SEnji Cooper 70*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Tests that builtin modules can " 71*57718be8SEnji Cooper "be disabled"); 72*57718be8SEnji Cooper } 73*57718be8SEnji Cooper 74*57718be8SEnji Cooper ATF_TC_BODY(disable, tc) 75*57718be8SEnji Cooper { 76*57718be8SEnji Cooper 77*57718be8SEnji Cooper rump_init(); 78*57718be8SEnji Cooper RL(rump_sys_mkdir(MYMP, 0777)); 79*57718be8SEnji Cooper RL(rump_sys_mount(MOUNT_KERNFS, MYMP, 0, NULL, 0)); 80*57718be8SEnji Cooper ATF_REQUIRE(check_kernfs()); 81*57718be8SEnji Cooper RL(rump_sys_unmount(MYMP, 0)); 82*57718be8SEnji Cooper RL(rump_sys_modctl(MODCTL_UNLOAD, kernfs)); 83*57718be8SEnji Cooper } 84*57718be8SEnji Cooper 85*57718be8SEnji Cooper ATF_TC(noauto); 86*57718be8SEnji Cooper ATF_TC_HEAD(noauto, tc) 87*57718be8SEnji Cooper { 88*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Tests that disabled builtin modules " 89*57718be8SEnji Cooper "will not autoload"); 90*57718be8SEnji Cooper } 91*57718be8SEnji Cooper 92*57718be8SEnji Cooper ATF_TC_BODY(noauto, tc) 93*57718be8SEnji Cooper { 94*57718be8SEnji Cooper 95*57718be8SEnji Cooper rump_init(); 96*57718be8SEnji Cooper RL(rump_sys_mkdir(MYMP, 0777)); 97*57718be8SEnji Cooper 98*57718be8SEnji Cooper RL(rump_sys_modctl(MODCTL_UNLOAD, kernfs)); 99*57718be8SEnji Cooper 100*57718be8SEnji Cooper ATF_REQUIRE_ERRNO(ENODEV, 101*57718be8SEnji Cooper rump_sys_mount(MOUNT_KERNFS, MYMP, 0, NULL, 0) == -1); 102*57718be8SEnji Cooper } 103*57718be8SEnji Cooper 104*57718be8SEnji Cooper ATF_TC(forcereload); 105*57718be8SEnji Cooper ATF_TC_HEAD(forcereload, tc) 106*57718be8SEnji Cooper { 107*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Tests that disabled builtin modules " 108*57718be8SEnji Cooper "can be force-reloaded"); 109*57718be8SEnji Cooper } 110*57718be8SEnji Cooper 111*57718be8SEnji Cooper ATF_TC_BODY(forcereload, tc) 112*57718be8SEnji Cooper { 113*57718be8SEnji Cooper struct modctl_load mod; 114*57718be8SEnji Cooper 115*57718be8SEnji Cooper rump_init(); 116*57718be8SEnji Cooper RL(rump_sys_mkdir(MYMP, 0777)); 117*57718be8SEnji Cooper 118*57718be8SEnji Cooper RL(rump_sys_modctl(MODCTL_UNLOAD, kernfs)); 119*57718be8SEnji Cooper ATF_REQUIRE_ERRNO(ENODEV, 120*57718be8SEnji Cooper rump_sys_mount(MOUNT_KERNFS, MYMP, 0, NULL, 0) == -1); 121*57718be8SEnji Cooper 122*57718be8SEnji Cooper memset(&mod, 0, sizeof(mod)); 123*57718be8SEnji Cooper mod.ml_filename = kernfs; 124*57718be8SEnji Cooper mod.ml_flags = MODCTL_LOAD_FORCE; 125*57718be8SEnji Cooper 126*57718be8SEnji Cooper RL(rump_sys_modctl(MODCTL_LOAD, &mod)); 127*57718be8SEnji Cooper 128*57718be8SEnji Cooper RL(rump_sys_mount(MOUNT_KERNFS, MYMP, 0, NULL, 0)); 129*57718be8SEnji Cooper ATF_REQUIRE(check_kernfs()); 130*57718be8SEnji Cooper RL(rump_sys_unmount(MYMP, 0)); 131*57718be8SEnji Cooper } 132*57718be8SEnji Cooper 133*57718be8SEnji Cooper ATF_TC(disabledstat); 134*57718be8SEnji Cooper ATF_TC_HEAD(disabledstat, tc) 135*57718be8SEnji Cooper { 136*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Tests that disabled builtin modules " 137*57718be8SEnji Cooper "show up in modstat with refcount -1"); 138*57718be8SEnji Cooper } 139*57718be8SEnji Cooper 140*57718be8SEnji Cooper ATF_TC_BODY(disabledstat, tc) 141*57718be8SEnji Cooper { 142*57718be8SEnji Cooper struct modstat ms[128]; 143*57718be8SEnji Cooper struct iovec iov; 144*57718be8SEnji Cooper size_t i; 145*57718be8SEnji Cooper bool found = false; 146*57718be8SEnji Cooper 147*57718be8SEnji Cooper rump_init(); 148*57718be8SEnji Cooper RL(rump_sys_mkdir(MYMP, 0777)); 149*57718be8SEnji Cooper 150*57718be8SEnji Cooper RL(rump_sys_modctl(MODCTL_UNLOAD, kernfs)); 151*57718be8SEnji Cooper 152*57718be8SEnji Cooper iov.iov_base = ms; 153*57718be8SEnji Cooper iov.iov_len = sizeof(ms); 154*57718be8SEnji Cooper RL(rump_sys_modctl(MODCTL_STAT, &iov)); 155*57718be8SEnji Cooper 156*57718be8SEnji Cooper for (i = 0; i < __arraycount(ms); i++) { 157*57718be8SEnji Cooper if (strcmp(ms[i].ms_name, kernfs) == 0) { 158*57718be8SEnji Cooper ATF_REQUIRE_EQ(ms[i].ms_refcnt, (u_int)-1); 159*57718be8SEnji Cooper found = 1; 160*57718be8SEnji Cooper break; 161*57718be8SEnji Cooper } 162*57718be8SEnji Cooper } 163*57718be8SEnji Cooper ATF_REQUIRE(found); 164*57718be8SEnji Cooper } 165*57718be8SEnji Cooper 166*57718be8SEnji Cooper ATF_TC(busydisable); 167*57718be8SEnji Cooper ATF_TC_HEAD(busydisable, tc) 168*57718be8SEnji Cooper { 169*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Tests that busy builtin modules " 170*57718be8SEnji Cooper "cannot be disabled"); 171*57718be8SEnji Cooper } 172*57718be8SEnji Cooper 173*57718be8SEnji Cooper ATF_TC_BODY(busydisable, tc) 174*57718be8SEnji Cooper { 175*57718be8SEnji Cooper 176*57718be8SEnji Cooper rump_init(); 177*57718be8SEnji Cooper RL(rump_sys_mkdir(MYMP, 0777)); 178*57718be8SEnji Cooper RL(rump_sys_mount(MOUNT_KERNFS, MYMP, 0, NULL, 0)); 179*57718be8SEnji Cooper ATF_REQUIRE(check_kernfs()); 180*57718be8SEnji Cooper ATF_REQUIRE_ERRNO(EBUSY, 181*57718be8SEnji Cooper rump_sys_modctl(MODCTL_UNLOAD, kernfs) == -1); 182*57718be8SEnji Cooper } 183*57718be8SEnji Cooper 184*57718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 185*57718be8SEnji Cooper { 186*57718be8SEnji Cooper 187*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, disable); 188*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, noauto); 189*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, forcereload); 190*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, disabledstat); 191*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, busydisable); 192*57718be8SEnji Cooper 193*57718be8SEnji Cooper return atf_no_error(); 194*57718be8SEnji Cooper } 195