diff mbox series

[bpf-next,v2,4/7] tools headers UAPI: Update tools's copy of bpf.h header

Message ID 20250125-bpf_dynptr_probe-v2-4-c42c87f97afe@outlook.com (mailing list archive)
State New
Headers show
Series bpf: Add probe_read_{kernel,user}_dynptr and copy_from_user_dynptr | expand

Commit Message

Levi Zim via B4 Relay Jan. 25, 2025, 8:29 a.m. UTC
From: Levi Zim <rsworktech@outlook.com>

This update brings the new bpf_probe_read_{kernel,user} helpers

Signed-off-by: Levi Zim <rsworktech@outlook.com>
---
 tools/include/uapi/linux/bpf.h | 49 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

Comments

Andrii Nakryiko Jan. 27, 2025, 10:08 p.m. UTC | #1
On Sat, Jan 25, 2025 at 12:30 AM Levi Zim via B4 Relay
<devnull+rsworktech.outlook.com@kernel.org> wrote:
>
> From: Levi Zim <rsworktech@outlook.com>
>
> This update brings the new bpf_probe_read_{kernel,user} helpers
>
> Signed-off-by: Levi Zim <rsworktech@outlook.com>
> ---
>  tools/include/uapi/linux/bpf.h | 49 ++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 49 insertions(+)
>
> diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
> index 2acf9b33637174bd16b1d12ccc6410c5f55a7ea9..f92cf809b50bc393d54eb0e8de2e1ce2a39e95d0 100644
> --- a/tools/include/uapi/linux/bpf.h
> +++ b/tools/include/uapi/linux/bpf.h
> @@ -5805,6 +5805,52 @@ union bpf_attr {
>   *             0 on success.
>   *
>   *             **-ENOENT** if the bpf_local_storage cannot be found.
> + *
> + * long bpf_probe_read_kernel_dynptr(const struct bpf_dynptr *dst, u32 offset, u32 size, const void *unsafe_ptr, u64 flags)
> + *     Description
> + *             Safely attempt to read *size* bytes from kernel space address
> + *             *unsafe_ptr* and store the data in *dst* starting from *offset*.
> + *             *flags* is currently unused.
> + *     Return
> + *             0 on success.
> + *
> + *             **-E2BIG** if *offset* + *len* exceeds the length of *src*'s data
> + *
> + *             **-EINVAL** if *src* is an invalid dynptr or doesn't support this
> + *             support this helper, or if *flags* is not 0.
> + *
> + *             Or other negative errors on failure reading kernel memory.
> + *
> + * long bpf_probe_read_user_dynptr(const struct bpf_dynptr *dst, u32 offset, u32 size, const void *unsafe_ptr, u64 flags)
> + *     Description
> + *             Safely attempt to read *size* bytes from user space address
> + *             *unsafe_ptr* and store the data in *dst* starting from *offset*.
> + *             *flags* is currently unused.
> + *     Return
> + *             0 on success.
> + *
> + *             **-E2BIG** if *offset* + *len* exceeds the length of *src*'s data
> + *
> + *             **-EINVAL** if *src* is an invalid dynptr or doesn't support this
> + *             support this helper, or if *flags* is not 0.
> + *
> + *             Or other negative errors on failure reading user space memory.
> + *
> + * long bpf_copy_from_user_dynptr(const struct bpf_dynptr *dst, u32 offset, u32 size, const void *user_ptr, u64 flags)
> + *     Description
> + *             Read *size* bytes from user space address *user_ptr* and store
> + *             the data in *dst* starting from *offset*.
> + *             This is a wrapper of **copy_from_user**\ ().
> + *             *flags* is currently unused.
> + *     Return
> + *             0 on success.
> + *
> + *             **-E2BIG** if *offset* + *len* exceeds the length of *src*'s data
> + *
> + *             **-EINVAL** if *src* is an invalid dynptr or doesn't support this
> + *             support this helper, or if *flags* is not 0.
> + *
> + *             Or other negative errors on failure reading user space memory.
>   */
>  #define ___BPF_FUNC_MAPPER(FN, ctx...)                 \
>         FN(unspec, 0, ##ctx)                            \
> @@ -6019,6 +6065,9 @@ union bpf_attr {
>         FN(user_ringbuf_drain, 209, ##ctx)              \
>         FN(cgrp_storage_get, 210, ##ctx)                \
>         FN(cgrp_storage_delete, 211, ##ctx)             \

we probably want to add some big and very noticeable comment here
suggesting kfunc route, to save people time next time. Please consider
adding it as a separate patch for v2.

> +       FN(probe_read_kernel_dynptr, 212, ##ctx)                \
> +       FN(probe_read_user_dynptr, 213, ##ctx)          \
> +       FN(copy_from_user_dynptr, 214, ##ctx)           \
>         /* */
>
>  /* backwards-compatibility macros for users of __BPF_FUNC_MAPPER that don't
>
> --
> 2.48.1
>
>
diff mbox series

Patch

diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
index 2acf9b33637174bd16b1d12ccc6410c5f55a7ea9..f92cf809b50bc393d54eb0e8de2e1ce2a39e95d0 100644
--- a/tools/include/uapi/linux/bpf.h
+++ b/tools/include/uapi/linux/bpf.h
@@ -5805,6 +5805,52 @@  union bpf_attr {
  *		0 on success.
  *
  *		**-ENOENT** if the bpf_local_storage cannot be found.
+ *
+ * long bpf_probe_read_kernel_dynptr(const struct bpf_dynptr *dst, u32 offset, u32 size, const void *unsafe_ptr, u64 flags)
+ *	Description
+ *		Safely attempt to read *size* bytes from kernel space address
+ *		*unsafe_ptr* and store the data in *dst* starting from *offset*.
+ *		*flags* is currently unused.
+ *	Return
+ *		0 on success.
+ *
+ *		**-E2BIG** if *offset* + *len* exceeds the length of *src*'s data
+ *
+ *		**-EINVAL** if *src* is an invalid dynptr or doesn't support this
+ *		support this helper, or if *flags* is not 0.
+ *
+ *		Or other negative errors on failure reading kernel memory.
+ *
+ * long bpf_probe_read_user_dynptr(const struct bpf_dynptr *dst, u32 offset, u32 size, const void *unsafe_ptr, u64 flags)
+ *	Description
+ *		Safely attempt to read *size* bytes from user space address
+ *		*unsafe_ptr* and store the data in *dst* starting from *offset*.
+ *		*flags* is currently unused.
+ *	Return
+ *		0 on success.
+ *
+ *		**-E2BIG** if *offset* + *len* exceeds the length of *src*'s data
+ *
+ *		**-EINVAL** if *src* is an invalid dynptr or doesn't support this
+ *		support this helper, or if *flags* is not 0.
+ *
+ *		Or other negative errors on failure reading user space memory.
+ *
+ * long bpf_copy_from_user_dynptr(const struct bpf_dynptr *dst, u32 offset, u32 size, const void *user_ptr, u64 flags)
+ *	Description
+ *		Read *size* bytes from user space address *user_ptr* and store
+ *		the data in *dst* starting from *offset*.
+ *		This is a wrapper of **copy_from_user**\ ().
+ *		*flags* is currently unused.
+ *	Return
+ *		0 on success.
+ *
+ *		**-E2BIG** if *offset* + *len* exceeds the length of *src*'s data
+ *
+ *		**-EINVAL** if *src* is an invalid dynptr or doesn't support this
+ *		support this helper, or if *flags* is not 0.
+ *
+ *		Or other negative errors on failure reading user space memory.
  */
 #define ___BPF_FUNC_MAPPER(FN, ctx...)			\
 	FN(unspec, 0, ##ctx)				\
@@ -6019,6 +6065,9 @@  union bpf_attr {
 	FN(user_ringbuf_drain, 209, ##ctx)		\
 	FN(cgrp_storage_get, 210, ##ctx)		\
 	FN(cgrp_storage_delete, 211, ##ctx)		\
+	FN(probe_read_kernel_dynptr, 212, ##ctx)		\
+	FN(probe_read_user_dynptr, 213, ##ctx)		\
+	FN(copy_from_user_dynptr, 214, ##ctx)		\
 	/* */
 
 /* backwards-compatibility macros for users of __BPF_FUNC_MAPPER that don't