Annotation of nono/vm/scsidomain.h, revision 1.1.1.2

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2025 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: //
                      8: // SCSI ドメイン
                      9: //
                     10: 
                     11: #pragma once
                     12: 
                     13: #include "device.h"
                     14: #include <array>
                     15: 
                     16: class SCSIBus;
                     17: class SCSIDevice;
                     18: class SCSIHostDevice;
                     19: class SCSITarget;
                     20: 
                     21: //
                     22: // 一つの SCSI イニシエータとそのターゲットデバイス一式の管理構造。
                     23: // 設定周りとインスタンスの所有。
                     24: // バスは含まない (VirtIO SCSI だとバスという構造が存在しないため)。
                     25: //
                     26: class SCSIDomain : public Device
                     27: {
                     28:        using inherited = Device;
                     29: 
                     30:  public:
                     31:        // このドメインで扱うデバイス数。
                     32:        static constexpr size_t MaxDevices = 8;
                     33: 
                     34:  public:
1.1.1.2 ! root       35:        SCSIDomain(IODevice *parent_,
        !            36:                const char *domain_name_, const char *config_name_);
1.1       root       37:        ~SCSIDomain() override;
                     38: 
                     39:        bool Create() override;
                     40:        bool Init() override;
                     41: 
1.1.1.2 ! root       42:        // このホストデバイス名を返す。
        !            43:        const char *GetDomainName() const noexcept { return domain_name; }
        !            44: 
1.1       root       45:        // 設定ファイル上のこのホストデバイスを示す接頭語を返す
                     46:        const char *GetConfigName() const noexcept { return config_name; }
                     47: 
                     48:        // イニシエータを返す。ないことはないはず。
                     49:        SCSIHostDevice *GetInitiator() const noexcept { return initiator.get(); }
                     50: 
                     51:        // すべてのターゲットをバスに参加させる。
                     52:        void AttachTargets(SCSIBus *bus_);
                     53: 
                     54:        // イニシエータに ID を付与してバスに参加させる。
                     55:        bool AttachInitiator(SCSIBus *bus_, uint id);
                     56: 
                     57:        // 指定 id のターゲットデバイスを返す。なければ NULL を返す。
                     58:        SCSITarget *GetTarget(uint id) const noexcept { return target[id].get(); }
                     59: 
                     60:        // デバイス (イニシエータ+ターゲット) 配列のコピーを返す。
                     61:        void GetDevices(std::array<SCSIDevice *, MaxDevices> *dst) const {
                     62:                *dst = device;
                     63:        }
                     64: 
                     65:        // 指定 id のデバイスを返す。なければ NULL を返す。
                     66:        SCSIDevice *GetDevice(uint id) const { return device[id]; }
                     67: 
                     68:        // (イニシエータを除く) デバイス数を返す。
                     69:        uint GetTargetCount() const;
                     70: 
                     71:        // (イニシエータがあれば含む) すべてのデバイスのリストを返す。
                     72:        const std::vector<SCSIDevice*>& GetConnectedDevices() const noexcept {
                     73:                return connected_devices;
                     74:        }
                     75: 
                     76:  private:
1.1.1.2 ! root       77:        DECLARE_MONITOR_SCREEN(MonitorScreen);
1.1       root       78: 
                     79:        // device[] と connected_devices を更新する。
                     80:        bool RefreshDevices();
                     81: 
1.1.1.2 ! root       82:        // デバイスのログ表示名用 (コントローラ名)。
        !            83:        // "SPC0", "VIOSCSI" とか (VirtIO-SCSI では長いので縮める)。
        !            84:        const char *domain_name {};
        !            85: 
1.1       root       86:        // 設定ファイルに使われるこのホストデバイスを示す接頭語。
1.1.1.2 ! root       87:        // "spc0", "virtio-scsi" とか (こっちはもう気軽に変更できないので)。
1.1       root       88:        const char *config_name {};
                     89: 
                     90:        // SCSI イニシエータ (所有)
                     91:        std::unique_ptr<SCSIHostDevice> initiator /*{}*/;
                     92: 
                     93:        // SCSI ターゲット (所有)。イニシエータは含まない。
                     94:        std::array<std::unique_ptr<SCSITarget>, MaxDevices> target /*{}*/;
                     95: 
                     96:        // SCSI デバイス (イニシエータ+ターゲット) のポインタ。
                     97:        std::array<SCSIDevice *, MaxDevices> device {};
                     98: 
                     99:        // 接続中のデバイス(イニシエータ含む)を ID 順に詰めたリスト。
                    100:        std::vector<SCSIDevice*> connected_devices {};
                    101: 
                    102:        IODevice *parent {};
                    103: 
                    104:        Monitor *monitor {};
                    105: };

unix.superglobalmegacorp.com

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