Bläddra i källkod

reset: Add RESET_TYPE_WAKEUP

Some devices need to distinguish cold start reset from waking up from a
suspended state. This patch adds new value to the enum, and updates the
i386 wakeup method to use this new reset type.

Message-ID: <20240904103722.946194-3-jmarcin@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Juraj Marcin <jmarcin@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
Juraj Marcin 11 månader sedan
förälder
incheckning
759cbb4ee9
3 ändrade filer med 14 tillägg och 2 borttagningar
  1. 11 1
      docs/devel/reset.rst
  2. 1 1
      hw/i386/pc.c
  3. 2 0
      include/hw/resettable.h

+ 11 - 1
docs/devel/reset.rst

@@ -44,6 +44,17 @@ The Resettable interface handles reset types with an enum ``ResetType``:
   value on each cold reset, such as RNG seed information, and which they
   value on each cold reset, such as RNG seed information, and which they
   must not reinitialize on a snapshot-load reset.
   must not reinitialize on a snapshot-load reset.
 
 
+``RESET_TYPE_WAKEUP``
+  If the machine supports waking up from a suspended state and needs to reset
+  its devices during wake-up (from the ``MachineClass::wakeup()`` method), this
+  reset type should be used for such a request. Devices can utilize this reset
+  type to differentiate the reset requested during machine wake-up from other
+  reset requests. For example, RAM content must not be lost during wake-up, and
+  memory devices like virtio-mem that provide additional RAM must not reset
+  such state during wake-ups, but might do so during cold resets. However, this
+  reset type should not be used for wake-up detection, as not every machine
+  type issues a device reset request during wake-up.
+
 ``RESET_TYPE_S390_CPU_NORMAL``
 ``RESET_TYPE_S390_CPU_NORMAL``
   This is only used for S390 CPU objects; it clears interrupts, stops
   This is only used for S390 CPU objects; it clears interrupts, stops
   processing, and clears the TLB, but does not touch register contents.
   processing, and clears the TLB, but does not touch register contents.
@@ -53,7 +64,6 @@ The Resettable interface handles reset types with an enum ``ResetType``:
   ``RESET_TYPE_S390_CPU_NORMAL`` does and also clears the PSW, prefix,
   ``RESET_TYPE_S390_CPU_NORMAL`` does and also clears the PSW, prefix,
   FPC, timer and control registers. It does not touch gprs, fprs or acrs.
   FPC, timer and control registers. It does not touch gprs, fprs or acrs.
 
 
-
 Devices which implement reset methods must treat any unknown ``ResetType``
 Devices which implement reset methods must treat any unknown ``ResetType``
 as equivalent to ``RESET_TYPE_COLD``; this will reduce the amount of
 as equivalent to ``RESET_TYPE_COLD``; this will reduce the amount of
 existing code we need to change if we add more types in future.
 existing code we need to change if we add more types in future.

+ 1 - 1
hw/i386/pc.c

@@ -1732,7 +1732,7 @@ static void pc_machine_reset(MachineState *machine, ResetType type)
 static void pc_machine_wakeup(MachineState *machine)
 static void pc_machine_wakeup(MachineState *machine)
 {
 {
     cpu_synchronize_all_states();
     cpu_synchronize_all_states();
-    pc_machine_reset(machine, RESET_TYPE_COLD);
+    pc_machine_reset(machine, RESET_TYPE_WAKEUP);
     cpu_synchronize_all_post_reset();
     cpu_synchronize_all_post_reset();
 }
 }
 
 

+ 2 - 0
include/hw/resettable.h

@@ -29,6 +29,7 @@ typedef struct ResettableState ResettableState;
  * Types of reset.
  * Types of reset.
  *
  *
  * + Cold: reset resulting from a power cycle of the object.
  * + Cold: reset resulting from a power cycle of the object.
+ * + Wakeup: reset resulting from a wake-up from a suspended state.
  *
  *
  * TODO: Support has to be added to handle more types. In particular,
  * TODO: Support has to be added to handle more types. In particular,
  * ResettableState structure needs to be expanded.
  * ResettableState structure needs to be expanded.
@@ -36,6 +37,7 @@ typedef struct ResettableState ResettableState;
 typedef enum ResetType {
 typedef enum ResetType {
     RESET_TYPE_COLD,
     RESET_TYPE_COLD,
     RESET_TYPE_SNAPSHOT_LOAD,
     RESET_TYPE_SNAPSHOT_LOAD,
+    RESET_TYPE_WAKEUP,
     RESET_TYPE_S390_CPU_INITIAL,
     RESET_TYPE_S390_CPU_INITIAL,
     RESET_TYPE_S390_CPU_NORMAL,
     RESET_TYPE_S390_CPU_NORMAL,
 } ResetType;
 } ResetType;