[RFC,01/20] rust_binder: define a Rust binder driver

Message ID 20231101-rust-binder-v1-1-08ba9197f637@google.com
State New
Headers
Series Setting up Binder for the future |

Commit Message

Alice Ryhl Nov. 1, 2023, 6:01 p.m. UTC
  From: Wedson Almeida Filho <wedsonaf@gmail.com>

Define the Rust binder driver, and set up the helpers for making C types
accessible from Rust.

Signed-off-by: Wedson Almeida Filho <wedsonaf@gmail.com>
Co-developed-by: Alice Ryhl <aliceryhl@google.com>
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
---
 drivers/android/Kconfig             | 11 +++++++++++
 drivers/android/Makefile            |  1 +
 drivers/android/rust_binder.rs      | 21 +++++++++++++++++++++
 include/uapi/linux/android/binder.h | 30 ++++++++++++++++--------------
 rust/bindings/bindings_helper.h     |  1 +
 5 files changed, 50 insertions(+), 14 deletions(-)
  

Comments

Greg KH Nov. 1, 2023, 6:09 p.m. UTC | #1
On Wed, Nov 01, 2023 at 06:01:31PM +0000, Alice Ryhl wrote:
> From: Wedson Almeida Filho <wedsonaf@gmail.com>
> 
> Define the Rust binder driver, and set up the helpers for making C types
> accessible from Rust.
> 
> Signed-off-by: Wedson Almeida Filho <wedsonaf@gmail.com>
> Co-developed-by: Alice Ryhl <aliceryhl@google.com>
> Signed-off-by: Alice Ryhl <aliceryhl@google.com>
> ---
>  drivers/android/Kconfig             | 11 +++++++++++
>  drivers/android/Makefile            |  1 +
>  drivers/android/rust_binder.rs      | 21 +++++++++++++++++++++
>  include/uapi/linux/android/binder.h | 30 ++++++++++++++++--------------
>  rust/bindings/bindings_helper.h     |  1 +
>  5 files changed, 50 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/android/Kconfig b/drivers/android/Kconfig
> index 07aa8ae0a058..fcfd25c9a016 100644
> --- a/drivers/android/Kconfig
> +++ b/drivers/android/Kconfig
> @@ -13,6 +13,17 @@ config ANDROID_BINDER_IPC
>  	  Android process, using Binder to identify, invoke and pass arguments
>  	  between said processes.
>  
> +config ANDROID_BINDER_IPC_RUST
> +	bool "Android Binder IPC Driver in Rust"
> +	depends on MMU && RUST

Can RUST even build on non-mmu systems?
  
Boqun Feng Nov. 1, 2023, 6:25 p.m. UTC | #2
On Wed, Nov 01, 2023 at 06:01:31PM +0000, Alice Ryhl wrote:
[...]
> --- a/rust/bindings/bindings_helper.h
> +++ b/rust/bindings/bindings_helper.h
> @@ -21,6 +21,7 @@
>  #include <linux/sched.h>
>  #include <linux/task_work.h>
>  #include <linux/workqueue.h>
> +#include <uapi/linux/android/binder.h>

I wonder whether we could (and should) move this into
rust/uapi/uapi_helpers.h

Regards,
Boqun

>  
>  /* `bindgen` gets confused at certain things. */
>  const size_t BINDINGS_ARCH_SLAB_MINALIGN = ARCH_SLAB_MINALIGN;
> 
> -- 
> 2.42.0.820.g83a721a137-goog
>
  
Alice Ryhl Nov. 2, 2023, 10:27 a.m. UTC | #3
Boqun Feng <boqun.feng@gmail.com> writes:
>> +#include <uapi/linux/android/binder.h>
>
> I wonder whether we could (and should) move this into
> rust/uapi/uapi_helpers.h

Sure. That was introduced after I wrote this part, but I'm happy to move
it if you think it would make sense.

Alice
  
Alice Ryhl Nov. 8, 2023, 10:38 a.m. UTC | #4
Greg Kroah-Hartman <gregkh@linuxfoundation.org> writes:
> On Wed, Nov 01, 2023 at 06:01:31PM +0000, Alice Ryhl wrote:
>> +config ANDROID_BINDER_IPC_RUST
>> +	bool "Android Binder IPC Driver in Rust"
>> +	depends on MMU && RUST
> 
> Can RUST even build on non-mmu systems?

I don't know, but if it could, then the dependencies of this RFC
probably broke that. I guess this depends on is in the wrong place.

Alice
  

Patch

diff --git a/drivers/android/Kconfig b/drivers/android/Kconfig
index 07aa8ae0a058..fcfd25c9a016 100644
--- a/drivers/android/Kconfig
+++ b/drivers/android/Kconfig
@@ -13,6 +13,17 @@  config ANDROID_BINDER_IPC
 	  Android process, using Binder to identify, invoke and pass arguments
 	  between said processes.
 
+config ANDROID_BINDER_IPC_RUST
+	bool "Android Binder IPC Driver in Rust"
+	depends on MMU && RUST
+	help
+	  Binder is used in Android for both communication between processes,
+	  and remote method invocation.
+
+	  This means one Android process can call a method/routine in another
+	  Android process, using Binder to identify, invoke and pass arguments
+	  between said processes.
+
 config ANDROID_BINDERFS
 	bool "Android Binderfs filesystem"
 	depends on ANDROID_BINDER_IPC
