|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2024 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: // ! 8: // VirtIO ブロックデバイス ! 9: // ! 10: ! 11: #pragma once ! 12: ! 13: #include "virtio_base.h" ! 14: #include "diskimage.h" ! 15: #include "monitor.h" ! 16: #include "scsidev.h" ! 17: ! 18: class VirtIOBlockReq; ! 19: ! 20: class VirtIOBlockDevice : public VirtIODevice ! 21: { ! 22: using inherited = VirtIODevice; ! 23: public: ! 24: static const uint32 ACCESS_READ = 0x01; ! 25: static const uint32 ACCESS_WRITE = 0x02; ! 26: ! 27: public: ! 28: VirtIOBlockDevice(int slot_, int id_); ! 29: ~VirtIOBlockDevice() override; ! 30: ! 31: bool Init() override; ! 32: ! 33: // メディアの書き込みモードを返す ! 34: SCSIDisk::RW GetWriteMode() const { return write_mode; } ! 35: ! 36: // 現在のアクセス状況を返す ! 37: uint32 GetAccessRead() const { return access_read; } ! 38: uint32 GetAccessWrite() const { return access_write; } ! 39: ! 40: private: ! 41: DECLARE_MONITOR_CALLBACK(MonitorUpdate); ! 42: ! 43: const char *GetFeatureName(int feature) const override; ! 44: ! 45: bool LoadDisk(const std::string& pathname_); ! 46: ! 47: // ディスクリプタを一つ処理する。 ! 48: void ProcessDesc(VirtQueue *) override; ! 49: uint32 CmdRead(VirtIOBlockReq&); ! 50: uint32 CmdWrite(VirtIOBlockReq&); ! 51: void ReadVirtIOBlockReq(VirtIOBlockReq&); ! 52: ! 53: int id {}; // 識別番号 ! 54: std::string pathname {}; // イメージファイルのフルパス ! 55: bool write_ignore {}; // 書き込み無視オプション ! 56: ! 57: DiskImage image {}; // イメージファイル ! 58: uint32 blocksize {}; // 論理ブロック長 ! 59: SCSIDisk::RW write_mode {}; // メディアの書き込みモード ! 60: ! 61: // アクセスインジケータ (GUI) 用のカウンタ。 ! 62: uint32 access_read {}; ! 63: uint32 access_write {}; ! 64: ! 65: Monitor monitor { this }; ! 66: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.