|
|
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.