efi_loaded_image_t *image,
                                 efi_handle_t image_handle)
 {
-       unsigned long kernel_size = 0;
-       unsigned long preferred_addr;
+       unsigned long kernel_size, kernel_codesize, kernel_memsize;
        efi_status_t status;
 
        kernel_size = _edata - _start;
+       kernel_codesize = __init_text_end - _start;
+       kernel_memsize = kernel_size + (_end - _edata);
        *image_addr = (unsigned long)_start;
-       *image_size = kernel_size + (_end - _edata);
-
-       /*
-        * RISC-V kernel maps PAGE_OFFSET virtual address to the same physical
-        * address where kernel is booted. That's why kernel should boot from
-        * as low as possible to avoid wastage of memory. Currently, dram_base
-        * is occupied by the firmware. So the preferred address for kernel to
-        * boot is next aligned address. If preferred address is not available,
-        * relocate_kernel will fall back to efi_low_alloc_above to allocate
-        * lowest possible memory region as long as the address and size meets
-        * the alignment constraints.
-        */
-       preferred_addr = EFI_KIMG_PREFERRED_ADDRESS;
-       status = efi_relocate_kernel(image_addr, kernel_size, *image_size,
-                                    preferred_addr, efi_get_kimg_min_align(),
-                                    0x0);
+       *image_size = kernel_memsize;
+       *reserve_size = *image_size;
 
+       status = efi_kaslr_relocate_kernel(image_addr,
+                                          reserve_addr, reserve_size,
+                                          kernel_size, kernel_codesize, kernel_memsize,
+                                          efi_kaslr_get_phys_seed(image_handle));
        if (status != EFI_SUCCESS) {
                efi_err("Failed to relocate kernel\n");
                *image_size = 0;
        }
+
        return status;
 }
+
+void efi_icache_sync(unsigned long start, unsigned long end)
+{
+       asm volatile ("fence.i" ::: "memory");
+}