All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junjie Mao <junjie.mao@intel.com>
To: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>,
	<qemu-devel@nongnu.org>
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Daniel P. Berrangé" <berrange@redhat.com>,
	"Thomas Huth" <thuth@redhat.com>,
	"Philippe Mathieu-Daudé" <philmd@linaro.org>,
	"Pierrick Bouvier" <pierrick.bouvier@linaro.org>,
	"Richard Henderson" <richard.henderson@linaro.org>,
	"Gustavo Romero" <gustavo.romero@linaro.org>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Peter Maydell" <peter.maydell@linaro.org>,
	"Zhao Liu" <zhao1.liu@intel.com>
Subject: Re: [PATCH v8 6/8] rust: add crate to expose bindings and interfaces
Date: Mon, 26 Aug 2024 13:31:55 +0800	[thread overview]
Message-ID: <841befb6-5ce1-44e5-890c-4e60fcbd4fa6@intel.com> (raw)
In-Reply-To: <20240823-rust-pl011-v8-6-b9f5746bdaf3@linaro.org>

On 8/23/2024 4:11 PM, Manos Pitsidianakis wrote:
> Add rust/qemu-api, which exposes rust-bindgen generated FFI bindings and
> provides some declaration macros for symbols visible to the rest of
> QEMU.
> 
> Co-authored-by: Junjie Mao <junjie.mao@intel.com>
> Co-authored-by: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Junjie Mao <junjie.mao@intel.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
> ---
>   MAINTAINERS                       |   6 ++
>   rust/meson.build                  |   1 +
>   rust/qemu-api/.gitignore          |   2 +
>   rust/qemu-api/Cargo.lock          |   7 +++
>   rust/qemu-api/Cargo.toml          |  26 ++++++++
>   rust/qemu-api/README.md           |  17 +++++
>   rust/qemu-api/build.rs            |  14 +++++
>   rust/qemu-api/meson.build         |  20 ++++++
>   rust/qemu-api/rustfmt.toml        |   1 +
>   rust/qemu-api/src/definitions.rs  | 109 ++++++++++++++++++++++++++++++++
>   rust/qemu-api/src/device_class.rs | 128 ++++++++++++++++++++++++++++++++++++++
>   rust/qemu-api/src/lib.rs          | 102 ++++++++++++++++++++++++++++++
>   rust/qemu-api/src/tests.rs        |  49 +++++++++++++++
>   rust/rustfmt.toml                 |   7 +++
>   14 files changed, 489 insertions(+)
[snip]
> diff --git a/rust/qemu-api/src/lib.rs b/rust/qemu-api/src/lib.rs
> new file mode 100644
> index 0000000000..ab95d0d5f7
> --- /dev/null
> +++ b/rust/qemu-api/src/lib.rs
> @@ -0,0 +1,102 @@
> +// Copyright 2024, Linaro Limited
> +// Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
> +#![cfg_attr(not(MESON), doc = include_str!("../README.md"))]
> +
> +#[allow(
> +    dead_code,
> +    improper_ctypes_definitions,
> +    improper_ctypes,
> +    non_camel_case_types,
> +    non_snake_case,
> +    non_upper_case_globals,
> +    clippy::missing_const_for_fn,
> +    clippy::too_many_arguments,
> +    clippy::approx_constant,
> +    clippy::use_self,
> +    clippy::useless_transmute,
> +    clippy::missing_safety_doc,
> +)]
> +#[rustfmt::skip]
> +pub mod bindings;
> +
> +unsafe impl Send for bindings::Property {}
> +unsafe impl Sync for bindings::Property {}
> +unsafe impl Sync for bindings::TypeInfo {}
> +unsafe impl Sync for bindings::VMStateDescription {}
> +
> +pub mod definitions;
> +pub mod device_class;
> +
> +#[cfg(test)]
> +mod tests;
> +
> +use std::alloc::{GlobalAlloc, Layout};
> +
> +extern "C" {
> +    pub fn g_aligned_alloc0(
> +        n_blocks: bindings::gsize,
> +        n_block_bytes: bindings::gsize,
> +        alignment: bindings::gsize,
> +    ) -> bindings::gpointer;
> +    pub fn g_aligned_free(mem: bindings::gpointer);
> +    pub fn g_malloc0(n_bytes: bindings::gsize) -> bindings::gpointer;
> +    pub fn g_free(mem: bindings::gpointer);
> +}
> +
> +/// An allocator that uses the same allocator as QEMU in C.
> +///
> +/// It is enabled by default with the `allocator` feature.
> +///
> +/// To set it up manually as a global allocator in your crate:
> +///
> +/// ```ignore
> +/// use qemu_api::QemuAllocator;
> +///
> +/// #[global_allocator]
> +/// static GLOBAL: QemuAllocator = QemuAllocator::new();
> +/// ```
> +#[derive(Clone, Copy, Debug)]
> +#[repr(C)]
> +pub struct QemuAllocator {
> +    _unused: [u8; 0],
> +}
> +
> +#[cfg_attr(feature = "allocator", global_allocator)]
> +pub static GLOBAL: QemuAllocator = QemuAllocator::new();
> +
> +impl QemuAllocator {
> +    pub const fn new() -> Self {
> +        Self { _unused: [] }
> +    }
> +}
> +
> +impl Default for QemuAllocator {
> +    fn default() -> Self {
> +        Self::new()
> +    }
> +}
> +
> +unsafe impl GlobalAlloc for QemuAllocator {
> +    unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
> +        if layout.align() == 0 {
> +            g_malloc0(layout.size().try_into().unwrap()).cast::<u8>()
> +        } else {
> +            g_aligned_alloc0(

One more thing: g_aligned_alloc0() was introduced in glib 2.72 [1] but the 
current glib version check in meson is >= 2.66.0.

Glib 2.72 still supports Win 7+, so no increase to _WIN32_WINNT is needed for 
this version bumping.

[1] https://docs.gtk.org/glib/func.aligned_alloc0.html
[2] https://gitlab.gnome.org/GNOME/glib/-/blob/2.72.0/meson.build?ref_type=tags#L509

---
Best Regards
Junjie Mao

> +                layout.size().try_into().unwrap(),
> +                1,
> +                layout.align().try_into().unwrap(),
> +            )
> +            .cast::<u8>()
> +        }
> +    }
> +
> +    unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
> +        if layout.align() == 0 {
> +            g_free(ptr.cast::<_>())
> +        } else {
> +            g_aligned_free(ptr.cast::<_>())
> +        }
> +    }
> +}


  parent reply	other threads:[~2024-08-26  5:33 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-23  8:11 [PATCH v8 0/8] Add Rust build support, ARM PL011 device impl Manos Pitsidianakis
2024-08-23  8:11 ` [PATCH v8 1/8] Require meson version 1.5.0 Manos Pitsidianakis
2024-08-23  8:11 ` [PATCH v8 2/8] build-sys: Add rust feature option Manos Pitsidianakis
2024-08-23  8:11 ` [PATCH v8 3/8] configure, meson: detect Rust toolchain Manos Pitsidianakis
2024-08-23  8:11 ` [PATCH v8 4/8] rust: add bindgen step as a meson dependency Manos Pitsidianakis
2024-08-23  8:11 ` [PATCH v8 5/8] .gitattributes: add Rust diff and merge attributes Manos Pitsidianakis
2024-08-23  8:11 ` [PATCH v8 6/8] rust: add crate to expose bindings and interfaces Manos Pitsidianakis
2024-08-26  5:03   ` Junjie Mao
2024-08-26  6:12     ` Manos Pitsidianakis
2024-08-26  8:41       ` Junjie Mao
2024-08-26  5:31   ` Junjie Mao [this message]
2024-08-26  6:41     ` Manos Pitsidianakis
2024-08-26  7:45       ` Junjie Mao
2024-08-26  8:24       ` Thomas Huth
2024-08-26 11:29         ` Manos Pitsidianakis
2024-08-23  8:11 ` [PATCH v8 7/8] rust: add utility procedural macro crate Manos Pitsidianakis
2024-08-26  5:15   ` Junjie Mao
2024-08-26  6:02     ` Manos Pitsidianakis
2024-08-23  8:11 ` [PATCH v8 8/8] rust: add PL011 device model Manos Pitsidianakis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=841befb6-5ce1-44e5-890c-4e60fcbd4fa6@intel.com \
    --to=junjie.mao@intel.com \
    --cc=alex.bennee@linaro.org \
    --cc=berrange@redhat.com \
    --cc=gustavo.romero@linaro.org \
    --cc=manos.pitsidianakis@linaro.org \
    --cc=marcandre.lureau@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=philmd@linaro.org \
    --cc=pierrick.bouvier@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=thuth@redhat.com \
    --cc=zhao1.liu@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.