@@ -506,6 +506,8 @@ static void build_dsdt(GArray *table_data,
s->memmap[VIRT_ACPI_GED].base);
}
+ acpi_dsdt_add_power_button(scope);
+
aml_append(dsdt, scope);
/* copy AML table into ACPI tables blob and patch header there */
@@ -51,6 +51,7 @@
#include "system/kvm.h"
#include "system/tpm.h"
#include "system/qtest.h"
+#include "system/runstate.h"
#include "hw/pci/pci.h"
#include "hw/pci-host/gpex.h"
#include "hw/display/ramfb.h"
@@ -1446,6 +1447,16 @@ static void virt_build_smbios(RISCVVirtState *s)
}
}
+static void virt_powerdown_req(Notifier *notifier, void *opaque)
+{
+ RISCVVirtState *s;
+
+ s = container_of(notifier, RISCVVirtState, powerdown_notifier);
+ if(s->acpi_ged) {
+ acpi_send_event(s->acpi_ged, ACPI_POWER_DOWN_STATUS);
+ }
+}
+
static void virt_machine_done(Notifier *notifier, void *data)
{
RISCVVirtState *s = container_of(notifier, RISCVVirtState,
@@ -1766,6 +1777,9 @@ static void virt_machine_init(MachineState *machine)
sysbus_realize_and_unref(SYS_BUS_DEVICE(iommu_sys), &error_fatal);
}
+ s->powerdown_notifier.notify = virt_powerdown_req;
+ qemu_register_powerdown_notifier(&s->powerdown_notifier);
+
s->machine_done.notify = virt_machine_done;
qemu_add_machine_init_done_notifier(&s->machine_done);
}
@@ -47,6 +47,7 @@ struct RISCVVirtState {
/*< public >*/
Notifier machine_done;
+ Notifier powerdown_notifier;
DeviceState *acpi_ged;
DeviceState *platform_bus_dev;
RISCVHartArrayState soc[VIRT_SOCKETS_MAX];