tests.rs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // Copyright 2024, Linaro Limited
  2. // Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
  3. // SPDX-License-Identifier: GPL-2.0-or-later
  4. use std::{ffi::CStr, os::raw::c_void};
  5. use qemu_api::{
  6. bindings::*,
  7. c_str, declare_properties, define_property,
  8. definitions::{ClassInitImpl, ObjectImpl},
  9. device_class, device_class_init,
  10. zeroable::Zeroable,
  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. #[derive(qemu_api_macros::offsets)]
  21. #[repr(C)]
  22. #[derive(qemu_api_macros::Object)]
  23. pub struct DummyState {
  24. pub _parent: DeviceState,
  25. pub migrate_clock: bool,
  26. }
  27. #[repr(C)]
  28. pub struct DummyClass {
  29. pub _parent: DeviceClass,
  30. }
  31. declare_properties! {
  32. DUMMY_PROPERTIES,
  33. define_property!(
  34. c_str!("migrate-clk"),
  35. DummyState,
  36. migrate_clock,
  37. unsafe { &qdev_prop_bool },
  38. bool
  39. ),
  40. }
  41. device_class_init! {
  42. dummy_class_init,
  43. props => DUMMY_PROPERTIES,
  44. realize_fn => None,
  45. legacy_reset_fn => None,
  46. vmsd => VMSTATE,
  47. }
  48. impl ObjectImpl for DummyState {
  49. type Class = DummyClass;
  50. const TYPE_INFO: qemu_api::bindings::TypeInfo = qemu_api::type_info! { Self };
  51. const TYPE_NAME: &'static CStr = c_str!("dummy");
  52. const PARENT_TYPE_NAME: Option<&'static CStr> = Some(device_class::TYPE_DEVICE);
  53. }
  54. impl ClassInitImpl for DummyClass {
  55. const CLASS_INIT: Option<unsafe extern "C" fn(klass: *mut ObjectClass, data: *mut c_void)> =
  56. Some(dummy_class_init);
  57. const CLASS_BASE_INIT: Option<
  58. unsafe extern "C" fn(klass: *mut ObjectClass, data: *mut c_void),
  59. > = None;
  60. }
  61. unsafe {
  62. module_call_init(module_init_type::MODULE_INIT_QOM);
  63. object_unref(object_new(DummyState::TYPE_NAME.as_ptr()).cast());
  64. }
  65. }