|
|
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.