目次: Zephyr
Zephyrでリセットできないんだけど、って言われて調べたので、忘れないうちに記録に残しておきます。
RISC-Vの規格ではリセット処理について何も記述されていませんので、リセット処理はハードウェア依存となります。QEMUのRISC-V virtマシンはどうかというと、SiFiveのナイスガイ達が作ってくれたリセットの仕組みがあります。
// qemu/hw/riscv/virt.c
static const struct MemmapEntry {
hwaddr base;
hwaddr size;
} virt_memmap[] = {
[VIRT_DEBUG] = { 0x0, 0x100 },
[VIRT_MROM] = { 0x1000, 0xf000 },
[VIRT_TEST] = { 0x100000, 0x1000 }, //★アドレス0x00100000にある★
[VIRT_RTC] = { 0x101000, 0x1000 },
...
// qemu/hw/riscv/virt.c
static void virt_machine_init(MachineState *machine)
{
...
/* SiFive Test MMIO device */
sifive_test_create(memmap[VIRT_TEST].base); //★テストデバイスを追加している★
// qemu/hw/misc/sifive_test.c
/*
* Create Test device.
*/
DeviceState *sifive_test_create(hwaddr addr)
{
DeviceState *dev = qdev_new(TYPE_SIFIVE_TEST);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
return dev;
}
...
static void sifive_test_write(void *opaque, hwaddr addr,
uint64_t val64, unsigned int size)
{
if (addr == 0) {
int status = val64 & 0xffff;
int code = (val64 >> 16) & 0xffff;
switch (status) {
case FINISHER_FAIL:
exit(code);
case FINISHER_PASS:
exit(0);
case FINISHER_RESET:
qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); //★ここに到達するとリセットが掛かるはず★
return;
default:
break;
}
}
qemu_log_mask(LOG_GUEST_ERROR, "%s: write: addr=0x%x val=0x%016" PRIx64 "\n",
__func__, (int)addr, val64);
}
// qemu/include/hw/misc/sifive_test.h
enum {
FINISHER_FAIL = 0x3333,
FINISHER_PASS = 0x5555,
FINISHER_RESET = 0x7777 //★この値を書けば良さそう★
};
つまり0x100000に0x00007777を4バイトWriteすれば良さそうです。
Zephyrのサンプルshellを使います。理由はリブートするコマンドが簡単に使えるからです。CONFIG_REBOOTを有効にする必要があります。またshellは起動後プロンプトが出るだけで、リセットが掛かったかどうかわかりにくいため、起動時のバナーも有効にしておくと良いです。
CONFIG_REBOOT=y Boot Options ---> [ ] Reboot functionality CONFIG_BOOT_BANNER=y General Kernel Options ---> Kernel Debugging and Metrics ---> [ ] Boot banner
ちょっと長いので一旦切ります。次回は実装と動作確認をします。
< | 2021 | > | ||||
<< | < | 02 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | - | - | - | - | - | - |
合計:
本日: