Unverified Commit 40e46e51 authored by Alistair Francis's avatar Alistair Francis Committed by Palmer Dabbelt
Browse files

riscv: Ensure the kernel start address is correctly cast



Cast the kernel start address to the target bit length.

This ensures that we calculate the initrd offset to a valid address for
the architecture.

Steps to reproduce the original problem (reported by Alex):
  Build U-Boot for the virt machine for riscv32. Then run it with

    $ qemu-system-riscv32 -M virt -kernel u-boot -nographic -initrd <a file>

  You can find the initrd address with

    U-Boot# fdt addr $fdtcontroladdr
    U-Boot# fdt ls /chosen

  Then take a peek at that address:

    U-Boot# md.b <addr>

  and you will see that there is nothing there without this patch. The
  reason is that the binary was loaded to a negative address.

Signed-off-by: default avatarAlistair Francis <alistair.francis@wdc.com>
Suggested-by: default avatarAlexander Graf <agraf@suse.de>
Reported-by: default avatarAlexander Graf <agraf@suse.de>
Reviewed-by: default avatarPhilippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: default avatarPalmer Dabbelt <palmer@sifive.com>
parent ff9f31d9
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@ static const struct MemmapEntry {
    [SIFIVE_E_DTIM] =     { 0x80000000,     0x4000 }
};

static uint64_t load_kernel(const char *kernel_filename)
static target_ulong load_kernel(const char *kernel_filename)
{
    uint64_t kernel_entry, kernel_high;

+1 −1
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ static const struct MemmapEntry {

#define GEM_REVISION        0x10070109

static uint64_t load_kernel(const char *kernel_filename)
static target_ulong load_kernel(const char *kernel_filename)
{
    uint64_t kernel_entry, kernel_high;

+1 −1
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ static const struct MemmapEntry {
    [SPIKE_DRAM] =     { 0x80000000,        0x0 },
};

static uint64_t load_kernel(const char *kernel_filename)
static target_ulong load_kernel(const char *kernel_filename)
{
    uint64_t kernel_entry, kernel_high;

+1 −1
Original line number Diff line number Diff line
@@ -62,7 +62,7 @@ static const struct MemmapEntry {
    [VIRT_PCIE_ECAM] =   { 0x30000000,    0x10000000 },
};

static uint64_t load_kernel(const char *kernel_filename)
static target_ulong load_kernel(const char *kernel_filename)
{
    uint64_t kernel_entry, kernel_high;