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 5*8c80c472SPaolo Bonzini use std::ffi::CStr; 6cde3c425SPaolo Bonzini 7cde3c425SPaolo Bonzini use qemu_api::{ 8cde3c425SPaolo Bonzini bindings::*, 9718e255fSPaolo Bonzini c_str, declare_properties, define_property, 10*8c80c472SPaolo Bonzini definitions::ObjectImpl, 11*8c80c472SPaolo Bonzini device_class::{self, DeviceImpl}, 12*8c80c472SPaolo Bonzini impl_device_class, 130a65e412SManos Pitsidianakis zeroable::Zeroable, 14cde3c425SPaolo Bonzini }; 15cde3c425SPaolo Bonzini 16cde3c425SPaolo Bonzini #[test] 17cde3c425SPaolo Bonzini fn test_device_decl_macros() { 18cde3c425SPaolo Bonzini // Test that macros can compile. 190a65e412SManos Pitsidianakis pub static VMSTATE: VMStateDescription = VMStateDescription { 20718e255fSPaolo Bonzini name: c_str!("name").as_ptr(), 21cde3c425SPaolo Bonzini unmigratable: true, 220a65e412SManos Pitsidianakis ..Zeroable::ZERO 230a65e412SManos Pitsidianakis }; 24cde3c425SPaolo Bonzini 25f3518400SJunjie Mao #[derive(qemu_api_macros::offsets)] 26cde3c425SPaolo Bonzini #[repr(C)] 27cde3c425SPaolo Bonzini #[derive(qemu_api_macros::Object)] 28cde3c425SPaolo Bonzini pub struct DummyState { 29cde3c425SPaolo Bonzini pub _parent: DeviceState, 30cde3c425SPaolo Bonzini pub migrate_clock: bool, 31cde3c425SPaolo Bonzini } 32cde3c425SPaolo Bonzini 33cde3c425SPaolo Bonzini #[repr(C)] 34cde3c425SPaolo Bonzini pub struct DummyClass { 35cde3c425SPaolo Bonzini pub _parent: DeviceClass, 36cde3c425SPaolo Bonzini } 37cde3c425SPaolo Bonzini 38cde3c425SPaolo Bonzini declare_properties! { 39cde3c425SPaolo Bonzini DUMMY_PROPERTIES, 40cde3c425SPaolo Bonzini define_property!( 41718e255fSPaolo Bonzini c_str!("migrate-clk"), 42cde3c425SPaolo Bonzini DummyState, 43cde3c425SPaolo Bonzini migrate_clock, 44cde3c425SPaolo Bonzini unsafe { &qdev_prop_bool }, 45cde3c425SPaolo Bonzini bool 46cde3c425SPaolo Bonzini ), 47cde3c425SPaolo Bonzini } 48cde3c425SPaolo Bonzini 49cde3c425SPaolo Bonzini impl ObjectImpl for DummyState { 50cde3c425SPaolo Bonzini type Class = DummyClass; 51718e255fSPaolo Bonzini const TYPE_NAME: &'static CStr = c_str!("dummy"); 52ce4a144cSPaolo Bonzini const PARENT_TYPE_NAME: Option<&'static CStr> = Some(device_class::TYPE_DEVICE); 53cde3c425SPaolo Bonzini } 54cde3c425SPaolo Bonzini 55*8c80c472SPaolo Bonzini impl DeviceImpl for DummyState { 56*8c80c472SPaolo Bonzini fn properties() -> &'static [Property] { 57*8c80c472SPaolo Bonzini &DUMMY_PROPERTIES 58cde3c425SPaolo Bonzini } 59*8c80c472SPaolo Bonzini fn vmsd() -> Option<&'static VMStateDescription> { 60*8c80c472SPaolo Bonzini Some(&VMSTATE) 61*8c80c472SPaolo Bonzini } 62*8c80c472SPaolo Bonzini } 63*8c80c472SPaolo Bonzini 64*8c80c472SPaolo Bonzini impl_device_class!(DummyState); 65cde3c425SPaolo Bonzini 66cde3c425SPaolo Bonzini unsafe { 67cde3c425SPaolo Bonzini module_call_init(module_init_type::MODULE_INIT_QOM); 687a35e2fbSPaolo Bonzini object_unref(object_new(DummyState::TYPE_NAME.as_ptr()).cast()); 69cde3c425SPaolo Bonzini } 70cde3c425SPaolo Bonzini } 71