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::*, c_str, declare_properties, define_property, definitions::ObjectImpl, 9 device_class::DeviceImpl, impl_device_class, prelude::*, zeroable::Zeroable, 10 }; 11 12 #[test] 13 fn test_device_decl_macros() { 14 // Test that macros can compile. 15 pub static VMSTATE: VMStateDescription = VMStateDescription { 16 name: c_str!("name").as_ptr(), 17 unmigratable: true, 18 ..Zeroable::ZERO 19 }; 20 21 #[derive(qemu_api_macros::offsets)] 22 #[repr(C)] 23 #[derive(qemu_api_macros::Object)] 24 pub struct DummyState { 25 pub _parent: DeviceState, 26 pub migrate_clock: bool, 27 } 28 29 declare_properties! { 30 DUMMY_PROPERTIES, 31 define_property!( 32 c_str!("migrate-clk"), 33 DummyState, 34 migrate_clock, 35 unsafe { &qdev_prop_bool }, 36 bool 37 ), 38 } 39 40 unsafe impl ObjectType for DummyState { 41 type Class = <DeviceState as ObjectType>::Class; 42 const TYPE_NAME: &'static CStr = c_str!("dummy"); 43 } 44 45 impl ObjectImpl for DummyState { 46 type ParentType = DeviceState; 47 const ABSTRACT: bool = false; 48 } 49 50 impl DeviceImpl for DummyState { 51 fn properties() -> &'static [Property] { 52 &DUMMY_PROPERTIES 53 } 54 fn vmsd() -> Option<&'static VMStateDescription> { 55 Some(&VMSTATE) 56 } 57 } 58 59 unsafe { 60 module_call_init(module_init_type::MODULE_INIT_QOM); 61 object_unref(object_new(DummyState::TYPE_NAME.as_ptr()).cast()); 62 } 63 } 64