--- nono/vm/scsidev.cpp 2026/04/29 17:04:42 1.1.1.5 +++ nono/vm/scsidev.cpp 2026/04/29 17:04:45 1.1.1.6 @@ -152,6 +152,12 @@ SCSIHostDevice::BusFreeCB(int id) SetData(0); } +#if defined(__clang__) +// デストラクタがインラインで書けないのは面倒なのでとりあえず +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wweak-vtables" +#endif + // // SCSI コマンドの共通部分 // @@ -239,7 +245,7 @@ class SCSICmdTestUnitReady : public SCSI using inherited = SCSICmd; public: SCSICmdTestUnitReady(SCSITarget *p) : inherited(p) { } - virtual ~SCSICmdTestUnitReady() { } + virtual ~SCSICmdTestUnitReady() override { } }; // @@ -250,7 +256,7 @@ class SCSICmdRezeroUnit : public SCSICmd using inherited = SCSICmd; public: SCSICmdRezeroUnit(SCSITarget *p) : inherited(p) { } - virtual ~SCSICmdRezeroUnit() { } + virtual ~SCSICmdRezeroUnit() override { } // とりあえず黙って成功するだけでいいか }; @@ -263,15 +269,15 @@ class SCSICmdRequestSense : public SCSIC using inherited = SCSICmd; public: SCSICmdRequestSense(SCSITarget *p) : inherited(p) { } - virtual ~SCSICmdRequestSense() { } + virtual ~SCSICmdRequestSense() override { } - virtual SCSI::XferPhase Command(std::vector& cmdseq) { + SCSI::XferPhase Command(std::vector& cmdseq) override { // 応答のセンスデータは SCSI-2 形式(最小18バイト) を実装。 // 今の所、センスキー、ASC、ASCQ だけで返せる内容にだけ対応している。 // これ以外のフィールドを返す必要が出来たらまた考えること。 buf.clear(); - buf.resize(17); + buf.resize(18); buf[0] = 0xf0; // Valid、エラーコード 0x70 buf[1] = 0; // セグメント番号(?) buf[2] = parent->sensekey; // センスキー (上位4ビットは今の所 0) @@ -310,9 +316,9 @@ class SCSICmdRead6 : public SCSICmd using inherited = SCSICmd; public: SCSICmdRead6(SCSITarget *p) : inherited(p) { } - virtual ~SCSICmdRead6() { } + virtual ~SCSICmdRead6() override { } - virtual SCSI::XferPhase Command(std::vector& cmdseq) { + SCSI::XferPhase Command(std::vector& cmdseq) override { SCSIHD *hdparent = dynamic_cast(parent); uint32 lba; uint32 blks; @@ -360,9 +366,9 @@ class SCSICmdWrite6 : public SCSICmd SCSICmdWrite6(SCSITarget *p) : inherited(p) { hdparent = dynamic_cast(parent); } - virtual ~SCSICmdWrite6() { } + virtual ~SCSICmdWrite6() override { } - virtual SCSI::XferPhase Command(std::vector& cmdseq) { + SCSI::XferPhase Command(std::vector& cmdseq) override { // センスデータをクリア parent->ClearSense(); @@ -391,7 +397,7 @@ class SCSICmdWrite6 : public SCSICmd return SCSI::XferPhase::DataOut; } - virtual SCSI::XferPhase DoneDataOut() { + SCSI::XferPhase DoneDataOut() override { parent->putlog(1, "WRITE6 LBA=0x%x blks=0x%x", lba, blks); if (hdparent->writeprotect == false) { memcpy(hdparent->mem + (lba * parent->GetBlocksize()), @@ -414,9 +420,9 @@ class SCSICmdInquiry : public SCSICmd using inherited = SCSICmd; public: SCSICmdInquiry(SCSITarget *p) : inherited(p) { } - virtual ~SCSICmdInquiry() { } + virtual ~SCSICmdInquiry() override { } - virtual SCSI::XferPhase Command(std::vector& cmdseq) { + SCSI::XferPhase Command(std::vector& cmdseq) override { // センスデータをクリア parent->ClearSense(); @@ -440,9 +446,9 @@ class SCSICmdModeSelect6 : public SCSICm using inherited = SCSICmd; public: SCSICmdModeSelect6(SCSITarget *p) : inherited(p) { } - virtual ~SCSICmdModeSelect6() { } + virtual ~SCSICmdModeSelect6() override { } - virtual SCSI::XferPhase Command(std::vector& cmdseq) { + SCSI::XferPhase Command(std::vector& cmdseq) override { // センスデータをクリア parent->ClearSense(); @@ -450,7 +456,7 @@ class SCSICmdModeSelect6 : public SCSICm return SCSI::XferPhase::DataOut; } - virtual SCSI::XferPhase DoneDataOut() { + SCSI::XferPhase DoneDataOut() override { // Mode Select(6) のデータは以下の構造で並んでいる。 // ヘッダ // ブロックディスクリプタ#1 @@ -485,9 +491,9 @@ class SCSICmdModeSense6 : public SCSICmd using inherited = SCSICmd; public: SCSICmdModeSense6(SCSITarget *p) : inherited(p) { } - virtual ~SCSICmdModeSense6() { } + virtual ~SCSICmdModeSense6() override { } - virtual SCSI::XferPhase Command(std::vector& cmdseq) { + SCSI::XferPhase Command(std::vector& cmdseq) override { uint8 pagecode = (cmdseq[2] & 0x3f); // センスデータをクリア @@ -511,13 +517,13 @@ class SCSICmdStartStopUnit : public SCSI using inherited = SCSICmd; public: SCSICmdStartStopUnit(SCSITarget *p) : inherited(p) { } - virtual ~SCSICmdStartStopUnit() { } + virtual ~SCSICmdStartStopUnit() override { } // スピンアップ/ダウンやメディアのロード/アンロードを指示する。 // ので今の所エミュレーション上は特にすることはない。 // XXX それっぽい時間待つくらいはしてもいいかも知れない - virtual SCSI::XferPhase Command(std::vector& cmdseq) { + SCSI::XferPhase Command(std::vector& cmdseq) override { parent->putlog(1, "StartStopUnit"); return inherited::Command(cmdseq); } @@ -531,9 +537,9 @@ class SCSICmdReadCapacity : public SCSIC using inherited = SCSICmd; public: SCSICmdReadCapacity(SCSITarget *p) : inherited(p) { } - virtual ~SCSICmdReadCapacity() { } + virtual ~SCSICmdReadCapacity() override { } - virtual SCSI::XferPhase Command(std::vector& cmdseq) { + SCSI::XferPhase Command(std::vector& cmdseq) override { SCSIHD *hdparent = dynamic_cast(parent); // センスデータをクリア @@ -571,9 +577,9 @@ class SCSICmdRead10 : public SCSICmd using inherited = SCSICmd; public: SCSICmdRead10(SCSITarget *p) : inherited(p) { } - virtual ~SCSICmdRead10() { } + virtual ~SCSICmdRead10() override { } - virtual SCSI::XferPhase Command(std::vector& cmdseq) { + SCSI::XferPhase Command(std::vector& cmdseq) override { SCSIHD *hdparent = dynamic_cast(parent); uint32 lba; uint32 blks; @@ -621,9 +627,9 @@ class SCSICmdNotSupportedCommand : publi using inherited = SCSICmd; public: SCSICmdNotSupportedCommand(SCSITarget *p) : inherited(p) { } - virtual ~SCSICmdNotSupportedCommand() { } + virtual ~SCSICmdNotSupportedCommand() override { } - virtual SCSI::XferPhase Command(std::vector& cmdseq) { + SCSI::XferPhase Command(std::vector& cmdseq) override { // XXX センスキーよく分からんけどとりあえず parent->sensekey = SCSI::SenseKey::IllegalRequest; parent->senseasc = SCSI::ASC::InvalidCommandOperationCode; @@ -632,6 +638,9 @@ class SCSICmdNotSupportedCommand : publi } }; +#if defined(__clang__) +#pragma clang diagnostic pop +#endif // // SCSI ターゲットデバイスの共通部分