Hu Tao | eec3d2a | 2013-04-26 11:24:42 +0800 | [diff] [blame] | 1 | /* |
| 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 Maydell | 0d1c978 | 2016-01-26 18:17:17 +0000 | [diff] [blame] | 15 | #include "qemu/osdep.h" |
Hu Tao | eec3d2a | 2013-04-26 11:24:42 +0800 | [diff] [blame] | 16 | #include "qemu/log.h" |
Markus Armbruster | 0b8fa32 | 2019-05-23 16:35:07 +0200 | [diff] [blame] | 17 | #include "qemu/module.h" |
Markus Armbruster | 54d3123 | 2019-08-12 07:23:59 +0200 | [diff] [blame] | 18 | #include "sysemu/runstate.h" |
Hu Tao | eec3d2a | 2013-04-26 11:24:42 +0800 | [diff] [blame] | 19 | |
Hu Tao | 10a584b | 2013-04-26 11:24:44 +0800 | [diff] [blame] | 20 | #include "hw/nvram/fw_cfg.h" |
Markus Armbruster | a27bd6c | 2019-08-12 07:23:51 +0200 | [diff] [blame] | 21 | #include "hw/qdev-properties.h" |
Philippe Mathieu-Daudé | 0d5d8a3 | 2017-10-17 13:44:23 -0300 | [diff] [blame] | 22 | #include "hw/misc/pvpanic.h" |
Eduardo Habkost | db1015e | 2020-09-03 16:43:22 -0400 | [diff] [blame] | 23 | #include "qom/object.h" |
Paolo Bonzini | b8116f4 | 2024-06-03 14:16:55 +0200 | [diff] [blame] | 24 | #include "standard-headers/misc/pvpanic.h" |
Hu Tao | 10a584b | 2013-04-26 11:24:44 +0800 | [diff] [blame] | 25 | |
Hu Tao | eec3d2a | 2013-04-26 11:24:42 +0800 | [diff] [blame] | 26 | static void handle_event(int event) |
| 27 | { |
| 28 | static bool logged; |
| 29 | |
Thomas Weißschuh | 9b13640 | 2024-05-27 08:27:49 +0200 | [diff] [blame] | 30 | if (event & ~PVPANIC_EVENTS && !logged) { |
Hu Tao | eec3d2a | 2013-04-26 11:24:42 +0800 | [diff] [blame] | 31 | qemu_log_mask(LOG_GUEST_ERROR, "pvpanic: unknown event %#x.\n", event); |
| 32 | logged = true; |
| 33 | } |
| 34 | |
| 35 | if (event & PVPANIC_PANICKED) { |
Anton Nefedov | c86f106 | 2017-02-14 09:25:23 +0300 | [diff] [blame] | 36 | qemu_system_guest_panicked(NULL); |
Hu Tao | eec3d2a | 2013-04-26 11:24:42 +0800 | [diff] [blame] | 37 | return; |
| 38 | } |
zhenwei pi | 7dc58de | 2020-01-14 10:31:02 +0800 | [diff] [blame] | 39 | |
zhenwei pi | 45d8c05 | 2022-02-21 20:27:17 +0800 | [diff] [blame] | 40 | if (event & PVPANIC_CRASH_LOADED) { |
zhenwei pi | 7dc58de | 2020-01-14 10:31:02 +0800 | [diff] [blame] | 41 | qemu_system_guest_crashloaded(NULL); |
| 42 | return; |
| 43 | } |
Thomas Weißschuh | 6269086 | 2024-05-27 08:27:51 +0200 | [diff] [blame] | 44 | |
| 45 | if (event & PVPANIC_SHUTDOWN) { |
| 46 | qemu_system_guest_pvshutdown(); |
| 47 | return; |
| 48 | } |
Hu Tao | eec3d2a | 2013-04-26 11:24:42 +0800 | [diff] [blame] | 49 | } |
| 50 | |
Hu Tao | eec3d2a | 2013-04-26 11:24:42 +0800 | [diff] [blame] | 51 | /* return supported events on read */ |
Mihai Carabas | 677726e | 2021-01-27 16:59:27 +0200 | [diff] [blame] | 52 | static uint64_t pvpanic_read(void *opaque, hwaddr addr, unsigned size) |
Hu Tao | eec3d2a | 2013-04-26 11:24:42 +0800 | [diff] [blame] | 53 | { |
Paolo Bonzini | b1b0393 | 2020-11-09 08:53:04 -0500 | [diff] [blame] | 54 | PVPanicState *pvp = opaque; |
| 55 | return pvp->events; |
Hu Tao | eec3d2a | 2013-04-26 11:24:42 +0800 | [diff] [blame] | 56 | } |
| 57 | |
Mihai Carabas | 677726e | 2021-01-27 16:59:27 +0200 | [diff] [blame] | 58 | static void pvpanic_write(void *opaque, hwaddr addr, uint64_t val, |
Hu Tao | eec3d2a | 2013-04-26 11:24:42 +0800 | [diff] [blame] | 59 | unsigned size) |
| 60 | { |
| 61 | handle_event(val); |
| 62 | } |
| 63 | |
| 64 | static const MemoryRegionOps pvpanic_ops = { |
Mihai Carabas | 677726e | 2021-01-27 16:59:27 +0200 | [diff] [blame] | 65 | .read = pvpanic_read, |
| 66 | .write = pvpanic_write, |
Hu Tao | eec3d2a | 2013-04-26 11:24:42 +0800 | [diff] [blame] | 67 | .impl = { |
| 68 | .min_access_size = 1, |
| 69 | .max_access_size = 1, |
| 70 | }, |
| 71 | }; |
| 72 | |
Mihai Carabas | 677726e | 2021-01-27 16:59:27 +0200 | [diff] [blame] | 73 | void pvpanic_setup_io(PVPanicState *s, DeviceState *dev, unsigned size) |
Hu Tao | eec3d2a | 2013-04-26 11:24:42 +0800 | [diff] [blame] | 74 | { |
Mihai Carabas | 677726e | 2021-01-27 16:59:27 +0200 | [diff] [blame] | 75 | memory_region_init_io(&s->mr, OBJECT(dev), &pvpanic_ops, s, "pvpanic", size); |
Andreas Färber | db895a1 | 2012-11-25 02:37:14 +0100 | [diff] [blame] | 76 | } |