/*
         * Use the page tables supplied from  __cpu_up.
         */
+#ifdef CONFIG_XIP_KERNEL
+       ldr     r3, =(secondary_data + PLAT_PHYS_OFFSET - PAGE_OFFSET)
+#else
        adr_l   r3, secondary_data
+#endif
        mov_l   r12, __secondary_switched
        ldrd    r4, r5, [r3, #0]                @ get secondary_data.pgdir
 ARM_BE8(eor    r4, r4, r5)                     @ Swap r5 and r4 in BE:
 
 static int psci_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
        if (psci_ops.cpu_on)
+#ifdef CONFIG_XIP_KERNEL
+               return psci_ops.cpu_on(cpu_logical_map(cpu),
+                       ((phys_addr_t)(&secondary_startup)
+                       - XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR)
+                       + CONFIG_XIP_PHYS_ADDR));
+#else
                return psci_ops.cpu_on(cpu_logical_map(cpu),
                                        virt_to_idmap(&secondary_startup));
+#endif
        return -ENODEV;
 }
 
 
        unsigned long addr, end;
        unsigned long next;
 
+#ifdef CONFIG_XIP_KERNEL
+       addr = (phys_addr_t)(text_start) - XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR)
+               + CONFIG_XIP_PHYS_ADDR;
+       end = (phys_addr_t)(text_end) - XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR)
+               + CONFIG_XIP_PHYS_ADDR;
+#else
        addr = virt_to_idmap(text_start);
        end = virt_to_idmap(text_end);
+#endif
        pr_info("Setting up static identity map for 0x%lx - 0x%lx\n", addr, end);
 
        prot |= PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AF;