1 1.8 jakllsch /* $NetBSD: t_hid.c,v 1.8 2016/05/05 17:40:26 jakllsch Exp $ */ 2 1.1 jakllsch 3 1.1 jakllsch /* 4 1.1 jakllsch * Copyright (c) 2016 Jonathan A. Kollasch 5 1.1 jakllsch * All rights reserved. 6 1.1 jakllsch * 7 1.1 jakllsch * Redistribution and use in source and binary forms, with or without 8 1.1 jakllsch * modification, are permitted provided that the following conditions 9 1.1 jakllsch * are met: 10 1.1 jakllsch * 1. Redistributions of source code must retain the above copyright 11 1.1 jakllsch * notice, this list of conditions and the following disclaimer. 12 1.1 jakllsch * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 jakllsch * notice, this list of conditions and the following disclaimer in the 14 1.1 jakllsch * documentation and/or other materials provided with the distribution. 15 1.1 jakllsch * 16 1.1 jakllsch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 1.1 jakllsch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 1.1 jakllsch * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 1.1 jakllsch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 20 1.1 jakllsch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21 1.1 jakllsch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22 1.1 jakllsch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23 1.1 jakllsch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 1.1 jakllsch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25 1.1 jakllsch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26 1.1 jakllsch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 1.1 jakllsch */ 28 1.1 jakllsch 29 1.1 jakllsch #include <sys/cdefs.h> 30 1.8 jakllsch __RCSID("$NetBSD: t_hid.c,v 1.8 2016/05/05 17:40:26 jakllsch Exp $"); 31 1.1 jakllsch 32 1.1 jakllsch #include <machine/types.h> 33 1.1 jakllsch #include <stdlib.h> 34 1.1 jakllsch #include <string.h> 35 1.1 jakllsch #include <stdio.h> 36 1.1 jakllsch #include <atf-c.h> 37 1.6 jakllsch 38 1.6 jakllsch #include <rump/rump.h> 39 1.6 jakllsch 40 1.1 jakllsch #define hid_start_parse rumpns_hid_start_parse 41 1.1 jakllsch #define hid_end_parse rumpns_hid_end_parse 42 1.1 jakllsch #define hid_get_item rumpns_hid_get_item 43 1.1 jakllsch #define hid_locate rumpns_hid_locate 44 1.1 jakllsch #define hid_report_size rumpns_hid_report_size 45 1.1 jakllsch #define hid_get_data rumpns_hid_get_data 46 1.1 jakllsch #define hid_get_udata rumpns_hid_get_udata 47 1.1 jakllsch #define uhidevdebug rumpns_uhidevdebug 48 1.4 jakllsch #include <usb.h> 49 1.4 jakllsch #include <usbhid.h> 50 1.1 jakllsch #include <hid.h> 51 1.1 jakllsch 52 1.1 jakllsch #include "../../lib/libusbhid/hid_test_data.c" 53 1.1 jakllsch 54 1.1 jakllsch #define MYd_ATF_CHECK_EQ(d, v) \ 55 1.1 jakllsch ATF_CHECK_EQ_MSG(d, v, "== %d", (d)) 56 1.1 jakllsch 57 1.1 jakllsch #define MYld_ATF_CHECK_EQ(d, v) \ 58 1.1 jakllsch ATF_CHECK_EQ_MSG(d, v, "== %ld", (d)) 59 1.1 jakllsch 60 1.1 jakllsch #define MYu_ATF_CHECK_EQ(d, v) \ 61 1.1 jakllsch ATF_CHECK_EQ_MSG(d, v, "== %u", (d)) 62 1.1 jakllsch 63 1.1 jakllsch #define MYlu_ATF_CHECK_EQ(d, v) \ 64 1.1 jakllsch ATF_CHECK_EQ_MSG(d, v, "== %lu", (d)) 65 1.1 jakllsch 66 1.1 jakllsch #define MYx_ATF_CHECK_EQ(d, v) \ 67 1.1 jakllsch ATF_CHECK_EQ_MSG(d, v, "== 0x%x", (d)) 68 1.1 jakllsch 69 1.1 jakllsch #define MYlx_ATF_CHECK_EQ(d, v) \ 70 1.1 jakllsch ATF_CHECK_EQ_MSG(d, v, "== 0x%lx", (d)) 71 1.1 jakllsch 72 1.1 jakllsch int uhidevdebug; 73 1.1 jakllsch 74 1.1 jakllsch ATF_TC(khid); 75 1.1 jakllsch 76 1.1 jakllsch ATF_TC_HEAD(khid, tc) 77 1.1 jakllsch { 78 1.1 jakllsch 79 1.1 jakllsch atf_tc_set_md_var(tc, "descr", "check kernel hid.c"); 80 1.1 jakllsch } 81 1.1 jakllsch 82 1.4 jakllsch static int 83 1.4 jakllsch locate_item(const void *desc, int size, u_int32_t u, u_int8_t id, 84 1.5 jakllsch enum hid_kind k, struct hid_item *hip) 85 1.4 jakllsch { 86 1.4 jakllsch struct hid_data *d; 87 1.4 jakllsch struct hid_item h; 88 1.4 jakllsch 89 1.4 jakllsch h.report_ID = 0; 90 1.4 jakllsch for (d = hid_start_parse(desc, size, k); hid_get_item(d, &h); ) { 91 1.4 jakllsch if (h.kind == k && !(h.flags & HIO_CONST) && 92 1.4 jakllsch (/*XXX*/uint32_t)h.usage == u && h.report_ID == id) { 93 1.4 jakllsch if (hip != NULL) 94 1.4 jakllsch *hip = h; 95 1.4 jakllsch hid_end_parse(d); 96 1.4 jakllsch return (1); 97 1.4 jakllsch } 98 1.4 jakllsch } 99 1.4 jakllsch hid_end_parse(d); 100 1.4 jakllsch return (0); 101 1.4 jakllsch } 102 1.4 jakllsch 103 1.1 jakllsch ATF_TC_BODY(khid, tc) 104 1.1 jakllsch { 105 1.1 jakllsch int ret; 106 1.1 jakllsch struct hid_item hi; 107 1.1 jakllsch 108 1.1 jakllsch uhidevdebug = 0; 109 1.1 jakllsch 110 1.6 jakllsch rump_init(); 111 1.6 jakllsch 112 1.8 jakllsch rump_schedule(); 113 1.8 jakllsch 114 1.4 jakllsch ret = locate_item(range_test_report_descriptor, 115 1.1 jakllsch sizeof(range_test_report_descriptor), 0xff000003, 0, hid_input, 116 1.5 jakllsch &hi); 117 1.1 jakllsch ATF_REQUIRE(ret > 0); 118 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.size, 32); 119 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.count, 1); 120 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.pos, 0); 121 1.5 jakllsch MYx_ATF_CHECK_EQ(hi.flags, 0); 122 1.1 jakllsch MYd_ATF_CHECK_EQ(hi.logical_minimum, -2147483648); 123 1.1 jakllsch MYd_ATF_CHECK_EQ(hi.logical_maximum, 2147483647); 124 1.1 jakllsch MYd_ATF_CHECK_EQ(hi.physical_minimum, -2147483648); 125 1.1 jakllsch MYd_ATF_CHECK_EQ(hi.physical_maximum, 2147483647); 126 1.1 jakllsch MYld_ATF_CHECK_EQ(hid_get_data(range_test_minimum_report, 127 1.1 jakllsch &hi.loc), -2147483648); 128 1.1 jakllsch MYld_ATF_CHECK_EQ(hid_get_data(range_test_negative_one_report, 129 1.1 jakllsch &hi.loc), -1); 130 1.1 jakllsch MYld_ATF_CHECK_EQ(hid_get_data(range_test_positive_one_report, 131 1.1 jakllsch &hi.loc), 1); 132 1.1 jakllsch MYld_ATF_CHECK_EQ(hid_get_data(range_test_maximum_report, 133 1.1 jakllsch &hi.loc), 2147483647); 134 1.1 jakllsch 135 1.4 jakllsch ret = locate_item(range_test_report_descriptor, 136 1.1 jakllsch sizeof(range_test_report_descriptor), 0xff000002, 0, hid_input, 137 1.5 jakllsch &hi); 138 1.1 jakllsch ATF_REQUIRE(ret > 0); 139 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.size, 16); 140 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.count, 1); 141 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.pos, 32); 142 1.5 jakllsch MYx_ATF_CHECK_EQ(hi.flags, 0); 143 1.1 jakllsch MYd_ATF_CHECK_EQ(hi.logical_minimum, -32768); 144 1.1 jakllsch MYd_ATF_CHECK_EQ(hi.logical_maximum, 32767); 145 1.1 jakllsch MYd_ATF_CHECK_EQ(hi.physical_minimum, -32768); 146 1.1 jakllsch MYd_ATF_CHECK_EQ(hi.physical_maximum, 32767); 147 1.1 jakllsch MYld_ATF_CHECK_EQ(hid_get_data(range_test_minimum_report, 148 1.1 jakllsch &hi.loc), -32768); 149 1.1 jakllsch MYld_ATF_CHECK_EQ(hid_get_data(range_test_negative_one_report, 150 1.1 jakllsch &hi.loc), -1); 151 1.1 jakllsch MYld_ATF_CHECK_EQ(hid_get_data(range_test_positive_one_report, 152 1.1 jakllsch &hi.loc), 1); 153 1.1 jakllsch MYld_ATF_CHECK_EQ(hid_get_data(range_test_maximum_report, 154 1.1 jakllsch &hi.loc), 32767); 155 1.1 jakllsch 156 1.4 jakllsch ret = locate_item(range_test_report_descriptor, 157 1.1 jakllsch sizeof(range_test_report_descriptor), 0xff000001, 0, hid_input, 158 1.5 jakllsch &hi); 159 1.1 jakllsch ATF_REQUIRE(ret > 0); 160 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.size, 8); 161 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.count, 1); 162 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.pos, 48); 163 1.5 jakllsch MYx_ATF_CHECK_EQ(hi.flags, 0); 164 1.1 jakllsch MYd_ATF_CHECK_EQ(hi.logical_minimum, -128); 165 1.1 jakllsch MYd_ATF_CHECK_EQ(hi.logical_maximum, 127); 166 1.1 jakllsch MYd_ATF_CHECK_EQ(hi.physical_minimum, -128); 167 1.1 jakllsch MYd_ATF_CHECK_EQ(hi.physical_maximum, 127); 168 1.1 jakllsch MYld_ATF_CHECK_EQ(hid_get_data(range_test_minimum_report, 169 1.1 jakllsch &hi.loc), -128); 170 1.1 jakllsch MYld_ATF_CHECK_EQ(hid_get_data(range_test_negative_one_report, 171 1.1 jakllsch &hi.loc), -1); 172 1.1 jakllsch MYld_ATF_CHECK_EQ(hid_get_data(range_test_positive_one_report, 173 1.1 jakllsch &hi.loc), 1); 174 1.1 jakllsch MYld_ATF_CHECK_EQ(hid_get_data(range_test_maximum_report, 175 1.1 jakllsch &hi.loc), 127); 176 1.1 jakllsch 177 1.1 jakllsch 178 1.4 jakllsch ret = locate_item(unsigned_range_test_report_descriptor, 179 1.1 jakllsch sizeof(unsigned_range_test_report_descriptor), 0xff000013, 0, 180 1.5 jakllsch hid_input, &hi); 181 1.1 jakllsch ATF_REQUIRE(ret > 0); 182 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.size, 32); 183 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.count, 1); 184 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.pos, 0); 185 1.5 jakllsch MYx_ATF_CHECK_EQ(hi.flags, 0); 186 1.1 jakllsch MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_minimum_report, 187 1.1 jakllsch &hi.loc), 0x0); 188 1.1 jakllsch MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_positive_one_report, 189 1.1 jakllsch &hi.loc), 0x1); 190 1.1 jakllsch MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_negative_one_report, 191 1.1 jakllsch &hi.loc), 0xfffffffe); 192 1.1 jakllsch MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_maximum_report, 193 1.1 jakllsch &hi.loc), 0xffffffff); 194 1.1 jakllsch 195 1.4 jakllsch ret = locate_item(unsigned_range_test_report_descriptor, 196 1.1 jakllsch sizeof(unsigned_range_test_report_descriptor), 0xff000012, 0, 197 1.5 jakllsch hid_input, &hi); 198 1.1 jakllsch ATF_REQUIRE(ret > 0); 199 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.size, 16); 200 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.count, 1); 201 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.pos, 32); 202 1.5 jakllsch MYx_ATF_CHECK_EQ(hi.flags, 0); 203 1.1 jakllsch MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_minimum_report, 204 1.1 jakllsch &hi.loc), 0x0); 205 1.1 jakllsch MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_positive_one_report, 206 1.1 jakllsch &hi.loc), 0x1); 207 1.1 jakllsch MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_negative_one_report, 208 1.1 jakllsch &hi.loc), 0xfffe); 209 1.1 jakllsch MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_maximum_report, 210 1.1 jakllsch &hi.loc), 0xffff); 211 1.1 jakllsch 212 1.4 jakllsch ret = locate_item(unsigned_range_test_report_descriptor, 213 1.1 jakllsch sizeof(unsigned_range_test_report_descriptor), 0xff000011, 0, 214 1.5 jakllsch hid_input, &hi); 215 1.1 jakllsch ATF_REQUIRE(ret > 0); 216 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.size, 8); 217 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.count, 1); 218 1.1 jakllsch MYu_ATF_CHECK_EQ(hi.loc.pos, 48); 219 1.5 jakllsch MYx_ATF_CHECK_EQ(hi.flags, 0); 220 1.1 jakllsch MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_minimum_report, 221 1.1 jakllsch &hi.loc), 0x0); 222 1.1 jakllsch MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_positive_one_report, 223 1.1 jakllsch &hi.loc), 0x1); 224 1.1 jakllsch MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_negative_one_report, 225 1.1 jakllsch &hi.loc), 0xfe); 226 1.1 jakllsch MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_maximum_report, 227 1.1 jakllsch &hi.loc), 0xff); 228 1.8 jakllsch 229 1.8 jakllsch rump_unschedule(); 230 1.1 jakllsch } 231 1.1 jakllsch 232 1.2 jakllsch ATF_TC(khid_parse_just_pop); 233 1.2 jakllsch 234 1.2 jakllsch ATF_TC_HEAD(khid_parse_just_pop, tc) 235 1.2 jakllsch { 236 1.2 jakllsch 237 1.2 jakllsch atf_tc_set_md_var(tc, "descr", "check kernel hid.c for " 238 1.2 jakllsch "Pop on empty stack bug"); 239 1.2 jakllsch } 240 1.2 jakllsch 241 1.2 jakllsch ATF_TC_BODY(khid_parse_just_pop, tc) 242 1.2 jakllsch { 243 1.2 jakllsch struct hid_data *hdp; 244 1.2 jakllsch struct hid_item hi; 245 1.2 jakllsch 246 1.8 jakllsch rump_init(); 247 1.7 jakllsch 248 1.8 jakllsch rump_schedule(); 249 1.6 jakllsch 250 1.2 jakllsch hdp = hid_start_parse(just_pop_report_descriptor, 251 1.2 jakllsch sizeof just_pop_report_descriptor, hid_none); 252 1.2 jakllsch while (hid_get_item(hdp, &hi) > 0) { 253 1.2 jakllsch } 254 1.2 jakllsch hid_end_parse(hdp); 255 1.8 jakllsch 256 1.8 jakllsch rump_unschedule(); 257 1.2 jakllsch } 258 1.2 jakllsch 259 1.1 jakllsch ATF_TP_ADD_TCS(tp) 260 1.1 jakllsch { 261 1.1 jakllsch 262 1.1 jakllsch ATF_TP_ADD_TC(tp, khid); 263 1.2 jakllsch ATF_TP_ADD_TC(tp, khid_parse_just_pop); 264 1.1 jakllsch 265 1.1 jakllsch return atf_no_error(); 266 1.1 jakllsch } 267 1.1 jakllsch 268