Lines Matching +full:- +full:- +full:disable +full:- +full:numa

4  * Copyright (c) 2006-2007 CodeSourcery.
12 #include "qemu/error-report.h"
16 #include "hw/arm/linux-boot-if.h"
24 #include "system/numa.h"
30 #include "qemu/config-file.h"
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 */
73 { 0x58000084 }, /* ldr x4, entry ; Load the lower 32-bits of kernel entry */
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 */
82 /* A very small bootloader: call the board-setup code (if needed),
83 * set r0-r2, then jump to the kernel.
90 { 0xe51ff004 }, /* ldr pc, [pc, #-4] */
124 { 0xe5821000 }, /* str r1, [r2] - set GICC_CTLR.Enable */
126 { 0xe5821004 }, /* str r1, [r2, 4] - set GIC_PMR.Priority to 0xff */
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()
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()
252 rom_add_blob_fixed_as("board-setup-mvbar", mvbar_blob, sizeof(mvbar_blob), 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()
270 cpu_set_pc(cs, info->smp_loader_start); in default_reset_secondary()
275 return info->dtb_filename || info->get_dtb; in have_dtb()
286 int initrd_size = info->initrd_size; in set_kernel_args()
287 hwaddr base = info->loader_start; 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()
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()
322 if (info->atag_board) { in set_kernel_args()
327 atag_board_len = (info->atag_board(info, atag_board_buf) + 3) & ~3; 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()
386 WRITE_WORD(p, info->initrd_start); in set_kernel_args_old()
406 s = info->kernel_cmdline; in set_kernel_args_old()
430 /* only set the NUMA ID if it is specified */ 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()
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()
482 const char comp[] = "arm,psci-1.0\0arm,psci-0.2\0arm,psci"; in fdt_add_psci_node()
487 if (arm_feature(&armcpu->env, ARM_FEATURE_AARCH64)) { in fdt_add_psci_node()
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()
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()
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()
595 * We drop all the memory nodes which correspond to empty NUMA nodes in arm_load_dtb()
596 * from the device tree, because the Linux NUMA binding document in arm_load_dtb()
597 * states they should not be generated. Linux will get the NUMA node in arm_load_dtb()
598 * IDs of the empty NUMA nodes from the distance map if they are needed. in arm_load_dtb()
600 * configure distance maps when the empty NUMA node IDs are needed and 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()
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()
626 binfo->loader_start); in arm_load_dtb()
636 if (ms->kernel_cmdline && *ms->kernel_cmdline) { in arm_load_dtb()
638 ms->kernel_cmdline); 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()
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()
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()
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()
850 info->kernel_filename, load_elf_strerror(ret)); in arm_load_elf()
874 return -1; 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()
892 * is only valid if the image_size is non-zero. in load_aarch64_image()
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()
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()
975 if (image_low_addr < info->loader_start) { 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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()