mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging
* rust: better integration with clippy, rustfmt and rustdoc * rust: interior mutability types * rust: add a bit operations module * rust: first part of QOM rework * kvm: remove unnecessary #ifdef * clock: small cleanups, improve handling of Clock lifetimes # -----BEGIN PGP SIGNATURE----- # # iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmdZqFkUHHBib256aW5p # QHJlZGhhdC5jb20ACgkQv/vSX3jHroOzRwf/SYUD+CJCn2x7kUH/JG893jwN1WbJ # meGZ0PQDUpOZJFWg6T4g0MuW4O+Wevy2pF4SfGojgqaYxKBbTQVkeliDEMyNUxpr # vSKXego0K3pkX3cRDXNVTaXFbsHsMt/3pfzMQM6ocF9qbL+Emvx7Og6WdAcyJ4hc # lA17EHlnrWKUSnqN/Ow/pZXsa4ijCklXFFh4barfbdGVhMQc2QekUU45GsP2AvGT # NkXTQC05HqxBaAIDeSxbprDSzNihyT71dAooVoxqKboprPu5uoUSJwgaD8rADPr4 # EOfsz61V4mji+DWDcIzTtYoAdY41vVXI9lvCKOcCFkimA29xO0W6P7mG2w== # =JSh5 # -----END PGP SIGNATURE----- # gpg: Signature made Wed 11 Dec 2024 09:57:29 EST # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [full] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [full] # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * tag 'for-upstream' of https://gitlab.com/bonzini/qemu: (49 commits) rust: qom: change the parent type to an associated type rust: qom: split ObjectType from ObjectImpl trait rust: qom: move bridge for TypeInfo functions out of pl011 rust: qdev: move bridge for realize and reset functions out of pl011 rust: qdev: move device_class_init! body to generic function, ClassInitImpl implementation to macro rust: qom: move ClassInitImpl to the instance side rust: qom: convert type_info! macro to an associated const rust: qom: rename Class trait to ClassInitImpl rust: qom: add default definitions for ObjectImpl rust: add a bit operation module rust: add bindings for interrupt sources rust: define prelude rust: cell: add BQL-enforcing RefCell variant rust: cell: add BQL-enforcing Cell variant bql: check that the BQL is not dropped within marked sections qom/object: Remove type_register() script/codeconverter/qom_type_info: Deprecate MakeTypeRegisterStatic and MakeTypeRegisterNotStatic ui: Replace type_register() with type_register_static() target/xtensa: Replace type_register() with type_register_static() target/sparc: Replace type_register() with type_register_static() ... Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
@@ -40,7 +40,7 @@ build-system-ubuntu:
|
||||
job: amd64-ubuntu2204-container
|
||||
variables:
|
||||
IMAGE: ubuntu2204
|
||||
CONFIGURE_ARGS: --enable-docs
|
||||
CONFIGURE_ARGS: --enable-docs --enable-rust
|
||||
TARGETS: alpha-softmmu microblazeel-softmmu mips64el-softmmu
|
||||
MAKE_CHECK_ARGS: check-build
|
||||
|
||||
@@ -71,7 +71,7 @@ build-system-debian:
|
||||
job: amd64-debian-container
|
||||
variables:
|
||||
IMAGE: debian
|
||||
CONFIGURE_ARGS: --with-coroutine=sigaltstack
|
||||
CONFIGURE_ARGS: --with-coroutine=sigaltstack --enable-rust
|
||||
TARGETS: arm-softmmu i386-softmmu riscv64-softmmu sh4eb-softmmu
|
||||
sparc-softmmu xtensa-softmmu
|
||||
MAKE_CHECK_ARGS: check-build
|
||||
|
||||
@@ -46,3 +46,27 @@ check-python-tox:
|
||||
QEMU_JOB_OPTIONAL: 1
|
||||
needs:
|
||||
job: python-container
|
||||
|
||||
check-rust-tools-nightly:
|
||||
extends: .base_job_template
|
||||
stage: test
|
||||
image: $CI_REGISTRY_IMAGE/qemu/fedora-rust-nightly:$QEMU_CI_CONTAINER_TAG
|
||||
script:
|
||||
- source scripts/ci/gitlab-ci-section
|
||||
- section_start test "Running Rust code checks"
|
||||
- cd build
|
||||
- pyvenv/bin/meson devenv -w ../rust ${CARGO-cargo} fmt --check
|
||||
- make clippy
|
||||
- make rustdoc
|
||||
- section_end test
|
||||
variables:
|
||||
GIT_DEPTH: 1
|
||||
allow_failure: true
|
||||
needs:
|
||||
- job: build-system-fedora-rust-nightly
|
||||
artifacts: true
|
||||
artifacts:
|
||||
when: on_success
|
||||
expire_in: 2 days
|
||||
paths:
|
||||
- rust/target/doc
|
||||
|
||||
+1
-1
@@ -1731,7 +1731,7 @@ static void armsse_register_types(void)
|
||||
.class_init = armsse_class_init,
|
||||
.class_data = (void *)&armsse_variants[i],
|
||||
};
|
||||
type_register(&ti);
|
||||
type_register_static(&ti);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -2065,8 +2065,8 @@ static const TypeInfo smmuv3_iommu_memory_region_info = {
|
||||
|
||||
static void smmuv3_register_types(void)
|
||||
{
|
||||
type_register(&smmuv3_type_info);
|
||||
type_register(&smmuv3_iommu_memory_region_info);
|
||||
type_register_static(&smmuv3_type_info);
|
||||
type_register_static(&smmuv3_iommu_memory_region_info);
|
||||
}
|
||||
|
||||
type_init(smmuv3_register_types)
|
||||
|
||||
+1
-1
@@ -1894,7 +1894,7 @@ static void m25p80_register_types(void)
|
||||
.class_init = m25p80_class_init,
|
||||
.class_data = (void *)&known_devices[i],
|
||||
};
|
||||
type_register(&ti);
|
||||
type_register_static(&ti);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+17
-5
@@ -44,16 +44,12 @@ Clock *clock_new(Object *parent, const char *name)
|
||||
void clock_set_callback(Clock *clk, ClockCallback *cb, void *opaque,
|
||||
unsigned int events)
|
||||
{
|
||||
assert(OBJECT(clk)->parent);
|
||||
clk->callback = cb;
|
||||
clk->callback_opaque = opaque;
|
||||
clk->callback_events = events;
|
||||
}
|
||||
|
||||
void clock_clear_callback(Clock *clk)
|
||||
{
|
||||
clock_set_callback(clk, NULL, NULL, 0);
|
||||
}
|
||||
|
||||
bool clock_set(Clock *clk, uint64_t period)
|
||||
{
|
||||
if (clk->period == period) {
|
||||
@@ -168,6 +164,16 @@ static void clock_period_prop_get(Object *obj, Visitor *v, const char *name,
|
||||
visit_type_uint64(v, name, &period, errp);
|
||||
}
|
||||
|
||||
static void clock_unparent(Object *obj)
|
||||
{
|
||||
/*
|
||||
* Callback are registered by the parent, which might die anytime after
|
||||
* it's unparented the children. Avoid having a callback to a deleted
|
||||
* object in case the clock is still referenced somewhere else (eg: by
|
||||
* a clock output).
|
||||
*/
|
||||
clock_set_callback(CLOCK(obj), NULL, NULL, 0);
|
||||
}
|
||||
|
||||
static void clock_initfn(Object *obj)
|
||||
{
|
||||
@@ -200,11 +206,17 @@ static void clock_finalizefn(Object *obj)
|
||||
g_free(clk->canonical_path);
|
||||
}
|
||||
|
||||
static void clock_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
klass->unparent = clock_unparent;
|
||||
}
|
||||
|
||||
static const TypeInfo clock_info = {
|
||||
.name = TYPE_CLOCK,
|
||||
.parent = TYPE_OBJECT,
|
||||
.instance_size = sizeof(Clock),
|
||||
.instance_init = clock_initfn,
|
||||
.class_init = clock_class_init,
|
||||
.instance_finalize = clock_finalizefn,
|
||||
};
|
||||
|
||||
|
||||
+29
-57
@@ -22,7 +22,7 @@
|
||||
* Add a new clock in a device
|
||||
*/
|
||||
static NamedClockList *qdev_init_clocklist(DeviceState *dev, const char *name,
|
||||
bool output, Clock *clk)
|
||||
bool alias, bool output, Clock *clk)
|
||||
{
|
||||
NamedClockList *ncl;
|
||||
|
||||
@@ -38,39 +38,8 @@ static NamedClockList *qdev_init_clocklist(DeviceState *dev, const char *name,
|
||||
*/
|
||||
ncl = g_new0(NamedClockList, 1);
|
||||
ncl->name = g_strdup(name);
|
||||
ncl->alias = alias;
|
||||
ncl->output = output;
|
||||
ncl->alias = (clk != NULL);
|
||||
|
||||
/*
|
||||
* Trying to create a clock whose name clashes with some other
|
||||
* clock or property is a bug in the caller and we will abort().
|
||||
*/
|
||||
if (clk == NULL) {
|
||||
clk = CLOCK(object_new(TYPE_CLOCK));
|
||||
object_property_add_child(OBJECT(dev), name, OBJECT(clk));
|
||||
if (output) {
|
||||
/*
|
||||
* Remove object_new()'s initial reference.
|
||||
* Note that for inputs, the reference created by object_new()
|
||||
* will be deleted in qdev_finalize_clocklist().
|
||||
*/
|
||||
object_unref(OBJECT(clk));
|
||||
}
|
||||
} else {
|
||||
object_property_add_link(OBJECT(dev), name,
|
||||
object_get_typename(OBJECT(clk)),
|
||||
(Object **) &ncl->clock,
|
||||
NULL, OBJ_PROP_LINK_STRONG);
|
||||
/*
|
||||
* Since the link property has the OBJ_PROP_LINK_STRONG flag, the clk
|
||||
* object reference count gets decremented on property deletion.
|
||||
* However object_property_add_link does not increment it since it
|
||||
* doesn't know the linked object. Increment it here to ensure the
|
||||
* aliased clock stays alive during this device life-time.
|
||||
*/
|
||||
object_ref(OBJECT(clk));
|
||||
}
|
||||
|
||||
ncl->clock = clk;
|
||||
|
||||
QLIST_INSERT_HEAD(&dev->clocks, ncl, node);
|
||||
@@ -84,14 +53,11 @@ void qdev_finalize_clocklist(DeviceState *dev)
|
||||
|
||||
QLIST_FOREACH_SAFE(ncl, &dev->clocks, node, ncl_next) {
|
||||
QLIST_REMOVE(ncl, node);
|
||||
if (!ncl->output && !ncl->alias) {
|
||||
if (!ncl->alias) {
|
||||
/*
|
||||
* We kept a reference on the input clock to ensure it lives up to
|
||||
* this point so we can safely remove the callback.
|
||||
* It avoids having a callback to a deleted object if ncl->clock
|
||||
* is still referenced somewhere else (eg: by a clock output).
|
||||
* this point; it is used by the monitor to show the frequency.
|
||||
*/
|
||||
clock_clear_callback(ncl->clock);
|
||||
object_unref(OBJECT(ncl->clock));
|
||||
}
|
||||
g_free(ncl->name);
|
||||
@@ -101,29 +67,25 @@ void qdev_finalize_clocklist(DeviceState *dev)
|
||||
|
||||
Clock *qdev_init_clock_out(DeviceState *dev, const char *name)
|
||||
{
|
||||
NamedClockList *ncl;
|
||||
Clock *clk = CLOCK(object_new(TYPE_CLOCK));
|
||||
object_property_add_child(OBJECT(dev), name, OBJECT(clk));
|
||||
|
||||
assert(name);
|
||||
|
||||
ncl = qdev_init_clocklist(dev, name, true, NULL);
|
||||
|
||||
return ncl->clock;
|
||||
qdev_init_clocklist(dev, name, false, true, clk);
|
||||
return clk;
|
||||
}
|
||||
|
||||
Clock *qdev_init_clock_in(DeviceState *dev, const char *name,
|
||||
ClockCallback *callback, void *opaque,
|
||||
unsigned int events)
|
||||
{
|
||||
NamedClockList *ncl;
|
||||
|
||||
assert(name);
|
||||
|
||||
ncl = qdev_init_clocklist(dev, name, false, NULL);
|
||||
Clock *clk = CLOCK(object_new(TYPE_CLOCK));
|
||||
object_property_add_child(OBJECT(dev), name, OBJECT(clk));
|
||||
|
||||
qdev_init_clocklist(dev, name, false, false, clk);
|
||||
if (callback) {
|
||||
clock_set_callback(ncl->clock, callback, opaque, events);
|
||||
clock_set_callback(clk, callback, opaque, events);
|
||||
}
|
||||
return ncl->clock;
|
||||
return clk;
|
||||
}
|
||||
|
||||
void qdev_init_clocks(DeviceState *dev, const ClockPortInitArray clocks)
|
||||
@@ -194,15 +156,25 @@ Clock *qdev_get_clock_out(DeviceState *dev, const char *name)
|
||||
Clock *qdev_alias_clock(DeviceState *dev, const char *name,
|
||||
DeviceState *alias_dev, const char *alias_name)
|
||||
{
|
||||
NamedClockList *ncl;
|
||||
NamedClockList *ncl = qdev_get_clocklist(dev, name);
|
||||
Clock *clk = ncl->clock;
|
||||
|
||||
assert(name && alias_name);
|
||||
ncl = qdev_init_clocklist(alias_dev, alias_name, true, ncl->output, clk);
|
||||
|
||||
ncl = qdev_get_clocklist(dev, name);
|
||||
object_property_add_link(OBJECT(alias_dev), alias_name,
|
||||
TYPE_CLOCK,
|
||||
(Object **) &ncl->clock,
|
||||
NULL, OBJ_PROP_LINK_STRONG);
|
||||
/*
|
||||
* Since the link property has the OBJ_PROP_LINK_STRONG flag, the clk
|
||||
* object reference count gets decremented on property deletion.
|
||||
* However object_property_add_link does not increment it since it
|
||||
* doesn't know the linked object. Increment it here to ensure the
|
||||
* aliased clock stays alive during this device life-time.
|
||||
*/
|
||||
object_ref(OBJECT(clk));
|
||||
|
||||
qdev_init_clocklist(alias_dev, alias_name, ncl->output, ncl->clock);
|
||||
|
||||
return ncl->clock;
|
||||
return clk;
|
||||
}
|
||||
|
||||
void qdev_connect_clock_in(DeviceState *dev, const char *name, Clock *source)
|
||||
|
||||
+1
-1
@@ -1774,7 +1774,7 @@ static void e1000_register_types(void)
|
||||
type_info.class_data = (void *)info;
|
||||
type_info.class_init = e1000_class_init;
|
||||
|
||||
type_register(&type_info);
|
||||
type_register_static(&type_info);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -2102,7 +2102,7 @@ static void eepro100_register_types(void)
|
||||
{ },
|
||||
};
|
||||
|
||||
type_register(&type_info);
|
||||
type_register_static(&type_info);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -4723,7 +4723,7 @@ static void spapr_machine_latest_class_options(MachineClass *mc)
|
||||
static void MACHINE_VER_SYM(register, spapr, __VA_ARGS__)(void) \
|
||||
{ \
|
||||
MACHINE_VER_DELETION(__VA_ARGS__); \
|
||||
type_register(&MACHINE_VER_SYM(info, spapr, __VA_ARGS__)); \
|
||||
type_register_static(&MACHINE_VER_SYM(info, spapr, __VA_ARGS__)); \
|
||||
} \
|
||||
type_init(MACHINE_VER_SYM(register, spapr, __VA_ARGS__))
|
||||
|
||||
|
||||
+1
-1
@@ -161,7 +161,7 @@ static void m48t59_isa_register_types(void)
|
||||
for (i = 0; i < ARRAY_SIZE(m48txx_isa_info); i++) {
|
||||
isa_type_info.name = m48txx_isa_info[i].bus_name;
|
||||
isa_type_info.class_data = &m48txx_isa_info[i];
|
||||
type_register(&isa_type_info);
|
||||
type_register_static(&isa_type_info);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -679,7 +679,7 @@ static void m48t59_register_types(void)
|
||||
for (i = 0; i < ARRAY_SIZE(m48txx_sysbus_info); i++) {
|
||||
sysbus_type_info.name = m48txx_sysbus_info[i].bus_name;
|
||||
sysbus_type_info.class_data = &m48txx_sysbus_info[i];
|
||||
type_register(&sysbus_type_info);
|
||||
type_register_static(&sysbus_type_info);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -2576,7 +2576,7 @@ static void megasas_register_types(void)
|
||||
type_info.class_init = megasas_class_init;
|
||||
type_info.interfaces = info->interfaces;
|
||||
|
||||
type_register(&type_info);
|
||||
type_register_static(&type_info);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -1450,7 +1450,7 @@ static const TypeInfo mptsas_info = {
|
||||
|
||||
static void mptsas_register_types(void)
|
||||
{
|
||||
type_register(&mptsas_info);
|
||||
type_register_static(&mptsas_info);
|
||||
}
|
||||
|
||||
type_init(mptsas_register_types)
|
||||
|
||||
+1
-1
@@ -384,7 +384,7 @@ static void tmp421_register_types(void)
|
||||
.class_init = tmp421_class_init,
|
||||
.class_data = (void *) &devices[i],
|
||||
};
|
||||
type_register(&ti);
|
||||
type_register_static(&ti);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -228,7 +228,7 @@ static void ehci_pci_register_types(void)
|
||||
for (i = 0; i < ARRAY_SIZE(ehci_pci_info); i++) {
|
||||
ehci_type_info.name = ehci_pci_info[i].name;
|
||||
ehci_type_info.class_data = ehci_pci_info + i;
|
||||
type_register(&ehci_type_info);
|
||||
type_register_static(&ehci_type_info);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -1362,7 +1362,7 @@ static void uhci_register_types(void)
|
||||
for (i = 0; i < ARRAY_SIZE(uhci_info); i++) {
|
||||
uhci_type_info.name = uhci_info[i].name;
|
||||
uhci_type_info.class_data = uhci_info + i;
|
||||
type_register(&uhci_type_info);
|
||||
type_register_static(&uhci_type_info);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2511,9 +2511,9 @@ void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t)
|
||||
base_type_info.class_data = (void *)t;
|
||||
}
|
||||
|
||||
type_register(&base_type_info);
|
||||
type_register_static(&base_type_info);
|
||||
if (generic_type_info.name) {
|
||||
type_register(&generic_type_info);
|
||||
type_register_static(&generic_type_info);
|
||||
}
|
||||
|
||||
if (t->non_transitional_name) {
|
||||
@@ -2527,7 +2527,7 @@ void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t)
|
||||
{ }
|
||||
},
|
||||
};
|
||||
type_register(&non_transitional_type_info);
|
||||
type_register_static(&non_transitional_type_info);
|
||||
}
|
||||
|
||||
if (t->transitional_name) {
|
||||
@@ -2544,7 +2544,7 @@ void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t)
|
||||
{ }
|
||||
},
|
||||
};
|
||||
type_register(&transitional_type_info);
|
||||
type_register_static(&transitional_type_info);
|
||||
}
|
||||
g_free(base_name);
|
||||
}
|
||||
|
||||
@@ -141,14 +141,6 @@ Clock *clock_new(Object *parent, const char *name);
|
||||
void clock_set_callback(Clock *clk, ClockCallback *cb,
|
||||
void *opaque, unsigned int events);
|
||||
|
||||
/**
|
||||
* clock_clear_callback:
|
||||
* @clk: the clock to delete the callback from
|
||||
*
|
||||
* Unregister the callback registered with clock_set_callback.
|
||||
*/
|
||||
void clock_clear_callback(Clock *clk);
|
||||
|
||||
/**
|
||||
* clock_set_source:
|
||||
* @clk: the clock.
|
||||
|
||||
@@ -319,7 +319,7 @@ extern const size_t pc_compat_2_3_len;
|
||||
}; \
|
||||
static void pc_machine_init_##suffix(void) \
|
||||
{ \
|
||||
type_register(&pc_machine_type_##suffix); \
|
||||
type_register_static(&pc_machine_type_##suffix); \
|
||||
} \
|
||||
type_init(pc_machine_init_##suffix)
|
||||
|
||||
@@ -349,7 +349,7 @@ extern const size_t pc_compat_2_3_len;
|
||||
static void MACHINE_VER_SYM(register, namesym, __VA_ARGS__)(void) \
|
||||
{ \
|
||||
MACHINE_VER_DELETION(__VA_ARGS__); \
|
||||
type_register(&MACHINE_VER_SYM(info, namesym, __VA_ARGS__)); \
|
||||
type_register_static(&MACHINE_VER_SYM(info, namesym, __VA_ARGS__)); \
|
||||
} \
|
||||
type_init(MACHINE_VER_SYM(register, namesym, __VA_ARGS__));
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user