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 #[repr(C)] 30 pub struct DummyClass { 31 pub _parent: DeviceClass, 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 = DummyClass; 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 impl_device_class!(DummyState); 65 66 unsafe { 67 module_call_init(module_init_type::MODULE_INIT_QOM); 68 object_unref(object_new(DummyState::TYPE_NAME.as_ptr()).cast()); 69 } 70 } 71