--- nono/m680x0/m68030.h 2026/04/29 17:04:28 1.1 +++ nono/m680x0/m68030.h 2026/04/29 17:04:37 1.1.1.4 @@ -1,6 +1,7 @@ // // nono -// Copyright (C) 2017 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once @@ -9,6 +10,7 @@ // 外部公開用 // +#include "branchhistory.h" #include #include #include @@ -75,24 +77,6 @@ class m68kcpu; #include "m68030ccr.h" #include "m68030mmu.h" -// 64ビット数と2つの32ビット数を扱う共用体。 -// 構造はまったく同じだが名前だけ場所に合わせてつけたい。 -#if _BYTE_ORDER == _LITTLE_ENDIAN -#define DEF_UNION64(NAME, Q, H, L) \ - union NAME { \ - uint64 Q; \ - struct { uint32 L, H; }; \ - } -#else -#define DEF_UNION64(NAME, Q, H, L) \ - union NAME { \ - uint64 Q; \ - struct { uint32 H, L; }; \ - } -#endif - -DEF_UNION64(union64, q, h, l); - // レジスタイメージを保持する構造体。 // この構造体はコピーとか比較をするのでポインタとかは置かないこと。 struct m68kreg { @@ -140,14 +124,6 @@ struct m68kreg { } }; -// ブランチ履歴 -struct m68kbrhist { - uint32 count; // 連続通過回数 - uint32 from; // ジャンプ元アドレス(VA) - uint32 to; // ジャンプ先アドレス(VA) - uint32 padding; -} __packed; - // バス状態 struct m68kbus { // 論理アドレスと SSW。 @@ -178,10 +154,10 @@ struct m68kbus { uint GetFC() const { return ssw & SSW_FC_MASK; } }; -class m68kcpu { +class m68kcpu final { public: m68kcpu() { } - virtual ~m68kcpu() { } + ~m68kcpu() { } public: m68kreg reg {}; @@ -270,16 +246,10 @@ class m68kcpu { int32 cycle_nocache = 0; // ノーキャッシュケースの時の *追加分* uint64 inst_count = 0; // 命令実行数 - // ブランチ履歴 - // 1エントリは64ビット。上位32ビットがブランチ先アドレス、下位32ビットが - // ブランチ元命令のアドレス。 - // brhist_top がカーソル(次に書き込む位置)を示しており8ビットなので勝手に - // 循環する。.count = 0 は書き込み前の無効エントリ。 - // 16バイト単位のテーブルなので16バイト境界に整列がよかろう。 - alignas(16) m68kbrhist brhist[256] {}; - // 直近に使用したインデックスを指す。 - // ループ回数カウントのため、次に書き込むインデックスでないことに注意。 - uint8 brhist_top = 0; + // ブランチ履歴 (例外履歴を含む) + BranchHistory_m680x0 brhist {}; + // 例外履歴のみ + BranchHistory_m680x0 exhist {}; // バス m68kbus bus {}; @@ -297,6 +267,10 @@ class m68kcpu { void *aline_arg = NULL; bool (*fline_callback)(m68kcpu *, void *) = NULL; void *fline_arg = NULL; + + // ダブルバスフォールトのコールバックとユーザ引数。 + void (*halt_callback)(void *) = NULL; + void *halt_arg = NULL; }; #define RegD(n) (cpu->reg.da[(n)])