--- nono/vm/mpu.h 2026/04/29 17:04:28 1.1.1.1 +++ nono/vm/mpu.h 2026/04/29 17:04:32 1.1.1.2 @@ -3,88 +3,44 @@ // Copyright (C) 2017 isaki@NetBSD.org // +// MPU 共通部 + #pragma once #include "device.h" -#include "m68030.h" class MPUDevice : public Device { typedef Device inherited; public: - MPUDevice(uint32); + MPUDevice(); virtual ~MPUDevice(); - virtual bool Init(); - virtual void ResetHard(); - - virtual bool MonitorUpdate(); - // 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; } - - // 基準サイクル数を取得 - uint64 total_cycle() const { return cpu->total_cycle; } - - // 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; - } + virtual void Release() = 0; - private: - m68kcpu *cpu = NULL; -}; + // 現在実行中の命令の PC を取得 + virtual uint32 GetPPC() const = 0; -// ATC モニタ -class MPUATC : public Object -{ - public: - MPUATC(m68kcpu *cpu); - virtual ~MPUATC() { } + // 現在アクセス中の論理アドレス、物理アドレスを取得。 + // Laddr == Paddr が MMU オフなのか PA=VA で運用中なのかの区別は + // ここでは付かない。 + virtual uint32 GetLaddr() const = 0; + virtual uint32 GetPaddr() const = 0; - virtual bool MonitorUpdate(); - - private: - m68kcpu *cpu = NULL; + // 割り込み発生を MPU に通知 (オートベクタ) + virtual void Interrupt(int level) = 0; }; -// ブランチ履歴モニタ -class MPUBrHist : public Object -{ - public: - MPUBrHist(m68kcpu *cpu); - virtual ~MPUBrHist() { } - - virtual bool MonitorUpdate(); - - private: - m68kcpu *cpu = NULL; -}; +#include "mpu680x0.h" +#include "mpu88xx0.h" -extern MPUDevice *gMPU; -extern MPUATC *gMPUATC; -extern MPUBrHist *gMPUBrHist; +extern std::unique_ptr gMPU;