diff options
Diffstat (limited to 'tools/testing/selftests/hid/progs/hid.c')
| -rw-r--r-- | tools/testing/selftests/hid/progs/hid.c | 46 | 
1 files changed, 46 insertions, 0 deletions
diff --git a/tools/testing/selftests/hid/progs/hid.c b/tools/testing/selftests/hid/progs/hid.c index 1e558826b809..f67d35def142 100644 --- a/tools/testing/selftests/hid/progs/hid.c +++ b/tools/testing/selftests/hid/progs/hid.c @@ -101,6 +101,52 @@ int hid_user_raw_request(struct hid_hw_request_syscall_args *args)  	return 0;  } +SEC("syscall") +int hid_user_output_report(struct hid_hw_request_syscall_args *args) +{ +	struct hid_bpf_ctx *ctx; +	const size_t size = args->size; +	int i, ret = 0; + +	if (size > sizeof(args->data)) +		return -7; /* -E2BIG */ + +	ctx = hid_bpf_allocate_context(args->hid); +	if (!ctx) +		return -1; /* EPERM check */ + +	ret = hid_bpf_hw_output_report(ctx, +				       args->data, +				       size); +	args->retval = ret; + +	hid_bpf_release_context(ctx); + +	return 0; +} + +SEC("syscall") +int hid_user_input_report(struct hid_hw_request_syscall_args *args) +{ +	struct hid_bpf_ctx *ctx; +	const size_t size = args->size; +	int i, ret = 0; + +	if (size > sizeof(args->data)) +		return -7; /* -E2BIG */ + +	ctx = hid_bpf_allocate_context(args->hid); +	if (!ctx) +		return -1; /* EPERM check */ + +	ret = hid_bpf_input_report(ctx, HID_INPUT_REPORT, args->data, size); +	args->retval = ret; + +	hid_bpf_release_context(ctx); + +	return 0; +} +  static const __u8 rdesc[] = {  	0x05, 0x01,				/* USAGE_PAGE (Generic Desktop) */  	0x09, 0x32,				/* USAGE (Z) */  | 
