Use bootloader helper to generate kernel jump. Also move kernel jump to 0x580 to avoid collisions with exception vectors.
Signed-off-by: Jiaxun Yang <jiaxun.y...@flygoat.com> --- hw/mips/fuloong2e.c | 35 +++++------------------------------ 1 file changed, 5 insertions(+), 30 deletions(-) diff --git a/hw/mips/fuloong2e.c b/hw/mips/fuloong2e.c index a9e0c2f8d3..0a4809c816 100644 --- a/hw/mips/fuloong2e.c +++ b/hw/mips/fuloong2e.c @@ -186,38 +186,13 @@ static void write_bootloader(CPUMIPSState *env, uint8_t *base, /* Small bootloader */ p = (uint32_t *)base; - /* j 0x1fc00040 */ - stl_p(p++, 0x0bf00010); - /* nop */ - stl_p(p++, 0x00000000); + bl_gen_jump_to(&p, 0xbfc00580); /* Second part of the bootloader */ - p = (uint32_t *)(base + 0x040); - - /* lui a0, 0 */ - stl_p(p++, 0x3c040000); - /* ori a0, a0, 2 */ - stl_p(p++, 0x34840002); - /* lui a1, high(ENVP_ADDR) */ - stl_p(p++, 0x3c050000 | ((ENVP_ADDR >> 16) & 0xffff)); - /* ori a1, a0, low(ENVP_ADDR) */ - stl_p(p++, 0x34a50000 | (ENVP_ADDR & 0xffff)); - /* lui a2, high(ENVP_ADDR + 8) */ - stl_p(p++, 0x3c060000 | (((ENVP_ADDR + 8) >> 16) & 0xffff)); - /* ori a2, a2, low(ENVP_ADDR + 8) */ - stl_p(p++, 0x34c60000 | ((ENVP_ADDR + 8) & 0xffff)); - /* lui a3, high(env->ram_size) */ - stl_p(p++, 0x3c070000 | (loaderparams.ram_size >> 16)); - /* ori a3, a3, low(env->ram_size) */ - stl_p(p++, 0x34e70000 | (loaderparams.ram_size & 0xffff)); - /* lui ra, high(kernel_addr) */ - stl_p(p++, 0x3c1f0000 | ((kernel_addr >> 16) & 0xffff)); - /* ori ra, ra, low(kernel_addr) */ - stl_p(p++, 0x37ff0000 | (kernel_addr & 0xffff)); - /* jr ra */ - stl_p(p++, 0x03e00008); - /* nop */ - stl_p(p++, 0x00000000); + p = (uint32_t *)(base + 0x580); + + bl_gen_jump_kernel(&p, ENVP_ADDR - 64, 2, ENVP_ADDR, ENVP_ADDR + 8, + loaderparams.ram_size, kernel_addr); } static void main_cpu_reset(void *opaque) -- 2.29.2