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