xref: /openbmc/qemu/hw/mips/bootloader.c (revision a8d6abe1292e1db1ad9be5b2b124b9c01bcda094)
13ebbf861SJiaxun Yang /*
23ebbf861SJiaxun Yang  * Utility for QEMU MIPS to generate it's simple bootloader
33ebbf861SJiaxun Yang  *
43ebbf861SJiaxun Yang  * Instructions used here are carefully selected to keep compatibility with
53ebbf861SJiaxun Yang  * MIPS Release 6.
63ebbf861SJiaxun Yang  *
73ebbf861SJiaxun Yang  * Copyright (C) 2020 Jiaxun Yang <jiaxun.yang@flygoat.com>
83ebbf861SJiaxun Yang  *
93ebbf861SJiaxun Yang  * SPDX-License-Identifier: GPL-2.0-or-later
103ebbf861SJiaxun Yang  */
113ebbf861SJiaxun Yang 
123ebbf861SJiaxun Yang #include "qemu/osdep.h"
133ebbf861SJiaxun Yang #include "qemu/bitops.h"
143ebbf861SJiaxun Yang #include "cpu.h"
153ebbf861SJiaxun Yang #include "hw/mips/bootloader.h"
163ebbf861SJiaxun Yang 
173ebbf861SJiaxun Yang typedef enum bl_reg {
183ebbf861SJiaxun Yang     BL_REG_ZERO = 0,
193ebbf861SJiaxun Yang     BL_REG_AT = 1,
203ebbf861SJiaxun Yang     BL_REG_V0 = 2,
213ebbf861SJiaxun Yang     BL_REG_V1 = 3,
223ebbf861SJiaxun Yang     BL_REG_A0 = 4,
233ebbf861SJiaxun Yang     BL_REG_A1 = 5,
243ebbf861SJiaxun Yang     BL_REG_A2 = 6,
253ebbf861SJiaxun Yang     BL_REG_A3 = 7,
263ebbf861SJiaxun Yang     BL_REG_T0 = 8,
273ebbf861SJiaxun Yang     BL_REG_T1 = 9,
283ebbf861SJiaxun Yang     BL_REG_T2 = 10,
293ebbf861SJiaxun Yang     BL_REG_T3 = 11,
303ebbf861SJiaxun Yang     BL_REG_T4 = 12,
313ebbf861SJiaxun Yang     BL_REG_T5 = 13,
323ebbf861SJiaxun Yang     BL_REG_T6 = 14,
333ebbf861SJiaxun Yang     BL_REG_T7 = 15,
343ebbf861SJiaxun Yang     BL_REG_S0 = 16,
353ebbf861SJiaxun Yang     BL_REG_S1 = 17,
363ebbf861SJiaxun Yang     BL_REG_S2 = 18,
373ebbf861SJiaxun Yang     BL_REG_S3 = 19,
383ebbf861SJiaxun Yang     BL_REG_S4 = 20,
393ebbf861SJiaxun Yang     BL_REG_S5 = 21,
403ebbf861SJiaxun Yang     BL_REG_S6 = 22,
413ebbf861SJiaxun Yang     BL_REG_S7 = 23,
423ebbf861SJiaxun Yang     BL_REG_T8 = 24,
433ebbf861SJiaxun Yang     BL_REG_T9 = 25,
443ebbf861SJiaxun Yang     BL_REG_K0 = 26,
453ebbf861SJiaxun Yang     BL_REG_K1 = 27,
463ebbf861SJiaxun Yang     BL_REG_GP = 28,
473ebbf861SJiaxun Yang     BL_REG_SP = 29,
483ebbf861SJiaxun Yang     BL_REG_FP = 30,
493ebbf861SJiaxun Yang     BL_REG_RA = 31,
503ebbf861SJiaxun Yang } bl_reg;
513ebbf861SJiaxun Yang 
bootcpu_supports_isa(uint64_t isa_mask)523ebbf861SJiaxun Yang static bool bootcpu_supports_isa(uint64_t isa_mask)
533ebbf861SJiaxun Yang {
543ebbf861SJiaxun Yang     return cpu_supports_isa(&MIPS_CPU(first_cpu)->env, isa_mask);
553ebbf861SJiaxun Yang }
563ebbf861SJiaxun Yang 
st_nm32_p(void ** ptr,uint32_t insn)57cf386ca8SPhilippe Mathieu-Daudé static void st_nm32_p(void **ptr, uint32_t insn)
58cf386ca8SPhilippe Mathieu-Daudé {
59cf386ca8SPhilippe Mathieu-Daudé     uint16_t *p = *ptr;
60cf386ca8SPhilippe Mathieu-Daudé 
61cf386ca8SPhilippe Mathieu-Daudé     stw_p(p, insn >> 16);
62cf386ca8SPhilippe Mathieu-Daudé     p++;
63cf386ca8SPhilippe Mathieu-Daudé     stw_p(p, insn >> 0);
64cf386ca8SPhilippe Mathieu-Daudé     p++;
65cf386ca8SPhilippe Mathieu-Daudé 
66cf386ca8SPhilippe Mathieu-Daudé     *ptr = p;
67cf386ca8SPhilippe Mathieu-Daudé }
68cf386ca8SPhilippe Mathieu-Daudé 
693ebbf861SJiaxun Yang /* Base types */
bl_gen_nop(void ** ptr)70cd5066f8SPhilippe Mathieu-Daudé static void bl_gen_nop(void **ptr)
713ebbf861SJiaxun Yang {
72cf386ca8SPhilippe Mathieu-Daudé     if (bootcpu_supports_isa(ISA_NANOMIPS32)) {
73cf386ca8SPhilippe Mathieu-Daudé         st_nm32_p(ptr, 0x8000c000);
74cf386ca8SPhilippe Mathieu-Daudé     } else {
75cd5066f8SPhilippe Mathieu-Daudé         uint32_t *p = *ptr;
76cd5066f8SPhilippe Mathieu-Daudé 
77cd5066f8SPhilippe Mathieu-Daudé         stl_p(p, 0);
78cd5066f8SPhilippe Mathieu-Daudé         p++;
79cd5066f8SPhilippe Mathieu-Daudé         *ptr = p;
803ebbf861SJiaxun Yang     }
81cf386ca8SPhilippe Mathieu-Daudé }
823ebbf861SJiaxun Yang 
bl_gen_r_type(void ** ptr,uint8_t opcode,bl_reg rs,bl_reg rt,bl_reg rd,uint8_t shift,uint8_t funct)83cd5066f8SPhilippe Mathieu-Daudé static void bl_gen_r_type(void **ptr, uint8_t opcode,
843ebbf861SJiaxun Yang                           bl_reg rs, bl_reg rt, bl_reg rd,
853ebbf861SJiaxun Yang                           uint8_t shift, uint8_t funct)
863ebbf861SJiaxun Yang {
87cd5066f8SPhilippe Mathieu-Daudé     uint32_t *p = *ptr;
883ebbf861SJiaxun Yang     uint32_t insn = 0;
893ebbf861SJiaxun Yang 
903ebbf861SJiaxun Yang     insn = deposit32(insn, 26, 6, opcode);
913ebbf861SJiaxun Yang     insn = deposit32(insn, 21, 5, rs);
923ebbf861SJiaxun Yang     insn = deposit32(insn, 16, 5, rt);
933ebbf861SJiaxun Yang     insn = deposit32(insn, 11, 5, rd);
943ebbf861SJiaxun Yang     insn = deposit32(insn, 6, 5, shift);
953ebbf861SJiaxun Yang     insn = deposit32(insn, 0, 6, funct);
963ebbf861SJiaxun Yang 
97cd5066f8SPhilippe Mathieu-Daudé     stl_p(p, insn);
98cd5066f8SPhilippe Mathieu-Daudé     p++;
99cd5066f8SPhilippe Mathieu-Daudé 
100cd5066f8SPhilippe Mathieu-Daudé     *ptr = p;
1013ebbf861SJiaxun Yang }
1023ebbf861SJiaxun Yang 
bl_gen_i_type(void ** ptr,uint8_t opcode,bl_reg rs,bl_reg rt,uint16_t imm)103cd5066f8SPhilippe Mathieu-Daudé static void bl_gen_i_type(void **ptr, uint8_t opcode,
1043ebbf861SJiaxun Yang                           bl_reg rs, bl_reg rt, uint16_t imm)
1053ebbf861SJiaxun Yang {
106cd5066f8SPhilippe Mathieu-Daudé     uint32_t *p = *ptr;
1073ebbf861SJiaxun Yang     uint32_t insn = 0;
1083ebbf861SJiaxun Yang 
1093ebbf861SJiaxun Yang     insn = deposit32(insn, 26, 6, opcode);
1103ebbf861SJiaxun Yang     insn = deposit32(insn, 21, 5, rs);
1113ebbf861SJiaxun Yang     insn = deposit32(insn, 16, 5, rt);
1123ebbf861SJiaxun Yang     insn = deposit32(insn, 0, 16, imm);
1133ebbf861SJiaxun Yang 
114cd5066f8SPhilippe Mathieu-Daudé     stl_p(p, insn);
115cd5066f8SPhilippe Mathieu-Daudé     p++;
116cd5066f8SPhilippe Mathieu-Daudé 
117cd5066f8SPhilippe Mathieu-Daudé     *ptr = p;
1183ebbf861SJiaxun Yang }
1193ebbf861SJiaxun Yang 
1203ebbf861SJiaxun Yang /* Single instructions */
bl_gen_dsll(void ** p,bl_reg rd,bl_reg rt,uint8_t sa)121cd5066f8SPhilippe Mathieu-Daudé static void bl_gen_dsll(void **p, bl_reg rd, bl_reg rt, uint8_t sa)
1223ebbf861SJiaxun Yang {
1233ebbf861SJiaxun Yang     if (bootcpu_supports_isa(ISA_MIPS3)) {
1243ebbf861SJiaxun Yang         bl_gen_r_type(p, 0, 0, rt, rd, sa, 0x38);
1253ebbf861SJiaxun Yang     } else {
1263ebbf861SJiaxun Yang         g_assert_not_reached(); /* unsupported */
1273ebbf861SJiaxun Yang     }
1283ebbf861SJiaxun Yang }
1293ebbf861SJiaxun Yang 
bl_gen_jalr(void ** p,bl_reg rs)130cd5066f8SPhilippe Mathieu-Daudé static void bl_gen_jalr(void **p, bl_reg rs)
1313ebbf861SJiaxun Yang {
132*9356a2d2SPhilippe Mathieu-Daudé     if (bootcpu_supports_isa(ISA_NANOMIPS32)) {
133*9356a2d2SPhilippe Mathieu-Daudé         uint32_t insn = 0;
134*9356a2d2SPhilippe Mathieu-Daudé 
135*9356a2d2SPhilippe Mathieu-Daudé         insn = deposit32(insn, 26, 6, 0b010010); /* JALRC */
136*9356a2d2SPhilippe Mathieu-Daudé         insn = deposit32(insn, 21, 5, BL_REG_RA);
137*9356a2d2SPhilippe Mathieu-Daudé         insn = deposit32(insn, 16, 5, rs);
138*9356a2d2SPhilippe Mathieu-Daudé 
139*9356a2d2SPhilippe Mathieu-Daudé         st_nm32_p(p, insn);
140*9356a2d2SPhilippe Mathieu-Daudé     } else {
1413ebbf861SJiaxun Yang         bl_gen_r_type(p, 0, rs, 0, BL_REG_RA, 0, 0x09);
1423ebbf861SJiaxun Yang     }
143*9356a2d2SPhilippe Mathieu-Daudé }
1443ebbf861SJiaxun Yang 
bl_gen_lui_nm(void ** ptr,bl_reg rt,uint32_t imm20)1455d380e4cSPhilippe Mathieu-Daudé static void bl_gen_lui_nm(void **ptr, bl_reg rt, uint32_t imm20)
1465d380e4cSPhilippe Mathieu-Daudé {
1475d380e4cSPhilippe Mathieu-Daudé     uint32_t insn = 0;
1485d380e4cSPhilippe Mathieu-Daudé 
1495d380e4cSPhilippe Mathieu-Daudé     assert(extract32(imm20, 0, 20) == imm20);
1505d380e4cSPhilippe Mathieu-Daudé     insn = deposit32(insn, 26, 6, 0b111000);
1515d380e4cSPhilippe Mathieu-Daudé     insn = deposit32(insn, 21, 5, rt);
1525d380e4cSPhilippe Mathieu-Daudé     insn = deposit32(insn, 12, 9, extract32(imm20, 0, 9));
1535d380e4cSPhilippe Mathieu-Daudé     insn = deposit32(insn, 2, 10, extract32(imm20, 9, 10));
1545d380e4cSPhilippe Mathieu-Daudé     insn = deposit32(insn, 0, 1, sextract32(imm20, 19, 1));
1555d380e4cSPhilippe Mathieu-Daudé 
1565d380e4cSPhilippe Mathieu-Daudé     st_nm32_p(ptr, insn);
1575d380e4cSPhilippe Mathieu-Daudé }
1585d380e4cSPhilippe Mathieu-Daudé 
bl_gen_lui(void ** p,bl_reg rt,uint16_t imm)159cd5066f8SPhilippe Mathieu-Daudé static void bl_gen_lui(void **p, bl_reg rt, uint16_t imm)
1603ebbf861SJiaxun Yang {
1613ebbf861SJiaxun Yang     /* R6: It's a alias of AUI with RS = 0 */
1623ebbf861SJiaxun Yang     bl_gen_i_type(p, 0x0f, 0, rt, imm);
1633ebbf861SJiaxun Yang }
1643ebbf861SJiaxun Yang 
bl_gen_ori_nm(void ** ptr,bl_reg rt,bl_reg rs,uint16_t imm12)1655d380e4cSPhilippe Mathieu-Daudé static void bl_gen_ori_nm(void **ptr, bl_reg rt, bl_reg rs, uint16_t imm12)
1665d380e4cSPhilippe Mathieu-Daudé {
1675d380e4cSPhilippe Mathieu-Daudé     uint32_t insn = 0;
1685d380e4cSPhilippe Mathieu-Daudé 
1695d380e4cSPhilippe Mathieu-Daudé     assert(extract32(imm12, 0, 12) == imm12);
1705d380e4cSPhilippe Mathieu-Daudé     insn = deposit32(insn, 26, 6, 0b100000);
1715d380e4cSPhilippe Mathieu-Daudé     insn = deposit32(insn, 21, 5, rt);
1725d380e4cSPhilippe Mathieu-Daudé     insn = deposit32(insn, 16, 5, rs);
1735d380e4cSPhilippe Mathieu-Daudé     insn = deposit32(insn, 0, 12, imm12);
1745d380e4cSPhilippe Mathieu-Daudé 
1755d380e4cSPhilippe Mathieu-Daudé     st_nm32_p(ptr, insn);
1765d380e4cSPhilippe Mathieu-Daudé }
1775d380e4cSPhilippe Mathieu-Daudé 
bl_gen_ori(void ** p,bl_reg rt,bl_reg rs,uint16_t imm)178cd5066f8SPhilippe Mathieu-Daudé static void bl_gen_ori(void **p, bl_reg rt, bl_reg rs, uint16_t imm)
1793ebbf861SJiaxun Yang {
1803ebbf861SJiaxun Yang     bl_gen_i_type(p, 0x0d, rs, rt, imm);
1813ebbf861SJiaxun Yang }
1823ebbf861SJiaxun Yang 
bl_gen_sw_nm(void ** ptr,bl_reg rt,uint8_t rs,uint16_t ofs12)18373be38cbSPhilippe Mathieu-Daudé static void bl_gen_sw_nm(void **ptr, bl_reg rt, uint8_t rs, uint16_t ofs12)
18473be38cbSPhilippe Mathieu-Daudé {
18573be38cbSPhilippe Mathieu-Daudé     uint32_t insn = 0;
18673be38cbSPhilippe Mathieu-Daudé 
18773be38cbSPhilippe Mathieu-Daudé     assert(extract32(ofs12, 0, 12) == ofs12);
18873be38cbSPhilippe Mathieu-Daudé     insn = deposit32(insn, 26, 6, 0b100001);
18973be38cbSPhilippe Mathieu-Daudé     insn = deposit32(insn, 21, 5, rt);
19073be38cbSPhilippe Mathieu-Daudé     insn = deposit32(insn, 16, 5, rs);
19173be38cbSPhilippe Mathieu-Daudé     insn = deposit32(insn, 12, 4, 0b1001);
19273be38cbSPhilippe Mathieu-Daudé     insn = deposit32(insn, 0, 12, ofs12);
19373be38cbSPhilippe Mathieu-Daudé 
19473be38cbSPhilippe Mathieu-Daudé     st_nm32_p(ptr, insn);
19573be38cbSPhilippe Mathieu-Daudé }
19673be38cbSPhilippe Mathieu-Daudé 
bl_gen_sw(void ** p,bl_reg rt,uint8_t base,uint16_t offset)197cd5066f8SPhilippe Mathieu-Daudé static void bl_gen_sw(void **p, bl_reg rt, uint8_t base, uint16_t offset)
1983ebbf861SJiaxun Yang {
19973be38cbSPhilippe Mathieu-Daudé     if (bootcpu_supports_isa(ISA_NANOMIPS32)) {
20073be38cbSPhilippe Mathieu-Daudé         bl_gen_sw_nm(p, rt, base, offset);
20173be38cbSPhilippe Mathieu-Daudé     } else {
2023ebbf861SJiaxun Yang         bl_gen_i_type(p, 0x2b, base, rt, offset);
2033ebbf861SJiaxun Yang     }
20473be38cbSPhilippe Mathieu-Daudé }
2053ebbf861SJiaxun Yang 
bl_gen_sd(void ** p,bl_reg rt,uint8_t base,uint16_t offset)206cd5066f8SPhilippe Mathieu-Daudé static void bl_gen_sd(void **p, bl_reg rt, uint8_t base, uint16_t offset)
2073ebbf861SJiaxun Yang {
2083ebbf861SJiaxun Yang     if (bootcpu_supports_isa(ISA_MIPS3)) {
2093ebbf861SJiaxun Yang         bl_gen_i_type(p, 0x3f, base, rt, offset);
2103ebbf861SJiaxun Yang     } else {
2113ebbf861SJiaxun Yang         g_assert_not_reached(); /* unsupported */
2123ebbf861SJiaxun Yang     }
2133ebbf861SJiaxun Yang }
2143ebbf861SJiaxun Yang 
2153ebbf861SJiaxun Yang /* Pseudo instructions */
bl_gen_li(void ** p,bl_reg rt,uint32_t imm)216cd5066f8SPhilippe Mathieu-Daudé static void bl_gen_li(void **p, bl_reg rt, uint32_t imm)
2173ebbf861SJiaxun Yang {
2185d380e4cSPhilippe Mathieu-Daudé     if (bootcpu_supports_isa(ISA_NANOMIPS32)) {
2195d380e4cSPhilippe Mathieu-Daudé         bl_gen_lui_nm(p, rt, extract32(imm, 12, 20));
2205d380e4cSPhilippe Mathieu-Daudé         bl_gen_ori_nm(p, rt, rt, extract32(imm, 0, 12));
2215d380e4cSPhilippe Mathieu-Daudé     } else {
2223ebbf861SJiaxun Yang         bl_gen_lui(p, rt, extract32(imm, 16, 16));
2233ebbf861SJiaxun Yang         bl_gen_ori(p, rt, rt, extract32(imm, 0, 16));
2243ebbf861SJiaxun Yang     }
2255d380e4cSPhilippe Mathieu-Daudé }
2263ebbf861SJiaxun Yang 
bl_gen_dli(void ** p,bl_reg rt,uint64_t imm)227cd5066f8SPhilippe Mathieu-Daudé static void bl_gen_dli(void **p, bl_reg rt, uint64_t imm)
2283ebbf861SJiaxun Yang {
2293ebbf861SJiaxun Yang     bl_gen_li(p, rt, extract64(imm, 32, 32));
2303ebbf861SJiaxun Yang     bl_gen_dsll(p, rt, rt, 16);
2313ebbf861SJiaxun Yang     bl_gen_ori(p, rt, rt, extract64(imm, 16, 16));
2323ebbf861SJiaxun Yang     bl_gen_dsll(p, rt, rt, 16);
2333ebbf861SJiaxun Yang     bl_gen_ori(p, rt, rt, extract64(imm, 0, 16));
2343ebbf861SJiaxun Yang }
2353ebbf861SJiaxun Yang 
bl_gen_load_ulong(void ** p,bl_reg rt,target_ulong imm)236cd5066f8SPhilippe Mathieu-Daudé static void bl_gen_load_ulong(void **p, bl_reg rt, target_ulong imm)
2373ebbf861SJiaxun Yang {
2383ebbf861SJiaxun Yang     if (bootcpu_supports_isa(ISA_MIPS3)) {
2393ebbf861SJiaxun Yang         bl_gen_dli(p, rt, imm); /* 64bit */
2403ebbf861SJiaxun Yang     } else {
2413ebbf861SJiaxun Yang         bl_gen_li(p, rt, imm); /* 32bit */
2423ebbf861SJiaxun Yang     }
2433ebbf861SJiaxun Yang }
2443ebbf861SJiaxun Yang 
2453ebbf861SJiaxun Yang /* Helpers */
bl_gen_jump_to(void ** p,target_ulong jump_addr)246cd5066f8SPhilippe Mathieu-Daudé void bl_gen_jump_to(void **p, target_ulong jump_addr)
2473ebbf861SJiaxun Yang {
2483ebbf861SJiaxun Yang     bl_gen_load_ulong(p, BL_REG_T9, jump_addr);
2493ebbf861SJiaxun Yang     bl_gen_jalr(p, BL_REG_T9);
2503ebbf861SJiaxun Yang     bl_gen_nop(p); /* delay slot */
2513ebbf861SJiaxun Yang }
2523ebbf861SJiaxun Yang 
bl_gen_jump_kernel(void ** p,bool set_sp,target_ulong sp,bool set_a0,target_ulong a0,bool set_a1,target_ulong a1,bool set_a2,target_ulong a2,bool set_a3,target_ulong a3,target_ulong kernel_addr)253cd5066f8SPhilippe Mathieu-Daudé void bl_gen_jump_kernel(void **p,
25436d7487bSPhilippe Mathieu-Daudé                         bool set_sp, target_ulong sp,
25536d7487bSPhilippe Mathieu-Daudé                         bool set_a0, target_ulong a0,
25636d7487bSPhilippe Mathieu-Daudé                         bool set_a1, target_ulong a1,
25736d7487bSPhilippe Mathieu-Daudé                         bool set_a2, target_ulong a2,
25836d7487bSPhilippe Mathieu-Daudé                         bool set_a3, target_ulong a3,
2593ebbf861SJiaxun Yang                         target_ulong kernel_addr)
2603ebbf861SJiaxun Yang {
26136d7487bSPhilippe Mathieu-Daudé     if (set_sp) {
2623ebbf861SJiaxun Yang         bl_gen_load_ulong(p, BL_REG_SP, sp);
26336d7487bSPhilippe Mathieu-Daudé     }
26436d7487bSPhilippe Mathieu-Daudé     if (set_a0) {
2653ebbf861SJiaxun Yang         bl_gen_load_ulong(p, BL_REG_A0, a0);
26636d7487bSPhilippe Mathieu-Daudé     }
26736d7487bSPhilippe Mathieu-Daudé     if (set_a1) {
2683ebbf861SJiaxun Yang         bl_gen_load_ulong(p, BL_REG_A1, a1);
26936d7487bSPhilippe Mathieu-Daudé     }
27036d7487bSPhilippe Mathieu-Daudé     if (set_a2) {
2713ebbf861SJiaxun Yang         bl_gen_load_ulong(p, BL_REG_A2, a2);
27236d7487bSPhilippe Mathieu-Daudé     }
27336d7487bSPhilippe Mathieu-Daudé     if (set_a3) {
2743ebbf861SJiaxun Yang         bl_gen_load_ulong(p, BL_REG_A3, a3);
27536d7487bSPhilippe Mathieu-Daudé     }
2763ebbf861SJiaxun Yang 
2773ebbf861SJiaxun Yang     bl_gen_jump_to(p, kernel_addr);
2783ebbf861SJiaxun Yang }
2793ebbf861SJiaxun Yang 
bl_gen_write_ulong(void ** p,target_ulong addr,target_ulong val)280cd5066f8SPhilippe Mathieu-Daudé void bl_gen_write_ulong(void **p, target_ulong addr, target_ulong val)
2813ebbf861SJiaxun Yang {
2823ebbf861SJiaxun Yang     bl_gen_load_ulong(p, BL_REG_K0, val);
2833ebbf861SJiaxun Yang     bl_gen_load_ulong(p, BL_REG_K1, addr);
28424ade8c5SJiaxun Yang     if (bootcpu_supports_isa(ISA_MIPS3)) {
2853ebbf861SJiaxun Yang         bl_gen_sd(p, BL_REG_K0, BL_REG_K1, 0x0);
28624ade8c5SJiaxun Yang     } else {
28724ade8c5SJiaxun Yang         bl_gen_sw(p, BL_REG_K0, BL_REG_K1, 0x0);
28824ade8c5SJiaxun Yang     }
2893ebbf861SJiaxun Yang }
2903ebbf861SJiaxun Yang 
bl_gen_write_u32(void ** p,target_ulong addr,uint32_t val)291cd5066f8SPhilippe Mathieu-Daudé void bl_gen_write_u32(void **p, target_ulong addr, uint32_t val)
2923ebbf861SJiaxun Yang {
2933ebbf861SJiaxun Yang     bl_gen_li(p, BL_REG_K0, val);
2943ebbf861SJiaxun Yang     bl_gen_load_ulong(p, BL_REG_K1, addr);
2953ebbf861SJiaxun Yang     bl_gen_sw(p, BL_REG_K0, BL_REG_K1, 0x0);
2963ebbf861SJiaxun Yang }
2973ebbf861SJiaxun Yang 
bl_gen_write_u64(void ** p,target_ulong addr,uint64_t val)298cd5066f8SPhilippe Mathieu-Daudé void bl_gen_write_u64(void **p, target_ulong addr, uint64_t val)
2993ebbf861SJiaxun Yang {
3003ebbf861SJiaxun Yang     bl_gen_dli(p, BL_REG_K0, val);
3013ebbf861SJiaxun Yang     bl_gen_load_ulong(p, BL_REG_K1, addr);
3023ebbf861SJiaxun Yang     bl_gen_sd(p, BL_REG_K0, BL_REG_K1, 0x0);
3033ebbf861SJiaxun Yang }
304