|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2017 [email protected] ! 4: // ! 5: ! 6: #include "pluto.h" ! 7: #include "mpu.h" ! 8: ! 9: PlutoDevice::PlutoDevice() ! 10: { ! 11: logname = "pluto"; ! 12: devname = "Pluto"; ! 13: devaddr = 0xeac000; ! 14: devlen = 0x2000; ! 15: } ! 16: ! 17: PlutoDevice::~PlutoDevice() ! 18: { ! 19: } ! 20: ! 21: // ベンチマーク開始 ! 22: void ! 23: PlutoDevice::benchmark_start(uint32 data) ! 24: { ! 25: m_test_num = data; ! 26: ! 27: // テスト番号によってパラメータをセット ! 28: // #2,#3 は NOP による実行サイクル測定。 ! 29: // #4,#5 は movem によるデータ空間アクセス測定。 ! 30: switch (m_test_num) { ! 31: case 2: ! 32: case 3: ! 33: m_test_name = "NOP"; ! 34: m_inst_len = 2; ! 35: m_inst_cycle = 2; ! 36: break; ! 37: case 4: ! 38: case 5: ! 39: m_test_name = "MOVEM"; ! 40: m_inst_len = 8; ! 41: m_inst_cycle = 244; // XXX 見直すこと ! 42: break; ! 43: } ! 44: ! 45: // 測定開始時だけ表示 ! 46: if (m_count == 0) { ! 47: putlog(0, "ベンチマーク開始"); ! 48: ! 49: // 命令開始アドレス。この時点で REG_PC は次をさしている ! 50: m_start_addr = gMPU->GetPPC(); ! 51: } ! 52: ! 53: // 測定開始 ! 54: gettimeofday(&m_start, NULL); ! 55: } ! 56: ! 57: // ベンチマーク終了 ! 58: void ! 59: PlutoDevice::benchmark_end() ! 60: { ! 61: const int SECONDS = 5; // 測定秒数 [sec] ! 62: timeval end, result; ! 63: int t; ! 64: int num_of_inst; // 1ループ中の命令セット数 ! 65: double speed; ! 66: ! 67: // 測定終了 ! 68: gettimeofday(&end, NULL); ! 69: m_count++; ! 70: ! 71: // 今回1セット分の実行時間 [usec] ! 72: timersub(&end, &m_start, &result); ! 73: ! 74: // 総実行時間 ! 75: timeradd(&result, &m_total, &m_total); ! 76: ! 77: // 規定秒数に満たなければ、もう1セット繰り返し。 ! 78: // 次が jmp 命令なのでこの命令を抜けるだけでいい。 ! 79: if (m_total.tv_sec < SECONDS) { ! 80: return; ! 81: } ! 82: ! 83: // 規定秒数に達していれば、測定終了 ! 84: t = m_total.tv_sec * 1000*1000 + m_total.tv_usec; ! 85: putlog(0, "ベンチマーク#%d 終了 (%d 回, 計 %d.%03d msec)", ! 86: benchmark_mode, m_count, t / 1000, t % 1000); ! 87: ! 88: // 1ループ中の命令セット数を算出。REG_PPC はこの命令の開始番地 ! 89: num_of_inst = (gMPU->GetPPC() - m_start_addr) / m_inst_len; ! 90: ! 91: // 68030 のクロック数 [MHz] に換算 ! 92: speed = (double)(m_count * num_of_inst) * m_inst_cycle / t; ! 93: ! 94: // 表示用にベンチマーク ROM のリビジョンを取得 ! 95: int rev; ! 96: rev = 0; ! 97: #if 0 ! 98: IPLROM1 *iplrom1 = (IPLROM1 *)vm->SearchDevice(DEVICE_IPLROM1); ! 99: ASSERT(iplrom1); ! 100: if (!iplrom1->GetBenchmarkROM(m_test_num, NULL, &rev)) { ! 101: rev = 0; ! 102: } ! 103: #endif ! 104: ! 105: // XXX NetBSD ホストでは有効桁2桁と思われる ! 106: putlog(0, "ベンチマーク#%d.%d (%s 実行速度) 68030/%3.0fMHz, %d MIPS", ! 107: m_test_num, rev, m_test_name, speed, (m_count * num_of_inst) / t); ! 108: ! 109: // 電源オフ ! 110: // XXX とりあえずね ! 111: exit(1); ! 112: } ! 113: ! 114: // ! 115: void ! 116: PlutoDevice::write_8_benchmark(uint32 addr, uint32 data) ! 117: { ! 118: switch (data) { ! 119: case 0: // ベンチマーク終了 ! 120: benchmark_end(); ! 121: break; ! 122: case 2: // ベンチマーク開始 ! 123: case 3: ! 124: case 4: ! 125: case 5: ! 126: benchmark_start(data); ! 127: break; ! 128: default: ! 129: PANIC("not impl"); ! 130: } ! 131: } ! 132: ! 133: uint64 ! 134: PlutoDevice::Read8(uint32 addr) ! 135: { ! 136: PANIC("not impl"); ! 137: } ! 138: ! 139: uint64 ! 140: PlutoDevice::Read16(uint32 addr) ! 141: { ! 142: PANIC("not impl"); ! 143: } ! 144: ! 145: uint64 ! 146: PlutoDevice::Write8(uint32 addr, uint32 data) ! 147: { ! 148: switch (addr) { ! 149: case 0xeac403: ! 150: write_8_benchmark(addr, data); ! 151: break; ! 152: default: ! 153: PANIC("not yet"); ! 154: } ! 155: return 0; ! 156: } ! 157: ! 158: uint64 ! 159: PlutoDevice::Write16(uint32 addr, uint32 data) ! 160: { ! 161: PANIC("not impl"); ! 162: return 0; ! 163: } ! 164: ! 165: uint64 ! 166: PlutoDevice::Peek8(uint32 addr) ! 167: { ! 168: PANIC("not yet"); ! 169: return 0; ! 170: } ! 171: ! 172: // ベンチマークモード。コマンドライン引数で指定される。 ! 173: /*static*/int PlutoDevice::benchmark_mode;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.