| 1 | |
| 2 |
|
| 3 | |
| 4 | * Early init before relocation
|
| 5 |
|
| 6 |
|
| 7 | #include <linux/init.h>
|
| 8 | #include <linux/kernel.h>
|
| 9 | #include <asm/setup.h>
|
| 10 | #include <asm/sections.h>
|
| 11 |
|
| 12 | |
| 13 | * We're called here very early in the boot.
|
| 14 | *
|
| 15 | * Note that the kernel may be running at an address which is different
|
| 16 | * from the address that it was linked at, so we must use RELOC/PTRRELOC
|
| 17 | * to access static data (including strings). -- paulus
|
| 18 |
|
| 19 | notrace unsigned long __init early_init(unsigned long dt_ptr)
|
| 20 | {
|
| 21 | unsigned long kva, offset = reloc_offset();
|
| 22 |
|
| 23 | kva = *PTRRELOC(&kernstart_virt_addr);
|
| 24 |
|
| 25 |
|
| 26 | if (kva == KERNELBASE)
|
| 27 | memset(PTRRELOC(&__bss_start), 0, __bss_stop - __bss_start);
|
| 28 |
|
| 29 | |
| 30 | * Identify the CPU type and fix up code sections
|
| 31 | * that depend on which cpu we have.
|
| 32 |
|
| 33 | identify_cpu(offset, mfspr(SPRN_PVR));
|
| 34 |
|
| 35 | apply_feature_fixups();
|
| 36 |
|
| 37 | return kva + offset;
|
| 38 | }
|