mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-26 20:03:54 -06:00

This commit adds a re-implementation of hw/char/pl011.c in Rust. How to build: 1. Configure a QEMU build with: --enable-system --target-list=aarch64-softmmu --enable-rust 2. Launching a VM with qemu-system-aarch64 should use the Rust version of the pl011 device 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: Manos Pitsidianakis <manos.pitsidianakis@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Link: https://lore.kernel.org/r/20241024-rust-round-2-v1-2-051e7a25b978@linaro.org
70 lines
1.9 KiB
Rust
70 lines
1.9 KiB
Rust
// Copyright 2024, Linaro Limited
|
|
// Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
use core::ptr::NonNull;
|
|
|
|
use qemu_api::{bindings::*, definitions::ObjectImpl};
|
|
|
|
use crate::device::PL011State;
|
|
|
|
#[used]
|
|
pub static VMSTATE_PL011: VMStateDescription = VMStateDescription {
|
|
name: PL011State::TYPE_INFO.name,
|
|
unmigratable: true,
|
|
..unsafe { ::core::mem::MaybeUninit::<VMStateDescription>::zeroed().assume_init() }
|
|
};
|
|
|
|
qemu_api::declare_properties! {
|
|
PL011_PROPERTIES,
|
|
qemu_api::define_property!(
|
|
c"chardev",
|
|
PL011State,
|
|
char_backend,
|
|
unsafe { &qdev_prop_chr },
|
|
CharBackend
|
|
),
|
|
qemu_api::define_property!(
|
|
c"migrate-clk",
|
|
PL011State,
|
|
migrate_clock,
|
|
unsafe { &qdev_prop_bool },
|
|
bool
|
|
),
|
|
}
|
|
|
|
qemu_api::device_class_init! {
|
|
pl011_class_init,
|
|
props => PL011_PROPERTIES,
|
|
realize_fn => Some(pl011_realize),
|
|
legacy_reset_fn => Some(pl011_reset),
|
|
vmsd => VMSTATE_PL011,
|
|
}
|
|
|
|
/// # Safety
|
|
///
|
|
/// We expect the FFI user of this function to pass a valid pointer, that has
|
|
/// the same size as [`PL011State`]. We also expect the device is
|
|
/// readable/writeable from one thread at any time.
|
|
#[no_mangle]
|
|
pub unsafe extern "C" fn pl011_realize(dev: *mut DeviceState, _errp: *mut *mut Error) {
|
|
unsafe {
|
|
assert!(!dev.is_null());
|
|
let mut state = NonNull::new_unchecked(dev.cast::<PL011State>());
|
|
state.as_mut().realize();
|
|
}
|
|
}
|
|
|
|
/// # Safety
|
|
///
|
|
/// We expect the FFI user of this function to pass a valid pointer, that has
|
|
/// the same size as [`PL011State`]. We also expect the device is
|
|
/// readable/writeable from one thread at any time.
|
|
#[no_mangle]
|
|
pub unsafe extern "C" fn pl011_reset(dev: *mut DeviceState) {
|
|
unsafe {
|
|
assert!(!dev.is_null());
|
|
let mut state = NonNull::new_unchecked(dev.cast::<PL011State>());
|
|
state.as_mut().reset();
|
|
}
|
|
}
|