1cde3c425SPaolo Bonzini // Copyright 2024, Linaro Limited 2cde3c425SPaolo Bonzini // Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org> 3cde3c425SPaolo Bonzini // SPDX-License-Identifier: GPL-2.0-or-later 4cde3c425SPaolo Bonzini 58c80c472SPaolo Bonzini use std::ffi::CStr; 6cde3c425SPaolo Bonzini 7cde3c425SPaolo Bonzini use qemu_api::{ 87bd8e3efSPaolo Bonzini bindings::*, c_str, declare_properties, define_property, definitions::ObjectImpl, 97bd8e3efSPaolo Bonzini device_class::DeviceImpl, impl_device_class, prelude::*, zeroable::Zeroable, 10cde3c425SPaolo Bonzini }; 11cde3c425SPaolo Bonzini 12cde3c425SPaolo Bonzini #[test] 13cde3c425SPaolo Bonzini fn test_device_decl_macros() { 14cde3c425SPaolo Bonzini // Test that macros can compile. 150a65e412SManos Pitsidianakis pub static VMSTATE: VMStateDescription = VMStateDescription { 16718e255fSPaolo Bonzini name: c_str!("name").as_ptr(), 17cde3c425SPaolo Bonzini unmigratable: true, 180a65e412SManos Pitsidianakis ..Zeroable::ZERO 190a65e412SManos Pitsidianakis }; 20cde3c425SPaolo Bonzini 21f3518400SJunjie Mao #[derive(qemu_api_macros::offsets)] 22cde3c425SPaolo Bonzini #[repr(C)] 23cde3c425SPaolo Bonzini #[derive(qemu_api_macros::Object)] 24cde3c425SPaolo Bonzini pub struct DummyState { 25cde3c425SPaolo Bonzini pub _parent: DeviceState, 26cde3c425SPaolo Bonzini pub migrate_clock: bool, 27cde3c425SPaolo Bonzini } 28cde3c425SPaolo Bonzini 29cde3c425SPaolo Bonzini declare_properties! { 30cde3c425SPaolo Bonzini DUMMY_PROPERTIES, 31cde3c425SPaolo Bonzini define_property!( 32718e255fSPaolo Bonzini c_str!("migrate-clk"), 33cde3c425SPaolo Bonzini DummyState, 34cde3c425SPaolo Bonzini migrate_clock, 35cde3c425SPaolo Bonzini unsafe { &qdev_prop_bool }, 36cde3c425SPaolo Bonzini bool 37cde3c425SPaolo Bonzini ), 38cde3c425SPaolo Bonzini } 39cde3c425SPaolo Bonzini 407bd8e3efSPaolo Bonzini unsafe impl ObjectType for DummyState { 41*6dd818fbSPaolo Bonzini type Class = <DeviceState as ObjectType>::Class; 42718e255fSPaolo Bonzini const TYPE_NAME: &'static CStr = c_str!("dummy"); 437bd8e3efSPaolo Bonzini } 447bd8e3efSPaolo Bonzini 457bd8e3efSPaolo Bonzini impl ObjectImpl for DummyState { 46166e8a1fSPaolo Bonzini type ParentType = DeviceState; 477bd8e3efSPaolo Bonzini const ABSTRACT: bool = false; 48cde3c425SPaolo Bonzini } 49cde3c425SPaolo Bonzini 508c80c472SPaolo Bonzini impl DeviceImpl for DummyState { 518c80c472SPaolo Bonzini fn properties() -> &'static [Property] { 528c80c472SPaolo Bonzini &DUMMY_PROPERTIES 53cde3c425SPaolo Bonzini } 548c80c472SPaolo Bonzini fn vmsd() -> Option<&'static VMStateDescription> { 558c80c472SPaolo Bonzini Some(&VMSTATE) 568c80c472SPaolo Bonzini } 578c80c472SPaolo Bonzini } 588c80c472SPaolo Bonzini 59cde3c425SPaolo Bonzini unsafe { 60cde3c425SPaolo Bonzini module_call_init(module_init_type::MODULE_INIT_QOM); 617a35e2fbSPaolo Bonzini object_unref(object_new(DummyState::TYPE_NAME.as_ptr()).cast()); 62cde3c425SPaolo Bonzini } 63cde3c425SPaolo Bonzini } 64