void __init early_init_devtree(void *params)
 {
+       phys_addr_t int_vector_size;
 
        DBG(" -> early_init_devtree(%px)\n", params);
 
        setup_initial_memory_limit(memstart_addr, first_memblock_size);
        /* Reserve MEMBLOCK regions used by kernel, initrd, dt, etc... */
        memblock_reserve(PHYSICAL_START, __pa(_end) - PHYSICAL_START);
+#ifdef CONFIG_PPC64
+       /* If relocatable, reserve at least 32k for interrupt vectors etc. */
+       int_vector_size = __end_interrupts - _stext;
+       int_vector_size = max_t(phys_addr_t, SZ_32K, int_vector_size);
+#else
        /* If relocatable, reserve first 32k for interrupt vectors etc. */
+       int_vector_size = SZ_32K;
+#endif
        if (PHYSICAL_START > MEMORY_START)
-               memblock_reserve(MEMORY_START, 0x8000);
+               memblock_reserve(MEMORY_START, int_vector_size);
        reserve_kdump_trampoline();
 #if defined(CONFIG_FA_DUMP) || defined(CONFIG_PRESERVE_FA_DUMP)
        /*