|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2024 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
8: // QEMU Virtual System Controller
9: //
10:
11: // https://www.qemu.org/docs/master/specs/virt-ctlr.html
12:
13: #include "qemusysctlr.h"
1.1.1.3 ! root 14: #include "mainbus.h"
1.1 root 15: #include "power.h"
1.1.1.3 ! root 16: #include "syncer.h"
1.1 root 17:
18: // コンストラクタ
19: QemuSysCtlrDevice::QemuSysCtlrDevice()
20: : inherited(OBJ_QEMUSYSCTLR)
21: {
22: }
23:
24: // デストラクタ
25: QemuSysCtlrDevice::~QemuSysCtlrDevice()
26: {
27: }
28:
29: busdata
1.1.1.2 root 30: QemuSysCtlrDevice::ReadPort(uint32 offset)
1.1 root 31: {
1.1.1.2 root 32: busdata data;
1.1 root 33:
34: if (offset == 0) {
35: // Features (Read Only)
1.1.1.2 root 36: data = FEATURES;
37: putlog(2, "FEATURES -> $%08x", data.Data());
1.1 root 38: } else {
39: // 他のポートがどうなるのかは仕様に書いてない。
1.1.1.2 root 40: data.SetBusErr();
1.1.1.3 ! root 41: putlog(1, "Read $%08x (BusErr)", GetMainbusDevice()->GetPaddr());
1.1 root 42: }
1.1.1.2 root 43:
44: data |= BusData::Size4;
45: return data;
1.1 root 46: }
47:
48: busdata
1.1.1.2 root 49: QemuSysCtlrDevice::WritePort(uint32 offset, uint32 data)
1.1 root 50: {
1.1.1.2 root 51: busdata r;
1.1 root 52:
1.1.1.2 root 53: if (offset == 1) {
1.1 root 54: // Command (Write Only)
55: static const char *cmdname[] = {
56: "no-op",
57: "reset",
58: "halt",
59: "panic",
60: };
61: putlog(1, "Command <- $%08x (%s)", data,
62: (data < countof(cmdname) ? cmdname[data] : cmdname[0]));
63: switch (data) {
64: default:
65: case 0: // no-op
66: break;
67:
68: case 1: // reset
69: GetPowerDevice()->MakeResetHard();
70: break;
71:
72: case 2: // halt
73: GetPowerDevice()->PushPowerButton();
74: break;
1.1.1.3 ! root 75:
! 76: case 3: // panic
! 77: DoPanic();
! 78: break;
1.1 root 79: }
80: } else {
81: // 他のポートがどうなるのかは仕様に書いてない。
1.1.1.3 ! root 82: putlog(1, "Write $%08x <- $%08x (BusErr)",
! 83: GetMainbusDevice()->GetPaddr(), data);
1.1.1.2 root 84: r.SetBusErr();
1.1 root 85: }
1.1.1.2 root 86:
87: r |= BusData::Size4;
88: return r;
1.1 root 89: }
90:
91: busdata
1.1.1.2 root 92: QemuSysCtlrDevice::PeekPort(uint32 offset)
1.1 root 93: {
94: switch (offset) {
1.1.1.2 root 95: case 0: return FEATURES;
1.1 root 96: default:
1.1.1.2 root 97: return BusData::BusErr;
1.1 root 98: }
99: }
1.1.1.3 ! root 100:
! 101: // ゲストがパニックしたので、状態を保全して停止。
! 102: // 本当はデバッガで止まるとかすればいいんだろうけど。
! 103: void
! 104: QemuSysCtlrDevice::DoPanic()
! 105: {
! 106: // 速度だけは落としておく。
! 107: auto syncer = GetSyncer();
! 108: syncer->NotifyFullSpeed(false);
! 109: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.