Annotation of nono/vm/pluto.cpp, revision 1.1.1.1

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;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.