Lines Matching +full:psci +full:- +full:0
4 * Copyright (c) 2006-2007 CodeSourcery.
12 #include "qemu/error-report.h"
16 #include "hw/arm/linux-boot-if.h"
30 #include "qemu/config-file.h"
39 #define KERNEL_ARGS_ADDR 0x100
40 #define KERNEL_NOLOAD_ADDR 0x02000000
41 #define KERNEL_LOAD_ADDR 0x00010000
42 #define KERNEL64_LOAD_ADDR 0x00080000
59 if (arm_feature(&cpu->env, ARM_FEATURE_EL3) && info->secure_boot) { in arm_boot_address_space()
69 { 0x580000c0 }, /* ldr x0, arg ; Load the lower 32-bits of DTB */
70 { 0xaa1f03e1 }, /* mov x1, xzr */
71 { 0xaa1f03e2 }, /* mov x2, xzr */
72 { 0xaa1f03e3 }, /* mov x3, xzr */
73 { 0x58000084 }, /* ldr x4, entry ; Load the lower 32-bits of kernel entry */
74 { 0xd61f0080 }, /* br x4 ; Jump to the kernel entry point */
75 { 0, FIXUP_ARGPTR_LO }, /* arg: .word @DTB Lower 32-bits */
76 { 0, FIXUP_ARGPTR_HI}, /* .word @DTB Higher 32-bits */
77 { 0, FIXUP_ENTRYPOINT_LO }, /* entry: .word @Kernel Entry Lower 32-bits */
78 { 0, FIXUP_ENTRYPOINT_HI }, /* .word @Kernel Entry Higher 32-bits */
79 { 0, FIXUP_TERMINATOR }
82 /* A very small bootloader: call the board-setup code (if needed),
83 * set r0-r2, then jump to the kernel.
89 { 0xe28fe004 }, /* add lr, pc, #4 */
90 { 0xe51ff004 }, /* ldr pc, [pc, #-4] */
91 { 0, FIXUP_BOARD_SETUP },
93 { 0xe3a00000 }, /* mov r0, #0 */
94 { 0xe59f1004 }, /* ldr r1, [pc, #4] */
95 { 0xe59f2004 }, /* ldr r2, [pc, #4] */
96 { 0xe59ff004 }, /* ldr pc, [pc, #4] */
97 { 0, FIXUP_BOARDID },
98 { 0, FIXUP_ARGPTR_LO },
99 { 0, FIXUP_ENTRYPOINT_LO },
100 { 0, FIXUP_TERMINATOR }
117 #define DSB_INSN 0xf57ff04f
118 #define CP15_DSB_INSN 0xee070f9a /* mcr cp15, 0, r0, c7, c10, 4 */
121 { 0xe59f2028 }, /* ldr r2, gic_cpu_if */
122 { 0xe59f0028 }, /* ldr r0, bootreg_addr */
123 { 0xe3a01001 }, /* mov r1, #1 */
124 { 0xe5821000 }, /* str r1, [r2] - set GICC_CTLR.Enable */
125 { 0xe3a010ff }, /* mov r1, #0xff */
126 { 0xe5821004 }, /* str r1, [r2, 4] - set GIC_PMR.Priority to 0xff */
127 { 0, FIXUP_DSB }, /* dsb */
128 { 0xe320f003 }, /* wfi */
129 { 0xe5901000 }, /* ldr r1, [r0] */
130 { 0xe1110001 }, /* tst r1, r1 */
131 { 0x0afffffb }, /* beq <wfi> */
132 { 0xe12fff11 }, /* bx r1 */
133 { 0, FIXUP_GIC_CPU_IF }, /* gic_cpu_if: .word 0x.... */
134 { 0, FIXUP_BOOTREG }, /* bootreg_addr: .word 0x.... */
135 { 0, FIXUP_TERMINATOR }
151 len = 0; in arm_write_bootloader()
158 for (i = 0; i < len; i++) { in arm_write_bootloader()
195 fixupcontext[FIXUP_GIC_CPU_IF] = info->gic_cpu_if_addr; in default_write_secondary()
196 fixupcontext[FIXUP_BOOTREG] = info->smp_bootreg_addr; in default_write_secondary()
197 if (arm_feature(&cpu->env, ARM_FEATURE_V7)) { in default_write_secondary()
203 arm_write_bootloader("smpboot", as, info->smp_loader_start, in default_write_secondary()
218 0xeafffffe, /* (spin) */ in arm_write_secure_board_setup_dummy_smc()
219 0xeafffffe, /* (spin) */ in arm_write_secure_board_setup_dummy_smc()
220 0xe1b0f00e, /* movs pc, lr ;SMC exception return */ in arm_write_secure_board_setup_dummy_smc()
221 0xeafffffe, /* (spin) */ in arm_write_secure_board_setup_dummy_smc()
222 0xeafffffe, /* (spin) */ in arm_write_secure_board_setup_dummy_smc()
223 0xeafffffe, /* (spin) */ in arm_write_secure_board_setup_dummy_smc()
224 0xeafffffe, /* (spin) */ in arm_write_secure_board_setup_dummy_smc()
225 0xeafffffe, /* (spin) */ in arm_write_secure_board_setup_dummy_smc()
229 0xee110f51, /* mrc p15, 0, r0, c1, c1, 2 ;read NSACR */ in arm_write_secure_board_setup_dummy_smc()
230 0xe3800b03, /* orr r0, #0xc00 ;set CP11, CP10 */ in arm_write_secure_board_setup_dummy_smc()
231 0xee010f51, /* mcr p15, 0, r0, c1, c1, 2 ;write NSACR */ in arm_write_secure_board_setup_dummy_smc()
232 0xe3a00e00 + (mvbar_addr >> 4), /* mov r0, #mvbar_addr */ in arm_write_secure_board_setup_dummy_smc()
233 0xee0c0f30, /* mcr p15, 0, r0, c12, c0, 1 ;set MVBAR */ in arm_write_secure_board_setup_dummy_smc()
234 0xee110f11, /* mrc p15, 0, r0, c1 , c1, 0 ;read SCR */ in arm_write_secure_board_setup_dummy_smc()
235 0xe3800031, /* orr r0, #0x31 ;enable AW, FW, NS */ in arm_write_secure_board_setup_dummy_smc()
236 0xee010f11, /* mcr p15, 0, r0, c1, c1, 0 ;write SCR */ in arm_write_secure_board_setup_dummy_smc()
237 0xe1a0100e, /* mov r1, lr ;save LR across SMC */ in arm_write_secure_board_setup_dummy_smc()
238 0xe1600070, /* smc #0 ;call monitor to flush SCR */ in arm_write_secure_board_setup_dummy_smc()
239 0xe1a0f001, /* mov pc, r1 ;return */ in arm_write_secure_board_setup_dummy_smc()
243 assert((mvbar_addr & 0x1f) == 0 && (mvbar_addr >> 4) < 0x100); in arm_write_secure_board_setup_dummy_smc()
246 assert((mvbar_addr + sizeof(mvbar_blob) <= info->board_setup_addr) in arm_write_secure_board_setup_dummy_smc()
247 || (info->board_setup_addr + sizeof(board_setup_blob) <= mvbar_addr)); in arm_write_secure_board_setup_dummy_smc()
249 for (n = 0; n < ARRAY_SIZE(mvbar_blob); n++) { in arm_write_secure_board_setup_dummy_smc()
252 rom_add_blob_fixed_as("board-setup-mvbar", mvbar_blob, sizeof(mvbar_blob), in arm_write_secure_board_setup_dummy_smc()
255 for (n = 0; n < ARRAY_SIZE(board_setup_blob); n++) { in arm_write_secure_board_setup_dummy_smc()
258 rom_add_blob_fixed_as("board-setup", board_setup_blob, in arm_write_secure_board_setup_dummy_smc()
259 sizeof(board_setup_blob), info->board_setup_addr, as); in arm_write_secure_board_setup_dummy_smc()
268 address_space_stl_notdirty(as, info->smp_bootreg_addr, in default_reset_secondary()
269 0, MEMTXATTRS_UNSPECIFIED, NULL); in default_reset_secondary()
270 cpu_set_pc(cs, info->smp_loader_start); in default_reset_secondary()
275 return info->dtb_filename || info->get_dtb; in have_dtb()
282 } while (0)
286 int initrd_size = info->initrd_size; in set_kernel_args()
287 hwaddr base = info->loader_start; in set_kernel_args()
293 WRITE_WORD(p, 0x54410001); in set_kernel_args()
295 WRITE_WORD(p, 0x1000); in set_kernel_args()
296 WRITE_WORD(p, 0); in set_kernel_args()
300 WRITE_WORD(p, 0x54410002); in set_kernel_args()
301 WRITE_WORD(p, info->ram_size); in set_kernel_args()
302 WRITE_WORD(p, info->loader_start); in set_kernel_args()
306 WRITE_WORD(p, 0x54420005); in set_kernel_args()
307 WRITE_WORD(p, info->initrd_start); in set_kernel_args()
310 if (info->kernel_cmdline && *info->kernel_cmdline) { in set_kernel_args()
314 cmdline_size = strlen(info->kernel_cmdline); in set_kernel_args()
316 info->kernel_cmdline, cmdline_size + 1); in set_kernel_args()
319 WRITE_WORD(p, 0x54410009); in set_kernel_args()
322 if (info->atag_board) { in set_kernel_args()
325 uint8_t atag_board_buf[0x1000]; in set_kernel_args()
327 atag_board_len = (info->atag_board(info, atag_board_buf) + 3) & ~3; in set_kernel_args()
329 WRITE_WORD(p, 0x414f4d50); in set_kernel_args()
335 WRITE_WORD(p, 0); in set_kernel_args()
336 WRITE_WORD(p, 0); in set_kernel_args()
344 int initrd_size = info->initrd_size; in set_kernel_args_old()
345 hwaddr base = info->loader_start; in set_kernel_args_old()
347 /* see linux/include/asm-arm/setup.h */ in set_kernel_args_old()
352 WRITE_WORD(p, info->ram_size / 4096); in set_kernel_args_old()
354 WRITE_WORD(p, 0); in set_kernel_args_old()
361 WRITE_WORD(p, (31 << 8) | 0); /* /dev/mtdblock0 */ in set_kernel_args_old()
363 WRITE_WORD(p, 0); in set_kernel_args_old()
365 WRITE_WORD(p, 0); in set_kernel_args_old()
367 WRITE_WORD(p, 0); in set_kernel_args_old()
369 WRITE_WORD(p, 0); in set_kernel_args_old()
371 WRITE_WORD(p, 0); in set_kernel_args_old()
376 WRITE_WORD(p, 0); in set_kernel_args_old()
378 WRITE_WORD(p, 0); in set_kernel_args_old()
379 WRITE_WORD(p, 0); in set_kernel_args_old()
380 WRITE_WORD(p, 0); in set_kernel_args_old()
381 WRITE_WORD(p, 0); in set_kernel_args_old()
383 WRITE_WORD(p, 0); in set_kernel_args_old()
386 WRITE_WORD(p, info->initrd_start); in set_kernel_args_old()
388 WRITE_WORD(p, 0); in set_kernel_args_old()
393 WRITE_WORD(p, 0); in set_kernel_args_old()
395 WRITE_WORD(p, 0); in set_kernel_args_old()
397 WRITE_WORD(p, 0); in set_kernel_args_old()
399 WRITE_WORD(p, 0); in set_kernel_args_old()
401 WRITE_WORD(p, 0); in set_kernel_args_old()
404 WRITE_WORD(p, 0); in set_kernel_args_old()
406 s = info->kernel_cmdline; in set_kernel_args_old()
410 WRITE_WORD(p, 0); in set_kernel_args_old()
426 if (ret < 0) { in fdt_add_memory_node()
431 if (numa_node_id >= 0) { in fdt_add_memory_node()
433 "numa-node-id", numa_node_id); in fdt_add_memory_node()
451 "psci-conduit", in fdt_add_psci_node()
467 * A pre-existing /psci node might specify function ID values in fdt_add_psci_node()
468 * that don't match QEMU's PSCI implementation. Delete the whole in fdt_add_psci_node()
471 rc = fdt_path_offset(fdt, "/psci"); in fdt_add_psci_node()
472 if (rc >= 0) { in fdt_add_psci_node()
473 qemu_fdt_nop_node(fdt, "/psci"); in fdt_add_psci_node()
476 qemu_fdt_add_subnode(fdt, "/psci"); in fdt_add_psci_node()
477 if (armcpu->psci_version >= QEMU_PSCI_VERSION_0_2) { in fdt_add_psci_node()
478 if (armcpu->psci_version < QEMU_PSCI_VERSION_1_0) { in fdt_add_psci_node()
479 const char comp[] = "arm,psci-0.2\0arm,psci"; in fdt_add_psci_node()
480 qemu_fdt_setprop(fdt, "/psci", "compatible", comp, sizeof(comp)); in fdt_add_psci_node()
482 const char comp[] = "arm,psci-1.0\0arm,psci-0.2\0arm,psci"; in fdt_add_psci_node()
483 qemu_fdt_setprop(fdt, "/psci", "compatible", comp, sizeof(comp)); in fdt_add_psci_node()
487 if (arm_feature(&armcpu->env, ARM_FEATURE_AARCH64)) { in fdt_add_psci_node()
497 qemu_fdt_setprop_string(fdt, "/psci", "compatible", "arm,psci"); in fdt_add_psci_node()
505 /* We adopt the PSCI spec's nomenclature, and use 'conduit' to refer in fdt_add_psci_node()
506 * to the instruction that should be used to invoke PSCI functions. in fdt_add_psci_node()
510 qemu_fdt_setprop_string(fdt, "/psci", "method", psci_method); in fdt_add_psci_node()
512 qemu_fdt_setprop_cell(fdt, "/psci", "cpu_suspend", cpu_suspend_fn); in fdt_add_psci_node()
513 qemu_fdt_setprop_cell(fdt, "/psci", "cpu_off", cpu_off_fn); in fdt_add_psci_node()
514 qemu_fdt_setprop_cell(fdt, "/psci", "cpu_on", cpu_on_fn); in fdt_add_psci_node()
515 qemu_fdt_setprop_cell(fdt, "/psci", "migrate", migrate_fn); in fdt_add_psci_node()
523 int size, rc, n = 0; in arm_load_dtb()
530 if (binfo->dtb_filename) { in arm_load_dtb()
532 filename = qemu_find_file(QEMU_FILE_TYPE_DTB, binfo->dtb_filename); in arm_load_dtb()
534 fprintf(stderr, "Couldn't open dtb file %s\n", binfo->dtb_filename); in arm_load_dtb()
546 fdt = binfo->get_dtb(binfo, &size); in arm_load_dtb()
553 if (addr_limit > addr && size > (addr_limit - addr)) { in arm_load_dtb()
556 * so just return 0 as size, i.e., no error. in arm_load_dtb()
559 return 0; in arm_load_dtb()
562 acells = qemu_fdt_getprop_cell(fdt, "/", "#address-cells", in arm_load_dtb()
564 scells = qemu_fdt_getprop_cell(fdt, "/", "#size-cells", in arm_load_dtb()
566 if (acells == 0 || scells == 0) { in arm_load_dtb()
567 fprintf(stderr, "dtb file invalid (#address-cells or #size-cells 0)\n"); in arm_load_dtb()
571 if (scells < 2 && binfo->ram_size >= 4 * GiB) { in arm_load_dtb()
580 /* nop all root nodes matching /memory or /memory@unit-address */ in arm_load_dtb()
603 if (ms->numa_state != NULL && ms->numa_state->num_nodes > 0) { in arm_load_dtb()
604 mem_base = binfo->loader_start; in arm_load_dtb()
605 for (i = 0; i < ms->numa_state->num_nodes; i++) { in arm_load_dtb()
606 mem_len = ms->numa_state->nodes[i].node_mem; in arm_load_dtb()
613 if (rc < 0) { in arm_load_dtb()
622 rc = fdt_add_memory_node(fdt, acells, binfo->loader_start, in arm_load_dtb()
623 scells, binfo->ram_size, -1); in arm_load_dtb()
624 if (rc < 0) { in arm_load_dtb()
626 binfo->loader_start); in arm_load_dtb()
632 if (rc < 0) { in arm_load_dtb()
636 if (ms->kernel_cmdline && *ms->kernel_cmdline) { in arm_load_dtb()
638 ms->kernel_cmdline); in arm_load_dtb()
639 if (rc < 0) { in arm_load_dtb()
645 if (binfo->initrd_size) { in arm_load_dtb()
646 rc = qemu_fdt_setprop_sized_cells(fdt, "/chosen", "linux,initrd-start", in arm_load_dtb()
647 acells, binfo->initrd_start); in arm_load_dtb()
648 if (rc < 0) { in arm_load_dtb()
649 fprintf(stderr, "couldn't set /chosen/linux,initrd-start\n"); in arm_load_dtb()
653 rc = qemu_fdt_setprop_sized_cells(fdt, "/chosen", "linux,initrd-end", in arm_load_dtb()
655 binfo->initrd_start + in arm_load_dtb()
656 binfo->initrd_size); in arm_load_dtb()
657 if (rc < 0) { in arm_load_dtb()
658 fprintf(stderr, "couldn't set /chosen/linux,initrd-end\n"); in arm_load_dtb()
665 if (binfo->modify_dtb) { in arm_load_dtb()
666 binfo->modify_dtb(binfo, fdt); in arm_load_dtb()
676 if (fdt != ms->fdt) { in arm_load_dtb()
677 g_free(ms->fdt); in arm_load_dtb()
678 ms->fdt = fdt; in arm_load_dtb()
685 return -1; in arm_load_dtb()
692 CPUARMState *env = &cpu->env; in do_cpu_reset()
693 const struct arm_boot_info *info = env->boot_info; in do_cpu_reset()
697 if (!info->is_linux) { in do_cpu_reset()
700 uint64_t entry = info->entry; in do_cpu_reset()
702 switch (info->endianness) { in do_cpu_reset()
704 env->cp15.sctlr_el[1] &= ~SCTLR_E0E; in do_cpu_reset()
706 env->cp15.sctlr_el[i] &= ~SCTLR_EE; in do_cpu_reset()
708 env->uncached_cpsr &= ~CPSR_E; in do_cpu_reset()
711 env->cp15.sctlr_el[1] |= SCTLR_E0E; in do_cpu_reset()
713 env->cp15.sctlr_el[i] |= SCTLR_EE; in do_cpu_reset()
715 env->uncached_cpsr |= CPSR_E; in do_cpu_reset()
718 env->cp15.sctlr_el[1] |= SCTLR_B; in do_cpu_reset()
730 * - AArch64 NS EL2 or NS EL1 in do_cpu_reset()
731 * - AArch32 Secure SVC (EL3) in do_cpu_reset()
732 * - AArch32 NS Hyp (EL2) in do_cpu_reset()
733 * - AArch32 NS SVC (EL1) in do_cpu_reset()
739 if (env->aarch64) { in do_cpu_reset()
744 assert(!info->secure_boot); in do_cpu_reset()
745 assert(!info->secure_board_setup); in do_cpu_reset()
748 (info->secure_boot || in do_cpu_reset()
749 (info->secure_board_setup && cpu == info->primary_cpu))) { in do_cpu_reset()
757 if (cpu == info->primary_cpu) { in do_cpu_reset()
760 cpu_set_pc(cs, info->loader_start); in do_cpu_reset()
769 } else if (info->secondary_cpu_reset_hook) { in do_cpu_reset()
770 info->secondary_cpu_reset_hook(cpu, info); in do_cpu_reset()
787 if (albifc->arm_linux_init) { in do_arm_linux_init()
788 albifc->arm_linux_init(albif, info->secure_boot); in do_arm_linux_init()
791 return 0; in do_arm_linux_init()
803 int data_swab = 0; in arm_load_elf()
809 load_elf_hdr(info->kernel_filename, &elf_header, &elf_is64, &err); in arm_load_elf()
816 return -1; in arm_load_elf()
821 info->endianness = elf_data_order == ELFDATA2MSB ? ARM_ENDIANNESS_BE8 in arm_load_elf()
827 info->endianness = ARM_ENDIANNESS_BE8; in arm_load_elf()
829 info->endianness = ARM_ENDIANNESS_BE32; in arm_load_elf()
830 /* In BE32, the CPU has a different view of the per-byte in arm_load_elf()
833 * the CPU's per-word byte-reversed view of the world. QEMU in arm_load_elf()
840 info->endianness = ARM_ENDIANNESS_LE; in arm_load_elf()
844 ret = load_elf_as(info->kernel_filename, NULL, NULL, NULL, in arm_load_elf()
847 if (ret <= 0) { in arm_load_elf()
850 info->kernel_filename, load_elf_strerror(ret)); in arm_load_elf()
861 uint64_t kernel_size = 0; in load_aarch64_image()
869 if (size < 0) { in load_aarch64_image()
874 return -1; in load_aarch64_image()
879 if (unpack_efi_zboot_image(&buffer, &size) < 0) { in load_aarch64_image()
881 return -1; in load_aarch64_image()
885 /* check the arm64 magic header value -- very old kernels may not have it */ in load_aarch64_image()
887 memcmp(buffer + ARM64_MAGIC_OFFSET, "ARM\x64", 4) == 0) { in load_aarch64_image()
892 * is only valid if the image_size is non-zero. in load_aarch64_image()
898 if (kernel_size != 0) { in load_aarch64_image()
899 kernel_load_offset = le64_to_cpu(hdrvals[0]); in load_aarch64_image()
908 * than 0MB + offset. in load_aarch64_image()
921 if (kernel_size == 0) { in load_aarch64_image()
941 int is_linux = 0; in arm_setup_direct_kernel_boot()
944 uint64_t image_low_addr = 0, image_high_addr = 0; in arm_setup_direct_kernel_boot()
948 uint64_t ram_end = info->loader_start + info->ram_size; in arm_setup_direct_kernel_boot()
950 if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) { in arm_setup_direct_kernel_boot()
955 if (!info->write_board_setup) { in arm_setup_direct_kernel_boot()
964 if (kernel_size > 0 && have_dtb(info)) { in arm_setup_direct_kernel_boot()
967 * the DTB there like we do for images loaded with -bios or -pflash. in arm_setup_direct_kernel_boot()
969 if (image_low_addr > info->loader_start in arm_setup_direct_kernel_boot()
970 || image_high_addr < info->loader_start) { in arm_setup_direct_kernel_boot()
973 * pointing into RAM, otherwise pass '0' (no limit) in arm_setup_direct_kernel_boot()
975 if (image_low_addr < info->loader_start) { in arm_setup_direct_kernel_boot()
976 image_low_addr = 0; in arm_setup_direct_kernel_boot()
978 info->dtb_start = info->loader_start; in arm_setup_direct_kernel_boot()
979 info->dtb_limit = image_low_addr; in arm_setup_direct_kernel_boot()
983 if (kernel_size < 0) { in arm_setup_direct_kernel_boot()
984 uint64_t loadaddr = info->loader_start + KERNEL_NOLOAD_ADDR; in arm_setup_direct_kernel_boot()
985 kernel_size = load_uimage_as(info->kernel_filename, &entry, &loadaddr, in arm_setup_direct_kernel_boot()
987 if (kernel_size >= 0) { in arm_setup_direct_kernel_boot()
992 if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64) && kernel_size < 0) { in arm_setup_direct_kernel_boot()
993 kernel_size = load_aarch64_image(info->kernel_filename, in arm_setup_direct_kernel_boot()
994 info->loader_start, &entry, as); in arm_setup_direct_kernel_boot()
996 if (kernel_size >= 0) { in arm_setup_direct_kernel_boot()
1000 } else if (kernel_size < 0) { in arm_setup_direct_kernel_boot()
1001 /* 32-bit ARM */ in arm_setup_direct_kernel_boot()
1002 entry = info->loader_start + KERNEL_LOAD_ADDR; in arm_setup_direct_kernel_boot()
1003 kernel_size = load_image_targphys_as(info->kernel_filename, entry, in arm_setup_direct_kernel_boot()
1004 ram_end - KERNEL_LOAD_ADDR, as); in arm_setup_direct_kernel_boot()
1006 if (kernel_size >= 0) { in arm_setup_direct_kernel_boot()
1011 if (kernel_size < 0) { in arm_setup_direct_kernel_boot()
1012 error_report("could not load kernel '%s'", info->kernel_filename); in arm_setup_direct_kernel_boot()
1016 if (kernel_size > info->ram_size) { in arm_setup_direct_kernel_boot()
1019 info->kernel_filename, kernel_size, info->ram_size); in arm_setup_direct_kernel_boot()
1023 info->entry = entry; in arm_setup_direct_kernel_boot()
1037 * don't tell us their exact size (eg self-decompressing 32-bit kernels) in arm_setup_direct_kernel_boot()
1040 info->initrd_start = info->loader_start + in arm_setup_direct_kernel_boot()
1041 MIN(info->ram_size / 2, 128 * MiB); in arm_setup_direct_kernel_boot()
1043 info->initrd_start = MAX(info->initrd_start, image_high_addr); in arm_setup_direct_kernel_boot()
1045 info->initrd_start = TARGET_PAGE_ALIGN(info->initrd_start); in arm_setup_direct_kernel_boot()
1050 if (info->initrd_filename) { in arm_setup_direct_kernel_boot()
1052 if (info->initrd_start >= ram_end) { in arm_setup_direct_kernel_boot()
1057 initrd_size = load_ramdisk_as(info->initrd_filename, in arm_setup_direct_kernel_boot()
1058 info->initrd_start, in arm_setup_direct_kernel_boot()
1059 ram_end - info->initrd_start, as); in arm_setup_direct_kernel_boot()
1060 if (initrd_size < 0) { in arm_setup_direct_kernel_boot()
1061 initrd_size = load_image_targphys_as(info->initrd_filename, in arm_setup_direct_kernel_boot()
1062 info->initrd_start, in arm_setup_direct_kernel_boot()
1063 ram_end - in arm_setup_direct_kernel_boot()
1064 info->initrd_start, in arm_setup_direct_kernel_boot()
1067 if (initrd_size < 0) { in arm_setup_direct_kernel_boot()
1069 info->initrd_filename); in arm_setup_direct_kernel_boot()
1072 if (info->initrd_start + initrd_size > ram_end) { in arm_setup_direct_kernel_boot()
1075 info->initrd_filename); in arm_setup_direct_kernel_boot()
1079 initrd_size = 0; in arm_setup_direct_kernel_boot()
1081 info->initrd_size = initrd_size; in arm_setup_direct_kernel_boot()
1083 fixupcontext[FIXUP_BOARDID] = info->board_id; in arm_setup_direct_kernel_boot()
1084 fixupcontext[FIXUP_BOARD_SETUP] = info->board_setup_addr; in arm_setup_direct_kernel_boot()
1111 info->dtb_start = QEMU_ALIGN_UP(info->initrd_start + initrd_size, in arm_setup_direct_kernel_boot()
1113 if (info->dtb_start >= ram_end) { in arm_setup_direct_kernel_boot()
1117 fixupcontext[FIXUP_ARGPTR_LO] = info->dtb_start; in arm_setup_direct_kernel_boot()
1118 fixupcontext[FIXUP_ARGPTR_HI] = info->dtb_start >> 32; in arm_setup_direct_kernel_boot()
1121 info->loader_start + KERNEL_ARGS_ADDR; in arm_setup_direct_kernel_boot()
1123 (info->loader_start + KERNEL_ARGS_ADDR) >> 32; in arm_setup_direct_kernel_boot()
1124 if (info->ram_size >= 4 * GiB) { in arm_setup_direct_kernel_boot()
1127 " using -dtb)"); in arm_setup_direct_kernel_boot()
1134 arm_write_bootloader("bootloader", as, info->loader_start, in arm_setup_direct_kernel_boot()
1137 if (info->write_board_setup) { in arm_setup_direct_kernel_boot()
1138 info->write_board_setup(cpu, info); in arm_setup_direct_kernel_boot()
1148 info->is_linux = is_linux; in arm_setup_direct_kernel_boot()
1151 ARM_CPU(cs)->env.boot_info = info; in arm_setup_direct_kernel_boot()
1165 info->dtb_start = info->loader_start; in arm_setup_firmware_boot()
1168 if (info->kernel_filename) { in arm_setup_firmware_boot()
1182 try_decompressing_kernel = arm_feature(&cpu->env, in arm_setup_firmware_boot()
1192 info->kernel_filename, in arm_setup_firmware_boot()
1196 info->initrd_filename, false); in arm_setup_firmware_boot()
1198 if (info->kernel_cmdline) { in arm_setup_firmware_boot()
1200 strlen(info->kernel_cmdline) + 1); in arm_setup_firmware_boot()
1202 info->kernel_cmdline); in arm_setup_firmware_boot()
1207 * We will start from address 0 (typically a boot ROM image) in the in arm_setup_firmware_boot()
1208 * same way as hardware. Leave env->boot_info NULL, so that in arm_setup_firmware_boot()
1218 CPUARMState *env = &cpu->env; in arm_load_kernel()
1219 int nb_cpus = 0; in arm_load_kernel()
1237 assert(!(info->secure_board_setup && kvm_enabled())); in arm_load_kernel()
1238 info->kernel_filename = ms->kernel_filename; in arm_load_kernel()
1239 info->kernel_cmdline = ms->kernel_cmdline; in arm_load_kernel()
1240 info->initrd_filename = ms->initrd_filename; in arm_load_kernel()
1241 info->dtb_filename = ms->dtb; in arm_load_kernel()
1242 info->dtb_limit = 0; in arm_load_kernel()
1245 info->primary_cpu = cpu; in arm_load_kernel()
1248 if (!info->kernel_filename || info->firmware_loaded) { in arm_load_kernel()
1255 * Disable the PSCI conduit if it is set up to target the same in arm_load_kernel()
1263 * If PSCI is enabled, then SMC calls all go to the PSCI handler and in arm_load_kernel()
1269 assert(info->psci_conduit == QEMU_PSCI_CONDUIT_DISABLED || in arm_load_kernel()
1270 !info->secure_board_setup); in arm_load_kernel()
1281 if (info->is_linux && !info->secure_boot) { in arm_load_kernel()
1285 if ((info->psci_conduit == QEMU_PSCI_CONDUIT_HVC && boot_el >= 2) || in arm_load_kernel()
1286 (info->psci_conduit == QEMU_PSCI_CONDUIT_SMC && boot_el == 3)) { in arm_load_kernel()
1287 info->psci_conduit = QEMU_PSCI_CONDUIT_DISABLED; in arm_load_kernel()
1290 if (info->psci_conduit != QEMU_PSCI_CONDUIT_DISABLED) { in arm_load_kernel()
1294 object_property_set_int(cpuobj, "psci-conduit", info->psci_conduit, in arm_load_kernel()
1296 /* Secondary CPUs start in PSCI powered-down state. */ in arm_load_kernel()
1297 if (ARM_CPU(cs) != info->primary_cpu) { in arm_load_kernel()
1298 object_property_set_bool(cpuobj, "start-powered-off", true, in arm_load_kernel()
1304 if (info->psci_conduit == QEMU_PSCI_CONDUIT_DISABLED && in arm_load_kernel()
1305 info->is_linux && nb_cpus > 1) { in arm_load_kernel()
1307 * We're booting Linux but not using PSCI, so for SMP we need in arm_load_kernel()
1311 if (!info->secondary_cpu_reset_hook) { in arm_load_kernel()
1312 info->secondary_cpu_reset_hook = default_reset_secondary; in arm_load_kernel()
1314 if (!info->write_secondary_boot) { in arm_load_kernel()
1315 info->write_secondary_boot = default_write_secondary; in arm_load_kernel()
1317 info->write_secondary_boot(cpu, info); in arm_load_kernel()
1323 info->write_secondary_boot = NULL; in arm_load_kernel()
1324 info->secondary_cpu_reset_hook = NULL; in arm_load_kernel()
1328 * arm_load_dtb() may add a PSCI node so it must be called after we have in arm_load_kernel()
1329 * decided whether to enable PSCI and set the psci-conduit CPU properties. in arm_load_kernel()
1331 if (!info->skip_dtb_autoload && have_dtb(info)) { in arm_load_kernel()
1332 if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, in arm_load_kernel()
1333 as, ms, cpu) < 0) { in arm_load_kernel()