aboutsummaryrefslogtreecommitdiff
path: root/rust/hw/char
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2024-10-31 14:27:36 +0100
committerPaolo Bonzini <pbonzini@redhat.com>2025-02-13 12:19:33 +0100
commitec3eba98967014f942bafb4307303d853d96e7e7 (patch)
tree7d8c3dc306db920fb6bd8b56c8fbc1c27af7e469 /rust/hw/char
parent0fcccf3ff04a54d597bffcb7a42668c52a7dcec0 (diff)
downloadqemu-ec3eba98967014f942bafb4307303d853d96e7e7.zip
qemu-ec3eba98967014f942bafb4307303d853d96e7e7.tar.gz
qemu-ec3eba98967014f942bafb4307303d853d96e7e7.tar.bz2
rust: qom: add object creation functionality
The basic object lifecycle test can now be implemented using safe code! Reviewed-by: Zhao Liu <zhao1.liu@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'rust/hw/char')
-rw-r--r--rust/hw/char/pl011/src/device.rs23
1 files changed, 13 insertions, 10 deletions
diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/device.rs
index 8050ede..f5db114 100644
--- a/rust/hw/char/pl011/src/device.rs
+++ b/rust/hw/char/pl011/src/device.rs
@@ -10,11 +10,11 @@ use std::{
use qemu_api::{
bindings::{
- error_fatal, hwaddr, memory_region_init_io, qdev_init_clock_in, qdev_new,
- qdev_prop_set_chr, qemu_chr_fe_accept_input, qemu_chr_fe_ioctl, qemu_chr_fe_set_handlers,
- qemu_chr_fe_write_all, qemu_irq, sysbus_connect_irq, sysbus_mmio_map,
- sysbus_realize_and_unref, CharBackend, Chardev, Clock, ClockEvent, MemoryRegion,
- QEMUChrEvent, CHR_IOCTL_SERIAL_SET_BREAK,
+ error_fatal, hwaddr, memory_region_init_io, qdev_init_clock_in, qdev_prop_set_chr,
+ qemu_chr_fe_accept_input, qemu_chr_fe_ioctl, qemu_chr_fe_set_handlers,
+ qemu_chr_fe_write_all, qemu_irq, sysbus_connect_irq, sysbus_mmio_map, sysbus_realize,
+ CharBackend, Chardev, Clock, ClockEvent, MemoryRegion, QEMUChrEvent,
+ CHR_IOCTL_SERIAL_SET_BREAK,
},
c_str, impl_vmstate_forward,
irq::InterruptSource,
@@ -705,15 +705,18 @@ pub unsafe extern "C" fn pl011_create(
irq: qemu_irq,
chr: *mut Chardev,
) -> *mut DeviceState {
+ let pl011 = PL011State::new();
unsafe {
- let dev: *mut DeviceState = qdev_new(PL011State::TYPE_NAME.as_ptr());
- let sysbus: *mut SysBusDevice = dev.cast::<SysBusDevice>();
-
+ let dev = pl011.as_mut_ptr::<DeviceState>();
qdev_prop_set_chr(dev, c_str!("chardev").as_ptr(), chr);
- sysbus_realize_and_unref(sysbus, addr_of_mut!(error_fatal));
+
+ let sysbus = pl011.as_mut_ptr::<SysBusDevice>();
+ sysbus_realize(sysbus, addr_of_mut!(error_fatal));
sysbus_mmio_map(sysbus, 0, addr);
sysbus_connect_irq(sysbus, 0, irq);
- dev
+
+ // return the pointer, which is kept alive by the QOM tree; drop owned ref
+ pl011.as_mut_ptr()
}
}