FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

BFDからバイナリデータを抽出してISSを動作させる(2)

さて、BFDからデータを読み込んで、ISSにロードしていこう。

基本的には、ダンプしていたルーチンから、メモリオブジェクトに対してデータ書き込みの関数を追加しておく。

github.com

-static void load_hex (bfd *b, asection *section, std::vector <MemoryBlock *> *p_mem_vec)
+static void load_hex (bfd *b, asection *section, Memory *p_memory)
 {
-    int i, j, size;
     unsigned char *buf;
-    size = bfd_section_size (b, section);
+    int size = bfd_section_size (b, section);
     buf = static_cast<unsigned char *>(calloc (size, 1));
     if (!bfd_get_section_contents (b, section, buf, 0, size))
         return;

     /* do hex dump of data */
     for (int i = 0; i < size; i+= 16) {
-        printf ( "%08x:  ", section->vma + i);
+        int j;
+        Addr_t addr = section->vma + i;
+        printf ( "%08x:  ", addr);
         for (j = 0; j < 16 && j + 1 < size; j++) {
             printf ("%02x ", buf[i+j]);
+            p_memory->StoreMemByte (addr+j, buf[i+j]);
         }
         for (; j < 16; j++) {
             printf ("    ");
@@ -99,6 +101,8 @@ static void load_hex (bfd *b, asection *section, std::vector <MemoryBlock *> *p_
             printf ("%c", isprint (buf[i+j]) ? buf[i+j] : '.');
         }
         printf ("\n");

bfd_map_over_sectionsの引数としてメモリオブジェクトを渡しており、それに対して書き込みをしている。 これで、バイナリファイルからメモリイメージのロードができるようになる。

./swimmer_riscv --debug --binfile ~/benchmarks/coremark_v1.0/coremark.bin --max 100 --init_pc 0x000100

  Version 20150818 Revision 8484044
  developed by Masayuki Kimura <masayuki.kimura.1986@gmail.com>
00000100:  97 01 00 7f 93 81 01 f1 17 41 00 7f 13 01 01 f0   .........A......
00000110:  b3 00 00 00 33 02 00 00 b3 02 00 00 33 03 00 00   ....3.......3...
00000120:  b3 03 00 00 33 04 00 00 b3 04 00 00 33 05 00 00   ....3.......3...
00000130:  b3 05 00 00 33 06 00 00 b3 06 00 00 33 07 00 00   ....3.......3...
00000140:  b3 07 00 00 33 08 00 00 b3 08 00 00 33 09 00 00   ....3.......3...
00000150:  b3 09 00 00 33 0a 00 00 b3 0a 00 00 33 0b 00 00   ....3.......3...
00000160:  b3 0b 00 00 33 0c 00 00 b3 0c 00 00 33 0d 00 00   ....3.......3...
00000170:  b3 0d 00 00 33 0e 00 00 b3 0e 00 00 33 0f 00 00   ....3.......3...
00000180:  b3 0f 00 00 17 24 00 80 13 04 44 16 e7 00 04 00   .....$....D.....
00000190:  93 00 10 00 73 90 00 78 6f f0 9f ff 13 00 00 00   ....s..xo.......
...
800031cc:  43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52   CDEFGHIJKLMNOPQR
800031dc:  53 54 55 56 57 58 59 5a 00 00 00 00 3c 4e 55 4c   STUVWXYZ....<NUL
800031ec:  4c 3e 00 00 00 00 00 00 11 10 00 00 00 00 00 00   L>..
00000000:  47 43 43 3a 20 28 47 4e 55 29 20 35 2e 31 2e 30   GCC: (GNU) 5.1.0
00000010:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   .
         0 : [00000100] 7f000197 : auipc      r03,0x7f000          r03<=7f000100
         1 : [00000104] f1018193 : addi       r03,r03,0xf10        r03=>7f000100 r03<=7f000010
         2 : [00000108] 7f004117 : auipc      r02,0x7f004          r02<=7f004108
         3 : [0000010c] f0010113 : addi       r02,r02,0xf00        r02=>7f004108 r02<=7f004008
         4 : [00000110] 000000b3 : add        r01,r00,r00          r00=>00000000 r00=>00000000 r01<=00000000
         5 : [00000114] 00000233 : add        r04,r00,r00          r00=>00000000 r00=>00000000 r04<=00000000
         6 : [00000118] 000002b3 : add        r05,r00,r00          r00=>00000000 r00=>00000000 r05<=00000000
         7 : [0000011c] 00000333 : add        r06,r00,r00          r00=>00000000 r00=>00000000 r06<=00000000
         8 : [00000120] 000003b3 : add        r07,r00,r00          r00=>00000000 r00=>00000000 r07<=00000000
         9 : [00000124] 00000433 : add        r08,r00,r00          r00=>00000000 r00=>00000000 r08<=00000000
        10 : [00000128] 000004b3 : add        r09,r00,r00          r00=>00000000 r00=>00000000 r09<=00000000
        11 : [0000012c] 00000533 : add        r10,r00,r00          r00=>00000000 r00=>00000000 r10<=00000000
        12 : [00000130] 000005b3 : add        r11,r00,r00          r00=>00000000 r00=>00000000 r11<=00000000
        13 : [00000134] 00000633 : add        r12,r00,r00          r00=>00000000 r00=>00000000 r12<=00000000
        14 : [00000138] 000006b3 : add        r13,r00,r00          r00=>00000000 r00=>00000000 r13<=00000000
        15 : [0000013c] 00000733 : add        r14,r00,r00          r00=>00000000 r00=>00000000 r14<=00000000
        16 : [00000140] 000007b3 : add        r15,r00,r00          r00=>00000000 r00=>00000000 r15<=00000000
        17 : [00000144] 00000833 : add        r16,r00,r00          r00=>00000000 r00=>00000000 r16<=00000000
        18 : [00000148] 000008b3 : add        r17,r00,r00          r00=>00000000 r00=>00000000 r17<=00000000
        19 : [0000014c] 00000933 : add        r18,r00,r00          r00=>00000000 r00=>00000000 r18<=00000000
        20 : [00000150] 000009b3 : add        r19,r00,r00          r00=>00000000 r00=>00000000 r19<=00000000
        21 : [00000154] 00000a33 : add        r20,r00,r00          r00=>00000000 r00=>00000000 r20<=00000000
        22 : [00000158] 00000ab3 : add        r21,r00,r00          r00=>00000000 r00=>00000000 r21<=00000000
        23 : [0000015c] 00000b33 : add        r22,r00,r00          r00=>00000000 r00=>00000000 r22<=00000000
        24 : [00000160] 00000bb3 : add        r23,r00,r00          r00=>00000000 r00=>00000000 r23<=00000000
        25 : [00000164] 00000c33 : add        r24,r00,r00          r00=>00000000 r00=>00000000 r24<=00000000

きちんとロードされ、シミュレーションがスタートした!やった!

さて、これで下地は整ったので、これからはデバッグ情報とシミュレーション情報を統合して、もっとデバッグのやりやすいISSに改良していこうかな。