さて、BFDからデータを読み込んで、ISSにロードしていこう。
基本的には、ダンプしていたルーチンから、メモリオブジェクトに対してデータ書き込みの関数を追加しておく。
https://github.com/msyksphinz/swimmer_riscv/tree/bfd_testgithub.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 msyksphinz <msyksphinz_dev@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に改良していこうかな。