// Copyright 2024, Linaro Limited // Author(s): Manos Pitsidianakis // 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::::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::()); 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::()); state.as_mut().reset(); } }