1*4882a593Smuzhiyun# 2*4882a593Smuzhiyun# SPDX-License-Identifier: MIT 3*4882a593Smuzhiyun# 4*4882a593Smuzhiyun 5*4882a593Smuzhiyunimport os 6*4882a593Smuzhiyunimport time 7*4882a593Smuzhiyun 8*4882a593Smuzhiyunfrom oeqa.runtime.case import OERuntimeTestCase 9*4882a593Smuzhiyunfrom oeqa.core.decorator.depends import OETestDepends 10*4882a593Smuzhiyunfrom oeqa.core.decorator.data import skipIfNotFeature 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun# need some kernel fragments 13*4882a593Smuzhiyun# echo "KERNEL_FEATURES:append = \" features\/kernel\-sample\/kernel\-sample.scc\"" >> local.conf 14*4882a593Smuzhiyunclass KSample(OERuntimeTestCase): 15*4882a593Smuzhiyun def cmd_and_check(self, cmd='', match_string=''): 16*4882a593Smuzhiyun status, output = self.target.run(cmd) 17*4882a593Smuzhiyun if not match_string: 18*4882a593Smuzhiyun # send cmd 19*4882a593Smuzhiyun msg = '%s failed, %s' % (cmd, output) 20*4882a593Smuzhiyun self.assertEqual(status, 0, msg=msg) 21*4882a593Smuzhiyun else: 22*4882a593Smuzhiyun # check result 23*4882a593Smuzhiyun result = ("%s" % match_string) in output 24*4882a593Smuzhiyun msg = output 25*4882a593Smuzhiyun self.assertTrue(result, msg) 26*4882a593Smuzhiyun self.assertEqual(status, 0, cmd) 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun def check_arch(self, archset=''): 29*4882a593Smuzhiyun status, output = self.target.run("uname -m") 30*4882a593Smuzhiyun result = ("%s" % output) in archset 31*4882a593Smuzhiyun if not result: 32*4882a593Smuzhiyun self.skipTest("This case doesn't support %s" % output) 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun def check_config(self, config_opt=''): 35*4882a593Smuzhiyun cmd = "zcat /proc/config.gz | grep %s" % config_opt 36*4882a593Smuzhiyun status, output = self.target.run(cmd) 37*4882a593Smuzhiyun result = ("%s=y" % config_opt) in output 38*4882a593Smuzhiyun if not result: 39*4882a593Smuzhiyun self.skipTest("%s is not set" % config_opt) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun def check_module_exist(self, path='', module_name=''): 42*4882a593Smuzhiyun status, output = self.target.run("uname -r") 43*4882a593Smuzhiyun cmd = "ls " + "/lib/modules/" + output + "/kernel/samples/" + path + module_name 44*4882a593Smuzhiyun status, output = self.target.run(cmd) 45*4882a593Smuzhiyun if status != 0: 46*4882a593Smuzhiyun error_info = module_name + " doesn't exist" 47*4882a593Smuzhiyun self.skipTest(error_info) 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun def kfifo_func(self, name=''): 50*4882a593Smuzhiyun module_prename = name + "-example" 51*4882a593Smuzhiyun module_name = name + "-example.ko" 52*4882a593Smuzhiyun sysmbol_name = name + "_example" 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun # make sure if module exists 55*4882a593Smuzhiyun self.check_module_exist("kfifo/", module_name) 56*4882a593Smuzhiyun # modprobe 57*4882a593Smuzhiyun self.cmd_and_check("modprobe %s" % module_prename) 58*4882a593Smuzhiyun # lsmod 59*4882a593Smuzhiyun self.cmd_and_check("lsmod | grep %s | cut -d\' \' -f1" % sysmbol_name, sysmbol_name) 60*4882a593Smuzhiyun # check result 61*4882a593Smuzhiyun self.cmd_and_check("dmesg | grep \"test passed\" ", "test passed") 62*4882a593Smuzhiyun # rmmod 63*4882a593Smuzhiyun self.cmd_and_check("rmmod %s" % module_prename) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun def kprobe_func(self, name=''): 66*4882a593Smuzhiyun # check config 67*4882a593Smuzhiyun self.check_config("CONFIG_KPROBES") 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun module_prename = name + "_example" 70*4882a593Smuzhiyun module_name = name + "_example.ko" 71*4882a593Smuzhiyun sysmbol_name = module_prename 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun # make sure if module exists 74*4882a593Smuzhiyun self.check_module_exist("kprobes/", module_name) 75*4882a593Smuzhiyun # modprobe 76*4882a593Smuzhiyun self.cmd_and_check("modprobe %s" % module_prename) 77*4882a593Smuzhiyun # lsmod 78*4882a593Smuzhiyun self.cmd_and_check("lsmod | grep %s | cut -d\' \' -f1" % sysmbol_name, sysmbol_name) 79*4882a593Smuzhiyun # check result 80*4882a593Smuzhiyun self.cmd_and_check("dmesg | grep Planted | head -n10", "Planted") 81*4882a593Smuzhiyun # rmmod 82*4882a593Smuzhiyun self.cmd_and_check("rmmod %s" % module_prename) 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun def kobject_func(self, name=''): 85*4882a593Smuzhiyun module_prename = name + "_example" 86*4882a593Smuzhiyun module_name = name + "-example.ko" 87*4882a593Smuzhiyun sysmbol_name = module_prename 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun # make sure if module exists 90*4882a593Smuzhiyun self.check_module_exist("kobject/", module_name) 91*4882a593Smuzhiyun # modprobe 92*4882a593Smuzhiyun self.cmd_and_check("modprobe %s" % module_prename) 93*4882a593Smuzhiyun # lsmod 94*4882a593Smuzhiyun self.cmd_and_check("lsmod | grep %s | cut -d\' \' -f1" % sysmbol_name, sysmbol_name) 95*4882a593Smuzhiyun # check result 96*4882a593Smuzhiyun self.cmd_and_check("ls /sys/kernel/%s/" % sysmbol_name, "bar") 97*4882a593Smuzhiyun # rmmod 98*4882a593Smuzhiyun self.cmd_and_check("rmmod %s" % module_prename) 99*4882a593Smuzhiyun 100*4882a593Smuzhiyunclass KSampleTest(KSample): 101*4882a593Smuzhiyun # kfifo 102*4882a593Smuzhiyun @OETestDepends(['ssh.SSHTest.test_ssh']) 103*4882a593Smuzhiyun def test_kfifo_test(self): 104*4882a593Smuzhiyun index = ["dma", "bytestream", "inttype", "record"] 105*4882a593Smuzhiyun for i in index: 106*4882a593Smuzhiyun self.kfifo_func(i) 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun # kprobe 109*4882a593Smuzhiyun @OETestDepends(['ssh.SSHTest.test_ssh']) 110*4882a593Smuzhiyun def test_kprobe_test(self): 111*4882a593Smuzhiyun self.check_arch("x86_64 i686 ppc") 112*4882a593Smuzhiyun index = ["kprobe", "kretprobe"] 113*4882a593Smuzhiyun for i in index: 114*4882a593Smuzhiyun self.kprobe_func(i) 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun # kobject 117*4882a593Smuzhiyun @OETestDepends(['ssh.SSHTest.test_ssh']) 118*4882a593Smuzhiyun def test_kobject_test(self): 119*4882a593Smuzhiyun index = ["kobject", "kset"] 120*4882a593Smuzhiyun for i in index: 121*4882a593Smuzhiyun self.kobject_func(i) 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun #trace 124*4882a593Smuzhiyun @OETestDepends(['ssh.SSHTest.test_ssh']) 125*4882a593Smuzhiyun def test_trace_events(self): 126*4882a593Smuzhiyun # check config 127*4882a593Smuzhiyun self.check_config("CONFIG_TRACING_SUPPORT") 128*4882a593Smuzhiyun # make sure if module exists 129*4882a593Smuzhiyun self.check_module_exist("trace_events/", "trace-events-sample.ko") 130*4882a593Smuzhiyun # modprobe 131*4882a593Smuzhiyun self.cmd_and_check("modprobe trace-events-sample") 132*4882a593Smuzhiyun # lsmod 133*4882a593Smuzhiyun self.cmd_and_check("lsmod | grep trace_events_sample | cut -d\' \' -f1", "trace_events_sample") 134*4882a593Smuzhiyun # check dir 135*4882a593Smuzhiyun self.cmd_and_check("ls /sys/kernel/debug/tracing/events/ | grep sample-trace", "sample-trace") 136*4882a593Smuzhiyun # enable trace 137*4882a593Smuzhiyun self.cmd_and_check("echo 1 > /sys/kernel/debug/tracing/events/sample-trace/enable") 138*4882a593Smuzhiyun self.cmd_and_check("cat /sys/kernel/debug/tracing/events/sample-trace/enable") 139*4882a593Smuzhiyun # check result 140*4882a593Smuzhiyun status = 1 141*4882a593Smuzhiyun count = 0 142*4882a593Smuzhiyun while status != 0: 143*4882a593Smuzhiyun time.sleep(1) 144*4882a593Smuzhiyun status, output = self.target.run('cat /sys/kernel/debug/tracing/trace | grep hello | head -n1 | cut -d\':\' -f2') 145*4882a593Smuzhiyun if " foo_bar" in output: 146*4882a593Smuzhiyun break 147*4882a593Smuzhiyun count = count + 1 148*4882a593Smuzhiyun if count > 5: 149*4882a593Smuzhiyun self.assertTrue(False, "Time out when check result") 150*4882a593Smuzhiyun # disable trace 151*4882a593Smuzhiyun self.cmd_and_check("echo 0 > /sys/kernel/debug/tracing/events/sample-trace/enable") 152*4882a593Smuzhiyun # clean up trace 153*4882a593Smuzhiyun self.cmd_and_check("echo > /sys/kernel/debug/tracing/trace") 154*4882a593Smuzhiyun # rmmod 155*4882a593Smuzhiyun self.cmd_and_check("rmmod trace-events-sample") 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun @OETestDepends(['ssh.SSHTest.test_ssh']) 158*4882a593Smuzhiyun def test_trace_printk(self): 159*4882a593Smuzhiyun # check config 160*4882a593Smuzhiyun self.check_config("CONFIG_TRACING_SUPPORT") 161*4882a593Smuzhiyun # make sure if module exists 162*4882a593Smuzhiyun self.check_module_exist("trace_printk/", "trace-printk.ko") 163*4882a593Smuzhiyun # modprobe 164*4882a593Smuzhiyun self.cmd_and_check("modprobe trace-printk") 165*4882a593Smuzhiyun # lsmod 166*4882a593Smuzhiyun self.cmd_and_check("lsmod | grep trace_printk | cut -d\' \' -f1", "trace_printk") 167*4882a593Smuzhiyun # check result 168*4882a593Smuzhiyun self.cmd_and_check("cat /sys/kernel/debug/tracing/trace | grep trace_printk_irq_work | head -n1 | cut -d\':\' -f2", " trace_printk_irq_work") 169*4882a593Smuzhiyun # clean up trace 170*4882a593Smuzhiyun self.cmd_and_check("echo > /sys/kernel/debug/tracing/trace") 171*4882a593Smuzhiyun # rmmod 172*4882a593Smuzhiyun self.cmd_and_check("rmmod trace-printk") 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun # hw breakpoint 175*4882a593Smuzhiyun @OETestDepends(['ssh.SSHTest.test_ssh']) 176*4882a593Smuzhiyun def test_hw_breakpoint_example(self): 177*4882a593Smuzhiyun # check arch 178*4882a593Smuzhiyun status, output = self.target.run("uname -m") 179*4882a593Smuzhiyun result = ("x86_64" in output) or ("aarch64" in output) 180*4882a593Smuzhiyun if not result: 181*4882a593Smuzhiyun self.skipTest("the arch %s doesn't support hw breakpoint" % output) 182*4882a593Smuzhiyun # check config 183*4882a593Smuzhiyun self.check_config("CONFIG_KALLSYMS_ALL") 184*4882a593Smuzhiyun # make sure if module exists 185*4882a593Smuzhiyun self.check_module_exist("hw_breakpoint/", "data_breakpoint.ko") 186*4882a593Smuzhiyun # modprobe 187*4882a593Smuzhiyun self.cmd_and_check("modprobe data_breakpoint") 188*4882a593Smuzhiyun # lsmod 189*4882a593Smuzhiyun self.cmd_and_check("lsmod | grep data_breakpoint | cut -d\' \' -f1", "data_breakpoint") 190*4882a593Smuzhiyun # check result 191*4882a593Smuzhiyun self.cmd_and_check("cat /var/log/messages | grep sample_hbp_handler", "sample_hbp_handler") 192*4882a593Smuzhiyun # rmmod 193*4882a593Smuzhiyun self.cmd_and_check("rmmod data_breakpoint") 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun @OETestDepends(['ssh.SSHTest.test_ssh']) 196*4882a593Smuzhiyun def test_configfs_sample(self): 197*4882a593Smuzhiyun # check config 198*4882a593Smuzhiyun status, ret = self.target.run('zcat /proc/config.gz | grep CONFIG_CONFIGFS_FS') 199*4882a593Smuzhiyun if not ["CONFIG_CONFIGFS_FS=m" in ret or "CONFIG_CONFIGFS_FS=y" in ret]: 200*4882a593Smuzhiyun self.skipTest("CONFIG error") 201*4882a593Smuzhiyun # make sure if module exists 202*4882a593Smuzhiyun self.check_module_exist("configfs/", "configfs_sample.ko") 203*4882a593Smuzhiyun # modprobe 204*4882a593Smuzhiyun self.cmd_and_check("modprobe configfs_sample") 205*4882a593Smuzhiyun # lsmod 206*4882a593Smuzhiyun self.cmd_and_check("lsmod | grep configfs_sample | cut -d\' \' -f1 | head -n1", "configfs_sample") 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun status = 1 209*4882a593Smuzhiyun count = 0 210*4882a593Smuzhiyun while status != 0: 211*4882a593Smuzhiyun time.sleep(1) 212*4882a593Smuzhiyun status, ret = self.target.run('cat /sys/kernel/config/01-childless/description') 213*4882a593Smuzhiyun count = count + 1 214*4882a593Smuzhiyun if count > 200: 215*4882a593Smuzhiyun self.skipTest("Time out for check dir") 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun # rmmod 218*4882a593Smuzhiyun self.cmd_and_check("rmmod configfs_sample") 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun @OETestDepends(['ssh.SSHTest.test_ssh']) 221*4882a593Smuzhiyun def test_cn_test(self): 222*4882a593Smuzhiyun # make sure if module exists 223*4882a593Smuzhiyun self.check_module_exist("connector/", "cn_test.ko") 224*4882a593Smuzhiyun # modprobe 225*4882a593Smuzhiyun self.cmd_and_check("modprobe cn_test") 226*4882a593Smuzhiyun # lsmod 227*4882a593Smuzhiyun self.cmd_and_check("lsmod | grep cn_test | cut -d\' \' -f1", "cn_test") 228*4882a593Smuzhiyun # check result 229*4882a593Smuzhiyun self.cmd_and_check("cat /proc/net/connector | grep cn_test | head -n1 | cut -d\' \' -f1", "cn_test") 230*4882a593Smuzhiyun # rmmod 231*4882a593Smuzhiyun self.cmd_and_check("rmmod cn_test") 232