فهرست منبع

riscv/virt: Jump to pflash if specified

If the user supplied pflash to QEMU then change the reset code to jump
to the pflash base address instead of the DRAM base address.

Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Bin Meng <bmeng.cn@gmail.com>
Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
Alistair Francis 5 سال پیش
والد
کامیت
2738b3b555
1فایلهای تغییر یافته به همراه10 افزوده شده و 1 حذف شده
  1. 10 1
      hw/riscv/virt.c

+ 10 - 1
hw/riscv/virt.c

@@ -443,6 +443,7 @@ static void riscv_virt_board_init(MachineState *machine)
     MemoryRegion *mask_rom = g_new(MemoryRegion, 1);
     MemoryRegion *mask_rom = g_new(MemoryRegion, 1);
     char *plic_hart_config;
     char *plic_hart_config;
     size_t plic_hart_config_len;
     size_t plic_hart_config_len;
+    target_ulong start_addr = memmap[VIRT_DRAM].base;
     int i;
     int i;
     unsigned int smp_cpus = machine->smp.cpus;
     unsigned int smp_cpus = machine->smp.cpus;
 
 
@@ -489,6 +490,14 @@ static void riscv_virt_board_init(MachineState *machine)
         }
         }
     }
     }
 
 
+    if (drive_get(IF_PFLASH, 0, 0)) {
+        /*
+         * Pflash was supplied, let's overwrite the address we jump to after
+         * reset to the base of the flash.
+         */
+        start_addr = virt_memmap[VIRT_FLASH].base;
+    }
+
     /* reset vector */
     /* reset vector */
     uint32_t reset_vec[8] = {
     uint32_t reset_vec[8] = {
         0x00000297,                  /* 1:  auipc  t0, %pcrel_hi(dtb) */
         0x00000297,                  /* 1:  auipc  t0, %pcrel_hi(dtb) */
@@ -501,7 +510,7 @@ static void riscv_virt_board_init(MachineState *machine)
 #endif
 #endif
         0x00028067,                  /*     jr     t0 */
         0x00028067,                  /*     jr     t0 */
         0x00000000,
         0x00000000,
-        memmap[VIRT_DRAM].base,      /* start: .dword memmap[VIRT_DRAM].base */
+        start_addr,                  /* start: .dword */
         0x00000000,
         0x00000000,
                                      /* dtb: */
                                      /* dtb: */
     };
     };