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>
This commit is contained in:
Juraj Marcin 2024-09-04 12:37:13 +02:00 committed by David Hildenbrand
parent 1b063fe2df
commit 759cbb4ee9
3 changed files with 14 additions and 2 deletions

View file

@ -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.

View file

@ -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();
} }

View file

@ -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;