/* * livepatch_main.c - kernel live patch main infrastructure * * Copyright (c) 2014 SUSE * Author: Miroslav Benes * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ #include #include #include #include "uname_patch/livepatch_uname.h" /* Auto expanded KLP_PATCHES_INCLUDES: */ #include "bsc1230998/livepatch_bsc1230998.h" #include "bsc1231196/livepatch_bsc1231196.h" #include "bsc1231204/livepatch_bsc1231204.h" #include "bsc1231993/livepatch_bsc1231993.h" #include "bsc1232900/livepatch_bsc1232900.h" #include "bsc1232908/livepatch_bsc1232908.h" #include "bsc1232927/livepatch_bsc1232927.h" #include "bsc1232929/livepatch_bsc1232929.h" #include "bsc1233019/livepatch_bsc1233019.h" #include "bsc1233118/livepatch_bsc1233118.h" #include "bsc1233227/livepatch_bsc1233227.h" #include "bsc1233245/livepatch_bsc1233245.h" #include "bsc1233677/livepatch_bsc1233677.h" #include "bsc1233678/livepatch_bsc1233678.h" #include "bsc1233679/livepatch_bsc1233679.h" #include "bsc1233680/livepatch_bsc1233680.h" #include "bsc1233708/livepatch_bsc1233708.h" #include "bsc1234847/livepatch_bsc1234847.h" #include "bsc1234854/livepatch_bsc1234854.h" #include "bsc1234885/livepatch_bsc1234885.h" #include "bsc1234892/livepatch_bsc1234892.h" #include "bsc1235005/livepatch_bsc1235005.h" #include "bsc1235008/livepatch_bsc1235008.h" #include "bsc1235062/livepatch_bsc1235062.h" #include "bsc1235086/livepatch_bsc1235086.h" #include "bsc1235129/livepatch_bsc1235129.h" #include "bsc1235218/livepatch_bsc1235218.h" #include "bsc1235231/livepatch_bsc1235231.h" #include "bsc1235250/livepatch_bsc1235250.h" #include "bsc1235431/livepatch_bsc1235431.h" #include "bsc1235452/livepatch_bsc1235452.h" #include "bsc1235769/livepatch_bsc1235769.h" #include "bsc1235916/livepatch_bsc1235916.h" #include "bsc1235921/livepatch_bsc1235921.h" #include "bsc1236244/livepatch_bsc1236244.h" #include "bsc1236701/livepatch_bsc1236701.h" #include "bsc1236783/livepatch_bsc1236783.h" #include "bsc1238912/livepatch_bsc1238912.h" #include "bsc1239077/livepatch_bsc1239077.h" #include "bsc1239096/livepatch_bsc1239096.h" #include "bsc1240840/livepatch_bsc1240840.h" #include "bsc1241579/livepatch_bsc1241579.h" #include "bsc1243648/livepatch_bsc1243648.h" #include "bsc1245793/livepatch_bsc1245793.h" #include "bsc1245797/livepatch_bsc1245797.h" #include "bsc1245804/livepatch_bsc1245804.h" static struct klp_object objs[] = { /* Auto expanded KLP_PATCHES_OBJS: */ { .name = NULL, .funcs = (struct klp_func[]) { { .old_name = __stringify(KLP_SYSCALL_SYM(newuname)), .new_func = KLP_SYSCALL_SYM(klp_newuname), }, #ifdef KLP_ARCH_HAS_SYSCALL_COMPAT_STUBS { .old_name = __stringify(KLP_SYSCALL_COMPAT_STUB_SYM(newuname)), .new_func = KLP_SYSCALL_COMPAT_STUB_SYM(klp_newuname), }, #endif { .old_name = __stringify(tcp_rearm_rto), .new_func = klpp_tcp_rearm_rto, }, { .old_name = __stringify(tcp_schedule_loss_probe), .new_func = klpp_tcp_schedule_loss_probe, }, { .old_name = __stringify(dax_file_unshare), .new_func = klpp_dax_file_unshare, }, #if IS_ENABLED(CONFIG_HID) { .old_name = __stringify(hid_alloc_report_buf), .new_func = klpp_hid_alloc_report_buf, }, #endif { .old_name = __stringify(search_nested_keyrings), .new_func = klpp_search_nested_keyrings, }, { .old_name = __stringify(bfq_limit_depth), .new_func = klpp_bfq_limit_depth, }, { .old_name = __stringify(inet6_create), .new_func = klpp_inet6_create, }, { .old_name = __stringify(inet_create), .new_func = klpp_inet_create, }, { .old_name = __stringify(sock_map_remove_links), .new_func = klpp_sock_map_remove_links, }, { .old_name = __stringify(sock_map_delete_elem), .new_func = klpp_sock_map_delete_elem, }, { .old_name = __stringify(mptcp_established_options), .new_func = klpp_mptcp_established_options, }, { .old_name = __stringify(mac_partition), .new_func = klpp_mac_partition, }, { .old_name = __stringify(pfifo_tail_enqueue), .new_func = klpp_pfifo_tail_enqueue, }, { .old_name = __stringify(find_equal_scalars), .new_func = klpp_find_equal_scalars, }, { } } }, #if IS_ENABLED(CONFIG_DRM_AMDGPU) { .name = "amdgpu", .funcs = (struct klp_func[]) { { .old_name = __stringify(rn_notify_wm_ranges), .new_func = klpp_rn_notify_wm_ranges, }, { .old_name = __stringify(dal_gpio_service_open), .new_func = klpp_dal_gpio_service_open, }, { .old_name = __stringify(dal_gpio_service_lock), .new_func = klpp_dal_gpio_service_lock, }, { .old_name = __stringify(dal_gpio_service_close), .new_func = klpp_dal_gpio_service_close, }, { .old_name = __stringify(dal_gpio_service_unlock), .new_func = klpp_dal_gpio_service_unlock, }, { } } }, #endif #if IS_ENABLED(CONFIG_ATH9K_HTC) { .name = "ath9k_htc", .funcs = (struct klp_func[]) { { .old_name = __stringify(htc_connect_service), .new_func = klpp_htc_connect_service, }, { } } }, #endif #if IS_ENABLED(CONFIG_BT) { .name = "bluetooth", .funcs = (struct klp_func[]) { { .old_name = __stringify(iso_sock_timeout), .new_func = klpp_iso_sock_timeout, }, { .old_name = __stringify(iso_conn_del), .new_func = klpp_iso_conn_del, }, { .old_name = __stringify(sco_sock_timeout), .new_func = klpp_sco_sock_timeout, }, { .old_name = __stringify(sco_conn_del), .new_func = klpp_sco_conn_del, }, { .old_name = __stringify(l2cap_sock_create), .new_func = klpp_l2cap_sock_create, }, { .old_name = __stringify(l2cap_sock_new_connection_cb), .new_func = klpp_l2cap_sock_new_connection_cb, }, { .old_name = __stringify(mgmt_set_powered_complete), .new_func = klpp_mgmt_set_powered_complete, }, { .old_name = __stringify(set_powered_sync), .new_func = klpp_set_powered_sync, }, { .old_name = __stringify(mgmt_remove_adv_monitor_complete), .new_func = klpp_mgmt_remove_adv_monitor_complete, }, { .old_name = __stringify(mgmt_remove_adv_monitor_sync), .new_func = klpp_mgmt_remove_adv_monitor_sync, }, { .old_name = __stringify(hci_event_packet), .new_func = klpp_hci_event_packet, }, { } } }, #endif #if IS_ENABLED(CONFIG_INFINIBAND_BNXT_RE) { .name = "bnxt_re", .funcs = (struct klp_func[]) { { .old_name = __stringify(bnxt_qplib_alloc_init_hwq), .new_func = klpp_bnxt_qplib_alloc_init_hwq, }, { } } }, #endif { .name = "btrfs", .funcs = (struct klp_func[]) { { .old_name = __stringify(btrfs_encoded_read_endio), .new_func = klpp_btrfs_encoded_read_endio, }, { .old_name = __stringify(btrfs_create_pending_block_groups), .new_func = klpp_btrfs_create_pending_block_groups, }, { } } }, { .name = "dm_cache", .funcs = (struct klp_func[]) { { .old_name = __stringify(cache_preresume), .new_func = klpp_cache_preresume, }, { } } }, { .name = "hsr", .funcs = (struct klp_func[]) { { .old_name = __stringify(hsr_forward_skb), .new_func = klpp_hsr_forward_skb, }, { } } }, { .name = "ip_gre", .funcs = (struct klp_func[]) { { .old_name = __stringify(gre_fill_metadata_dst), .new_func = klpp_gre_fill_metadata_dst, }, { } } }, { .name = "ip_tunnel", .funcs = (struct klp_func[]) { { .old_name = __stringify(ip_tunnel_xmit), .new_func = klpp_ip_tunnel_xmit, }, { .old_name = __stringify(ip_md_tunnel_xmit), .new_func = klpp_ip_md_tunnel_xmit, }, { .old_name = __stringify(ip_tunnel_bind_dev), .new_func = klpp_ip_tunnel_bind_dev, }, { } } }, #if IS_ENABLED(CONFIG_IWLMVM) { .name = "iwlmvm", .funcs = (struct klp_func[]) { { .old_name = __stringify(iwl_mvm_mac_remove_interface), .new_func = klpp_iwl_mvm_mac_remove_interface, }, { } } }, #endif #if IS_ENABLED(CONFIG_KVM_AMD) { .name = "kvm_amd", .funcs = (struct klp_func[]) { { .old_name = __stringify(nested_svm_get_tdp_pdptr), .new_func = klpp_nested_svm_get_tdp_pdptr, }, { } } }, #endif { .name = "mlxsw_spectrum", .funcs = (struct klp_func[]) { { .old_name = __stringify(mlxsw_sp_span_gretap4_route), .new_func = klpp_mlxsw_sp_span_gretap4_route, }, { } } }, { .name = "nbd", .funcs = (struct klp_func[]) { { .old_name = __stringify(nbd_xmit_timeout), .new_func = klpp_nbd_xmit_timeout, }, { .old_name = __stringify(nbd_queue_rq), .new_func = klpp_nbd_queue_rq, }, { } } }, #if IS_ENABLED(CONFIG_BT) { .name = "net/bluetooth/bluetooth", .funcs = (struct klp_func[]) { { .old_name = __stringify(hci_conn_del_sysfs), .new_func = klpp_hci_conn_del_sysfs, }, { } } }, #endif { .name = "nfsd", .funcs = (struct klp_func[]) { { .old_name = __stringify(decode_cb_compound4res), .new_func = klpp_decode_cb_compound4res, }, { .old_name = __stringify(e_show), .new_func = klpp_e_show, }, { } } }, { .name = "nfsv4", .funcs = (struct klp_func[]) { { .old_name = __stringify(nfs4_open_release), .new_func = klpp_nfs4_open_release, }, { } } }, { .name = "pktgen", .funcs = (struct klp_func[]) { { .old_name = __stringify(pktgen_if_write), .new_func = klpp_pktgen_if_write, }, { } } }, { .name = "sch_hfsc", .funcs = (struct klp_func[]) { { .old_name = __stringify(hfsc_change_class), .new_func = klpp_hfsc_change_class, }, { } } }, { .name = "sch_netem", .funcs = (struct klp_func[]) { { .old_name = __stringify(netem_enqueue), .new_func = klpp_netem_enqueue, }, { } } }, { .name = "sch_sfq", .funcs = (struct klp_func[]) { { .old_name = __stringify(sfq_init), .new_func = klpp_sfq_init, }, { } } }, { .name = "sch_taprio", .funcs = (struct klp_func[]) { { .old_name = __stringify(taprio_change), .new_func = klpp_taprio_change, }, { } } }, #if IS_ENABLED(CONFIG_SND_SEQUENCER_OSS) { .name = "snd_seq_oss", .funcs = (struct klp_func[]) { { .old_name = __stringify(snd_seq_oss_synth_sysex), .new_func = klpp_snd_seq_oss_synth_sysex, }, { } } }, #endif #if IS_ENABLED(CONFIG_TDX_GUEST_DRIVER) { .name = "tdx_guest", .funcs = (struct klp_func[]) { { .old_name = __stringify(tdx_guest_init), .new_func = klpp_tdx_guest_init, }, { } } }, #endif #if IS_ENABLED(CONFIG_USB_VIDEO_CLASS) { .name = "uvcvideo", .funcs = (struct klp_func[]) { { .old_name = __stringify(uvc_parse_format), .new_func = klpp_uvc_parse_format, }, { } } }, #endif { .name = "vfio_pci_core", .funcs = (struct klp_func[]) { { .old_name = __stringify(vfio_pci_config_rw), .new_func = klpp_vfio_pci_config_rw, }, { } } }, { .name = "virtio_net", .funcs = (struct klp_func[]) { { .old_name = __stringify(virtnet_probe), .new_func = klpp_virtnet_probe, }, { } } }, { .name = "x_tables", .funcs = (struct klp_func[]) { { .old_name = __stringify(xt_find_table_lock), .new_func = klpp_xt_find_table_lock, }, { } } }, #if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_LED) { .name = "xt_LED", .funcs = (struct klp_func[]) { { .old_name = __stringify(led_tg_check), .new_func = klpp_led_tg_check, }, { } } }, #endif { } }; static struct klp_patch patch = { .mod = THIS_MODULE, .objs = objs, .replace = true, }; static int __init klp_patch_init(void) { int retval; pr_info("livepatch: initializing\n"); /* Auto expanded KLP_PATCHES_INIT_CALLS: */ retval = livepatch_bsc1230998_init(); if (retval) goto err_bsc1230998; retval = livepatch_bsc1231196_init(); if (retval) goto err_bsc1231196; retval = livepatch_bsc1231204_init(); if (retval) goto err_bsc1231204; retval = livepatch_bsc1231993_init(); if (retval) goto err_bsc1231993; retval = livepatch_bsc1232900_init(); if (retval) goto err_bsc1232900; retval = livepatch_bsc1232908_init(); if (retval) goto err_bsc1232908; retval = livepatch_bsc1232927_init(); if (retval) goto err_bsc1232927; retval = livepatch_bsc1232929_init(); if (retval) goto err_bsc1232929; retval = livepatch_bsc1233019_init(); if (retval) goto err_bsc1233019; retval = livepatch_bsc1233118_init(); if (retval) goto err_bsc1233118; retval = livepatch_bsc1233227_init(); if (retval) goto err_bsc1233227; retval = livepatch_bsc1233245_init(); if (retval) goto err_bsc1233245; retval = livepatch_bsc1233677_init(); if (retval) goto err_bsc1233677; retval = livepatch_bsc1233678_init(); if (retval) goto err_bsc1233678; retval = livepatch_bsc1233679_init(); if (retval) goto err_bsc1233679; retval = livepatch_bsc1233680_init(); if (retval) goto err_bsc1233680; retval = livepatch_bsc1233708_init(); if (retval) goto err_bsc1233708; retval = livepatch_bsc1234847_init(); if (retval) goto err_bsc1234847; retval = livepatch_bsc1234854_init(); if (retval) goto err_bsc1234854; retval = livepatch_bsc1234885_init(); if (retval) goto err_bsc1234885; retval = livepatch_bsc1234892_init(); if (retval) goto err_bsc1234892; retval = livepatch_bsc1235005_init(); if (retval) goto err_bsc1235005; retval = livepatch_bsc1235008_init(); if (retval) goto err_bsc1235008; retval = livepatch_bsc1235062_init(); if (retval) goto err_bsc1235062; retval = livepatch_bsc1235086_init(); if (retval) goto err_bsc1235086; retval = livepatch_bsc1235129_init(); if (retval) goto err_bsc1235129; retval = livepatch_bsc1235218_init(); if (retval) goto err_bsc1235218; retval = livepatch_bsc1235231_init(); if (retval) goto err_bsc1235231; retval = livepatch_bsc1235250_init(); if (retval) goto err_bsc1235250; retval = livepatch_bsc1235431_init(); if (retval) goto err_bsc1235431; retval = livepatch_bsc1235452_init(); if (retval) goto err_bsc1235452; retval = livepatch_bsc1235769_init(); if (retval) goto err_bsc1235769; retval = livepatch_bsc1235916_init(); if (retval) goto err_bsc1235916; retval = livepatch_bsc1235921_init(); if (retval) goto err_bsc1235921; retval = livepatch_bsc1236244_init(); if (retval) goto err_bsc1236244; retval = livepatch_bsc1236701_init(); if (retval) goto err_bsc1236701; retval = livepatch_bsc1236783_init(); if (retval) goto err_bsc1236783; retval = livepatch_bsc1238912_init(); if (retval) goto err_bsc1238912; retval = livepatch_bsc1239077_init(); if (retval) goto err_bsc1239077; retval = livepatch_bsc1239096_init(); if (retval) goto err_bsc1239096; retval = livepatch_bsc1240840_init(); if (retval) goto err_bsc1240840; retval = livepatch_bsc1241579_init(); if (retval) goto err_bsc1241579; retval = livepatch_bsc1243648_init(); if (retval) goto err_bsc1243648; retval = livepatch_bsc1245793_init(); if (retval) goto err_bsc1245793; retval = livepatch_bsc1245797_init(); if (retval) goto err_bsc1245797; retval = livepatch_bsc1245804_init(); if (retval) goto err_bsc1245804; retval = klp_enable_patch(&patch); if (!retval) return retval; /* Auto expanded KLP_PATCHES_INIT_ERR_HANDLERS: */ livepatch_bsc1245804_cleanup(); err_bsc1245804: livepatch_bsc1245797_cleanup(); err_bsc1245797: livepatch_bsc1245793_cleanup(); err_bsc1245793: livepatch_bsc1243648_cleanup(); err_bsc1243648: livepatch_bsc1241579_cleanup(); err_bsc1241579: livepatch_bsc1240840_cleanup(); err_bsc1240840: livepatch_bsc1239096_cleanup(); err_bsc1239096: livepatch_bsc1239077_cleanup(); err_bsc1239077: livepatch_bsc1238912_cleanup(); err_bsc1238912: livepatch_bsc1236783_cleanup(); err_bsc1236783: livepatch_bsc1236701_cleanup(); err_bsc1236701: livepatch_bsc1236244_cleanup(); err_bsc1236244: livepatch_bsc1235921_cleanup(); err_bsc1235921: livepatch_bsc1235916_cleanup(); err_bsc1235916: livepatch_bsc1235769_cleanup(); err_bsc1235769: livepatch_bsc1235452_cleanup(); err_bsc1235452: livepatch_bsc1235431_cleanup(); err_bsc1235431: livepatch_bsc1235250_cleanup(); err_bsc1235250: livepatch_bsc1235231_cleanup(); err_bsc1235231: livepatch_bsc1235218_cleanup(); err_bsc1235218: livepatch_bsc1235129_cleanup(); err_bsc1235129: livepatch_bsc1235086_cleanup(); err_bsc1235086: livepatch_bsc1235062_cleanup(); err_bsc1235062: livepatch_bsc1235008_cleanup(); err_bsc1235008: livepatch_bsc1235005_cleanup(); err_bsc1235005: livepatch_bsc1234892_cleanup(); err_bsc1234892: livepatch_bsc1234885_cleanup(); err_bsc1234885: livepatch_bsc1234854_cleanup(); err_bsc1234854: livepatch_bsc1234847_cleanup(); err_bsc1234847: livepatch_bsc1233708_cleanup(); err_bsc1233708: livepatch_bsc1233680_cleanup(); err_bsc1233680: livepatch_bsc1233679_cleanup(); err_bsc1233679: livepatch_bsc1233678_cleanup(); err_bsc1233678: livepatch_bsc1233677_cleanup(); err_bsc1233677: livepatch_bsc1233245_cleanup(); err_bsc1233245: livepatch_bsc1233227_cleanup(); err_bsc1233227: livepatch_bsc1233118_cleanup(); err_bsc1233118: livepatch_bsc1233019_cleanup(); err_bsc1233019: livepatch_bsc1232929_cleanup(); err_bsc1232929: livepatch_bsc1232927_cleanup(); err_bsc1232927: livepatch_bsc1232908_cleanup(); err_bsc1232908: livepatch_bsc1232900_cleanup(); err_bsc1232900: livepatch_bsc1231993_cleanup(); err_bsc1231993: livepatch_bsc1231204_cleanup(); err_bsc1231204: livepatch_bsc1231196_cleanup(); err_bsc1231196: livepatch_bsc1230998_cleanup(); err_bsc1230998: return retval; } static void __exit klp_patch_cleanup(void) { pr_info("livepatch: removed\n"); /* Auto expanded KLP_PATCHES_CLEANUP_CALLS: */ livepatch_bsc1230998_cleanup(); livepatch_bsc1231196_cleanup(); livepatch_bsc1231204_cleanup(); livepatch_bsc1231993_cleanup(); livepatch_bsc1232900_cleanup(); livepatch_bsc1232908_cleanup(); livepatch_bsc1232927_cleanup(); livepatch_bsc1232929_cleanup(); livepatch_bsc1233019_cleanup(); livepatch_bsc1233118_cleanup(); livepatch_bsc1233227_cleanup(); livepatch_bsc1233245_cleanup(); livepatch_bsc1233677_cleanup(); livepatch_bsc1233678_cleanup(); livepatch_bsc1233679_cleanup(); livepatch_bsc1233680_cleanup(); livepatch_bsc1233708_cleanup(); livepatch_bsc1234847_cleanup(); livepatch_bsc1234854_cleanup(); livepatch_bsc1234885_cleanup(); livepatch_bsc1234892_cleanup(); livepatch_bsc1235005_cleanup(); livepatch_bsc1235008_cleanup(); livepatch_bsc1235062_cleanup(); livepatch_bsc1235086_cleanup(); livepatch_bsc1235129_cleanup(); livepatch_bsc1235218_cleanup(); livepatch_bsc1235231_cleanup(); livepatch_bsc1235250_cleanup(); livepatch_bsc1235431_cleanup(); livepatch_bsc1235452_cleanup(); livepatch_bsc1235769_cleanup(); livepatch_bsc1235916_cleanup(); livepatch_bsc1235921_cleanup(); livepatch_bsc1236244_cleanup(); livepatch_bsc1236701_cleanup(); livepatch_bsc1236783_cleanup(); livepatch_bsc1238912_cleanup(); livepatch_bsc1239077_cleanup(); livepatch_bsc1239096_cleanup(); livepatch_bsc1240840_cleanup(); livepatch_bsc1241579_cleanup(); livepatch_bsc1243648_cleanup(); livepatch_bsc1245793_cleanup(); livepatch_bsc1245797_cleanup(); livepatch_bsc1245804_cleanup(); } module_init(klp_patch_init); module_exit(klp_patch_cleanup); MODULE_LICENSE("GPL"); MODULE_INFO(livepatch, "Y"); MODULE_INFO(klpgitrev, "80f0135cb09f4bb436ad31979920fe90ec8566fa");