rust: vmstate: use const_refs_to_static
The VMStateDescriptionBuilder already needs const_refs_static, so use it to remove the need for vmstate_clock! and vmstate_struct!, as well as to simplify the implementation for scalars. If the consts in the VMState trait can reference to static VMStateDescription, scalars do not need the info_enum_to_ref! indirection and structs can implement the VMState trait themselves. Reviewed-by: Zhao Liu <zhao1.liu@intel.com> Link: https://lore.kernel.org/r/20250908105005.2119297-9-pbonzini@redhat.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
7da9ee9207
commit
dcdee1e718
6 changed files with 113 additions and 217 deletions
|
|
@ -2,14 +2,11 @@
|
|||
// Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
use std::{
|
||||
ffi::CStr,
|
||||
mem::size_of
|
||||
};
|
||||
use std::{ffi::CStr, mem::size_of};
|
||||
|
||||
use qemu_api::{
|
||||
chardev::{CharBackend, Chardev, Event},
|
||||
impl_vmstate_forward,
|
||||
impl_vmstate_forward, impl_vmstate_struct,
|
||||
irq::{IRQState, InterruptSource},
|
||||
log::Log,
|
||||
log_mask_ln,
|
||||
|
|
@ -21,7 +18,7 @@ use qemu_api::{
|
|||
sysbus::{SysBusDevice, SysBusDeviceImpl},
|
||||
uninit_field_mut,
|
||||
vmstate::{self, VMStateDescription, VMStateDescriptionBuilder},
|
||||
vmstate_clock, vmstate_fields, vmstate_of, vmstate_struct, vmstate_subsections, vmstate_unused,
|
||||
vmstate_fields, vmstate_of, vmstate_subsections, vmstate_unused,
|
||||
};
|
||||
|
||||
use crate::registers::{self, Interrupt, RegisterOffset};
|
||||
|
|
@ -725,11 +722,12 @@ static VMSTATE_PL011_CLOCK: VMStateDescription<PL011State> =
|
|||
.minimum_version_id(1)
|
||||
.needed(&PL011State::clock_needed)
|
||||
.fields(vmstate_fields! {
|
||||
vmstate_clock!(PL011State, clock),
|
||||
vmstate_of!(PL011State, clock),
|
||||
})
|
||||
.build();
|
||||
|
||||
static VMSTATE_PL011_REGS: VMStateDescription<PL011Registers> =
|
||||
impl_vmstate_struct!(
|
||||
PL011Registers,
|
||||
VMStateDescriptionBuilder::<PL011Registers>::new()
|
||||
.name(c"pl011/regs")
|
||||
.version_id(2)
|
||||
|
|
@ -751,7 +749,8 @@ static VMSTATE_PL011_REGS: VMStateDescription<PL011Registers> =
|
|||
vmstate_of!(PL011Registers, read_count),
|
||||
vmstate_of!(PL011Registers, read_trigger),
|
||||
})
|
||||
.build();
|
||||
.build()
|
||||
);
|
||||
|
||||
pub const VMSTATE_PL011: VMStateDescription<PL011State> =
|
||||
VMStateDescriptionBuilder::<PL011State>::new()
|
||||
|
|
@ -761,7 +760,7 @@ pub const VMSTATE_PL011: VMStateDescription<PL011State> =
|
|||
.post_load(&PL011State::post_load)
|
||||
.fields(vmstate_fields! {
|
||||
vmstate_unused!(core::mem::size_of::<u32>()),
|
||||
vmstate_struct!(PL011State, regs, &VMSTATE_PL011_REGS, BqlRefCell<PL011Registers>),
|
||||
vmstate_of!(PL011State, regs),
|
||||
})
|
||||
.subsections(vmstate_subsections! {
|
||||
VMSTATE_PL011_CLOCK
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ use qemu_api::{
|
|||
qdev_prop_uint32, qdev_prop_usize,
|
||||
},
|
||||
cell::{BqlCell, BqlRefCell},
|
||||
impl_vmstate_struct,
|
||||
irq::InterruptSource,
|
||||
memory::{
|
||||
hwaddr, MemoryRegion, MemoryRegionOps, MemoryRegionOpsBuilder, MEMTXATTRS_UNSPECIFIED,
|
||||
|
|
@ -28,7 +29,7 @@ use qemu_api::{
|
|||
timer::{Timer, CLOCK_VIRTUAL, NANOSECONDS_PER_SECOND},
|
||||
uninit_field_mut,
|
||||
vmstate::{self, VMStateDescription, VMStateDescriptionBuilder},
|
||||
vmstate_fields, vmstate_of, vmstate_struct, vmstate_subsections, vmstate_validate,
|
||||
vmstate_fields, vmstate_of, vmstate_subsections, vmstate_validate,
|
||||
};
|
||||
|
||||
use crate::fw_cfg::HPETFwConfig;
|
||||
|
|
@ -964,7 +965,7 @@ static VMSTATE_HPET_OFFSET: VMStateDescription<HPETState> =
|
|||
})
|
||||
.build();
|
||||
|
||||
static VMSTATE_HPET_TIMER: VMStateDescription<HPETTimer> =
|
||||
const VMSTATE_HPET_TIMER: VMStateDescription<HPETTimer> =
|
||||
VMStateDescriptionBuilder::<HPETTimer>::new()
|
||||
.name(c"hpet_timer")
|
||||
.version_id(1)
|
||||
|
|
@ -979,6 +980,7 @@ static VMSTATE_HPET_TIMER: VMStateDescription<HPETTimer> =
|
|||
vmstate_of!(HPETTimer, qemu_timer),
|
||||
})
|
||||
.build();
|
||||
impl_vmstate_struct!(HPETTimer, VMSTATE_HPET_TIMER);
|
||||
|
||||
const VALIDATE_TIMERS_NAME: &CStr = c"num_timers must match";
|
||||
|
||||
|
|
@ -995,7 +997,7 @@ const VMSTATE_HPET: VMStateDescription<HPETState> =
|
|||
vmstate_of!(HPETState, counter),
|
||||
vmstate_of!(HPETState, num_timers_save),
|
||||
vmstate_validate!(HPETState, VALIDATE_TIMERS_NAME, HPETState::validate_num_timers),
|
||||
vmstate_struct!(HPETState, timers[0 .. num_timers_save], &VMSTATE_HPET_TIMER, BqlRefCell<HPETTimer>, HPETState::validate_num_timers).with_version_id(0),
|
||||
vmstate_of!(HPETState, timers[0 .. num_timers_save], HPETState::validate_num_timers).with_version_id(0),
|
||||
})
|
||||
.subsections(vmstate_subsections!(
|
||||
VMSTATE_HPET_RTC_IRQ_LEVEL,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue