rust: add bindings for memattrs

The MemTxAttrs structure contains bitfield members, and bindgen is
unable to generate an equivalent macro definition for
MEMTXATTRS_UNSPECIFIED.

Therefore, manually define a global constant variable
MEMTXATTRS_UNSPECIFIED to support calls from Rust code.

Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
Link: https://lore.kernel.org/r/20250125125137.1223277-6-zhao1.liu@intel.com
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Zhao Liu 2025-01-25 20:51:32 +08:00 committed by Paolo Bonzini
parent 9a96d41007
commit d015d4cbb4
3 changed files with 16 additions and 2 deletions

View file

@ -2,7 +2,7 @@
// Author(s): Paolo Bonzini <pbonzini@redhat.com> // Author(s): Paolo Bonzini <pbonzini@redhat.com>
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
//! Bindings for `MemoryRegion` and `MemoryRegionOps` //! Bindings for `MemoryRegion`, `MemoryRegionOps` and `MemTxAttrs`
use std::{ use std::{
ffi::{CStr, CString}, ffi::{CStr, CString},
@ -11,7 +11,7 @@ use std::{
ptr::addr_of, ptr::addr_of,
}; };
pub use bindings::hwaddr; pub use bindings::{hwaddr, MemTxAttrs};
use crate::{ use crate::{
bindings::{self, device_endian, memory_region_init_io}, bindings::{self, device_endian, memory_region_init_io},
@ -189,3 +189,15 @@ unsafe impl ObjectType for MemoryRegion {
unsafe { CStr::from_bytes_with_nul_unchecked(bindings::TYPE_MEMORY_REGION) }; unsafe { CStr::from_bytes_with_nul_unchecked(bindings::TYPE_MEMORY_REGION) };
} }
qom_isa!(MemoryRegion: Object); qom_isa!(MemoryRegion: Object);
/// A special `MemTxAttrs` constant, used to indicate that no memory
/// attributes are specified.
///
/// Bus masters which don't specify any attributes will get this,
/// which has all attribute bits clear except the topmost one
/// (so that we can distinguish "all attributes deliberately clear"
/// from "didn't specify" if necessary).
pub const MEMTXATTRS_UNSPECIFIED: MemTxAttrs = MemTxAttrs {
unspecified: true,
..Zeroable::ZERO
};

View file

@ -101,3 +101,4 @@ impl_zeroable!(crate::bindings::VMStateDescription);
impl_zeroable!(crate::bindings::MemoryRegionOps__bindgen_ty_1); impl_zeroable!(crate::bindings::MemoryRegionOps__bindgen_ty_1);
impl_zeroable!(crate::bindings::MemoryRegionOps__bindgen_ty_2); impl_zeroable!(crate::bindings::MemoryRegionOps__bindgen_ty_2);
impl_zeroable!(crate::bindings::MemoryRegionOps); impl_zeroable!(crate::bindings::MemoryRegionOps);
impl_zeroable!(crate::bindings::MemTxAttrs);

View file

@ -62,3 +62,4 @@ typedef enum memory_order {
#include "qapi/error.h" #include "qapi/error.h"
#include "migration/vmstate.h" #include "migration/vmstate.h"
#include "chardev/char-serial.h" #include "chardev/char-serial.h"
#include "exec/memattrs.h"