|
@@ -33,10 +33,8 @@
|
|
#include <libfdt.h>
|
|
#include <libfdt.h>
|
|
|
|
|
|
#if defined(TARGET_RISCV32)
|
|
#if defined(TARGET_RISCV32)
|
|
-# define KERNEL_BOOT_ADDRESS 0x80400000
|
|
|
|
#define fw_dynamic_info_data(__val) cpu_to_le32(__val)
|
|
#define fw_dynamic_info_data(__val) cpu_to_le32(__val)
|
|
#else
|
|
#else
|
|
-# define KERNEL_BOOT_ADDRESS 0x80200000
|
|
|
|
#define fw_dynamic_info_data(__val) cpu_to_le64(__val)
|
|
#define fw_dynamic_info_data(__val) cpu_to_le64(__val)
|
|
#endif
|
|
#endif
|
|
|
|
|
|
@@ -49,6 +47,15 @@ bool riscv_is_32_bit(MachineState *machine)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+target_ulong riscv_calc_kernel_start_addr(MachineState *machine,
|
|
|
|
+ target_ulong firmware_end_addr) {
|
|
|
|
+ if (riscv_is_32_bit(machine)) {
|
|
|
|
+ return QEMU_ALIGN_UP(firmware_end_addr, 4 * MiB);
|
|
|
|
+ } else {
|
|
|
|
+ return QEMU_ALIGN_UP(firmware_end_addr, 2 * MiB);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
target_ulong riscv_find_and_load_firmware(MachineState *machine,
|
|
target_ulong riscv_find_and_load_firmware(MachineState *machine,
|
|
const char *default_machine_firmware,
|
|
const char *default_machine_firmware,
|
|
hwaddr firmware_load_addr,
|
|
hwaddr firmware_load_addr,
|
|
@@ -123,7 +130,9 @@ target_ulong riscv_load_firmware(const char *firmware_filename,
|
|
exit(1);
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
|
|
-target_ulong riscv_load_kernel(const char *kernel_filename, symbol_fn_t sym_cb)
|
|
|
|
|
|
+target_ulong riscv_load_kernel(const char *kernel_filename,
|
|
|
|
+ target_ulong kernel_start_addr,
|
|
|
|
+ symbol_fn_t sym_cb)
|
|
{
|
|
{
|
|
uint64_t kernel_entry;
|
|
uint64_t kernel_entry;
|
|
|
|
|
|
@@ -138,9 +147,9 @@ target_ulong riscv_load_kernel(const char *kernel_filename, symbol_fn_t sym_cb)
|
|
return kernel_entry;
|
|
return kernel_entry;
|
|
}
|
|
}
|
|
|
|
|
|
- if (load_image_targphys_as(kernel_filename, KERNEL_BOOT_ADDRESS,
|
|
|
|
|
|
+ if (load_image_targphys_as(kernel_filename, kernel_start_addr,
|
|
ram_size, NULL) > 0) {
|
|
ram_size, NULL) > 0) {
|
|
- return KERNEL_BOOT_ADDRESS;
|
|
|
|
|
|
+ return kernel_start_addr;
|
|
}
|
|
}
|
|
|
|
|
|
error_report("could not load kernel '%s'", kernel_filename);
|
|
error_report("could not load kernel '%s'", kernel_filename);
|