mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-14 07:44:21 +08:00
HID: samples: convert the 2 HID-BPF samples into struct_ops
This is mostly mechanical: attach_prog is dropped, and the SEC are converted into struct_ops. Link: https://lore.kernel.org/r/20240608-hid_bpf_struct_ops-v3-5-6ac6ade58329@kernel.org Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
This commit is contained in:
parent
d7696738d6
commit
e342d6f6f7
@ -16,7 +16,6 @@ LIBBPF_DESTDIR = $(LIBBPF_OUTPUT)
|
|||||||
LIBBPF_INCLUDE = $(LIBBPF_DESTDIR)/include
|
LIBBPF_INCLUDE = $(LIBBPF_DESTDIR)/include
|
||||||
LIBBPF = $(LIBBPF_OUTPUT)/libbpf.a
|
LIBBPF = $(LIBBPF_OUTPUT)/libbpf.a
|
||||||
|
|
||||||
EXTRA_HEADERS := hid_bpf_attach.h
|
|
||||||
EXTRA_BPF_HEADERS := hid_bpf_helpers.h
|
EXTRA_BPF_HEADERS := hid_bpf_helpers.h
|
||||||
|
|
||||||
hid_mouse-objs := hid_mouse.o
|
hid_mouse-objs := hid_mouse.o
|
||||||
@ -207,8 +206,8 @@ $(obj)/%.bpf.o: $(src)/%.bpf.c $(EXTRA_BPF_HEADERS_SRC) $(obj)/vmlinux.h
|
|||||||
LINKED_SKELS := hid_mouse.skel.h hid_surface_dial.skel.h
|
LINKED_SKELS := hid_mouse.skel.h hid_surface_dial.skel.h
|
||||||
clean-files += $(LINKED_SKELS)
|
clean-files += $(LINKED_SKELS)
|
||||||
|
|
||||||
hid_mouse.skel.h-deps := hid_mouse.bpf.o hid_bpf_attach.bpf.o
|
hid_mouse.skel.h-deps := hid_mouse.bpf.o
|
||||||
hid_surface_dial.skel.h-deps := hid_surface_dial.bpf.o hid_bpf_attach.bpf.o
|
hid_surface_dial.skel.h-deps := hid_surface_dial.bpf.o
|
||||||
|
|
||||||
LINKED_BPF_SRCS := $(patsubst %.bpf.o,%.bpf.c,$(foreach skel,$(LINKED_SKELS),$($(skel)-deps)))
|
LINKED_BPF_SRCS := $(patsubst %.bpf.o,%.bpf.c,$(foreach skel,$(LINKED_SKELS),$($(skel)-deps)))
|
||||||
|
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
|
||||||
/* Copyright (c) 2022 Benjamin Tissoires
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "vmlinux.h"
|
|
||||||
#include <bpf/bpf_helpers.h>
|
|
||||||
#include <bpf/bpf_tracing.h>
|
|
||||||
#include "hid_bpf_attach.h"
|
|
||||||
#include "hid_bpf_helpers.h"
|
|
||||||
|
|
||||||
SEC("syscall")
|
|
||||||
int attach_prog(struct attach_prog_args *ctx)
|
|
||||||
{
|
|
||||||
ctx->retval = hid_bpf_attach_prog(ctx->hid,
|
|
||||||
ctx->prog_fd,
|
|
||||||
0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
||||||
/* Copyright (c) 2022 Benjamin Tissoires
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __HID_BPF_ATTACH_H
|
|
||||||
#define __HID_BPF_ATTACH_H
|
|
||||||
|
|
||||||
struct attach_prog_args {
|
|
||||||
int prog_fd;
|
|
||||||
unsigned int hid;
|
|
||||||
int retval;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* __HID_BPF_ATTACH_H */
|
|
@ -5,8 +5,7 @@
|
|||||||
#include <bpf/bpf_tracing.h>
|
#include <bpf/bpf_tracing.h>
|
||||||
#include "hid_bpf_helpers.h"
|
#include "hid_bpf_helpers.h"
|
||||||
|
|
||||||
SEC("fmod_ret/hid_bpf_device_event")
|
static int hid_y_event(struct hid_bpf_ctx *hctx)
|
||||||
int BPF_PROG(hid_y_event, struct hid_bpf_ctx *hctx)
|
|
||||||
{
|
{
|
||||||
s16 y;
|
s16 y;
|
||||||
__u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 9 /* size */);
|
__u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 9 /* size */);
|
||||||
@ -51,8 +50,7 @@ int BPF_PROG(hid_y_event, struct hid_bpf_ctx *hctx)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SEC("fmod_ret/hid_bpf_device_event")
|
static int hid_x_event(struct hid_bpf_ctx *hctx)
|
||||||
int BPF_PROG(hid_x_event, struct hid_bpf_ctx *hctx)
|
|
||||||
{
|
{
|
||||||
s16 x;
|
s16 x;
|
||||||
__u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 9 /* size */);
|
__u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 9 /* size */);
|
||||||
@ -69,7 +67,19 @@ int BPF_PROG(hid_x_event, struct hid_bpf_ctx *hctx)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SEC("fmod_ret/hid_bpf_rdesc_fixup")
|
SEC("struct_ops/device_event")
|
||||||
|
int BPF_PROG(hid_event, struct hid_bpf_ctx *hctx, enum hid_report_type type)
|
||||||
|
{
|
||||||
|
int ret = hid_y_event(hctx);
|
||||||
|
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return hid_x_event(hctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SEC("struct_ops/rdesc_fixup")
|
||||||
int BPF_PROG(hid_rdesc_fixup, struct hid_bpf_ctx *hctx)
|
int BPF_PROG(hid_rdesc_fixup, struct hid_bpf_ctx *hctx)
|
||||||
{
|
{
|
||||||
__u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 4096 /* size */);
|
__u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 4096 /* size */);
|
||||||
@ -109,4 +119,10 @@ int BPF_PROG(hid_rdesc_fixup, struct hid_bpf_ctx *hctx)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SEC(".struct_ops.link")
|
||||||
|
struct hid_bpf_ops mouse_invert = {
|
||||||
|
.rdesc_fixup = (void *)hid_rdesc_fixup,
|
||||||
|
.device_event = (void *)hid_event,
|
||||||
|
};
|
||||||
|
|
||||||
char _license[] SEC("license") = "GPL";
|
char _license[] SEC("license") = "GPL";
|
||||||
|
@ -29,7 +29,6 @@
|
|||||||
#include <bpf/libbpf.h>
|
#include <bpf/libbpf.h>
|
||||||
|
|
||||||
#include "hid_mouse.skel.h"
|
#include "hid_mouse.skel.h"
|
||||||
#include "hid_bpf_attach.h"
|
|
||||||
|
|
||||||
static bool running = true;
|
static bool running = true;
|
||||||
|
|
||||||
@ -76,18 +75,11 @@ static int get_hid_id(const char *path)
|
|||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct hid_mouse *skel;
|
struct hid_mouse *skel;
|
||||||
struct bpf_program *prog;
|
struct bpf_link *link;
|
||||||
int err;
|
int err;
|
||||||
const char *optstr = "";
|
const char *optstr = "";
|
||||||
const char *sysfs_path;
|
const char *sysfs_path;
|
||||||
int opt, hid_id, attach_fd;
|
int opt, hid_id;
|
||||||
struct attach_prog_args args = {
|
|
||||||
.retval = -1,
|
|
||||||
};
|
|
||||||
DECLARE_LIBBPF_OPTS(bpf_test_run_opts, tattr,
|
|
||||||
.ctx_in = &args,
|
|
||||||
.ctx_size_in = sizeof(args),
|
|
||||||
);
|
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, optstr)) != -1) {
|
while ((opt = getopt(argc, argv, optstr)) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
@ -108,7 +100,7 @@ int main(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
skel = hid_mouse__open_and_load();
|
skel = hid_mouse__open();
|
||||||
if (!skel) {
|
if (!skel) {
|
||||||
fprintf(stderr, "%s %s:%d", __func__, __FILE__, __LINE__);
|
fprintf(stderr, "%s %s:%d", __func__, __FILE__, __LINE__);
|
||||||
return -1;
|
return -1;
|
||||||
@ -120,27 +112,18 @@ int main(int argc, char **argv)
|
|||||||
fprintf(stderr, "can not open HID device: %m\n");
|
fprintf(stderr, "can not open HID device: %m\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
args.hid = hid_id;
|
skel->struct_ops.mouse_invert->hid_id = hid_id;
|
||||||
|
|
||||||
attach_fd = bpf_program__fd(skel->progs.attach_prog);
|
err = hid_mouse__load(skel);
|
||||||
if (attach_fd < 0) {
|
if (err < 0) {
|
||||||
fprintf(stderr, "can't locate attach prog: %m\n");
|
fprintf(stderr, "can not load HID-BPF program: %m\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bpf_object__for_each_program(prog, *skel->skeleton->obj) {
|
link = bpf_map__attach_struct_ops(skel->maps.mouse_invert);
|
||||||
/* ignore syscalls */
|
if (!link) {
|
||||||
if (bpf_program__get_type(prog) != BPF_PROG_TYPE_TRACING)
|
fprintf(stderr, "can not attach HID-BPF program: %m\n");
|
||||||
continue;
|
return 1;
|
||||||
|
|
||||||
args.retval = -1;
|
|
||||||
args.prog_fd = bpf_program__fd(prog);
|
|
||||||
err = bpf_prog_test_run_opts(attach_fd, &tattr);
|
|
||||||
if (err) {
|
|
||||||
fprintf(stderr, "can't attach prog to hid device %d: %m (err: %d)\n",
|
|
||||||
hid_id, err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
signal(SIGINT, int_exit);
|
signal(SIGINT, int_exit);
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#define HID_UP_BUTTON 0x0009
|
#define HID_UP_BUTTON 0x0009
|
||||||
#define HID_GD_WHEEL 0x0038
|
#define HID_GD_WHEEL 0x0038
|
||||||
|
|
||||||
SEC("fmod_ret/hid_bpf_device_event")
|
SEC("struct_ops/device_event")
|
||||||
int BPF_PROG(hid_event, struct hid_bpf_ctx *hctx)
|
int BPF_PROG(hid_event, struct hid_bpf_ctx *hctx)
|
||||||
{
|
{
|
||||||
__u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 9 /* size */);
|
__u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 9 /* size */);
|
||||||
@ -101,7 +101,7 @@ int set_haptic(struct haptic_syscall_args *args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Convert REL_DIAL into REL_WHEEL */
|
/* Convert REL_DIAL into REL_WHEEL */
|
||||||
SEC("fmod_ret/hid_bpf_rdesc_fixup")
|
SEC("struct_ops/rdesc_fixup")
|
||||||
int BPF_PROG(hid_rdesc_fixup, struct hid_bpf_ctx *hctx)
|
int BPF_PROG(hid_rdesc_fixup, struct hid_bpf_ctx *hctx)
|
||||||
{
|
{
|
||||||
__u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 4096 /* size */);
|
__u8 *data = hid_bpf_get_data(hctx, 0 /* offset */, 4096 /* size */);
|
||||||
@ -130,5 +130,11 @@ int BPF_PROG(hid_rdesc_fixup, struct hid_bpf_ctx *hctx)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SEC(".struct_ops.link")
|
||||||
|
struct hid_bpf_ops surface_dial = {
|
||||||
|
.rdesc_fixup = (void *)hid_rdesc_fixup,
|
||||||
|
.device_event = (void *)hid_event,
|
||||||
|
};
|
||||||
|
|
||||||
char _license[] SEC("license") = "GPL";
|
char _license[] SEC("license") = "GPL";
|
||||||
u32 _version SEC("version") = 1;
|
u32 _version SEC("version") = 1;
|
||||||
|
@ -31,7 +31,6 @@
|
|||||||
#include <bpf/libbpf.h>
|
#include <bpf/libbpf.h>
|
||||||
|
|
||||||
#include "hid_surface_dial.skel.h"
|
#include "hid_surface_dial.skel.h"
|
||||||
#include "hid_bpf_attach.h"
|
|
||||||
|
|
||||||
static bool running = true;
|
static bool running = true;
|
||||||
|
|
||||||
@ -86,34 +85,6 @@ static int get_hid_id(const char *path)
|
|||||||
return (int)strtol(str_id, NULL, 16);
|
return (int)strtol(str_id, NULL, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int attach_prog(struct hid_surface_dial *skel, struct bpf_program *prog, int hid_id)
|
|
||||||
{
|
|
||||||
struct attach_prog_args args = {
|
|
||||||
.hid = hid_id,
|
|
||||||
.retval = -1,
|
|
||||||
};
|
|
||||||
int attach_fd, err;
|
|
||||||
DECLARE_LIBBPF_OPTS(bpf_test_run_opts, tattr,
|
|
||||||
.ctx_in = &args,
|
|
||||||
.ctx_size_in = sizeof(args),
|
|
||||||
);
|
|
||||||
|
|
||||||
attach_fd = bpf_program__fd(skel->progs.attach_prog);
|
|
||||||
if (attach_fd < 0) {
|
|
||||||
fprintf(stderr, "can't locate attach prog: %m\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
args.prog_fd = bpf_program__fd(prog);
|
|
||||||
err = bpf_prog_test_run_opts(attach_fd, &tattr);
|
|
||||||
if (err) {
|
|
||||||
fprintf(stderr, "can't attach prog to hid device %d: %m (err: %d)\n",
|
|
||||||
hid_id, err);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int set_haptic(struct hid_surface_dial *skel, int hid_id)
|
static int set_haptic(struct hid_surface_dial *skel, int hid_id)
|
||||||
{
|
{
|
||||||
struct haptic_syscall_args args = {
|
struct haptic_syscall_args args = {
|
||||||
@ -144,10 +115,10 @@ static int set_haptic(struct hid_surface_dial *skel, int hid_id)
|
|||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct hid_surface_dial *skel;
|
struct hid_surface_dial *skel;
|
||||||
struct bpf_program *prog;
|
|
||||||
const char *optstr = "r:";
|
const char *optstr = "r:";
|
||||||
|
struct bpf_link *link;
|
||||||
const char *sysfs_path;
|
const char *sysfs_path;
|
||||||
int opt, hid_id, resolution = 72;
|
int err, opt, hid_id, resolution = 72;
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, optstr)) != -1) {
|
while ((opt = getopt(argc, argv, optstr)) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
@ -189,7 +160,7 @@ int main(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
skel = hid_surface_dial__open_and_load();
|
skel = hid_surface_dial__open();
|
||||||
if (!skel) {
|
if (!skel) {
|
||||||
fprintf(stderr, "%s %s:%d", __func__, __FILE__, __LINE__);
|
fprintf(stderr, "%s %s:%d", __func__, __FILE__, __LINE__);
|
||||||
return -1;
|
return -1;
|
||||||
@ -201,15 +172,21 @@ int main(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skel->struct_ops.surface_dial->hid_id = hid_id;
|
||||||
|
|
||||||
|
err = hid_surface_dial__load(skel);
|
||||||
|
if (err < 0) {
|
||||||
|
fprintf(stderr, "can not load HID-BPF program: %m\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
skel->data->resolution = resolution;
|
skel->data->resolution = resolution;
|
||||||
skel->data->physical = (int)(resolution / 72);
|
skel->data->physical = (int)(resolution / 72);
|
||||||
|
|
||||||
bpf_object__for_each_program(prog, *skel->skeleton->obj) {
|
link = bpf_map__attach_struct_ops(skel->maps.surface_dial);
|
||||||
/* ignore syscalls */
|
if (!link) {
|
||||||
if (bpf_program__get_type(prog) != BPF_PROG_TYPE_TRACING)
|
fprintf(stderr, "can not attach HID-BPF program: %m\n");
|
||||||
continue;
|
return 1;
|
||||||
|
|
||||||
attach_prog(skel, prog, hid_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
signal(SIGINT, int_exit);
|
signal(SIGINT, int_exit);
|
||||||
|
Loading…
Reference in New Issue
Block a user