mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-22 09:32:40 -06:00
hw/loader: Pass ELFDATA endian order argument to load_elf_ram_sym()
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 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-5-philmd@linaro.org>
This commit is contained in:
parent
518f8fdfe2
commit
3cd6dbce75
3 changed files with 11 additions and 13 deletions
|
@ -428,7 +428,8 @@ ssize_t load_elf_as(const char *filename,
|
||||||
{
|
{
|
||||||
return load_elf_ram_sym(filename, elf_note_fn,
|
return load_elf_ram_sym(filename, elf_note_fn,
|
||||||
translate_fn, translate_opaque,
|
translate_fn, translate_opaque,
|
||||||
pentry, lowaddr, highaddr, pflags, big_endian,
|
pentry, lowaddr, highaddr, pflags,
|
||||||
|
big_endian ? ELFDATA2MSB : ELFDATA2LSB,
|
||||||
elf_machine, clear_lsb, data_swab, as,
|
elf_machine, clear_lsb, data_swab, as,
|
||||||
true, NULL);
|
true, NULL);
|
||||||
}
|
}
|
||||||
|
@ -439,12 +440,12 @@ ssize_t load_elf_ram_sym(const char *filename,
|
||||||
uint64_t (*translate_fn)(void *, uint64_t),
|
uint64_t (*translate_fn)(void *, uint64_t),
|
||||||
void *translate_opaque, uint64_t *pentry,
|
void *translate_opaque, uint64_t *pentry,
|
||||||
uint64_t *lowaddr, uint64_t *highaddr,
|
uint64_t *lowaddr, uint64_t *highaddr,
|
||||||
uint32_t *pflags, int big_endian, int elf_machine,
|
uint32_t *pflags, int elf_data_order, int elf_machine,
|
||||||
int clear_lsb, int data_swab,
|
int clear_lsb, int data_swab,
|
||||||
AddressSpace *as, bool load_rom, symbol_fn_t sym_cb)
|
AddressSpace *as, bool load_rom, symbol_fn_t sym_cb)
|
||||||
{
|
{
|
||||||
const int host_data_order = HOST_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB;
|
const int host_data_order = HOST_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB;
|
||||||
int fd, target_data_order, must_swab;
|
int fd, must_swab;
|
||||||
ssize_t ret = ELF_LOAD_FAILED;
|
ssize_t ret = ELF_LOAD_FAILED;
|
||||||
uint8_t e_ident[EI_NIDENT];
|
uint8_t e_ident[EI_NIDENT];
|
||||||
|
|
||||||
|
@ -462,18 +463,14 @@ ssize_t load_elf_ram_sym(const char *filename,
|
||||||
ret = ELF_LOAD_NOT_ELF;
|
ret = ELF_LOAD_NOT_ELF;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
must_swab = host_data_order != e_ident[EI_DATA];
|
|
||||||
if (big_endian) {
|
|
||||||
target_data_order = ELFDATA2MSB;
|
|
||||||
} else {
|
|
||||||
target_data_order = ELFDATA2LSB;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target_data_order != e_ident[EI_DATA]) {
|
if (elf_data_order != ELFDATANONE && elf_data_order != e_ident[EI_DATA]) {
|
||||||
ret = ELF_LOAD_WRONG_ENDIAN;
|
ret = ELF_LOAD_WRONG_ENDIAN;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
must_swab = host_data_order != e_ident[EI_DATA];
|
||||||
|
|
||||||
lseek(fd, 0, SEEK_SET);
|
lseek(fd, 0, SEEK_SET);
|
||||||
if (e_ident[EI_CLASS] == ELFCLASS64) {
|
if (e_ident[EI_CLASS] == ELFCLASS64) {
|
||||||
ret = load_elf64(filename, fd, elf_note_fn,
|
ret = load_elf64(filename, fd, elf_note_fn,
|
||||||
|
|
|
@ -246,7 +246,8 @@ void riscv_load_kernel(MachineState *machine,
|
||||||
*/
|
*/
|
||||||
kernel_size = load_elf_ram_sym(kernel_filename, NULL, NULL, NULL, NULL,
|
kernel_size = load_elf_ram_sym(kernel_filename, NULL, NULL, NULL, NULL,
|
||||||
&info->image_low_addr, &info->image_high_addr,
|
&info->image_low_addr, &info->image_high_addr,
|
||||||
NULL, 0, EM_RISCV, 1, 0, NULL, true, sym_cb);
|
NULL, ELFDATA2LSB, EM_RISCV,
|
||||||
|
1, 0, NULL, true, sym_cb);
|
||||||
if (kernel_size > 0) {
|
if (kernel_size > 0) {
|
||||||
info->kernel_size = kernel_size;
|
info->kernel_size = kernel_size;
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -120,7 +120,7 @@ const char *load_elf_strerror(ssize_t error);
|
||||||
* @lowaddr: Populated with lowest loaded address. Ignored if NULL.
|
* @lowaddr: Populated with lowest loaded address. Ignored if NULL.
|
||||||
* @highaddr: Populated with highest loaded address. Ignored if NULL.
|
* @highaddr: Populated with highest loaded address. Ignored if NULL.
|
||||||
* @pflags: Populated with ELF processor-specific flags. Ignore if NULL.
|
* @pflags: Populated with ELF processor-specific flags. Ignore if NULL.
|
||||||
* @bigendian: Expected ELF endianness. 0 for LE otherwise BE
|
* @elf_data_order: Expected ELF endianness (ELFDATA2LSB or ELFDATA2MSB).
|
||||||
* @elf_machine: Expected ELF machine type
|
* @elf_machine: Expected ELF machine type
|
||||||
* @clear_lsb: Set to mask off LSB of addresses (Some architectures use
|
* @clear_lsb: Set to mask off LSB of addresses (Some architectures use
|
||||||
* this for non-address data)
|
* this for non-address data)
|
||||||
|
@ -151,7 +151,7 @@ ssize_t load_elf_ram_sym(const char *filename,
|
||||||
uint64_t (*translate_fn)(void *, uint64_t),
|
uint64_t (*translate_fn)(void *, uint64_t),
|
||||||
void *translate_opaque, uint64_t *pentry,
|
void *translate_opaque, uint64_t *pentry,
|
||||||
uint64_t *lowaddr, uint64_t *highaddr,
|
uint64_t *lowaddr, uint64_t *highaddr,
|
||||||
uint32_t *pflags, int big_endian, int elf_machine,
|
uint32_t *pflags, int elf_data_order, int elf_machine,
|
||||||
int clear_lsb, int data_swab,
|
int clear_lsb, int data_swab,
|
||||||
AddressSpace *as, bool load_rom, symbol_fn_t sym_cb);
|
AddressSpace *as, bool load_rom, symbol_fn_t sym_cb);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue