qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 2/3] hw/mips/boston: Allow loading elf kernel and dtb


From: Philippe Mathieu-Daudé
Subject: Re: [PATCH 2/3] hw/mips/boston: Allow loading elf kernel and dtb
Date: Mon, 16 Aug 2021 22:15:08 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0

On 7/29/21 10:02 AM, Philippe Mathieu-Daudé wrote:
> On 7/29/21 5:39 AM, Jiaxun Yang wrote:
>> ELF kernel allows us debugging much easier with DWARF symbols.
> 
> You can load the symbols using the 'loader' device:
> docs/system/generic-loader.rst.
> 
>> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
>> ---
>>  hw/mips/boston.c | 38 ++++++++++++++++++++++++++++++++++----
>>  1 file changed, 34 insertions(+), 4 deletions(-)
>>
>> diff --git a/hw/mips/boston.c b/hw/mips/boston.c
>> index a5746ede65..42b31a1ce4 100644
>> --- a/hw/mips/boston.c
>> +++ b/hw/mips/boston.c
>> @@ -20,6 +20,7 @@
>>  #include "qemu/osdep.h"
>>  #include "qemu/units.h"
>>  
>> +#include "elf.h"
>>  #include "hw/boards.h"
>>  #include "hw/char/serial.h"
>>  #include "hw/ide/pci.h"
>> @@ -546,10 +547,39 @@ static void boston_mach_init(MachineState *machine)
>>              exit(1);
>>          }
>>      } else if (machine->kernel_filename) {
>> -        fit_err = load_fit(&boston_fit_loader, machine->kernel_filename, s);
>> -        if (fit_err) {
>> -            error_report("unable to load FIT image");
>> -            exit(1);
>> +        uint64_t kernel_entry, kernel_low, kernel_high, kernel_size;
>> +
>> +        kernel_size = load_elf(machine->kernel_filename, NULL,
>> +                           cpu_mips_kseg0_to_phys, NULL,
>> +                           (uint64_t *)&kernel_entry,
>> +                           (uint64_t *)&kernel_low, (uint64_t 
>> *)&kernel_high,
>> +                           NULL, 0, EM_MIPS, 1, 0);
>> +
>> +        if (kernel_size) {
>> +            hwaddr dtb_paddr = QEMU_ALIGN_UP(kernel_high, 64 * KiB);
>> +            hwaddr dtb_vaddr = cpu_mips_phys_to_kseg0(NULL, dtb_paddr);
>> +
>> +            s->kernel_entry = kernel_entry;
>> +            if (machine->dtb) {
>> +                int dt_size;
>> +                const void *dtb_file_data, *dtb_load_data;
> 
> g_autofree is preferred.
> 
> Otherwise:
> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> 
>> +
>> +                dtb_file_data = load_device_tree(machine->dtb, &dt_size);
>> +                dtb_load_data = boston_fdt_filter(s, dtb_file_data, NULL, 
>> &dtb_vaddr);
>> +
>> +                /* Calculate real fdt size after filter */
>> +                dt_size = fdt_totalsize(dtb_load_data);
>> +                rom_add_blob_fixed("dtb", dtb_load_data, dt_size, 
>> dtb_paddr);
>> +                g_free((void *) dtb_file_data);
>> +                g_free((void *) dtb_load_data);

Also, no need to cast.

>> +            }
>> +        } else {
>> +            /* Try to load file as FIT */
>> +            fit_err = load_fit(&boston_fit_loader, 
>> machine->kernel_filename, s);
>> +            if (fit_err) {
>> +                error_report("unable to load kernel image");
>> +                exit(1);
>> +            }
>>          }
>>  
>>          gen_firmware(memory_region_get_ram_ptr(flash) + 0x7c00000,
>>
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]