@@ -13,6 +13,7 @@
#include "exec/target_long.h"
typedef struct bl_cpu_cfg {
+ bool cpu_is_bigendian;
} BlCpuCfg;
void bl_gen_jump_to(const BlCpuCfg *cfg, void **p, target_ulong jump_addr);
@@ -58,9 +58,9 @@ static void st_nm32_p(const BlCpuCfg *cfg, void **ptr, uint32_t insn)
{
uint16_t *p = *ptr;
- stw_p(p, insn >> 16);
+ stw_endian_p(cfg->cpu_is_bigendian, p, insn >> 16);
p++;
- stw_p(p, insn >> 0);
+ stw_endian_p(cfg->cpu_is_bigendian, p, insn >> 0);
p++;
*ptr = p;
@@ -74,7 +74,7 @@ static void bl_gen_nop(const BlCpuCfg *cfg, void **ptr)
} else {
uint32_t *p = *ptr;
- stl_p(p, 0);
+ stl_endian_p(cfg->cpu_is_bigendian, p, 0);
p++;
*ptr = p;
}
@@ -95,7 +95,7 @@ static void bl_gen_r_type(const BlCpuCfg *cfg,
insn = deposit32(insn, 6, 5, shift);
insn = deposit32(insn, 0, 6, funct);
- stl_p(p, insn);
+ stl_endian_p(cfg->cpu_is_bigendian, p, insn);
p++;
*ptr = p;
@@ -113,7 +113,7 @@ static void bl_gen_i_type(const BlCpuCfg *cfg,
insn = deposit32(insn, 16, 5, rt);
insn = deposit32(insn, 0, 16, imm);
- stl_p(p, insn);
+ stl_endian_p(cfg->cpu_is_bigendian, p, insn);
p++;
*ptr = p;
@@ -325,7 +325,7 @@ type_init(boston_register_types)
static void gen_firmware(void *p, hwaddr kernel_entry, hwaddr fdt_addr)
{
- const BlCpuCfg bl_cfg = { };
+ const BlCpuCfg bl_cfg = { .cpu_is_bigendian = TARGET_BIG_ENDIAN };
uint64_t regaddr;
/* Move CM GCRs */
@@ -165,7 +165,7 @@ static uint64_t load_kernel(MIPSCPU *cpu)
static void write_bootloader(CPUMIPSState *env, uint8_t *base,
uint64_t kernel_addr)
{
- const BlCpuCfg bl_cfg = { };
+ const BlCpuCfg bl_cfg = { .cpu_is_bigendian = false };
uint32_t *p;
/* Small bootloader */
@@ -624,7 +624,7 @@ static void bl_setup_gt64120_jump_kernel(void **p, uint64_t run_addr,
static const char pci_pins_cfg[PCI_NUM_PINS] = {
10, 10, 11, 11 /* PIIX IRQRC[A:D] */
};
- const BlCpuCfg bl_cfg = { };
+ const BlCpuCfg bl_cfg = { .cpu_is_bigendian = TARGET_BIG_ENDIAN };
/* Bus endianness is always reversed */
#if TARGET_BIG_ENDIAN
Add the BlCpuCfg::cpu_is_bigendian field, initialize it in machine code. Bootloader API use the ld/st_endian_p() to dispatch to target endianness. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- include/hw/mips/bootloader.h | 1 + hw/mips/bootloader.c | 10 +++++----- hw/mips/boston.c | 2 +- hw/mips/fuloong2e.c | 2 +- hw/mips/malta.c | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-)