Browse Source
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Link: https://lore.kernel.org/r/20250827104147.717203-14-marcandre.lureau@redhat.com Reviewed-by: Zhao Liu <zhao1.liu@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>pull/305/head
committed by
Paolo Bonzini
19 changed files with 164 additions and 20 deletions
@ -0,0 +1,24 @@ |
|||
[package] |
|||
name = "chardev" |
|||
version = "0.1.0" |
|||
description = "Rust bindings for QEMU/chardev" |
|||
resolver = "2" |
|||
publish = false |
|||
|
|||
authors.workspace = true |
|||
edition.workspace = true |
|||
homepage.workspace = true |
|||
license.workspace = true |
|||
repository.workspace = true |
|||
rust-version.workspace = true |
|||
|
|||
[dependencies] |
|||
common = { path = "../common" } |
|||
bql = { path = "../bql" } |
|||
migration = { path = "../migration" } |
|||
qom = { path = "../qom" } |
|||
util = { path = "../util" } |
|||
qemu_api_macros = { path = "../qemu-api-macros" } |
|||
|
|||
[lints] |
|||
workspace = true |
|||
@ -0,0 +1 @@ |
|||
../util/build.rs |
|||
@ -0,0 +1,41 @@ |
|||
c_enums = [ |
|||
'QEMUChrEvent', |
|||
] |
|||
_chardev_bindgen_args = [] |
|||
foreach enum : c_enums |
|||
_chardev_bindgen_args += ['--rustified-enum', enum] |
|||
endforeach |
|||
|
|||
# TODO: Remove this comment when the clang/libclang mismatch issue is solved. |
|||
# |
|||
# Rust bindings generation with `bindgen` might fail in some cases where the |
|||
# detected `libclang` does not match the expected `clang` version/target. In |
|||
# this case you must pass the path to `clang` and `libclang` to your build |
|||
# command invocation using the environment variables CLANG_PATH and |
|||
# LIBCLANG_PATH |
|||
_chardev_bindings_inc_rs = rust.bindgen( |
|||
input: 'wrapper.h', |
|||
dependencies: common_ss.all_dependencies(), |
|||
output: 'bindings.inc.rs', |
|||
include_directories: bindings_incdir, |
|||
bindgen_version: ['>=0.60.0'], |
|||
args: bindgen_args_common + _chardev_bindgen_args, |
|||
) |
|||
|
|||
_chardev_rs = static_library( |
|||
'chardev', |
|||
structured_sources( |
|||
[ |
|||
'src/lib.rs', |
|||
'src/bindings.rs', |
|||
'src/chardev.rs', |
|||
], |
|||
{'.': _chardev_bindings_inc_rs} |
|||
), |
|||
override_options: ['rust_std=2021', 'build.rust_std=2021'], |
|||
rust_abi: 'rust', |
|||
link_with: [_bql_rs, _migration_rs, _qom_rs, _util_rs], |
|||
dependencies: [common_rs, qemu_api_macros], |
|||
) |
|||
|
|||
chardev_rs = declare_dependency(link_with: [_chardev_rs], dependencies: [qemu_api_macros, chardev, qemuutil]) |
|||
@ -0,0 +1,36 @@ |
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|||
#![allow(
|
|||
dead_code, |
|||
improper_ctypes_definitions, |
|||
improper_ctypes, |
|||
non_camel_case_types, |
|||
non_snake_case, |
|||
non_upper_case_globals, |
|||
unnecessary_transmutes, |
|||
unsafe_op_in_unsafe_fn, |
|||
clippy::pedantic, |
|||
clippy::restriction, |
|||
clippy::style, |
|||
clippy::missing_const_for_fn, |
|||
clippy::ptr_offset_with_cast, |
|||
clippy::useless_transmute, |
|||
clippy::missing_safety_doc, |
|||
clippy::too_many_arguments |
|||
)] |
|||
|
|||
use common::Zeroable; |
|||
|
|||
#[cfg(MESON)] |
|||
include!("bindings.inc.rs"); |
|||
|
|||
#[cfg(not(MESON))] |
|||
include!(concat!(env!("OUT_DIR"), "/bindings.inc.rs")); |
|||
|
|||
// SAFETY: these are implemented in C; the bindings need to assert that the
|
|||
// BQL is taken, either directly or via `BqlCell` and `BqlRefCell`.
|
|||
// When bindings for character devices are introduced, this can be
|
|||
// moved to the Opaque<> wrapper in src/chardev.rs.
|
|||
unsafe impl Send for CharBackend {} |
|||
unsafe impl Sync for CharBackend {} |
|||
|
|||
unsafe impl Zeroable for CharBackend {} |
|||
@ -0,0 +1,6 @@ |
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|||
|
|||
pub mod bindings; |
|||
|
|||
mod chardev; |
|||
pub use chardev::*; |
|||
@ -0,0 +1,28 @@ |
|||
/* SPDX-License-Identifier: GPL-2.0-or-later */ |
|||
|
|||
/*
|
|||
* This header file is meant to be used as input to the `bindgen` application |
|||
* in order to generate C FFI compatible Rust bindings. |
|||
*/ |
|||
|
|||
#ifndef __CLANG_STDATOMIC_H |
|||
#define __CLANG_STDATOMIC_H |
|||
/*
|
|||
* Fix potential missing stdatomic.h error in case bindgen does not insert the |
|||
* correct libclang header paths on its own. We do not use stdatomic.h symbols |
|||
* in QEMU code, so it's fine to declare dummy types instead. |
|||
*/ |
|||
typedef enum memory_order { |
|||
memory_order_relaxed, |
|||
memory_order_consume, |
|||
memory_order_acquire, |
|||
memory_order_release, |
|||
memory_order_acq_rel, |
|||
memory_order_seq_cst, |
|||
} memory_order; |
|||
#endif /* __CLANG_STDATOMIC_H */ |
|||
|
|||
#include "qemu/osdep.h" |
|||
|
|||
#include "chardev/char-fe.h" |
|||
#include "chardev/char-serial.h" |
|||
Loading…
Reference in new issue