/* * Copyright 2011-2016 by Emese Revfy * Licensed under the GPL v2, or (at your option) v3 * * Homepage: * https://github.com/ephox-gcc-plugins/sancov * * This plugin inserts a __sanitizer_cov_trace_pc() call at the start of basic blocks. * It supports all gcc versions with plugin support (from gcc-4.5 on). * It is based on the commit "Add fuzzing coverage support" by Dmitry Vyukov . * * You can read about it more here: * https://gcc.gnu.org/viewcvs/gcc?limit_changes=0&view=revision&revision=231296 * http://lwn.net/Articles/674854/ * https://github.com/google/syzkaller * https://lwn.net/Articles/677764/ * * Usage: * make run */ #include "gcc-common.h" __visible int plugin_is_GPL_compatible; tree sancov_fndecl; static struct plugin_info sancov_plugin_info = { .version = "20160402", .help = "sancov plugin\n", }; static unsigned int sancov_execute(void) { basic_block bb; /* Remove this line when this plugin and kcov will be in the kernel. if (!strcmp(DECL_NAME_POINTER(current_function_decl), DECL_NAME_POINTER(sancov_fndecl))) return 0; */ FOR_EACH_BB_FN(bb, cfun) { const_gimple stmt; gcall *gcall; gimple_stmt_iterator gsi = gsi_after_labels(bb); if (gsi_end_p(gsi)) continue; stmt = gsi_stmt(gsi); gcall = as_a_gcall(gimple_build_call(sancov_fndecl, 0)); gimple_set_location(gcall, gimple_location(stmt)); gsi_insert_before(&gsi, gcall, GSI_SAME_STMT); } return 0; } #define PASS_NAME sancov #define NO_GATE #define TODO_FLAGS_FINISH TODO_dump_func | TODO_verify_stmts | TODO_update_ssa_no_phi | TODO_verify_flow #include "gcc-generate-gimple-pass.h" static void sancov_start_unit(void __unused *gcc_data, void __unused *user_data) { tree leaf_attr, nothrow_attr; tree BT_FN_VOID = build_function_type_list(void_type_node, NULL_TREE); sancov_fndecl = build_fn_decl("__sanitizer_cov_trace_pc", BT_FN_VOID); DECL_ASSEMBLER_NAME(sancov_fndecl); TREE_PUBLIC(sancov_fndecl) = 1; DECL_EXTERNAL(sancov_fndecl) = 1; DECL_ARTIFICIAL(sancov_fndecl) = 1; DECL_PRESERVE_P(sancov_fndecl) = 1; DECL_UNINLINABLE(sancov_fndecl) = 1; TREE_USED(sancov_fndecl) = 1; nothrow_attr = tree_cons(get_identifier("nothrow"), NULL, NULL); decl_attributes(&sancov_fndecl, nothrow_attr, 0); gcc_assert(TREE_NOTHROW(sancov_fndecl)); #if BUILDING_GCC_VERSION > 4005 leaf_attr = tree_cons(get_identifier("leaf"), NULL, NULL); decl_attributes(&sancov_fndecl, leaf_attr, 0); #endif } __visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) { int i; struct register_pass_info sancov_plugin_pass_info; const char * const plugin_name = plugin_info->base_name; const int argc = plugin_info->argc; const struct plugin_argument * const argv = plugin_info->argv; bool enable = true; static const struct ggc_root_tab gt_ggc_r_gt_sancov[] = { { .base = &sancov_fndecl, .nelt = 1, .stride = sizeof(sancov_fndecl), .cb = >_ggc_mx_tree_node, .pchw = >_pch_nx_tree_node }, LAST_GGC_ROOT_TAB }; /* BBs can be split afterwards?? */ sancov_plugin_pass_info.pass = make_sancov_pass(); #if BUILDING_GCC_VERSION >= 4009 sancov_plugin_pass_info.reference_pass_name = "asan"; #else sancov_plugin_pass_info.reference_pass_name = "nrv"; #endif sancov_plugin_pass_info.ref_pass_instance_number = 0; sancov_plugin_pass_info.pos_op = PASS_POS_INSERT_BEFORE; if (!plugin_default_version_check(version, &gcc_version)) { error(G_("incompatible gcc/plugin versions")); return 1; } for (i = 0; i < argc; ++i) { if (!strcmp(argv[i].key, "no-sancov")) { enable = false; continue; } error(G_("unknown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); } register_callback(plugin_name, PLUGIN_INFO, NULL, &sancov_plugin_info); if (!enable) return 0; #if BUILDING_GCC_VERSION < 6000 register_callback(plugin_name, PLUGIN_START_UNIT, &sancov_start_unit, NULL); register_callback(plugin_name, PLUGIN_REGISTER_GGC_ROOTS, NULL, (void *)>_ggc_r_gt_sancov); register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &sancov_plugin_pass_info); #endif return 0; } ption>space:mode:
authorChristoph Hellwig <hch@lst.de>2017-01-30 13:15:41 +0100
committerBjorn Helgaas <bhelgaas@google.com>2017-02-02 10:35:46 -0600
commitdfef358bd1beb4e7b5c94eca944be9cd23dfc752 (patch)
treeb9a2afb38a4c2ac8ad31f49ec0d71fe9e5b1994c /net/dccp/sysctl.c
parent030305d69fc6963c16003f50d7e8d74b02d0a143 (diff)
PCI/MSI: Don't apply affinity if there aren't enough vectors left
Bart reported a problem wіth an out of bounds access in the low-level IRQ affinity code, which we root caused to the qla2xxx driver assigning all its MSI-X vectors to the pre and post vectors, and not having any left for the actually spread IRQs. Fix this issue by not asking for affinity assignment when there are no vectors to assign left. Fixes: 402723ad5c62 ("PCI/MSI: Provide pci_alloc_irq_vectors_affinity()") Link: https://lkml.kernel.org/r/1485359225.3093.3.camel@sandisk.com Reported-by: Bart Van Assche <bart.vanassche@sandisk.com> Tested-by: Bart Van Assche <bart.vanassche@sandisk.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'net/dccp/sysctl.c')