1dbb60c8aSBenjamin Tissoires // SPDX-License-Identifier: GPL-2.0 2dbb60c8aSBenjamin Tissoires /* Copyright (c) 2022 Red hat */ 3dbb60c8aSBenjamin Tissoires #include "vmlinux.h" 4dbb60c8aSBenjamin Tissoires #include <bpf/bpf_helpers.h> 5dbb60c8aSBenjamin Tissoires #include <bpf/bpf_tracing.h> 6dbb60c8aSBenjamin Tissoires #include "hid_bpf_helpers.h" 7dbb60c8aSBenjamin Tissoires 8dbb60c8aSBenjamin Tissoires char _license[] SEC("license") = "GPL"; 9dbb60c8aSBenjamin Tissoires 10dbb60c8aSBenjamin Tissoires struct attach_prog_args { 11dbb60c8aSBenjamin Tissoires int prog_fd; 12dbb60c8aSBenjamin Tissoires unsigned int hid; 13dbb60c8aSBenjamin Tissoires int retval; 14dbb60c8aSBenjamin Tissoires }; 15dbb60c8aSBenjamin Tissoires 16dbb60c8aSBenjamin Tissoires __u64 callback_check = 52; 17dbb60c8aSBenjamin Tissoires __u64 callback2_check = 52; 18dbb60c8aSBenjamin Tissoires 19dbb60c8aSBenjamin Tissoires SEC("?fmod_ret/hid_bpf_device_event") 20dbb60c8aSBenjamin Tissoires int BPF_PROG(hid_first_event, struct hid_bpf_ctx *hid_ctx) 21dbb60c8aSBenjamin Tissoires { 22dbb60c8aSBenjamin Tissoires __u8 *rw_data = hid_bpf_get_data(hid_ctx, 0 /* offset */, 3 /* size */); 23dbb60c8aSBenjamin Tissoires 24dbb60c8aSBenjamin Tissoires if (!rw_data) 25dbb60c8aSBenjamin Tissoires return 0; /* EPERM check */ 26dbb60c8aSBenjamin Tissoires 27dbb60c8aSBenjamin Tissoires callback_check = rw_data[1]; 28dbb60c8aSBenjamin Tissoires 29dbb60c8aSBenjamin Tissoires rw_data[2] = rw_data[1] + 5; 30dbb60c8aSBenjamin Tissoires 31*0330f725SBenjamin Tissoires return hid_ctx->size; 32*0330f725SBenjamin Tissoires } 33*0330f725SBenjamin Tissoires 34*0330f725SBenjamin Tissoires SEC("?fmod_ret/hid_bpf_device_event") 35*0330f725SBenjamin Tissoires int BPF_PROG(hid_change_report_id, struct hid_bpf_ctx *hid_ctx) 36*0330f725SBenjamin Tissoires { 37*0330f725SBenjamin Tissoires __u8 *rw_data = hid_bpf_get_data(hid_ctx, 0 /* offset */, 3 /* size */); 38*0330f725SBenjamin Tissoires 39*0330f725SBenjamin Tissoires if (!rw_data) 40*0330f725SBenjamin Tissoires return 0; /* EPERM check */ 41*0330f725SBenjamin Tissoires 42*0330f725SBenjamin Tissoires rw_data[0] = 2; 43*0330f725SBenjamin Tissoires 44*0330f725SBenjamin Tissoires return 9; 45dbb60c8aSBenjamin Tissoires } 46dbb60c8aSBenjamin Tissoires 47dbb60c8aSBenjamin Tissoires SEC("syscall") 48dbb60c8aSBenjamin Tissoires int attach_prog(struct attach_prog_args *ctx) 49dbb60c8aSBenjamin Tissoires { 50dbb60c8aSBenjamin Tissoires ctx->retval = hid_bpf_attach_prog(ctx->hid, 51dbb60c8aSBenjamin Tissoires ctx->prog_fd, 52dbb60c8aSBenjamin Tissoires 0); 53dbb60c8aSBenjamin Tissoires return 0; 54dbb60c8aSBenjamin Tissoires } 55