Annotation of nono/vm/pluto.cpp, revision 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.