|
@@ -174,6 +174,7 @@ target_ulong riscv_load_firmware(const char *firmware_filename,
|
|
}
|
|
}
|
|
|
|
|
|
target_ulong riscv_load_kernel(MachineState *machine,
|
|
target_ulong riscv_load_kernel(MachineState *machine,
|
|
|
|
+ RISCVHartArrayState *harts,
|
|
target_ulong kernel_start_addr,
|
|
target_ulong kernel_start_addr,
|
|
symbol_fn_t sym_cb)
|
|
symbol_fn_t sym_cb)
|
|
{
|
|
{
|
|
@@ -192,21 +193,34 @@ target_ulong riscv_load_kernel(MachineState *machine,
|
|
if (load_elf_ram_sym(kernel_filename, NULL, NULL, NULL,
|
|
if (load_elf_ram_sym(kernel_filename, NULL, NULL, NULL,
|
|
NULL, &kernel_load_base, NULL, NULL, 0,
|
|
NULL, &kernel_load_base, NULL, NULL, 0,
|
|
EM_RISCV, 1, 0, NULL, true, sym_cb) > 0) {
|
|
EM_RISCV, 1, 0, NULL, true, sym_cb) > 0) {
|
|
- return kernel_load_base;
|
|
|
|
|
|
+ kernel_entry = kernel_load_base;
|
|
|
|
+ goto out;
|
|
}
|
|
}
|
|
|
|
|
|
if (load_uimage_as(kernel_filename, &kernel_entry, NULL, NULL,
|
|
if (load_uimage_as(kernel_filename, &kernel_entry, NULL, NULL,
|
|
NULL, NULL, NULL) > 0) {
|
|
NULL, NULL, NULL) > 0) {
|
|
- return kernel_entry;
|
|
|
|
|
|
+ goto out;
|
|
}
|
|
}
|
|
|
|
|
|
if (load_image_targphys_as(kernel_filename, kernel_start_addr,
|
|
if (load_image_targphys_as(kernel_filename, kernel_start_addr,
|
|
current_machine->ram_size, NULL) > 0) {
|
|
current_machine->ram_size, NULL) > 0) {
|
|
- return kernel_start_addr;
|
|
|
|
|
|
+ kernel_entry = kernel_start_addr;
|
|
|
|
+ goto out;
|
|
}
|
|
}
|
|
|
|
|
|
error_report("could not load kernel '%s'", kernel_filename);
|
|
error_report("could not load kernel '%s'", kernel_filename);
|
|
exit(1);
|
|
exit(1);
|
|
|
|
+
|
|
|
|
+out:
|
|
|
|
+ /*
|
|
|
|
+ * For 32 bit CPUs 'kernel_entry' can be sign-extended by
|
|
|
|
+ * load_elf_ram_sym().
|
|
|
|
+ */
|
|
|
|
+ if (riscv_is_32bit(harts)) {
|
|
|
|
+ kernel_entry = extract64(kernel_entry, 0, 32);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return kernel_entry;
|
|
}
|
|
}
|
|
|
|
|
|
void riscv_load_initrd(MachineState *machine, uint64_t kernel_entry)
|
|
void riscv_load_initrd(MachineState *machine, uint64_t kernel_entry)
|