load_image.c 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2015. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #include <stdlib.h>
  32. #include <sys/types.h>
  33. #include <stdint.h>
  34. #include <platform/partition.h>
  35. #include <platform/mt_typedefs.h>
  36. #include <platform/boot_mode.h>
  37. #include <platform/mt_reg_base.h>
  38. #include <bootimg.h>
  39. #include <platform/errno.h>
  40. #include <printf.h>
  41. #include <string.h>
  42. #include <malloc.h>
  43. #include <platform/mt_gpt.h>
  44. #include <platform/sec_status.h>
  45. #include <odm_mdtbo.h>
  46. #include <platform/mtk_key.h>
  47. #include <target/cust_key.h>
  48. #include <part_interface.h>
  49. #include <boot_opt.h>
  50. #include <block_generic_interface.h> // for mt_part_get_device()
  51. #include <storage_api.h>
  52. #define MODULE_NAME "LK_BOOT"
  53. // ************************************************************************
  54. #define PUBK_LEN 256
  55. #define BOOT_STATE_GREEN 0x0
  56. #define BOOT_STATE_ORANGE 0x1
  57. #define BOOT_STATE_YELLOW 0x2
  58. #define BOOT_STATE_RED 0x3
  59. #define DEVICE_STATE_UNLOCKED 0x0
  60. #define DEVICE_STATE_LOCKED 0x1
  61. #define DTBO_IMG_ALIGN_SZ (16)
  62. //*********
  63. //* Notice : it's kernel start addr (and not include any debug header)
  64. unsigned int g_kmem_off = 0;
  65. //*********
  66. //* Notice : it's rootfs start addr (and not include any debug header)
  67. unsigned int g_rmem_off = 0;
  68. unsigned int g_bimg_sz = 0;
  69. unsigned int g_rcimg_sz = 0;
  70. int g_kimg_sz = 0;
  71. int g_rimg_sz = 0;
  72. extern unsigned long long get_part_size(char *name);
  73. extern struct bootimg_hdr *g_boot_hdr;
  74. extern void mtk_wdt_restart(void);
  75. extern uint32_t g_boot_state;
  76. static uint32_t convert_endian(uint32_t in)
  77. {
  78. return ((in >> 24) & 0xff) |
  79. ((in << 8) & 0xff0000 |
  80. ((in >> 8) & 0xff00) |
  81. ((in << 24) & 0xff000000));
  82. }
  83. int verified_boot_flow(char *part_name)
  84. {
  85. int ret = 0;
  86. unsigned int img_vfy_time = 0;
  87. int lock_state = 0;
  88. /* if MTK_SECURITY_SW_SUPPORT is not defined, boot state is always green */
  89. #ifdef MTK_SECURITY_SW_SUPPORT
  90. /* please refer to the following website for verified boot flow */
  91. /* http://source.android.com/devices/tech/security/verifiedboot/verified-boot.html */
  92. ret = sec_query_device_lock(&lock_state);
  93. if (ret) {
  94. g_boot_state = BOOT_STATE_RED;
  95. goto _end;
  96. }
  97. if (DEVICE_STATE_LOCKED == lock_state) {
  98. if (g_boot_state != BOOT_STATE_RED)
  99. goto _end;
  100. /* yellow state is not supported on this platform */
  101. } else if (DEVICE_STATE_UNLOCKED == lock_state)
  102. g_boot_state = BOOT_STATE_ORANGE;
  103. else /* unknown lock state*/
  104. g_boot_state = BOOT_STATE_RED;
  105. #endif //MTK_SECURITY_SW_SUPPORT
  106. _end:
  107. ret = print_boot_state();
  108. if (ret)
  109. return ret;
  110. if (part_name == NULL)
  111. ret = show_warning("UNKNOWN");
  112. else
  113. ret = show_warning(part_name);
  114. if (ret)
  115. return ret;
  116. ret = set_boot_state_to_cmdline();
  117. if (ret)
  118. return ret;
  119. return ret;
  120. }
  121. static int mboot_common_load_part_info(char *part_name, part_hdr_t *part_hdr)
  122. {
  123. long len;
  124. //***************
  125. //* read partition header
  126. //*
  127. len = partition_read(part_name, 0, (uchar *)part_hdr, sizeof(part_hdr_t));
  128. if (len < 0) {
  129. dprintf(CRITICAL, "[%s] %s partition read error. LINE: %d\n", MODULE_NAME,
  130. part_name, __LINE__);
  131. return -1;
  132. }
  133. dprintf(CRITICAL, "\n=========================================\n");
  134. dprintf(CRITICAL, "[%s] %s magic number : 0x%x\n", MODULE_NAME, part_name,
  135. part_hdr->info.magic);
  136. part_hdr->info.name[31] = '\0'; //append end char
  137. dprintf(CRITICAL, "[%s] %s name : %s\n", MODULE_NAME, part_name,
  138. part_hdr->info.name);
  139. dprintf(CRITICAL, "[%s] %s size : %d\n", MODULE_NAME, part_name,
  140. part_hdr->info.dsize);
  141. dprintf(CRITICAL, "=========================================\n");
  142. //***************
  143. //* check partition magic
  144. //*
  145. if (part_hdr->info.magic != PART_MAGIC) {
  146. dprintf(CRITICAL, "[%s] %s partition magic error\n", MODULE_NAME, part_name);
  147. return -1;
  148. }
  149. //***************
  150. //* check partition name
  151. //*
  152. if (strncasecmp(part_hdr->info.name, part_name, sizeof(part_hdr->info.name))) {
  153. dprintf(CRITICAL, "[%s] %s partition name error\n", MODULE_NAME, part_name);
  154. return -1;
  155. }
  156. //***************
  157. //* check partition data size
  158. //*
  159. if (part_hdr->info.dsize > partition_get_size_by_name(part_name)) {
  160. dprintf(CRITICAL, "[%s] %s partition size error\n", MODULE_NAME, part_name);
  161. return -1;
  162. }
  163. return 0;
  164. }
  165. /**********************************************************
  166. * Routine: mboot_common_load_part
  167. *
  168. * Description: common function for loading image from nand flash
  169. * this function is called by
  170. * (1) 'mboot_common_load_logo' to display logo
  171. *
  172. **********************************************************/
  173. int mboot_common_load_part(char *part_name, unsigned long addr)
  174. {
  175. long len;
  176. part_hdr_t *part_hdr;
  177. part_hdr = (part_hdr_t *)malloc(sizeof(part_hdr_t));
  178. if (!part_hdr)
  179. return -ENOMEM;
  180. len = mboot_common_load_part_info(part_name, part_hdr);
  181. if (len < 0) {
  182. len = -EINVAL;
  183. goto exit;
  184. }
  185. //****************
  186. //* read image data
  187. //*
  188. dprintf(CRITICAL, "read the data of %s\n", part_name);
  189. len = partition_read(part_name, sizeof(part_hdr_t), (uchar *)addr, part_hdr->info.dsize);
  190. if (len < 0) {
  191. len = -EIO;
  192. goto exit;
  193. }
  194. exit:
  195. if (part_hdr)
  196. free(part_hdr);
  197. return len;
  198. }
  199. /**********************************************************
  200. * Routine: mboot_common_load_logo
  201. *
  202. * Description: function to load logo to display
  203. *
  204. **********************************************************/
  205. int mboot_common_load_logo(unsigned long logo_addr, char *filename)
  206. {
  207. int ret;
  208. #if (CONFIG_COMMANDS & CFG_CMD_FAT)
  209. long len;
  210. #endif
  211. #if (CONFIG_COMMANDS & CFG_CMD_FAT)
  212. len = file_fat_read(filename, (unsigned char *)logo_addr, 0);
  213. if (len > 0)
  214. return (int)len;
  215. #endif
  216. ret = mboot_common_load_part("logo", logo_addr);
  217. return ret;
  218. }
  219. /**********************************************************
  220. * Routine: mboot_android_check_img_info
  221. *
  222. * Description: this function is called to
  223. * (1) check the header of kernel / rootfs
  224. *
  225. * Notice : this function will be called by 'mboot_android_check_bootimg_hdr'
  226. *
  227. **********************************************************/
  228. int mboot_android_check_img_info(char *part_name, part_hdr_t *part_hdr)
  229. {
  230. //***************
  231. //* check partition magic
  232. //*
  233. if (part_hdr->info.magic != PART_MAGIC) {
  234. dprintf(CRITICAL, "[%s] %s partition magic error\n", MODULE_NAME, part_name);
  235. return -1;
  236. }
  237. //***************
  238. //* check partition name
  239. //*
  240. if (strncasecmp(part_hdr->info.name, part_name, sizeof(part_hdr->info.name))) {
  241. dprintf(CRITICAL, "[%s] %s partition name error\n", MODULE_NAME, part_name);
  242. return -1;
  243. }
  244. dprintf(CRITICAL, "\n=========================================\n");
  245. dprintf(CRITICAL, "[%s] %s magic number : 0x%x\n", MODULE_NAME, part_name,
  246. part_hdr->info.magic);
  247. dprintf(CRITICAL, "[%s] %s size : 0x%x\n", MODULE_NAME, part_name,
  248. part_hdr->info.dsize);
  249. dprintf(CRITICAL, "=========================================\n");
  250. //***************
  251. //* return the image size
  252. //*
  253. return part_hdr->info.dsize;
  254. }
  255. /**********************************************************
  256. * Routine: mboot_android_check_bootimg_hdr
  257. *
  258. * Description: this function is called to
  259. * (1) 'read' the header of boot image from nand flash
  260. * (2) 'parse' the header of boot image to obtain
  261. * - (a) kernel image size
  262. * - (b) rootfs image size
  263. * - (c) rootfs offset
  264. *
  265. * Notice : this function must be read first when doing nand / msdc boot
  266. *
  267. **********************************************************/
  268. static int mboot_android_check_bootimg_hdr(char *part_name, struct bootimg_hdr *boot_hdr)
  269. {
  270. long len;
  271. int ret = 0;
  272. //**********************************
  273. // TODO : fix pg_sz assignment
  274. //**********************************
  275. unsigned int pg_sz = 2 * 1024;
  276. //***************
  277. //* read partition header
  278. //*
  279. len = partition_read(part_name, 0, (uchar *) boot_hdr, sizeof(struct bootimg_hdr));
  280. if (len < 0) {
  281. dprintf(CRITICAL, "[%s] %s boot image header read error. LINE: %d\n",
  282. MODULE_NAME, part_name, __LINE__);
  283. return -1;
  284. }
  285. dprintf(CRITICAL,
  286. "\n============================================================\n");
  287. dprintf(CRITICAL, "[%s] Android Partition Name : %s\n",
  288. MODULE_NAME, part_name);
  289. dprintf(CRITICAL, "[%s] Android Boot IMG Hdr - Kernel Size : 0x%08X\n",
  290. MODULE_NAME, boot_hdr->kernel_sz);
  291. dprintf(CRITICAL, "[%s] Android Boot IMG Hdr - Kernel Address : 0x%08X\n",
  292. MODULE_NAME, boot_hdr->kernel_addr);
  293. dprintf(CRITICAL, "[%s] Android Boot IMG Hdr - Rootfs Size : 0x%08X\n",
  294. MODULE_NAME, boot_hdr->ramdisk_sz);
  295. dprintf(CRITICAL, "[%s] Android Boot IMG Hdr - Rootfs Address : 0x%08X\n",
  296. MODULE_NAME, boot_hdr->ramdisk_addr);
  297. dprintf(CRITICAL, "[%s] Android Boot IMG Hdr - Tags Address : 0x%08X\n",
  298. MODULE_NAME, boot_hdr->tags_addr);
  299. dprintf(CRITICAL, "[%s] Android Boot IMG Hdr - Page Size : 0x%08X\n",
  300. MODULE_NAME, boot_hdr->page_sz);
  301. dprintf(CRITICAL, "[%s] Android Boot IMG Hdr - Command Line : %s\n",
  302. MODULE_NAME, boot_hdr->cmdline);
  303. dprintf(CRITICAL,
  304. "============================================================\n");
  305. //***************
  306. //* check partition magic
  307. //*
  308. if (strncmp((char const *)boot_hdr->magic, BOOTIMG_MAGIC, BOOTIMG_MAGIC_SZ) != 0) {
  309. dprintf(CRITICAL, "[%s] boot image header magic error\n", MODULE_NAME);
  310. return -1;
  311. }
  312. pg_sz = boot_hdr->page_sz;
  313. //***************
  314. //* follow bootimg.h to calculate the location of rootfs
  315. //*
  316. if (len != -1) {
  317. unsigned int k_pg_cnt = 0;
  318. unsigned int r_pg_cnt = 0;
  319. unsigned int dtbo_pg_cnt = 0;
  320. unsigned int dt_pg_cnt = 0;
  321. if (g_is_64bit_kernel)
  322. g_kmem_off = target_get_scratch_address();
  323. else
  324. g_kmem_off = boot_hdr->kernel_addr;
  325. k_pg_cnt = (boot_hdr->kernel_sz + (pg_sz - 1)) / pg_sz;
  326. r_pg_cnt = (boot_hdr->ramdisk_sz + (pg_sz - 1)) / pg_sz;
  327. if (boot_hdr->header_version >= BOOT_HEADER_VERSION_ONE)
  328. dtbo_pg_cnt = (boot_hdr->recovery_dtbo_size + (pg_sz - 1)) / pg_sz;
  329. if (boot_hdr->header_version >= BOOT_HEADER_VERSION_TWO)
  330. dt_pg_cnt = (boot_hdr->dtb_size + (pg_sz - 1)) / pg_sz;
  331. dprintf(CRITICAL, " > page count of kernel image = %d\n", k_pg_cnt);
  332. g_rmem_off = g_kmem_off + k_pg_cnt * pg_sz;
  333. dprintf(CRITICAL, " > kernel mem offset = 0x%x\n", g_kmem_off);
  334. dprintf(CRITICAL, " > rootfs mem offset = 0x%x\n", g_rmem_off);
  335. //***************
  336. //* specify boot image size
  337. //*
  338. g_bimg_sz = (k_pg_cnt + r_pg_cnt + dtbo_pg_cnt + dt_pg_cnt + 1) * pg_sz;
  339. dprintf(CRITICAL, " > boot image size = 0x%x\n", g_bimg_sz);
  340. ret = verified_boot_flow("boot");
  341. if (ret) {
  342. len = -1;
  343. return len;
  344. }
  345. }
  346. return len;
  347. }
  348. /**********************************************************
  349. * Routine: mboot_android_check_recoveryimg_hdr
  350. *
  351. * Description: this function is called to
  352. * (1) 'read' the header of boot image from nand flash
  353. * (2) 'parse' the header of boot image to obtain
  354. * - (a) kernel image size
  355. * - (b) rootfs image size
  356. * - (c) rootfs offset
  357. *
  358. * Notice : this function must be read first when doing nand / msdc boot
  359. *
  360. **********************************************************/
  361. static int mboot_android_check_recoveryimg_hdr(char *part_name,
  362. struct bootimg_hdr *boot_hdr)
  363. {
  364. long len;
  365. int ret = 0;
  366. //**********************************
  367. // TODO : fix pg_sz assignment
  368. //**********************************
  369. unsigned int pg_sz = 2 * 1024;
  370. //***************
  371. //* read partition header
  372. //*
  373. len = partition_read(part_name, 0, (uchar *) boot_hdr, sizeof(struct bootimg_hdr));
  374. if (len < 0) {
  375. dprintf(CRITICAL, "[%s] %s Recovery image header read error. LINE: %d\n",
  376. MODULE_NAME, part_name, __LINE__);
  377. return -1;
  378. }
  379. dprintf(CRITICAL,
  380. "\n============================================================\n");
  381. dprintf(CRITICAL, "[%s] Android Recovery IMG Hdr - Kernel Size : 0x%08X\n",
  382. MODULE_NAME, boot_hdr->kernel_sz);
  383. dprintf(CRITICAL, "[%s] Android Recovery IMG Hdr - Kernel Address : 0x%08X\n",
  384. MODULE_NAME, boot_hdr->kernel_addr);
  385. dprintf(CRITICAL, "[%s] Android Recovery IMG Hdr - Rootfs Size : 0x%08X\n",
  386. MODULE_NAME, boot_hdr->ramdisk_sz);
  387. dprintf(CRITICAL, "[%s] Android Recovery IMG Hdr - Rootfs Address : 0x%08X\n",
  388. MODULE_NAME, boot_hdr->ramdisk_addr);
  389. dprintf(CRITICAL, "[%s] Android Recovery IMG Hdr - Tags Address : 0x%08X\n",
  390. MODULE_NAME, boot_hdr->tags_addr);
  391. dprintf(CRITICAL, "[%s] Android Recovery IMG Hdr - Page Size : 0x%08X\n",
  392. MODULE_NAME, boot_hdr->page_sz);
  393. dprintf(CRITICAL, "[%s] Android Recovery IMG Hdr - Command Line : %s\n",
  394. MODULE_NAME, boot_hdr->cmdline);
  395. dprintf(CRITICAL,
  396. "============================================================\n");
  397. //***************
  398. //* check partition magic
  399. //*
  400. if (strncmp((char const *)boot_hdr->magic, BOOTIMG_MAGIC, BOOTIMG_MAGIC_SZ) != 0) {
  401. dprintf(CRITICAL, "[%s] Recovery image header magic error\n", MODULE_NAME);
  402. return -1;
  403. }
  404. pg_sz = boot_hdr->page_sz;
  405. //***************
  406. //* follow bootimg.h to calculate the location of rootfs
  407. //*
  408. if (len != -1) {
  409. unsigned int k_pg_cnt = 0;
  410. unsigned int r_pg_cnt = 0;
  411. unsigned int dtbo_pg_cnt = 0;
  412. unsigned int dt_pg_cnt = 0;
  413. if (g_is_64bit_kernel)
  414. g_kmem_off = target_get_scratch_address();
  415. else
  416. g_kmem_off = boot_hdr->kernel_addr;
  417. k_pg_cnt = (boot_hdr->kernel_sz + (pg_sz - 1)) / pg_sz;
  418. r_pg_cnt = (boot_hdr->ramdisk_sz + (pg_sz - 1)) / pg_sz;
  419. if (boot_hdr->header_version >= BOOT_HEADER_VERSION_ONE)
  420. dtbo_pg_cnt = (boot_hdr->recovery_dtbo_size + (pg_sz - 1)) / pg_sz;
  421. if (boot_hdr->header_version >= BOOT_HEADER_VERSION_TWO)
  422. dt_pg_cnt = (boot_hdr->dtb_size+ (pg_sz - 1)) / pg_sz;
  423. dprintf(CRITICAL, " > page count of kernel image = %d\n", k_pg_cnt);
  424. g_rmem_off = g_kmem_off + k_pg_cnt * pg_sz;
  425. dprintf(CRITICAL, " > kernel mem offset = 0x%x\n", g_kmem_off);
  426. dprintf(CRITICAL, " > rootfs mem offset = 0x%x\n", g_rmem_off);
  427. //***************
  428. //* specify boot image size
  429. //*
  430. //g_rcimg_sz = part->start_sect * BLK_SIZE;
  431. g_rcimg_sz = (k_pg_cnt + r_pg_cnt + dtbo_pg_cnt + dt_pg_cnt + 1) * pg_sz;
  432. dprintf(CRITICAL, " > Recovery image size = 0x%x\n", g_rcimg_sz);
  433. ret = verified_boot_flow("recovery");
  434. if (ret) {
  435. len = -1;
  436. return len;
  437. }
  438. }
  439. return len;
  440. }
  441. /**********************************************************
  442. * Routine: mboot_android_load_bootimg_hdr
  443. *
  444. * Description: this is the entry function to handle boot image header
  445. *
  446. **********************************************************/
  447. int mboot_android_load_bootimg_hdr(char *part_name, unsigned long addr)
  448. {
  449. long len;
  450. struct bootimg_hdr *boot_hdr;
  451. if (partition_exists(part_name) != PART_OK) {
  452. dprintf(CRITICAL, "mboot_android_load_bootimg_hdr (%s), part = NULL\n",
  453. part_name);
  454. return -ENOENT;
  455. }
  456. // start_addr = part->start_sect * BLK_SIZE;
  457. boot_hdr = (struct bootimg_hdr *)malloc(sizeof(struct bootimg_hdr));
  458. if (!boot_hdr) {
  459. dprintf(CRITICAL, "mboot_android_load_bootimg_hdr, boot_hdr = NULL\n");
  460. return -ENOMEM;
  461. }
  462. g_boot_hdr = boot_hdr;
  463. len = mboot_android_check_bootimg_hdr(part_name, boot_hdr);
  464. platform_parse_bootopt(boot_hdr->cmdline);
  465. return len;
  466. }
  467. /**********************************************************
  468. * Routine: mboot_android_load_recoveryimg_hdr
  469. *
  470. * Description: this is the entry function to handle Recovery image header
  471. *
  472. **********************************************************/
  473. int mboot_android_load_recoveryimg_hdr(char *part_name, unsigned long addr)
  474. {
  475. long len;
  476. struct bootimg_hdr *boot_hdr;
  477. if (partition_exists(part_name) != PART_OK) {
  478. dprintf(CRITICAL, "mboot_android_load_recoveryimg_hdr (%s), part = NULL\n",
  479. part_name);
  480. return -ENOENT;
  481. }
  482. // start_addr = part->start_sect * BLK_SIZE;
  483. boot_hdr = (struct bootimg_hdr *)malloc(sizeof(struct bootimg_hdr));
  484. if (!boot_hdr) {
  485. dprintf(CRITICAL, "mboot_android_load_bootimg_hdr, boot_hdr = NULL\n");
  486. return -ENOMEM;
  487. }
  488. g_boot_hdr = boot_hdr;
  489. len = mboot_android_check_recoveryimg_hdr(part_name, boot_hdr);
  490. return len;
  491. }
  492. /**********************************************************
  493. * Routine: mboot_android_load_bootimg
  494. *
  495. * Description: main function to load Android Boot Image
  496. *
  497. **********************************************************/
  498. int mboot_android_load_bootimg(char *part_name, unsigned long addr)
  499. {
  500. long len;
  501. unsigned long long start_addr;
  502. //***************
  503. //* not to include unused header
  504. //*
  505. start_addr = partition_get_offset_by_name(part_name);
  506. #ifndef SKIP_MTK_PARTITION_HEADER_CHECK
  507. addr = addr - MKIMG_HEADER_SZ;
  508. #endif
  509. //***************
  510. //* read image data
  511. //*
  512. dprintf(CRITICAL, "\nread the data of %s (size = 0x%x)\n", part_name,
  513. g_bimg_sz);
  514. #ifdef MTK_EMMC_SUPPORT
  515. dprintf(CRITICAL, " > from - 0x%016llx (skip boot img hdr)\n", start_addr);
  516. #else
  517. dprintf(CRITICAL, " > from - 0x%x (skip boot img hdr)\n", start_addr);
  518. #endif
  519. dprintf(CRITICAL, " > to - 0x%x (starts with kernel img hdr)\n", addr);
  520. len = partition_read(part_name, g_boot_hdr->page_sz, (uchar *)addr, g_bimg_sz);
  521. if (len < 0) {
  522. len = -EIO;
  523. goto exit;
  524. }
  525. #ifndef SKIP_MTK_PARTITION_HEADER_CHECK
  526. //***************
  527. //* check kernel header
  528. //*
  529. g_kimg_sz = mboot_android_check_img_info(PART_KERNEL,
  530. (part_hdr_t *)(g_kmem_off - MKIMG_HEADER_SZ));
  531. if (g_kimg_sz == -1) {
  532. len = -EIO;
  533. goto exit;
  534. }
  535. //***************
  536. //* check rootfs header
  537. //*
  538. g_rimg_sz = mboot_android_check_img_info(PART_ROOTFS,
  539. (part_hdr_t *)(g_rmem_off - MKIMG_HEADER_SZ));
  540. if (g_rimg_sz == -1) {
  541. len = -EIO;
  542. goto exit;
  543. }
  544. if (len < 0) {
  545. len = -EIO;
  546. goto exit;
  547. }
  548. #endif
  549. exit:
  550. return len;
  551. }
  552. /**********************************************************
  553. * Routine: mboot_android_load_recoveryimg
  554. *
  555. * Description: main function to load Android Recovery Image
  556. *
  557. **********************************************************/
  558. int mboot_android_load_recoveryimg(char *part_name, unsigned long addr)
  559. {
  560. long len;
  561. unsigned long long start_addr;
  562. //***************
  563. //* not to include unused header
  564. //*
  565. start_addr = partition_get_offset_by_name(part_name);
  566. #ifndef SKIP_MTK_PARTITION_HEADER_CHECK
  567. addr = addr - MKIMG_HEADER_SZ;
  568. #endif
  569. //***************
  570. //* read image data
  571. //*
  572. dprintf(CRITICAL, "\nread the data of %s (size = 0x%x)\n", part_name,
  573. g_rcimg_sz);
  574. #ifdef MTK_EMMC_SUPPORT
  575. dprintf(CRITICAL, " > from - 0x%016llx (skip recovery img hdr)\n", start_addr);
  576. #else
  577. dprintf(CRITICAL, " > from - 0x%x (skip recovery img hdr)\n", start_addr);
  578. #endif
  579. dprintf(CRITICAL, " > to - 0x%x (starts with kernel img hdr)\n", addr);
  580. len = partition_read(part_name, g_boot_hdr->page_sz, (uchar *)addr, g_rcimg_sz);
  581. if (len < 0) {
  582. len = -EIO;
  583. goto exit;
  584. }
  585. #ifndef SKIP_MTK_PARTITION_HEADER_CHECK
  586. //***************
  587. //* check kernel header
  588. //*
  589. g_kimg_sz = mboot_android_check_img_info(PART_KERNEL,
  590. (part_hdr_t *)(g_kmem_off - MKIMG_HEADER_SZ));
  591. if (g_kimg_sz == -1) {
  592. len = -EIO;
  593. goto exit;
  594. }
  595. //***************
  596. //* check rootfs header
  597. //*
  598. g_rimg_sz = mboot_android_check_img_info("recovery",
  599. (part_hdr_t *)(g_rmem_off - MKIMG_HEADER_SZ));
  600. if (g_rimg_sz == -1) {
  601. len = -EIO;
  602. goto exit;
  603. }
  604. if (len < 0) {
  605. len = -EIO;
  606. goto exit;
  607. }
  608. #endif
  609. exit:
  610. return len;
  611. }
  612. /**********************************************************
  613. * Routine: mboot_android_load_factoryimg
  614. *
  615. * Description: main function to load Android Factory Image
  616. *
  617. **********************************************************/
  618. int mboot_android_load_factoryimg(char *part_name, unsigned long addr)
  619. {
  620. int len = 0;
  621. // unsigned long start_addr;
  622. //***************
  623. //* not to include unused header
  624. //*
  625. addr = addr - MKIMG_HEADER_SZ - g_boot_hdr->page_sz;
  626. #if (CONFIG_COMMANDS & CFG_CMD_FAT)
  627. len = file_fat_read(part_name, (uchar *)addr, 0);
  628. dprintf(CRITICAL, "len = %d, addr = 0x%x\n", len, addr);
  629. dprintf(CRITICAL, "part name = %s \n", part_name);
  630. #endif
  631. #ifndef SKIP_MTK_PARTITION_HEADER_CHECK
  632. //***************
  633. //* check kernel header
  634. //*
  635. g_kimg_sz = mboot_android_check_img_info(PART_KERNEL,
  636. (part_hdr_t *)(g_kmem_off - MKIMG_HEADER_SZ));
  637. if (g_kimg_sz == -1) {
  638. len = -EIO;
  639. goto exit;
  640. }
  641. //***************
  642. //* check rootfs header
  643. //*
  644. g_rimg_sz = mboot_android_check_img_info(PART_ROOTFS,
  645. (part_hdr_t *)(g_rmem_off - MKIMG_HEADER_SZ));
  646. if (g_rimg_sz == -1) {
  647. len = -EIO;
  648. goto exit;
  649. }
  650. if (len < 0) {
  651. len = -EIO;
  652. goto exit;
  653. }
  654. exit:
  655. #endif
  656. return len;
  657. }
  658. /**********************************************************
  659. * Routine: mboot_recovery_load_raw_part
  660. *
  661. * Description: load raw data for recovery mode support
  662. *
  663. **********************************************************/
  664. int mboot_recovery_load_raw_part(char *part_name, unsigned long *addr,
  665. unsigned int size)
  666. {
  667. long len;
  668. unsigned long begin;
  669. #ifdef MTK_EMMC_SUPPORT
  670. unsigned long long start_addr;
  671. #else
  672. unsigned long start_addr;
  673. #endif
  674. begin = get_timer(0);
  675. len = partition_read(part_name, 0, (uchar *)addr, size);
  676. if (len < 0) {
  677. len = -EIO;
  678. goto exit;
  679. }
  680. dprintf(CRITICAL, "[%s] Load '%s' partition to 0x%08lX (%d bytes in %ld ms)\n",
  681. MODULE_NAME, part_name, (unsigned long)addr, size, get_timer(begin));
  682. exit:
  683. return len;
  684. }
  685. /**********************************************************
  686. * Routine: mboot_recovery_load_raw_part_offset
  687. *
  688. * Description: load partition raw data with offset
  689. *
  690. * offset and size must page alignemnt
  691. **********************************************************/
  692. int mboot_recovery_load_raw_part_offset(char *part_name, unsigned long *addr,
  693. unsigned long offset, unsigned int size)
  694. {
  695. long len;
  696. unsigned long begin;
  697. int blksz = storage_get_blksz();
  698. begin = get_timer(0);
  699. len = partition_read(part_name, ROUNDUP(offset, blksz), (uchar *)addr, ROUNDUP(size, blksz));
  700. if (len < 0) {
  701. len = -EIO;
  702. goto exit;
  703. }
  704. dprintf(INFO, "[%s] Load '%s' partition to 0x%08lX (%d bytes in %ld ms)\n",
  705. MODULE_NAME, part_name, (unsigned long)addr, size, get_timer(begin));
  706. exit:
  707. return len;
  708. }
  709. /**********************************************************
  710. * Routine: mboot_recovery_load_misc
  711. *
  712. * Description: load recovery command
  713. *
  714. **********************************************************/
  715. int mboot_recovery_load_misc(unsigned long *misc_addr, unsigned int size)
  716. {
  717. int ret;
  718. dprintf(CRITICAL, "[mboot_recovery_load_misc]: size is %u\n", size);
  719. dprintf(CRITICAL, "[mboot_recovery_load_misc]: misc_addr is 0x%x\n", misc_addr);
  720. ret = mboot_recovery_load_raw_part("para", misc_addr, size);
  721. if (ret < 0)
  722. return ret;
  723. return ret;
  724. }
  725. unsigned int mboot_get_bootimg_size(char *part_name, unsigned int *size)
  726. {
  727. unsigned int ret = 0;
  728. long len = 0;
  729. struct bootimg_hdr boot_hdr;
  730. /* use starting 16 bytes to get boot sig size */
  731. /* actual boot signature size is much bigger */
  732. #define BOOT_SIG_HDR_SZ 16
  733. unsigned char boot_sig_hdr[BOOT_SIG_HDR_SZ] = {0};
  734. unsigned boot_sig_size = 0;
  735. unsigned page_sz =
  736. 0x800; /* used to cache page size in boot image hdr, default 2KB */
  737. *size = 0;
  738. len = partition_read(part_name, (off_t)0, (uchar *)&boot_hdr,
  739. sizeof(struct bootimg_hdr));
  740. if (len < 0) {
  741. dprintf(CRITICAL, "[%s] %s boot image header read error. LINE: %d\n",
  742. MODULE_NAME, part_name, __LINE__);
  743. return -1;
  744. }
  745. boot_hdr.magic[7] = '\0';
  746. dprintf(CRITICAL,
  747. "\n============================================================\n");
  748. dprintf(CRITICAL, "[%s] Android Partition Name : %s\n", MODULE_NAME,
  749. part_name);
  750. dprintf(CRITICAL, "[%s] Android IMG Hdr - Magic : %s\n", MODULE_NAME,
  751. boot_hdr.magic);
  752. dprintf(CRITICAL, "[%s] Android IMG Hdr - Kernel Size : 0x%08X\n",
  753. MODULE_NAME, boot_hdr.kernel_sz);
  754. dprintf(CRITICAL, "[%s] Android IMG Hdr - Kernel Address : 0x%08X\n",
  755. MODULE_NAME, boot_hdr.kernel_addr);
  756. dprintf(CRITICAL, "[%s] Android IMG Hdr - Rootfs Size : 0x%08X\n",
  757. MODULE_NAME, boot_hdr.ramdisk_sz);
  758. dprintf(CRITICAL, "[%s] Android IMG Hdr - Rootfs Address : 0x%08X\n",
  759. MODULE_NAME, boot_hdr.ramdisk_addr);
  760. dprintf(CRITICAL, "[%s] Android IMG Hdr - Tags Address : 0x%08X\n",
  761. MODULE_NAME, boot_hdr.tags_addr);
  762. dprintf(CRITICAL, "[%s] Android IMG Hdr - Page Size : 0x%08X\n",
  763. MODULE_NAME, boot_hdr.page_sz);
  764. dprintf(CRITICAL, "[%s] Android IMG Hdr - Command Line : %s\n", MODULE_NAME,
  765. boot_hdr.cmdline);
  766. dprintf(CRITICAL,
  767. "============================================================\n");
  768. page_sz = boot_hdr.page_sz;
  769. *size += page_sz; /* boot header size is 1 page*/
  770. *size += (((boot_hdr.kernel_sz + page_sz - 1) / page_sz) * page_sz);
  771. *size += (((boot_hdr.ramdisk_sz + page_sz - 1) / page_sz) * page_sz);
  772. *size += (((boot_hdr.second_sz + page_sz - 1) / page_sz) * page_sz);
  773. if (boot_hdr.header_version >= BOOT_HEADER_VERSION_ONE)
  774. *size += (((boot_hdr.recovery_dtbo_size + page_sz - 1) / page_sz) * page_sz);
  775. if (boot_hdr.header_version >= BOOT_HEADER_VERSION_TWO)
  776. *size += (((boot_hdr.dtb_size + page_sz - 1) / page_sz) * page_sz);
  777. /* try to get boot siganture size if it exists */
  778. len = partition_read(part_name, (off_t)(*size), (uchar *)&boot_sig_hdr,
  779. (size_t)BOOT_SIG_HDR_SZ);
  780. if (len < 0) {
  781. dprintf(CRITICAL, "[%s] %s boot sig header read error. LINE: %d\n", MODULE_NAME,
  782. part_name, __LINE__);
  783. return -1;
  784. }
  785. /* in case boot image is signed by boot signer */
  786. #define ASN_ID_SEQUENCE 0x30
  787. if (boot_sig_hdr[0] == ASN_ID_SEQUENCE) {
  788. /* boot signature exists */
  789. unsigned len = 0;
  790. unsigned len_size = 0;
  791. if (boot_sig_hdr[1] & 0x80) {
  792. /* multi-byte length field */
  793. unsigned int i = 0;
  794. len_size = 1 + (boot_sig_hdr[1] & 0x7f);
  795. for (i = 0; i < len_size - 1; i++)
  796. len = (len << 8) | boot_sig_hdr[2 + i];
  797. } else {
  798. /* single-byte length field */
  799. len_size = 1;
  800. len = boot_sig_hdr[1];
  801. }
  802. boot_sig_size = 1 + len_size + len;
  803. }
  804. *size += (((boot_sig_size + page_sz - 1) / page_sz) * page_sz);
  805. return ret;
  806. }
  807. unsigned int mboot_get_dtbo_img_size(char *part_name, unsigned int *size)
  808. {
  809. unsigned int ret = 0 ;
  810. long len = 0;
  811. struct dt_table_header dtboimg_hdr;
  812. if (part_name == NULL)
  813. return -ENOENT;
  814. if (size == NULL)
  815. return -ENOENT;
  816. *size = 0;
  817. len = partition_read(part_name, (off_t)0, (uchar *)&dtboimg_hdr,
  818. sizeof(struct dt_table_header));
  819. if (len < 0) {
  820. dprintf(CRITICAL, "[%s] partition %s not found, LINE: %d\n", MODULE_NAME,
  821. part_name, __LINE__);
  822. return -ENOENT;
  823. }
  824. *size = convert_endian(dtboimg_hdr.total_size);
  825. *size = ROUNDUP((*size), DTBO_IMG_ALIGN_SZ);
  826. return ret;
  827. }
  828. /**********************************************************
  829. * Routine: mboot_get_inhouse_img_size
  830. *
  831. * Description: Get img size from mkimage header (LK,Logo)
  832. The size include both image and header and the size is align to 4k.
  833. *
  834. **********************************************************/
  835. unsigned int mboot_get_inhouse_img_size(char *part_name, unsigned int *size)
  836. {
  837. unsigned int ret = 0;
  838. long len = 0;
  839. part_hdr_t mkimage_hdr;
  840. part_hdr_t *part_hdr;
  841. unsigned page_sz = 0x1000;
  842. *size = 0;
  843. dprintf(CRITICAL, "Get inhouse img size from mkimage header\n");
  844. /*Read mkimage header*/
  845. len = partition_read(part_name, (off_t)0, (uchar *)&mkimage_hdr,
  846. (size_t)sizeof(part_hdr_t));
  847. if (len < 0) {
  848. dprintf(CRITICAL, "[%s] %s partition read error. LINE: %d\n", MODULE_NAME,
  849. part_name, __LINE__);
  850. return -EIO;
  851. }
  852. dprintf(CRITICAL,
  853. "\n============================================================\n");
  854. dprintf(CRITICAL, "[%s] INHOUSE Partition Name : %s\n", MODULE_NAME,
  855. part_name);
  856. dprintf(CRITICAL, "[%s] INHOUSE IMG HDR - Magic : %x\n", MODULE_NAME,
  857. mkimage_hdr.info.magic);
  858. dprintf(CRITICAL, "[%s] INHOUSE IMG size : %x\n",
  859. MODULE_NAME, mkimage_hdr.info.dsize);
  860. dprintf(CRITICAL, "[%s] INHOUSE IMG HDR size : %x\n",
  861. MODULE_NAME, sizeof(part_hdr_t));
  862. dprintf(CRITICAL,
  863. "============================================================\n");
  864. *size = (((mkimage_hdr.info.dsize + sizeof(part_hdr_t) + page_sz - 1) /
  865. page_sz) * page_sz);
  866. dprintf(CRITICAL, "[%s] INHOUSE IMG size : %x\n", MODULE_NAME, *size);
  867. //mboot_common_load_part_info(part_name, part_hdr);
  868. return ret;
  869. }
  870. unsigned int mboot_get_img_size(char *part_name, unsigned int *size)
  871. {
  872. unsigned int ret = 0;
  873. long len = 0;
  874. struct bootimg_hdr *bootimg_hdr = NULL;
  875. struct dt_table_header *dtboimg_hdr = NULL;
  876. uint8_t hdr[sizeof(struct bootimg_hdr)] = {0};
  877. *size = 0;
  878. len = partition_read(part_name, (off_t)0, hdr,
  879. sizeof(struct bootimg_hdr));
  880. if (len < 0) {
  881. dprintf(CRITICAL, "[%s] partition %s not found, LINE: %d\n", MODULE_NAME,
  882. part_name, __LINE__);
  883. return -ENOENT;
  884. }
  885. bootimg_hdr = (struct bootimg_hdr *)hdr;
  886. dtboimg_hdr = (struct dt_table_header *)hdr;
  887. if (!memcmp(bootimg_hdr->magic, BOOTIMG_MAGIC, BOOTIMG_MAGIC_SZ))
  888. return mboot_get_bootimg_size(part_name, size);
  889. else if (dtboimg_hdr->magic == convert_endian(DT_TABLE_MAGIC))
  890. return mboot_get_dtbo_img_size(part_name, size);
  891. else
  892. return mboot_get_inhouse_img_size(part_name, size);
  893. return ret;
  894. }