blob: 3b893340c05d9be1f223bf04d779cb2bb6a54ce4 [file] [log] [blame]
Hu Taoeec3d2a2013-04-26 11:24:42 +08001/*
2 * QEMU simulated pvpanic device.
3 *
4 * Copyright Fujitsu, Corp. 2013
5 *
6 * Authors:
7 * Wen Congyang <wency@cn.fujitsu.com>
8 * Hu Tao <hutao@cn.fujitsu.com>
9 *
10 * This work is licensed under the terms of the GNU GPL, version 2 or later.
11 * See the COPYING file in the top-level directory.
12 *
13 */
14
Peter Maydell0d1c9782016-01-26 18:17:17 +000015#include "qemu/osdep.h"
Hu Taoeec3d2a2013-04-26 11:24:42 +080016#include "qemu/log.h"
Markus Armbruster0b8fa322019-05-23 16:35:07 +020017#include "qemu/module.h"
Markus Armbruster54d31232019-08-12 07:23:59 +020018#include "sysemu/runstate.h"
Hu Taoeec3d2a2013-04-26 11:24:42 +080019
Hu Tao10a584b2013-04-26 11:24:44 +080020#include "hw/nvram/fw_cfg.h"
Markus Armbrustera27bd6c2019-08-12 07:23:51 +020021#include "hw/qdev-properties.h"
Philippe Mathieu-Daudé0d5d8a32017-10-17 13:44:23 -030022#include "hw/misc/pvpanic.h"
Eduardo Habkostdb1015e2020-09-03 16:43:22 -040023#include "qom/object.h"
Paolo Bonzinib8116f42024-06-03 14:16:55 +020024#include "standard-headers/misc/pvpanic.h"
Hu Tao10a584b2013-04-26 11:24:44 +080025
Hu Taoeec3d2a2013-04-26 11:24:42 +080026static void handle_event(int event)
27{
28 static bool logged;
29
Thomas Weißschuh9b136402024-05-27 08:27:49 +020030 if (event & ~PVPANIC_EVENTS && !logged) {
Hu Taoeec3d2a2013-04-26 11:24:42 +080031 qemu_log_mask(LOG_GUEST_ERROR, "pvpanic: unknown event %#x.\n", event);
32 logged = true;
33 }
34
35 if (event & PVPANIC_PANICKED) {
Anton Nefedovc86f1062017-02-14 09:25:23 +030036 qemu_system_guest_panicked(NULL);
Hu Taoeec3d2a2013-04-26 11:24:42 +080037 return;
38 }
zhenwei pi7dc58de2020-01-14 10:31:02 +080039
zhenwei pi45d8c052022-02-21 20:27:17 +080040 if (event & PVPANIC_CRASH_LOADED) {
zhenwei pi7dc58de2020-01-14 10:31:02 +080041 qemu_system_guest_crashloaded(NULL);
42 return;
43 }
Thomas Weißschuh62690862024-05-27 08:27:51 +020044
45 if (event & PVPANIC_SHUTDOWN) {
46 qemu_system_guest_pvshutdown();
47 return;
48 }
Hu Taoeec3d2a2013-04-26 11:24:42 +080049}
50
Hu Taoeec3d2a2013-04-26 11:24:42 +080051/* return supported events on read */
Mihai Carabas677726e2021-01-27 16:59:27 +020052static uint64_t pvpanic_read(void *opaque, hwaddr addr, unsigned size)
Hu Taoeec3d2a2013-04-26 11:24:42 +080053{
Paolo Bonzinib1b03932020-11-09 08:53:04 -050054 PVPanicState *pvp = opaque;
55 return pvp->events;
Hu Taoeec3d2a2013-04-26 11:24:42 +080056}
57
Mihai Carabas677726e2021-01-27 16:59:27 +020058static void pvpanic_write(void *opaque, hwaddr addr, uint64_t val,
Hu Taoeec3d2a2013-04-26 11:24:42 +080059 unsigned size)
60{
61 handle_event(val);
62}
63
64static const MemoryRegionOps pvpanic_ops = {
Mihai Carabas677726e2021-01-27 16:59:27 +020065 .read = pvpanic_read,
66 .write = pvpanic_write,
Hu Taoeec3d2a2013-04-26 11:24:42 +080067 .impl = {
68 .min_access_size = 1,
69 .max_access_size = 1,
70 },
71};
72
Mihai Carabas677726e2021-01-27 16:59:27 +020073void pvpanic_setup_io(PVPanicState *s, DeviceState *dev, unsigned size)
Hu Taoeec3d2a2013-04-26 11:24:42 +080074{
Mihai Carabas677726e2021-01-27 16:59:27 +020075 memory_region_init_io(&s->mr, OBJECT(dev), &pvpanic_ops, s, "pvpanic", size);
Andreas Färberdb895a12012-11-25 02:37:14 +010076}