トップ 一覧 Farm 検索 ヘルプ RSS ログイン

Diary/2020-5-5の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!RISC-V
関係の環境を再構築.

::Qemu
riscv-qemuから本家にマージされたってことだった
 git clone --recursive https://git.qemu.org/git/qemu.git
 ./configure \
 --target-list=riscv64-softmmu,riscv32-softmmu,riscv64-linux-user,riscv32-linux-user \
 --prefix=$HOME/tools/riscv

::gccなど
crosstool-ngでインストール.
https://crosstool-ng.github.io/ から 1.24.0 をダウンロードしてビルド.
 wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.24.0.tar.bz2
 tar xvf crosstool-ng-1.24.0.tar.bz2
 cd crosstool-ng-1.24.0
 ./configure --prefix=/home/miyo/tools/crosstool-ng
 export PATH=$HOME/tools/crosstool-ng/bin:$PATH
 rehash
 ct-ng update-samples
 ct-ng list-samples | grep riscv
 ct-ng riscv64-unknown-elf
 vi .config # インストール先ディレクトリのCT_PREFIX_DIRを変更
            # $HOME/tools/ct-ng/ にインストールすることにした
 ct-ng build

::riscv-tools
 git clone https://github.com/riscv/riscv-tools.git
 cd riscv-tools
 git submodule update --init --recursive
 export PATH=$HOME/tools/ct-ng/riscv64-unknown-elf/bin:$PATH
 export RISCV=$HOME/tools/riscv
 ./build.sh

::動作確認

hello.s
 	.section .text
 	.equ UART_ADDR, 0x10000000 #UART
 	.global _start
 
 _start:
 	la s0,message
 
 loop:
 	lb   a0,0(s0)
 	addi s0,s0,1
 	beqz a0,halt
 	jal  putchar
 	j    loop
 
 putchar:
 	li   t0,UART_ADDR
 	sb   a0, 0(t0)
 	ret
 
 halt:
 	j    halt
 
 	.section .rodata
 
 message:
 	.ascii "Hello, RISC-V\n\0"

linker.ld
 OUTPUT_ARCH("riscv")
 ENTRY(_start)
 
 SECTIONS
 {
 	. = 0x80000000;
 	.text   : { *(.text)   }
 	.rodata : { *(.rodata) }
 	.data   : { *(.data)   }
 	.bss    : { *(.bss)    }
 }
ビルドして実行
 riscv64-unknown-elf-gcc -march=rv64i -mabi=lp64 -nostartfiles -Tlinker.ld hello.s -o hello
 qemu-system-riscv64 -M virt -kernel hello -nographic
実行結果
 miyo@tama:% qemu-system-riscv64 -M virt -kernel hello -nographic
 qemu-system-riscv64: warning: No -bios option specified. Not loading a firmware.
 qemu-system-riscv64: warning: This default will change in a future QEMU release. Please use the -bios option to avoid breakages when this happens.
 qemu-system-riscv64: warning: See QEMU's deprecation documentation for details.
 Hello, RISC-V # ここまで表示されたら Ctrl-a x を入力
 QEMU: Terminated

objdumpでみてみる
 miyo@tama:% riscv64-unknown-elf-objdump -s -d hello
 
 hello:     file format elf64-littleriscv
 
 Contents of section .text:
  80000000 17040000 1304c402 03050400 13041400  ................
  80000010 630c0500 ef008000 6ff01fff b7020010  c.......o.......
  80000020 2380a200 67800000 6f000000           #...g...o...    
 Contents of section .rodata:
  8000002c 48656c6c 6f2c2052 4953432d 560a00    Hello, RISC-V.. 
 Contents of section .riscv.attributes:
  0000 41190000 00726973 63760001 0f000000  A....riscv......
  0010 05727636 34693270 3000               .rv64i2p0.      
 
 Disassembly of section .text:
 
 0000000080000000 <_start>:
     80000000:	00000417          	auipc	s0,0x0
     80000004:	02c40413          	addi	s0,s0,44 # 8000002c <message>
 
 0000000080000008 <loop>:
     80000008:	00040503          	lb	a0,0(s0)
     8000000c:	00140413          	addi	s0,s0,1
     80000010:	00050c63          	beqz	a0,80000028 <halt>
     80000014:	008000ef          	jal	ra,8000001c <putchar>
     80000018:	ff1ff06f          	j	80000008 <loop>
 
 000000008000001c <putchar>:
     8000001c:	100002b7          	lui	t0,0x10000
     80000020:	00a28023          	sb	a0,0(t0) # 10000000 <UART_ADDR>
     80000024:	00008067          	ret
 
 0000000080000028 <halt>:
     80000028:	0000006f          	j	80000028 <halt>

objcopyしてhexdump

 miyo@tama:% riscv64-unknown-elf-objcopy -O binary hello hello.bin
 miyo@tama:% hexdump hello.bin
 0000000 0417 0000 0413 02c4 0503 0004 0413 0014
 0000010 0c63 0005 00ef 0080 f06f ff1f 02b7 1000
 0000020 8023 00a2 8067 0000 006f 0000 6548 6c6c
 0000030 2c6f 5220 5349 2d43 0a56 0000          
 000003b