1 // SPDX-License-Identifier: GPL-2.0-only
3 * This module provides an interface to trigger and test firmware loading.
5 * It is designed to be used for basic evaluation of the firmware loading
6 * subsystem (for example when validating firmware verification). It lacks
7 * any extra dependencies, and will not normally be loaded by the system
8 * unless explicitly requested by name.
11 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
13 #include <linux/init.h>
14 #include <linux/module.h>
15 #include <linux/printk.h>
16 #include <linux/completion.h>
17 #include <linux/firmware.h>
18 #include <linux/device.h>
20 #include <linux/miscdevice.h>
21 #include <linux/sizes.h>
22 #include <linux/slab.h>
23 #include <linux/uaccess.h>
24 #include <linux/delay.h>
25 #include <linux/kthread.h>
26 #include <linux/vmalloc.h>
27 #include <linux/efi_embedded_fw.h>
29 #define TEST_FIRMWARE_NAME "test-firmware.bin"
30 #define TEST_FIRMWARE_NUM_REQS 4
31 #define TEST_FIRMWARE_BUF_SIZE SZ_1K
33 static DEFINE_MUTEX(test_fw_mutex);
34 static const struct firmware *test_firmware;
36 struct test_batched_req {
40 const struct firmware *fw;
42 struct completion completion;
43 struct task_struct *task;
48 * test_config - represents configuration for the test for different triggers
50 * @name: the name of the firmware file to look for
51 * @into_buf: when the into_buf is used if this is true
52 * request_firmware_into_buf() will be used instead.
53 * @sync_direct: when the sync trigger is used if this is true
54 * request_firmware_direct() will be used instead.
55 * @send_uevent: whether or not to send a uevent for async requests
56 * @num_requests: number of requests to try per test case. This is trigger
58 * @reqs: stores all requests information
59 * @read_fw_idx: index of thread from which we want to read firmware results
60 * from through the read_fw trigger.
61 * @test_result: a test may use this to collect the result from the call
62 * of the request_firmware*() calls used in their tests. In order of
63 * priority we always keep first any setup error. If no setup errors were
64 * found then we move on to the first error encountered while running the
65 * API. Note that for async calls this typically will be a successful
66 * result (0) unless of course you've used bogus parameters, or the system
67 * is out of memory. In the async case the callback is expected to do a
68 * bit more homework to figure out what happened, unfortunately the only
69 * information passed today on error is the fact that no firmware was
70 * found so we can only assume -ENOENT on async calls if the firmware is
73 * Errors you can expect:
77 * 0: success for sync, for async it means request was sent
78 * -EINVAL: invalid parameters or request
79 * -ENOENT: files not found
83 * -ENOMEM: memory pressure on system
84 * -ENODEV: out of number of devices to test
85 * -EINVAL: an unexpected error has occurred
86 * @req_firmware: if @sync_direct is true this is set to
87 * request_firmware_direct(), otherwise request_firmware()
98 * These below don't belong her but we'll move them once we create
99 * a struct fw_test_device and stuff the misc_dev under there later.
101 struct test_batched_req *reqs;
103 int (*req_firmware)(const struct firmware **fw, const char *name,
104 struct device *device);
107 static struct test_config *test_fw_config;
109 static ssize_t test_fw_misc_read(struct file *f, char __user *buf,
110 size_t size, loff_t *offset)
114 mutex_lock(&test_fw_mutex);
116 rc = simple_read_from_buffer(buf, size, offset,
118 test_firmware->size);
119 mutex_unlock(&test_fw_mutex);
123 static const struct file_operations test_fw_fops = {
124 .owner = THIS_MODULE,
125 .read = test_fw_misc_read,
128 static void __test_release_all_firmware(void)
130 struct test_batched_req *req;
133 if (!test_fw_config->reqs)
136 for (i = 0; i < test_fw_config->num_requests; i++) {
137 req = &test_fw_config->reqs[i];
139 release_firmware(req->fw);
142 vfree(test_fw_config->reqs);
143 test_fw_config->reqs = NULL;
146 static void test_release_all_firmware(void)
148 mutex_lock(&test_fw_mutex);
149 __test_release_all_firmware();
150 mutex_unlock(&test_fw_mutex);
154 static void __test_firmware_config_free(void)
156 __test_release_all_firmware();
157 kfree_const(test_fw_config->name);
158 test_fw_config->name = NULL;
162 * XXX: move to kstrncpy() once merged.
164 * Users should use kfree_const() when freeing these.
166 static int __kstrncpy(char **dst, const char *name, size_t count, gfp_t gfp)
168 *dst = kstrndup(name, count, gfp);
174 static int __test_firmware_config_init(void)
178 ret = __kstrncpy(&test_fw_config->name, TEST_FIRMWARE_NAME,
179 strlen(TEST_FIRMWARE_NAME), GFP_KERNEL);
183 test_fw_config->num_requests = TEST_FIRMWARE_NUM_REQS;
184 test_fw_config->send_uevent = true;
185 test_fw_config->into_buf = false;
186 test_fw_config->sync_direct = false;
187 test_fw_config->req_firmware = request_firmware;
188 test_fw_config->test_result = 0;
189 test_fw_config->reqs = NULL;
194 __test_firmware_config_free();
198 static ssize_t reset_store(struct device *dev,
199 struct device_attribute *attr,
200 const char *buf, size_t count)
204 mutex_lock(&test_fw_mutex);
206 __test_firmware_config_free();
208 ret = __test_firmware_config_init();
211 pr_err("could not alloc settings for config trigger: %d\n",
220 mutex_unlock(&test_fw_mutex);
224 static DEVICE_ATTR_WO(reset);
226 static ssize_t config_show(struct device *dev,
227 struct device_attribute *attr,
232 mutex_lock(&test_fw_mutex);
234 len += scnprintf(buf, PAGE_SIZE - len,
235 "Custom trigger configuration for: %s\n",
238 if (test_fw_config->name)
239 len += scnprintf(buf+len, PAGE_SIZE - len,
241 test_fw_config->name);
243 len += scnprintf(buf+len, PAGE_SIZE - len,
246 len += scnprintf(buf+len, PAGE_SIZE - len,
247 "num_requests:\t%u\n", test_fw_config->num_requests);
249 len += scnprintf(buf+len, PAGE_SIZE - len,
250 "send_uevent:\t\t%s\n",
251 test_fw_config->send_uevent ?
252 "FW_ACTION_HOTPLUG" :
253 "FW_ACTION_NOHOTPLUG");
254 len += scnprintf(buf+len, PAGE_SIZE - len,
256 test_fw_config->into_buf ? "true" : "false");
257 len += scnprintf(buf+len, PAGE_SIZE - len,
258 "sync_direct:\t\t%s\n",
259 test_fw_config->sync_direct ? "true" : "false");
260 len += scnprintf(buf+len, PAGE_SIZE - len,
261 "read_fw_idx:\t%u\n", test_fw_config->read_fw_idx);
263 mutex_unlock(&test_fw_mutex);
267 static DEVICE_ATTR_RO(config);
269 static ssize_t config_name_store(struct device *dev,
270 struct device_attribute *attr,
271 const char *buf, size_t count)
275 mutex_lock(&test_fw_mutex);
276 kfree_const(test_fw_config->name);
277 ret = __kstrncpy(&test_fw_config->name, buf, count, GFP_KERNEL);
278 mutex_unlock(&test_fw_mutex);
284 * As per sysfs_kf_seq_show() the buf is max PAGE_SIZE.
286 static ssize_t config_test_show_str(char *dst,
291 mutex_lock(&test_fw_mutex);
292 len = snprintf(dst, PAGE_SIZE, "%s\n", src);
293 mutex_unlock(&test_fw_mutex);
298 static int test_dev_config_update_bool(const char *buf, size_t size,
303 mutex_lock(&test_fw_mutex);
304 if (strtobool(buf, cfg) < 0)
308 mutex_unlock(&test_fw_mutex);
313 static ssize_t test_dev_config_show_bool(char *buf, bool val)
315 return snprintf(buf, PAGE_SIZE, "%d\n", val);
318 static ssize_t test_dev_config_show_int(char *buf, int val)
320 return snprintf(buf, PAGE_SIZE, "%d\n", val);
323 static int test_dev_config_update_u8(const char *buf, size_t size, u8 *cfg)
328 ret = kstrtol(buf, 10, &new);
335 mutex_lock(&test_fw_mutex);
337 mutex_unlock(&test_fw_mutex);
339 /* Always return full write size even if we didn't consume all */
343 static ssize_t test_dev_config_show_u8(char *buf, u8 val)
345 return snprintf(buf, PAGE_SIZE, "%u\n", val);
348 static ssize_t config_name_show(struct device *dev,
349 struct device_attribute *attr,
352 return config_test_show_str(buf, test_fw_config->name);
354 static DEVICE_ATTR_RW(config_name);
356 static ssize_t config_num_requests_store(struct device *dev,
357 struct device_attribute *attr,
358 const char *buf, size_t count)
362 mutex_lock(&test_fw_mutex);
363 if (test_fw_config->reqs) {
364 pr_err("Must call release_all_firmware prior to changing config\n");
366 mutex_unlock(&test_fw_mutex);
369 mutex_unlock(&test_fw_mutex);
371 rc = test_dev_config_update_u8(buf, count,
372 &test_fw_config->num_requests);
378 static ssize_t config_num_requests_show(struct device *dev,
379 struct device_attribute *attr,
382 return test_dev_config_show_u8(buf, test_fw_config->num_requests);
384 static DEVICE_ATTR_RW(config_num_requests);
386 static ssize_t config_into_buf_store(struct device *dev,
387 struct device_attribute *attr,
388 const char *buf, size_t count)
390 return test_dev_config_update_bool(buf,
392 &test_fw_config->into_buf);
395 static ssize_t config_into_buf_show(struct device *dev,
396 struct device_attribute *attr,
399 return test_dev_config_show_bool(buf, test_fw_config->into_buf);
401 static DEVICE_ATTR_RW(config_into_buf);
403 static ssize_t config_sync_direct_store(struct device *dev,
404 struct device_attribute *attr,
405 const char *buf, size_t count)
407 int rc = test_dev_config_update_bool(buf, count,
408 &test_fw_config->sync_direct);
411 test_fw_config->req_firmware = test_fw_config->sync_direct ?
412 request_firmware_direct :
417 static ssize_t config_sync_direct_show(struct device *dev,
418 struct device_attribute *attr,
421 return test_dev_config_show_bool(buf, test_fw_config->sync_direct);
423 static DEVICE_ATTR_RW(config_sync_direct);
425 static ssize_t config_send_uevent_store(struct device *dev,
426 struct device_attribute *attr,
427 const char *buf, size_t count)
429 return test_dev_config_update_bool(buf, count,
430 &test_fw_config->send_uevent);
433 static ssize_t config_send_uevent_show(struct device *dev,
434 struct device_attribute *attr,
437 return test_dev_config_show_bool(buf, test_fw_config->send_uevent);
439 static DEVICE_ATTR_RW(config_send_uevent);
441 static ssize_t config_read_fw_idx_store(struct device *dev,
442 struct device_attribute *attr,
443 const char *buf, size_t count)
445 return test_dev_config_update_u8(buf, count,
446 &test_fw_config->read_fw_idx);
449 static ssize_t config_read_fw_idx_show(struct device *dev,
450 struct device_attribute *attr,
453 return test_dev_config_show_u8(buf, test_fw_config->read_fw_idx);
455 static DEVICE_ATTR_RW(config_read_fw_idx);
458 static ssize_t trigger_request_store(struct device *dev,
459 struct device_attribute *attr,
460 const char *buf, size_t count)
465 name = kstrndup(buf, count, GFP_KERNEL);
469 pr_info("loading '%s'\n", name);
471 mutex_lock(&test_fw_mutex);
472 release_firmware(test_firmware);
473 test_firmware = NULL;
474 rc = request_firmware(&test_firmware, name, dev);
476 pr_info("load of '%s' failed: %d\n", name, rc);
479 pr_info("loaded: %zu\n", test_firmware->size);
483 mutex_unlock(&test_fw_mutex);
489 static DEVICE_ATTR_WO(trigger_request);
491 #ifdef CONFIG_EFI_EMBEDDED_FIRMWARE
492 #include "../drivers/firmware/efi/embedded-firmware.h"
493 static ssize_t trigger_request_platform_store(struct device *dev,
494 struct device_attribute *attr,
495 const char *buf, size_t count)
497 static const u8 test_data[] = {
498 0x55, 0xaa, 0x55, 0xaa, 0x01, 0x02, 0x03, 0x04,
499 0x55, 0xaa, 0x55, 0xaa, 0x05, 0x06, 0x07, 0x08,
500 0x55, 0xaa, 0x55, 0xaa, 0x10, 0x20, 0x30, 0x40,
501 0x55, 0xaa, 0x55, 0xaa, 0x50, 0x60, 0x70, 0x80
503 struct efi_embedded_fw efi_embedded_fw;
504 const struct firmware *firmware = NULL;
505 bool saved_efi_embedded_fw_checked;
509 name = kstrndup(buf, count, GFP_KERNEL);
513 pr_info("inserting test platform fw '%s'\n", name);
514 efi_embedded_fw.name = name;
515 efi_embedded_fw.data = (void *)test_data;
516 efi_embedded_fw.length = sizeof(test_data);
517 list_add(&efi_embedded_fw.list, &efi_embedded_fw_list);
518 saved_efi_embedded_fw_checked = efi_embedded_fw_checked;
519 efi_embedded_fw_checked = true;
521 pr_info("loading '%s'\n", name);
522 rc = firmware_request_platform(&firmware, name, dev);
524 pr_info("load of '%s' failed: %d\n", name, rc);
527 if (firmware->size != sizeof(test_data) ||
528 memcmp(firmware->data, test_data, sizeof(test_data)) != 0) {
529 pr_info("firmware contents mismatch for '%s'\n", name);
533 pr_info("loaded: %zu\n", firmware->size);
537 efi_embedded_fw_checked = saved_efi_embedded_fw_checked;
538 release_firmware(firmware);
539 list_del(&efi_embedded_fw.list);
544 static DEVICE_ATTR_WO(trigger_request_platform);
547 static DECLARE_COMPLETION(async_fw_done);
549 static void trigger_async_request_cb(const struct firmware *fw, void *context)
552 complete(&async_fw_done);
555 static ssize_t trigger_async_request_store(struct device *dev,
556 struct device_attribute *attr,
557 const char *buf, size_t count)
562 name = kstrndup(buf, count, GFP_KERNEL);
566 pr_info("loading '%s'\n", name);
568 mutex_lock(&test_fw_mutex);
569 release_firmware(test_firmware);
570 test_firmware = NULL;
571 rc = request_firmware_nowait(THIS_MODULE, 1, name, dev, GFP_KERNEL,
572 NULL, trigger_async_request_cb);
574 pr_info("async load of '%s' failed: %d\n", name, rc);
578 /* Free 'name' ASAP, to test for race conditions */
581 wait_for_completion(&async_fw_done);
584 pr_info("loaded: %zu\n", test_firmware->size);
587 pr_err("failed to async load firmware\n");
592 mutex_unlock(&test_fw_mutex);
596 static DEVICE_ATTR_WO(trigger_async_request);
598 static ssize_t trigger_custom_fallback_store(struct device *dev,
599 struct device_attribute *attr,
600 const char *buf, size_t count)
605 name = kstrndup(buf, count, GFP_KERNEL);
609 pr_info("loading '%s' using custom fallback mechanism\n", name);
611 mutex_lock(&test_fw_mutex);
612 release_firmware(test_firmware);
613 test_firmware = NULL;
614 rc = request_firmware_nowait(THIS_MODULE, FW_ACTION_NOHOTPLUG, name,
615 dev, GFP_KERNEL, NULL,
616 trigger_async_request_cb);
618 pr_info("async load of '%s' failed: %d\n", name, rc);
622 /* Free 'name' ASAP, to test for race conditions */
625 wait_for_completion(&async_fw_done);
628 pr_info("loaded: %zu\n", test_firmware->size);
631 pr_err("failed to async load firmware\n");
636 mutex_unlock(&test_fw_mutex);
640 static DEVICE_ATTR_WO(trigger_custom_fallback);
642 static int test_fw_run_batch_request(void *data)
644 struct test_batched_req *req = data;
647 test_fw_config->test_result = -EINVAL;
651 if (test_fw_config->into_buf) {
654 test_buf = kzalloc(TEST_FIRMWARE_BUF_SIZE, GFP_KERNEL);
658 req->rc = request_firmware_into_buf(&req->fw,
662 TEST_FIRMWARE_BUF_SIZE);
666 req->rc = test_fw_config->req_firmware(&req->fw,
672 pr_info("#%u: batched sync load failed: %d\n",
674 if (!test_fw_config->test_result)
675 test_fw_config->test_result = req->rc;
676 } else if (req->fw) {
678 pr_info("#%u: batched sync loaded %zu\n",
679 req->idx, req->fw->size);
681 complete(&req->completion);
689 * We use a kthread as otherwise the kernel serializes all our sync requests
690 * and we would not be able to mimic batched requests on a sync call. Batched
691 * requests on a sync call can for instance happen on a device driver when
692 * multiple cards are used and firmware loading happens outside of probe.
694 static ssize_t trigger_batched_requests_store(struct device *dev,
695 struct device_attribute *attr,
696 const char *buf, size_t count)
698 struct test_batched_req *req;
702 mutex_lock(&test_fw_mutex);
704 test_fw_config->reqs =
705 vzalloc(array3_size(sizeof(struct test_batched_req),
706 test_fw_config->num_requests, 2));
707 if (!test_fw_config->reqs) {
712 pr_info("batched sync firmware loading '%s' %u times\n",
713 test_fw_config->name, test_fw_config->num_requests);
715 for (i = 0; i < test_fw_config->num_requests; i++) {
716 req = &test_fw_config->reqs[i];
719 req->name = test_fw_config->name;
721 init_completion(&req->completion);
722 req->task = kthread_run(test_fw_run_batch_request, req,
723 "%s-%u", KBUILD_MODNAME, req->idx);
724 if (!req->task || IS_ERR(req->task)) {
725 pr_err("Setting up thread %u failed\n", req->idx);
735 * We require an explicit release to enable more time and delay of
736 * calling release_firmware() to improve our chances of forcing a
737 * batched request. If we instead called release_firmware() right away
738 * then we might miss on an opportunity of having a successful firmware
739 * request pass on the opportunity to be come a batched request.
743 for (i = 0; i < test_fw_config->num_requests; i++) {
744 req = &test_fw_config->reqs[i];
745 if (req->task || req->sent)
746 wait_for_completion(&req->completion);
749 /* Override any worker error if we had a general setup error */
751 test_fw_config->test_result = rc;
754 mutex_unlock(&test_fw_mutex);
758 static DEVICE_ATTR_WO(trigger_batched_requests);
761 * We wait for each callback to return with the lock held, no need to lock here
763 static void trigger_batched_cb(const struct firmware *fw, void *context)
765 struct test_batched_req *req = context;
768 test_fw_config->test_result = -EINVAL;
772 /* forces *some* batched requests to queue up */
779 * Unfortunately the firmware API gives us nothing other than a null FW
780 * if the firmware was not found on async requests. Best we can do is
781 * just assume -ENOENT. A better API would pass the actual return
782 * value to the callback.
784 if (!fw && !test_fw_config->test_result)
785 test_fw_config->test_result = -ENOENT;
787 complete(&req->completion);
791 ssize_t trigger_batched_requests_async_store(struct device *dev,
792 struct device_attribute *attr,
793 const char *buf, size_t count)
795 struct test_batched_req *req;
800 mutex_lock(&test_fw_mutex);
802 test_fw_config->reqs =
803 vzalloc(array3_size(sizeof(struct test_batched_req),
804 test_fw_config->num_requests, 2));
805 if (!test_fw_config->reqs) {
810 pr_info("batched loading '%s' custom fallback mechanism %u times\n",
811 test_fw_config->name, test_fw_config->num_requests);
813 send_uevent = test_fw_config->send_uevent ? FW_ACTION_HOTPLUG :
816 for (i = 0; i < test_fw_config->num_requests; i++) {
817 req = &test_fw_config->reqs[i];
818 req->name = test_fw_config->name;
821 init_completion(&req->completion);
822 rc = request_firmware_nowait(THIS_MODULE, send_uevent,
824 dev, GFP_KERNEL, req,
827 pr_info("#%u: batched async load failed setup: %d\n",
840 * We require an explicit release to enable more time and delay of
841 * calling release_firmware() to improve our chances of forcing a
842 * batched request. If we instead called release_firmware() right away
843 * then we might miss on an opportunity of having a successful firmware
844 * request pass on the opportunity to be come a batched request.
847 for (i = 0; i < test_fw_config->num_requests; i++) {
848 req = &test_fw_config->reqs[i];
850 wait_for_completion(&req->completion);
853 /* Override any worker error if we had a general setup error */
855 test_fw_config->test_result = rc;
858 mutex_unlock(&test_fw_mutex);
862 static DEVICE_ATTR_WO(trigger_batched_requests_async);
864 static ssize_t test_result_show(struct device *dev,
865 struct device_attribute *attr,
868 return test_dev_config_show_int(buf, test_fw_config->test_result);
870 static DEVICE_ATTR_RO(test_result);
872 static ssize_t release_all_firmware_store(struct device *dev,
873 struct device_attribute *attr,
874 const char *buf, size_t count)
876 test_release_all_firmware();
879 static DEVICE_ATTR_WO(release_all_firmware);
881 static ssize_t read_firmware_show(struct device *dev,
882 struct device_attribute *attr,
885 struct test_batched_req *req;
889 mutex_lock(&test_fw_mutex);
891 idx = test_fw_config->read_fw_idx;
892 if (idx >= test_fw_config->num_requests) {
897 if (!test_fw_config->reqs) {
902 req = &test_fw_config->reqs[idx];
904 pr_err("#%u: failed to async load firmware\n", idx);
909 pr_info("#%u: loaded %zu\n", idx, req->fw->size);
911 if (req->fw->size > PAGE_SIZE) {
912 pr_err("Testing interface must use PAGE_SIZE firmware for now\n");
916 memcpy(buf, req->fw->data, req->fw->size);
920 mutex_unlock(&test_fw_mutex);
924 static DEVICE_ATTR_RO(read_firmware);
926 #define TEST_FW_DEV_ATTR(name) &dev_attr_##name.attr
928 static struct attribute *test_dev_attrs[] = {
929 TEST_FW_DEV_ATTR(reset),
931 TEST_FW_DEV_ATTR(config),
932 TEST_FW_DEV_ATTR(config_name),
933 TEST_FW_DEV_ATTR(config_num_requests),
934 TEST_FW_DEV_ATTR(config_into_buf),
935 TEST_FW_DEV_ATTR(config_sync_direct),
936 TEST_FW_DEV_ATTR(config_send_uevent),
937 TEST_FW_DEV_ATTR(config_read_fw_idx),
939 /* These don't use the config at all - they could be ported! */
940 TEST_FW_DEV_ATTR(trigger_request),
941 TEST_FW_DEV_ATTR(trigger_async_request),
942 TEST_FW_DEV_ATTR(trigger_custom_fallback),
943 #ifdef CONFIG_EFI_EMBEDDED_FIRMWARE
944 TEST_FW_DEV_ATTR(trigger_request_platform),
947 /* These use the config and can use the test_result */
948 TEST_FW_DEV_ATTR(trigger_batched_requests),
949 TEST_FW_DEV_ATTR(trigger_batched_requests_async),
951 TEST_FW_DEV_ATTR(release_all_firmware),
952 TEST_FW_DEV_ATTR(test_result),
953 TEST_FW_DEV_ATTR(read_firmware),
957 ATTRIBUTE_GROUPS(test_dev);
959 static struct miscdevice test_fw_misc_device = {
960 .minor = MISC_DYNAMIC_MINOR,
961 .name = "test_firmware",
962 .fops = &test_fw_fops,
963 .groups = test_dev_groups,
966 static int __init test_firmware_init(void)
970 test_fw_config = kzalloc(sizeof(struct test_config), GFP_KERNEL);
974 rc = __test_firmware_config_init();
976 kfree(test_fw_config);
977 pr_err("could not init firmware test config: %d\n", rc);
981 rc = misc_register(&test_fw_misc_device);
983 kfree(test_fw_config);
984 pr_err("could not register misc device: %d\n", rc);
988 pr_warn("interface ready\n");
993 module_init(test_firmware_init);
995 static void __exit test_firmware_exit(void)
997 mutex_lock(&test_fw_mutex);
998 release_firmware(test_firmware);
999 misc_deregister(&test_fw_misc_device);
1000 __test_firmware_config_free();
1001 kfree(test_fw_config);
1002 mutex_unlock(&test_fw_mutex);
1004 pr_warn("removed interface\n");
1007 module_exit(test_firmware_exit);
1009 MODULE_AUTHOR("Kees Cook <keescook@chromium.org>");
1010 MODULE_LICENSE("GPL");