/* Note that the kernel may be running at an address which is different from the address that it was linked at, so we must use RELOC/PTRRELOC to access static data (including strings).  */
notrace unsigned long __init early_init(unsigned long dt_ptr)
/* Note that the kernel may be running at an address which is different from the address that it was linked at, so we must use RELOC/PTRRELOC to access static data (including strings).  */
notrace unsigned long __init early_init(unsigned long dt_ptr)
{
	unsigned long offset = reloc_offset();
	struct cpu_spec *spec;
	memset_io((void __iomem *)PTRRELOC(&__bss_start), 0,
			__bss_stop - __bss_start);
	spec = identify_cpu(offset, mfspr(SPRN_PVR));
	do_feature_fixups(spec->cpu_features,
			  PTRRELOC(&__start___ftr_fixup),
			  PTRRELOC(&__stop___ftr_fixup));
	do_feature_fixups(spec->mmu_features,
			  PTRRELOC(&__start___mmu_ftr_fixup),
			  PTRRELOC(&__stop___mmu_ftr_fixup));
	do_lwsync_fixups(spec->cpu_features,
			 PTRRELOC(&__start___lwsync_fixup),
			 PTRRELOC(&__stop___lwsync_fixup));
	return KERNELBASE + offset;
}