/* * Copyright (c) Hisilicon Technologies Co., Ltd.. 2009-2019. All rights reserved. * Description: support KASLR(kernel addess space layout randomization) * Author: * Create: 2020-02-21 */ #include "kaslr.h" #include #include #include #include #include "common_ext.h" #include "pdm_ext.h" #include "fdt_support.h" #include "soc_errno.h" #include "drv_cipher_ext.h" #ifndef SOCT_MINIBOOT_SUPPORT #include #endif int fdt_modify_kaslr(void) { #ifndef SLAVE_BOOT_ENV int nodeoffset; /* node offset from libfdt */ int ret; u32 seed; u64 kaslr_seed; #ifdef KASLR_DEBUG u32 kaslr_dtb[2]; /* 2 for Array */ int i; #endif void *fdt = (void *)CONFIG_DTB_ADDR; ret = fdt_path_offset (fdt, "/chosen"); if (ret < 0) { printf("fdt_path_offset failed, ret = 0x%x\n", ret); return ret; } nodeoffset = ret; ret = ext_drv_cipher_init(); if (ret != TD_SUCCESS) { printf("Cipher init failed.\n"); return ret; } ret = ext_drv_cipher_trng_get_random(&seed); if (ret != 0) { printf("ext_drv_cipher_trng_get_random fail!"); (td_void)ext_drv_cipher_deinit(); return ret; } kaslr_seed = cpu_to_fdt64((u64)seed); ret = fdt_setprop(fdt, nodeoffset, (const char *)"kaslr-seed", &kaslr_seed, sizeof(u64)); if (ret < 0) { printf("fdt_setprop fail, ret = 0x%x\n", ret); (td_void)ext_drv_cipher_deinit(); return ret; } #ifdef KASLR_DEBUG ret = ext_get_dts_config_u32array_byname("chosen", "kaslr-seed", kaslr_dtb, 2); /* 2 for Array */ for (i = 0; i < 2; i++) { /* 2 for Array */ printf("/chosen-> kaslr-seed: 0x%x\n", kaslr_dtb[i]); } #endif (td_void)ext_drv_cipher_deinit(); #endif return 0; }