1 // Copyright 2024, Linaro Limited 2 // Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org> 3 // SPDX-License-Identifier: GPL-2.0-or-later 4 5 use std::ffi::CStr; 6 7 use qemu_api::{ 8 bindings::*, 9 c_str, declare_properties, define_property, 10 prelude::*, 11 qdev::{DeviceImpl, DeviceState, Property}, 12 qom::ObjectImpl, 13 vmstate::VMStateDescription, 14 zeroable::Zeroable, 15 }; 16 17 #[test] 18 fn test_device_decl_macros() { 19 // Test that macros can compile. 20 pub static VMSTATE: VMStateDescription = VMStateDescription { 21 name: c_str!("name").as_ptr(), 22 unmigratable: true, 23 ..Zeroable::ZERO 24 }; 25 26 #[derive(qemu_api_macros::offsets)] 27 #[repr(C)] 28 #[derive(qemu_api_macros::Object)] 29 pub struct DummyState { 30 pub _parent: DeviceState, 31 pub migrate_clock: bool, 32 } 33 34 declare_properties! { 35 DUMMY_PROPERTIES, 36 define_property!( 37 c_str!("migrate-clk"), 38 DummyState, 39 migrate_clock, 40 unsafe { &qdev_prop_bool }, 41 bool 42 ), 43 } 44 45 unsafe impl ObjectType for DummyState { 46 type Class = <DeviceState as ObjectType>::Class; 47 const TYPE_NAME: &'static CStr = c_str!("dummy"); 48 } 49 50 impl ObjectImpl for DummyState { 51 type ParentType = DeviceState; 52 const ABSTRACT: bool = false; 53 } 54 55 impl DeviceImpl for DummyState { 56 fn properties() -> &'static [Property] { 57 &DUMMY_PROPERTIES 58 } 59 fn vmsd() -> Option<&'static VMStateDescription> { 60 Some(&VMSTATE) 61 } 62 } 63 64 unsafe { 65 module_call_init(module_init_type::MODULE_INIT_QOM); 66 object_unref(object_new(DummyState::TYPE_NAME.as_ptr()).cast()); 67 } 68 } 69