Annotation of nono/vm/qemusysctlr.cpp, revision 1.1.1.3

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.