mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
hw/loader: Pass ELFDATA endian order argument to load_elf_as()
Rather than passing a boolean 'is_big_endian' argument, directly pass the ELFDATA, which can be unspecified using the ELFDATANONE value. Update the call sites: 0 -> ELFDATA2LSB 1 -> ELFDATA2MSB Note, this allow removing the target_words_bigendian() call in the GENERIC_LOADER device, where we pass ELFDATANONE. Suggested-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20250127113824.50177-6-philmd@linaro.org>
This commit is contained in:
parent
3cd6dbce75
commit
90f5c86acb
6 changed files with 16 additions and 20 deletions
|
@ -608,7 +608,7 @@ void armv7m_load_kernel(ARMCPU *cpu, const char *kernel_filename,
|
|||
if (kernel_filename) {
|
||||
image_size = load_elf_as(kernel_filename, NULL, NULL, NULL,
|
||||
&entry, NULL, NULL,
|
||||
NULL, 0, EM_ARM, 1, 0, as);
|
||||
NULL, ELFDATA2LSB, EM_ARM, 1, 0, as);
|
||||
if (image_size < 0) {
|
||||
image_size = load_image_targphys_as(kernel_filename, mem_base,
|
||||
mem_size, as);
|
||||
|
|
|
@ -798,7 +798,7 @@ static ssize_t arm_load_elf(struct arm_boot_info *info, uint64_t *pentry,
|
|||
Elf64_Ehdr h64;
|
||||
} elf_header;
|
||||
int data_swab = 0;
|
||||
bool big_endian;
|
||||
int elf_data_order;
|
||||
ssize_t ret;
|
||||
Error *err = NULL;
|
||||
|
||||
|
@ -814,12 +814,12 @@ static ssize_t arm_load_elf(struct arm_boot_info *info, uint64_t *pentry,
|
|||
}
|
||||
|
||||
if (elf_is64) {
|
||||
big_endian = elf_header.h64.e_ident[EI_DATA] == ELFDATA2MSB;
|
||||
info->endianness = big_endian ? ARM_ENDIANNESS_BE8
|
||||
: ARM_ENDIANNESS_LE;
|
||||
elf_data_order = elf_header.h64.e_ident[EI_DATA];
|
||||
info->endianness = elf_data_order == ELFDATA2MSB ? ARM_ENDIANNESS_BE8
|
||||
: ARM_ENDIANNESS_LE;
|
||||
} else {
|
||||
big_endian = elf_header.h32.e_ident[EI_DATA] == ELFDATA2MSB;
|
||||
if (big_endian) {
|
||||
elf_data_order = elf_header.h32.e_ident[EI_DATA];
|
||||
if (elf_data_order == ELFDATA2MSB) {
|
||||
if (bswap32(elf_header.h32.e_flags) & EF_ARM_BE8) {
|
||||
info->endianness = ARM_ENDIANNESS_BE8;
|
||||
} else {
|
||||
|
@ -839,8 +839,8 @@ static ssize_t arm_load_elf(struct arm_boot_info *info, uint64_t *pentry,
|
|||
}
|
||||
|
||||
ret = load_elf_as(info->kernel_filename, NULL, NULL, NULL,
|
||||
pentry, lowaddr, highaddr, NULL, big_endian, elf_machine,
|
||||
1, data_swab, as);
|
||||
pentry, lowaddr, highaddr, NULL, elf_data_order,
|
||||
elf_machine, 1, data_swab, as);
|
||||
if (ret <= 0) {
|
||||
/* The header loaded but the image didn't */
|
||||
error_report("Couldn't load elf '%s': %s",
|
||||
|
|
|
@ -73,7 +73,7 @@ bool avr_load_firmware(AVRCPU *cpu, MachineState *ms,
|
|||
|
||||
bytes_loaded = load_elf_as(filename, NULL, NULL, NULL,
|
||||
&entry, NULL, NULL,
|
||||
&e_flags, 0, EM_AVR, 0, 0, NULL);
|
||||
&e_flags, ELFDATA2LSB, EM_AVR, 0, 0, NULL);
|
||||
if (bytes_loaded >= 0) {
|
||||
/* If ELF file is provided, determine CPU type reading ELF e_flags. */
|
||||
const char *elf_cpu = avr_elf_e_flags_to_cpu_type(e_flags);
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "exec/tswap.h"
|
||||
#include "system/dma.h"
|
||||
#include "system/reset.h"
|
||||
#include "hw/boards.h"
|
||||
|
@ -66,7 +65,6 @@ static void generic_loader_realize(DeviceState *dev, Error **errp)
|
|||
{
|
||||
GenericLoaderState *s = GENERIC_LOADER(dev);
|
||||
hwaddr entry;
|
||||
int big_endian;
|
||||
ssize_t size = 0;
|
||||
|
||||
s->set_pc = false;
|
||||
|
@ -134,14 +132,12 @@ static void generic_loader_realize(DeviceState *dev, Error **errp)
|
|||
s->cpu = first_cpu;
|
||||
}
|
||||
|
||||
big_endian = target_words_bigendian();
|
||||
|
||||
if (s->file) {
|
||||
AddressSpace *as = s->cpu ? s->cpu->as : NULL;
|
||||
|
||||
if (!s->force_raw) {
|
||||
size = load_elf_as(s->file, NULL, NULL, NULL, &entry, NULL, NULL,
|
||||
NULL, big_endian, 0, 0, 0, as);
|
||||
NULL, ELFDATANONE, 0, 0, 0, as);
|
||||
|
||||
if (size < 0) {
|
||||
size = load_uimage_as(s->file, &entry, NULL, NULL, NULL, NULL,
|
||||
|
|
|
@ -413,7 +413,8 @@ ssize_t load_elf(const char *filename,
|
|||
int elf_machine, int clear_lsb, int data_swab)
|
||||
{
|
||||
return load_elf_as(filename, elf_note_fn, translate_fn, translate_opaque,
|
||||
pentry, lowaddr, highaddr, pflags, big_endian,
|
||||
pentry, lowaddr, highaddr, pflags,
|
||||
big_endian ? ELFDATA2MSB : ELFDATA2LSB,
|
||||
elf_machine, clear_lsb, data_swab, NULL);
|
||||
}
|
||||
|
||||
|
@ -422,14 +423,13 @@ ssize_t load_elf_as(const char *filename,
|
|||
uint64_t (*elf_note_fn)(void *, void *, bool),
|
||||
uint64_t (*translate_fn)(void *, uint64_t),
|
||||
void *translate_opaque, uint64_t *pentry, uint64_t *lowaddr,
|
||||
uint64_t *highaddr, uint32_t *pflags, int big_endian,
|
||||
uint64_t *highaddr, uint32_t *pflags, int elf_data_order,
|
||||
int elf_machine, int clear_lsb, int data_swab,
|
||||
AddressSpace *as)
|
||||
{
|
||||
return load_elf_ram_sym(filename, elf_note_fn,
|
||||
translate_fn, translate_opaque,
|
||||
pentry, lowaddr, highaddr, pflags,
|
||||
big_endian ? ELFDATA2MSB : ELFDATA2LSB,
|
||||
pentry, lowaddr, highaddr, pflags, elf_data_order,
|
||||
elf_machine, clear_lsb, data_swab, as,
|
||||
true, NULL);
|
||||
}
|
||||
|
|
|
@ -162,7 +162,7 @@ ssize_t load_elf_as(const char *filename,
|
|||
uint64_t (*elf_note_fn)(void *, void *, bool),
|
||||
uint64_t (*translate_fn)(void *, uint64_t),
|
||||
void *translate_opaque, uint64_t *pentry, uint64_t *lowaddr,
|
||||
uint64_t *highaddr, uint32_t *pflags, int big_endian,
|
||||
uint64_t *highaddr, uint32_t *pflags, int elf_data_order,
|
||||
int elf_machine, int clear_lsb, int data_swab,
|
||||
AddressSpace *as);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue