File:  [Isaki's NoNo m68k/m88k emulator] / nono / vm / scsidomain.h
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs
Wed Apr 29 17:06:01 2026 UTC (2 months, 3 weeks ago) by root
Branches: MAIN, Isaki
CVS tags: v027, HEAD
nono 1.7.0

//
// nono
// Copyright (C) 2025 nono project
// Licensed under nono-license.txt
//

//
// SCSI ドメイン
//

#pragma once

#include "device.h"
#include <array>

class SCSIBus;
class SCSIDevice;
class SCSIHostDevice;
class SCSITarget;

//
// 一つの SCSI イニシエータとそのターゲットデバイス一式の管理構造。
// 設定周りとインスタンスの所有。
// バスは含まない (VirtIO SCSI だとバスという構造が存在しないため)。
//
class SCSIDomain : public Device
{
	using inherited = Device;

 public:
	// このドメインで扱うデバイス数。
	static constexpr size_t MaxDevices = 8;

 public:
	SCSIDomain(IODevice *parent_,
		const char *domain_name_, const char *config_name_);
	~SCSIDomain() override;

	bool Create() override;
	bool Init() override;

	// このホストデバイス名を返す。
	const char *GetDomainName() const noexcept { return domain_name; }

	// 設定ファイル上のこのホストデバイスを示す接頭語を返す
	const char *GetConfigName() const noexcept { return config_name; }

	// イニシエータを返す。ないことはないはず。
	SCSIHostDevice *GetInitiator() const noexcept { return initiator.get(); }

	// すべてのターゲットをバスに参加させる。
	void AttachTargets(SCSIBus *bus_);

	// イニシエータに ID を付与してバスに参加させる。
	bool AttachInitiator(SCSIBus *bus_, uint id);

	// 指定 id のターゲットデバイスを返す。なければ NULL を返す。
	SCSITarget *GetTarget(uint id) const noexcept { return target[id].get(); }

	// デバイス (イニシエータ+ターゲット) 配列のコピーを返す。
	void GetDevices(std::array<SCSIDevice *, MaxDevices> *dst) const {
		*dst = device;
	}

	// 指定 id のデバイスを返す。なければ NULL を返す。
	SCSIDevice *GetDevice(uint id) const { return device[id]; }

	// (イニシエータを除く) デバイス数を返す。
	uint GetTargetCount() const;

	// (イニシエータがあれば含む) すべてのデバイスのリストを返す。
	const std::vector<SCSIDevice*>& GetConnectedDevices() const noexcept {
		return connected_devices;
	}

 private:
	DECLARE_MONITOR_SCREEN(MonitorScreen);

	// device[] と connected_devices を更新する。
	bool RefreshDevices();

	// デバイスのログ表示名用 (コントローラ名)。
	// "SPC0", "VIOSCSI" とか (VirtIO-SCSI では長いので縮める)。
	const char *domain_name {};

	// 設定ファイルに使われるこのホストデバイスを示す接頭語。
	// "spc0", "virtio-scsi" とか (こっちはもう気軽に変更できないので)。
	const char *config_name {};

	// SCSI イニシエータ (所有)
	std::unique_ptr<SCSIHostDevice> initiator /*{}*/;

	// SCSI ターゲット (所有)。イニシエータは含まない。
	std::array<std::unique_ptr<SCSITarget>, MaxDevices> target /*{}*/;

	// SCSI デバイス (イニシエータ+ターゲット) のポインタ。
	std::array<SCSIDevice *, MaxDevices> device {};

	// 接続中のデバイス(イニシエータ含む)を ID 順に詰めたリスト。
	std::vector<SCSIDevice*> connected_devices {};

	IODevice *parent {};

	Monitor *monitor {};
};

unix.superglobalmegacorp.com

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