diff --git a/drivers/android/Makefile b/drivers/android/Makefile
index c9d3d0c99c25..6348f75832ca 100644
--- a/drivers/android/Makefile
+++ b/drivers/android/Makefile
@@ -4,3 +4,4 @@  ccflags-y += -I$(src)			# needed for trace events
 obj-$(CONFIG_ANDROID_BINDERFS)		+= binderfs.o
 obj-$(CONFIG_ANDROID_BINDER_IPC)	+= binder.o binder_alloc.o
 obj-$(CONFIG_ANDROID_BINDER_IPC_SELFTEST) += binder_alloc_selftest.o
+obj-$(CONFIG_ANDROID_BINDER_IPC_RUST)	+= rust_binder.o
diff --git a/drivers/android/rust_binder.rs b/drivers/android/rust_binder.rs
new file mode 100644
index 000000000000..4b3d6676a9cf
--- /dev/null
+++ b/drivers/android/rust_binder.rs
@@ -0,0 +1,21 @@ 
+// SPDX-License-Identifier: GPL-2.0
+
+//! Binder -- the Android IPC mechanism.
+
+use kernel::prelude::*;
+
+module! {
+    type: BinderModule,
+    name: "rust_binder",
+    author: "Wedson Almeida Filho, Alice Ryhl",
+    description: "Android Binder",
+    license: "GPL",
+}
+
+struct BinderModule {}
+
+impl kernel::Module for BinderModule {
+    fn init(_module: &'static kernel::ThisModule) -> Result<Self> {
+        Ok(Self {})
+    }
+}
diff --git a/include/uapi/linux/android/binder.h b/include/uapi/linux/android/binder.h
index 5f636b5afcd7..d44a8118b2ed 100644
--- a/include/uapi/linux/android/binder.h
+++ b/include/uapi/linux/android/binder.h
@@ -251,20 +251,22 @@  struct binder_extended_error {
 	__s32	param;
 };
 
-#define BINDER_WRITE_READ		_IOWR('b', 1, struct binder_write_read)
-#define BINDER_SET_IDLE_TIMEOUT		_IOW('b', 3, __s64)
-#define BINDER_SET_MAX_THREADS		_IOW('b', 5, __u32)
-#define BINDER_SET_IDLE_PRIORITY	_IOW('b', 6, __s32)
-#define BINDER_SET_CONTEXT_MGR		_IOW('b', 7, __s32)
-#define BINDER_THREAD_EXIT		_IOW('b', 8, __s32)
-#define BINDER_VERSION			_IOWR('b', 9, struct binder_version)
-#define BINDER_GET_NODE_DEBUG_INFO	_IOWR('b', 11, struct binder_node_debug_info)
-#define BINDER_GET_NODE_INFO_FOR_REF	_IOWR('b', 12, struct binder_node_info_for_ref)
-#define BINDER_SET_CONTEXT_MGR_EXT	_IOW('b', 13, struct flat_binder_object)
-#define BINDER_FREEZE			_IOW('b', 14, struct binder_freeze_info)
-#define BINDER_GET_FROZEN_INFO		_IOWR('b', 15, struct binder_frozen_status_info)
-#define BINDER_ENABLE_ONEWAY_SPAM_DETECTION	_IOW('b', 16, __u32)
-#define BINDER_GET_EXTENDED_ERROR	_IOWR('b', 17, struct binder_extended_error)
+enum {
+	BINDER_WRITE_READ		= _IOWR('b', 1, struct binder_write_read),
+	BINDER_SET_IDLE_TIMEOUT		= _IOW('b', 3, __s64),
+	BINDER_SET_MAX_THREADS		= _IOW('b', 5, __u32),
+	BINDER_SET_IDLE_PRIORITY	= _IOW('b', 6, __s32),
+	BINDER_SET_CONTEXT_MGR		= _IOW('b', 7, __s32),
+	BINDER_THREAD_EXIT		= _IOW('b', 8, __s32),
+	BINDER_VERSION			= _IOWR('b', 9, struct binder_version),
+	BINDER_GET_NODE_DEBUG_INFO	= _IOWR('b', 11, struct binder_node_debug_info),
+	BINDER_GET_NODE_INFO_FOR_REF	= _IOWR('b', 12, struct binder_node_info_for_ref),
+	BINDER_SET_CONTEXT_MGR_EXT	= _IOW('b', 13, struct flat_binder_object),
+	BINDER_FREEZE			= _IOW('b', 14, struct binder_freeze_info),
+	BINDER_GET_FROZEN_INFO		= _IOWR('b', 15, struct binder_frozen_status_info),
+	BINDER_ENABLE_ONEWAY_SPAM_DETECTION	= _IOW('b', 16, __u32),
+	BINDER_GET_EXTENDED_ERROR	= _IOWR('b', 17, struct binder_extended_error),
+};
 
 /*
  * NOTE: Two special error codes you should check for when calling
diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helper.h
index 14f84aeef62d..00a66666f00a 100644
--- a/rust/bindings/bindings_helper.h
+++ b/rust/bindings/bindings_helper.h
@@ -21,6 +21,7 @@ 
 #include <linux/sched.h>
 #include <linux/task_work.h>
 #include <linux/workqueue.h>
+#include <uapi/linux/android/binder.h>
 
 /* `bindgen` gets confused at certain things. */
 const size_t BINDINGS_ARCH_SLAB_MINALIGN = ARCH_SLAB_MINALIGN;