mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
ppc/spapr: Implement H_WATCHDOG
The new PAPR 2.12 defines a watchdog facility managed via the new H_WATCHDOG hypercall. This adds H_WATCHDOG support which a proposed driver for pseries uses: https://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=303120 This was tested by running QEMU with a debug kernel and command line: -append \ "pseries-wdt.timeout=60 pseries-wdt.nowayout=1 pseries-wdt.action=2" and running "echo V > /dev/watchdog0" inside the VM. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Reviewed-by: Cédric Le Goater <clg@kaod.org> Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com> Message-Id: <20220622051008.1067464-1-aik@ozlabs.ru> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This commit is contained in:
parent
95444afcab
commit
81b205cecf
5 changed files with 310 additions and 1 deletions
|
@ -164,6 +164,21 @@ struct SpaprMachineClass {
|
|||
SpaprIrq *irq;
|
||||
};
|
||||
|
||||
#define WDT_MAX_WATCHDOGS 4 /* Maximum number of watchdog devices */
|
||||
|
||||
#define TYPE_SPAPR_WDT "spapr-wdt"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(SpaprWatchdog, SPAPR_WDT)
|
||||
|
||||
typedef struct SpaprWatchdog {
|
||||
/*< private >*/
|
||||
DeviceState parent_obj;
|
||||
/*< public >*/
|
||||
|
||||
QEMUTimer timer;
|
||||
uint8_t action; /* One of PSERIES_WDTF_ACTION_xxx */
|
||||
uint8_t leave_others; /* leaveOtherWatchdogsRunningOnTimeout */
|
||||
} SpaprWatchdog;
|
||||
|
||||
/**
|
||||
* SpaprMachineState:
|
||||
*/
|
||||
|
@ -264,6 +279,8 @@ struct SpaprMachineState {
|
|||
uint32_t FORM2_assoc_array[NUMA_NODES_MAX_NUM][FORM2_NUMA_ASSOC_SIZE];
|
||||
|
||||
Error *fwnmi_migration_blocker;
|
||||
|
||||
SpaprWatchdog wds[WDT_MAX_WATCHDOGS];
|
||||
};
|
||||
|
||||
#define H_SUCCESS 0
|
||||
|
@ -344,6 +361,7 @@ struct SpaprMachineState {
|
|||
#define H_P7 -60
|
||||
#define H_P8 -61
|
||||
#define H_P9 -62
|
||||
#define H_NOOP -63
|
||||
#define H_UNSUPPORTED -67
|
||||
#define H_OVERLAP -68
|
||||
#define H_UNSUPPORTED_FLAG -256
|
||||
|
@ -564,8 +582,9 @@ struct SpaprMachineState {
|
|||
#define H_SCM_HEALTH 0x400
|
||||
#define H_RPT_INVALIDATE 0x448
|
||||
#define H_SCM_FLUSH 0x44C
|
||||
#define H_WATCHDOG 0x45C
|
||||
|
||||
#define MAX_HCALL_OPCODE H_SCM_FLUSH
|
||||
#define MAX_HCALL_OPCODE H_WATCHDOG
|
||||
|
||||
/* The hcalls above are standardized in PAPR and implemented by pHyp
|
||||
* as well.
|
||||
|
@ -1028,6 +1047,7 @@ extern const VMStateDescription vmstate_spapr_cap_large_decr;
|
|||
extern const VMStateDescription vmstate_spapr_cap_ccf_assist;
|
||||
extern const VMStateDescription vmstate_spapr_cap_fwnmi;
|
||||
extern const VMStateDescription vmstate_spapr_cap_rpt_invalidate;
|
||||
extern const VMStateDescription vmstate_spapr_wdt;
|
||||
|
||||
static inline uint8_t spapr_get_cap(SpaprMachineState *spapr, int cap)
|
||||
{
|
||||
|
@ -1064,4 +1084,7 @@ target_ulong spapr_vof_client_architecture_support(MachineState *ms,
|
|||
target_ulong ovec_addr);
|
||||
void spapr_vof_client_dt_finalize(SpaprMachineState *spapr, void *fdt);
|
||||
|
||||
/* H_WATCHDOG */
|
||||
void spapr_watchdog_init(SpaprMachineState *spapr);
|
||||
|
||||
#endif /* HW_SPAPR_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue