--- nono/vm/mpu.h 2026/04/29 17:04:28 1.1.1.1 +++ nono/vm/mpu.h 2026/04/29 17:04:36 1.1.1.3 @@ -1,90 +1,44 @@ // // nono -// Copyright (C) 2017 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // +// MPU 共通部 + #pragma once #include "device.h" -#include "m68030.h" class MPUDevice : public Device { - typedef Device inherited; + using inherited = Device; public: - MPUDevice(uint32); - virtual ~MPUDevice(); - - virtual bool Init(); - virtual void ResetHard(); - - virtual bool MonitorUpdate(); + MPUDevice(); + ~MPUDevice() override; // MPU を request サイクル分実行する - uint32 Run(uint64 request); - - // 現在の PPC を取得 - uint32 GetPPC() const { return RegPPC; } - - // 割り込み発生を MPU に通知 (オートベクタ) - void Interrupt(int level); + virtual uint32 Run(uint64 request) = 0; - // 割り込み発生を MPU に通知 (ベクタ) - void Interrupt(int level, int vector); + // 基準サイクル数を取得 + virtual uint64 total_cycle() const = 0; // MPU の処理をこの命令で中断させる。 // スケジューラのイベントリストに追加が発生した時に VM 側から // MPU へ処理の中断を指示する。 - void Release() { cpu->atomic_reqflag |= CPU_REQ_RELEASE; } + virtual void Release() = 0; - // 基準サイクル数を取得 - uint64 total_cycle() const { return cpu->total_cycle; } + // 現在実行中の命令の PC を取得 + virtual uint32 GetPPC() const = 0; - // A-Line, F-Line 命令エミュレーションのコールバックを指定する。 - // (Human68k エミュレーションで使用) - void SetALineCallback(bool (*callback)(m68kcpu*, void*), void *arg); - void SetFLineCallback(bool (*callback)(m68kcpu*, void*), void *arg); - - // FPU を持っているか - bool HaveFPU() const { - return cpu->has_fpu; - } - - // CPU コアを取得 (主にデバッグ用途) - m68kcpu *GetCPU() const { - return cpu; - } + // 現在アクセス中の論理アドレス、物理アドレスを取得。 + // Laddr == Paddr が MMU オフなのか PA=VA で運用中なのかの区別は + // ここでは付かない。 + virtual uint32 GetLaddr() const = 0; + virtual uint32 GetPaddr() const = 0; - private: - m68kcpu *cpu = NULL; -}; - -// ATC モニタ -class MPUATC : public Object -{ - public: - MPUATC(m68kcpu *cpu); - virtual ~MPUATC() { } - - virtual bool MonitorUpdate(); - - private: - m68kcpu *cpu = NULL; -}; - -// ブランチ履歴モニタ -class MPUBrHist : public Object -{ - public: - MPUBrHist(m68kcpu *cpu); - virtual ~MPUBrHist() { } - - virtual bool MonitorUpdate(); - - private: - m68kcpu *cpu = NULL; + // 割り込み発生を MPU に通知 (オートベクタ) + virtual void Interrupt(Object *src, int level) = 0; }; -extern MPUDevice *gMPU; -extern MPUATC *gMPUATC; -extern MPUBrHist *gMPUBrHist; +extern std::unique_ptr gMPU;