blob: 3b5092d20bd15a7a2879c13e9f64acc48d04af2d [file] [log] [blame]
Steve Raeb4e4bbe2014-09-03 10:05:51 -07001/*
2 * Copyright (c) 2009, Google Inc.
3 * All rights reserved.
4 *
5 * Copyright (c) 2009-2014, The Linux Foundation. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * * Neither the name of The Linux Foundation nor
15 * the names of its contributors may be used to endorse or promote
16 * products derived from this software without specific prior written
17 * permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22 * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 *
31 */
32
33#include <app.h>
34#include <debug.h>
35#include <arch/arm.h>
36#include <string.h>
37#include <stdlib.h>
38#include <limits.h>
39#include <kernel/thread.h>
40#include <arch/ops.h>
41
42#include <dev/flash.h>
43#include <lib/ptable.h>
44#include <dev/keys.h>
45#include <dev/fbcon.h>
46#include <baseband.h>
47#include <target.h>
48#include <mmc.h>
49#include <partition_parser.h>
50#include <platform.h>
51#include <crypto_hash.h>
52#include <malloc.h>
53#include <boot_stats.h>
54#include <sha.h>
55#include <platform/iomap.h>
56#include <boot_device.h>
57
58#if DEVICE_TREE
59#include <libfdt.h>
60#include <dev_tree.h>
61#endif
62
63#include "image_verify.h"
64#include "recovery.h"
65#include "bootimg.h"
66#include "fastboot.h"
67#include "sparse_format.h"
68#include "mmc.h"
69#include "devinfo.h"
70#include "board.h"
71#include "scm.h"
72
73extern bool target_use_signed_kernel(void);
74extern void platform_uninit(void);
75extern void target_uninit(void);
76extern int get_target_boot_params(const char *cmdline, const char *part,
77 char *buf, int buflen);
78
79void write_device_info_mmc(device_info *dev);
80void write_device_info_flash(device_info *dev);
81
82#define EXPAND(NAME) #NAME
83#define TARGET(NAME) EXPAND(NAME)
84
85#ifdef MEMBASE
86#define EMMC_BOOT_IMG_HEADER_ADDR (0xFF000+(MEMBASE))
87#else
88#define EMMC_BOOT_IMG_HEADER_ADDR 0xFF000
89#endif
90
91#ifndef MEMSIZE
92#define MEMSIZE 1024*1024
93#endif
94
95#define MAX_TAGS_SIZE 1024
96
97#define RECOVERY_MODE 0x77665502
98#define FASTBOOT_MODE 0x77665500
99
100/* make 4096 as default size to ensure EFS,EXT4's erasing */
101#define DEFAULT_ERASE_SIZE 4096
102#define MAX_PANEL_BUF_SIZE 128
103
104#define UBI_MAGIC "UBI#"
105#define DISPLAY_DEFAULT_PREFIX "mdss_mdp"
106#define UBI_MAGIC_SIZE 0x04
107#define BOOT_DEV_MAX_LEN 64
108
109#define IS_ARM64(ptr) (ptr->magic_64 == KERNEL64_HDR_MAGIC) ? true : false
110
111#define ADD_OF(a, b) (UINT_MAX - b > a) ? (a + b) : UINT_MAX
112
113#if UFS_SUPPORT
114static const char *emmc_cmdline = " androidboot.bootdevice=";
115#else
116static const char *emmc_cmdline = " androidboot.emmc=true";
117#endif
118static const char *usb_sn_cmdline = " androidboot.serialno=";
119static const char *androidboot_mode = " androidboot.mode=";
120static const char *loglevel = " quiet";
121static const char *battchg_pause = " androidboot.mode=charger";
122static const char *auth_kernel = " androidboot.authorized_kernel=true";
123static const char *secondary_gpt_enable = " gpt";
124
125static const char *baseband_apq = " androidboot.baseband=apq";
126static const char *baseband_msm = " androidboot.baseband=msm";
127static const char *baseband_csfb = " androidboot.baseband=csfb";
128static const char *baseband_svlte2a = " androidboot.baseband=svlte2a";
129static const char *baseband_mdm = " androidboot.baseband=mdm";
130static const char *baseband_mdm2 = " androidboot.baseband=mdm2";
131static const char *baseband_sglte = " androidboot.baseband=sglte";
132static const char *baseband_dsda = " androidboot.baseband=dsda";
133static const char *baseband_dsda2 = " androidboot.baseband=dsda2";
134static const char *baseband_sglte2 = " androidboot.baseband=sglte2";
135static const char *warmboot_cmdline = " qpnp-power-on.warm_boot=1";
136
137static unsigned page_size = 0;
138static unsigned page_mask = 0;
139static char ffbm_mode_string[FFBM_MODE_BUF_SIZE];
140static bool boot_into_ffbm;
141static char target_boot_params[64];
142
143/* Assuming unauthorized kernel image by default */
144static int auth_kernel_img = 0;
145
146static device_info device = {DEVICE_MAGIC, 0, 0, 0, 0};
147
148struct atag_ptbl_entry
149{
150 char name[16];
151 unsigned offset;
152 unsigned size;
153 unsigned flags;
154};
155
156/*
157 * Partition info, required to be published
158 * for fastboot
159 */
160struct getvar_partition_info {
161 const char part_name[MAX_GPT_NAME_SIZE]; /* Partition name */
162 char getvar_size[MAX_GET_VAR_NAME_SIZE]; /* fastboot get var name for size */
163 char getvar_type[MAX_GET_VAR_NAME_SIZE]; /* fastboot get var name for type */
164 char size_response[MAX_RSP_SIZE]; /* fastboot response for size */
165 char type_response[MAX_RSP_SIZE]; /* fastboot response for type */
166};
167
168/*
169 * Right now, we are publishing the info for only
170 * three partitions
171 */
172struct getvar_partition_info part_info[] =
173{
174 { "system" , "partition-size:", "partition-type:", "", "ext4" },
175 { "userdata", "partition-size:", "partition-type:", "", "ext4" },
176 { "cache" , "partition-size:", "partition-type:", "", "ext4" },
177};
178
179char max_download_size[MAX_RSP_SIZE];
180char charger_screen_enabled[MAX_RSP_SIZE];
181char sn_buf[13];
182char display_panel_buf[MAX_PANEL_BUF_SIZE];
183char panel_display_mode[MAX_RSP_SIZE];
184
185extern int emmc_recovery_init(void);
186
187#if NO_KEYPAD_DRIVER
188extern int fastboot_trigger(void);
189#endif
190
191static void update_ker_tags_rdisk_addr(struct boot_img_hdr *hdr, bool is_arm64)
192{
193 /* overwrite the destination of specified for the project */
194#ifdef ABOOT_IGNORE_BOOT_HEADER_ADDRS
195 if (is_arm64)
196 hdr->kernel_addr = ABOOT_FORCE_KERNEL64_ADDR;
197 else
198 hdr->kernel_addr = ABOOT_FORCE_KERNEL_ADDR;
199 hdr->ramdisk_addr = ABOOT_FORCE_RAMDISK_ADDR;
200 hdr->tags_addr = ABOOT_FORCE_TAGS_ADDR;
201#endif
202}
203
204static void ptentry_to_tag(unsigned **ptr, struct ptentry *ptn)
205{
206 struct atag_ptbl_entry atag_ptn;
207
208 memcpy(atag_ptn.name, ptn->name, 16);
209 atag_ptn.name[15] = '\0';
210 atag_ptn.offset = ptn->start;
211 atag_ptn.size = ptn->length;
212 atag_ptn.flags = ptn->flags;
213 memcpy(*ptr, &atag_ptn, sizeof(struct atag_ptbl_entry));
214 *ptr += sizeof(struct atag_ptbl_entry) / sizeof(unsigned);
215}
216
217unsigned char *update_cmdline(const char * cmdline)
218{
219 int cmdline_len = 0;
220 int have_cmdline = 0;
221 unsigned char *cmdline_final = NULL;
222 int pause_at_bootup = 0;
223 bool warm_boot = false;
224 bool gpt_exists = partition_gpt_exists();
225 int have_target_boot_params = 0;
226 char *boot_dev_buf = NULL;
227
228 if (cmdline && cmdline[0]) {
229 cmdline_len = strlen(cmdline);
230 have_cmdline = 1;
231 }
232 if (target_is_emmc_boot()) {
233 cmdline_len += strlen(emmc_cmdline);
234#if UFS_SUPPORT
235 boot_dev_buf = (char *) malloc(sizeof(char) * BOOT_DEV_MAX_LEN);
236 ASSERT(boot_dev_buf);
237 platform_boot_dev_cmdline(boot_dev_buf);
238 cmdline_len += strlen(boot_dev_buf);
239#endif
240 }
241
242 cmdline_len += strlen(usb_sn_cmdline);
243 cmdline_len += strlen(sn_buf);
244
245 if (boot_into_recovery && gpt_exists)
246 cmdline_len += strlen(secondary_gpt_enable);
247
248 if (boot_into_ffbm) {
249 cmdline_len += strlen(androidboot_mode);
250 cmdline_len += strlen(ffbm_mode_string);
251 /* reduce kernel console messages to speed-up boot */
252 cmdline_len += strlen(loglevel);
253 } else if (device.charger_screen_enabled &&
254 target_pause_for_battery_charge()) {
255 pause_at_bootup = 1;
256 cmdline_len += strlen(battchg_pause);
257 }
258
259 if(target_use_signed_kernel() && auth_kernel_img) {
260 cmdline_len += strlen(auth_kernel);
261 }
262
263 if (get_target_boot_params(cmdline, boot_into_recovery ? "recoveryfs" :
264 "system",
265 target_boot_params,
266 sizeof(target_boot_params)) == 0) {
267 have_target_boot_params = 1;
268 cmdline_len += strlen(target_boot_params);
269 }
270
271 /* Determine correct androidboot.baseband to use */
272 switch(target_baseband())
273 {
274 case BASEBAND_APQ:
275 cmdline_len += strlen(baseband_apq);
276 break;
277
278 case BASEBAND_MSM:
279 cmdline_len += strlen(baseband_msm);
280 break;
281
282 case BASEBAND_CSFB:
283 cmdline_len += strlen(baseband_csfb);
284 break;
285
286 case BASEBAND_SVLTE2A:
287 cmdline_len += strlen(baseband_svlte2a);
288 break;
289
290 case BASEBAND_MDM:
291 cmdline_len += strlen(baseband_mdm);
292 break;
293
294 case BASEBAND_MDM2:
295 cmdline_len += strlen(baseband_mdm2);
296 break;
297
298 case BASEBAND_SGLTE:
299 cmdline_len += strlen(baseband_sglte);
300 break;
301
302 case BASEBAND_SGLTE2:
303 cmdline_len += strlen(baseband_sglte2);
304 break;
305
306 case BASEBAND_DSDA:
307 cmdline_len += strlen(baseband_dsda);
308 break;
309
310 case BASEBAND_DSDA2:
311 cmdline_len += strlen(baseband_dsda2);
312 break;
313 }
314
315 if (cmdline) {
316 if ((strstr(cmdline, DISPLAY_DEFAULT_PREFIX) == NULL) &&
317 target_display_panel_node(device.display_panel,
318 display_panel_buf, MAX_PANEL_BUF_SIZE) &&
319 strlen(display_panel_buf)) {
320 cmdline_len += strlen(display_panel_buf);
321 }
322 }
323
324 if (target_warm_boot()) {
325 warm_boot = true;
326 cmdline_len += strlen(warmboot_cmdline);
327 }
328
329 if (cmdline_len > 0) {
330 const char *src;
331 unsigned char *dst = (unsigned char*) malloc((cmdline_len + 4) & (~3));
332 ASSERT(dst != NULL);
333
334 /* Save start ptr for debug print */
335 cmdline_final = dst;
336 if (have_cmdline) {
337 src = cmdline;
338 while ((*dst++ = *src++));
339 }
340 if (target_is_emmc_boot()) {
341 src = emmc_cmdline;
342 if (have_cmdline) --dst;
343 have_cmdline = 1;
344 while ((*dst++ = *src++));
345#if UFS_SUPPORT
346 src = boot_dev_buf;
347 if (have_cmdline) --dst;
348 while ((*dst++ = *src++));
349#endif
350 }
351
352 src = usb_sn_cmdline;
353 if (have_cmdline) --dst;
354 have_cmdline = 1;
355 while ((*dst++ = *src++));
356 src = sn_buf;
357 if (have_cmdline) --dst;
358 have_cmdline = 1;
359 while ((*dst++ = *src++));
360 if (warm_boot) {
361 if (have_cmdline) --dst;
362 src = warmboot_cmdline;
363 while ((*dst++ = *src++));
364 }
365
366 if (boot_into_recovery && gpt_exists) {
367 src = secondary_gpt_enable;
368 if (have_cmdline) --dst;
369 while ((*dst++ = *src++));
370 }
371
372 if (boot_into_ffbm) {
373 src = androidboot_mode;
374 if (have_cmdline) --dst;
375 while ((*dst++ = *src++));
376 src = ffbm_mode_string;
377 if (have_cmdline) --dst;
378 while ((*dst++ = *src++));
379 src = loglevel;
380 if (have_cmdline) --dst;
381 while ((*dst++ = *src++));
382 } else if (pause_at_bootup) {
383 src = battchg_pause;
384 if (have_cmdline) --dst;
385 while ((*dst++ = *src++));
386 }
387
388 if(target_use_signed_kernel() && auth_kernel_img) {
389 src = auth_kernel;
390 if (have_cmdline) --dst;
391 while ((*dst++ = *src++));
392 }
393
394 switch(target_baseband())
395 {
396 case BASEBAND_APQ:
397 src = baseband_apq;
398 if (have_cmdline) --dst;
399 while ((*dst++ = *src++));
400 break;
401
402 case BASEBAND_MSM:
403 src = baseband_msm;
404 if (have_cmdline) --dst;
405 while ((*dst++ = *src++));
406 break;
407
408 case BASEBAND_CSFB:
409 src = baseband_csfb;
410 if (have_cmdline) --dst;
411 while ((*dst++ = *src++));
412 break;
413
414 case BASEBAND_SVLTE2A:
415 src = baseband_svlte2a;
416 if (have_cmdline) --dst;
417 while ((*dst++ = *src++));
418 break;
419
420 case BASEBAND_MDM:
421 src = baseband_mdm;
422 if (have_cmdline) --dst;
423 while ((*dst++ = *src++));
424 break;
425
426 case BASEBAND_MDM2:
427 src = baseband_mdm2;
428 if (have_cmdline) --dst;
429 while ((*dst++ = *src++));
430 break;
431
432 case BASEBAND_SGLTE:
433 src = baseband_sglte;
434 if (have_cmdline) --dst;
435 while ((*dst++ = *src++));
436 break;
437
438 case BASEBAND_SGLTE2:
439 src = baseband_sglte2;
440 if (have_cmdline) --dst;
441 while ((*dst++ = *src++));
442 break;
443
444 case BASEBAND_DSDA:
445 src = baseband_dsda;
446 if (have_cmdline) --dst;
447 while ((*dst++ = *src++));
448 break;
449
450 case BASEBAND_DSDA2:
451 src = baseband_dsda2;
452 if (have_cmdline) --dst;
453 while ((*dst++ = *src++));
454 break;
455 }
456
457 if (strlen(display_panel_buf)) {
458 src = display_panel_buf;
459 if (have_cmdline) --dst;
460 while ((*dst++ = *src++));
461 }
462
463 if (have_target_boot_params) {
464 if (have_cmdline) --dst;
465 src = target_boot_params;
466 while ((*dst++ = *src++));
467 }
468 }
469
470
471 if (boot_dev_buf)
472 free(boot_dev_buf);
473
474 dprintf(INFO, "cmdline: %s\n", cmdline_final);
475 return cmdline_final;
476}
477
478unsigned *atag_core(unsigned *ptr)
479{
480 /* CORE */
481 *ptr++ = 2;
482 *ptr++ = 0x54410001;
483
484 return ptr;
485
486}
487
488unsigned *atag_ramdisk(unsigned *ptr, void *ramdisk,
489 unsigned ramdisk_size)
490{
491 if (ramdisk_size) {
492 *ptr++ = 4;
493 *ptr++ = 0x54420005;
494 *ptr++ = (unsigned)ramdisk;
495 *ptr++ = ramdisk_size;
496 }
497
498 return ptr;
499}
500
501unsigned *atag_ptable(unsigned **ptr_addr)
502{
503 int i;
504 struct ptable *ptable;
505
506 if ((ptable = flash_get_ptable()) && (ptable->count != 0)) {
507 *(*ptr_addr)++ = 2 + (ptable->count * (sizeof(struct atag_ptbl_entry) /
508 sizeof(unsigned)));
509 *(*ptr_addr)++ = 0x4d534d70;
510 for (i = 0; i < ptable->count; ++i)
511 ptentry_to_tag(ptr_addr, ptable_get(ptable, i));
512 }
513
514 return (*ptr_addr);
515}
516
517unsigned *atag_cmdline(unsigned *ptr, const char *cmdline)
518{
519 int cmdline_length = 0;
520 int n;
521 char *dest;
522
523 cmdline_length = strlen((const char*)cmdline);
524 n = (cmdline_length + 4) & (~3);
525
526 *ptr++ = (n / 4) + 2;
527 *ptr++ = 0x54410009;
528 dest = (char *) ptr;
529 while ((*dest++ = *cmdline++));
530 ptr += (n / 4);
531
532 return ptr;
533}
534
535unsigned *atag_end(unsigned *ptr)
536{
537 /* END */
538 *ptr++ = 0;
539 *ptr++ = 0;
540
541 return ptr;
542}
543
544void generate_atags(unsigned *ptr, const char *cmdline,
545 void *ramdisk, unsigned ramdisk_size)
546{
547
548 ptr = atag_core(ptr);
549 ptr = atag_ramdisk(ptr, ramdisk, ramdisk_size);
550 ptr = target_atag_mem(ptr);
551
552 /* Skip NAND partition ATAGS for eMMC boot */
553 if (!target_is_emmc_boot()){
554 ptr = atag_ptable(&ptr);
555 }
556
557 ptr = atag_cmdline(ptr, cmdline);
558 ptr = atag_end(ptr);
559}
560
561typedef void entry_func_ptr(unsigned, unsigned, unsigned*);
562void boot_linux(void *kernel, unsigned *tags,
563 const char *cmdline, unsigned machtype,
564 void *ramdisk, unsigned ramdisk_size)
565{
566 unsigned char *final_cmdline;
567#if DEVICE_TREE
568 int ret = 0;
569#endif
570
571 void (*entry)(unsigned, unsigned, unsigned*) = (entry_func_ptr*)(PA((addr_t)kernel));
572 uint32_t tags_phys = PA((addr_t)tags);
573 struct kernel64_hdr *kptr = (struct kernel64_hdr*)kernel;
574
575 ramdisk = PA(ramdisk);
576
577 final_cmdline = update_cmdline((const char*)cmdline);
578
579#if DEVICE_TREE
580 dprintf(INFO, "Updating device tree: start\n");
581
582 /* Update the Device Tree */
583 ret = update_device_tree((void *)tags, final_cmdline, ramdisk, ramdisk_size);
584 if(ret)
585 {
586 dprintf(CRITICAL, "ERROR: Updating Device Tree Failed \n");
587 ASSERT(0);
588 }
589 dprintf(INFO, "Updating device tree: done\n");
590#else
591 /* Generating the Atags */
592 generate_atags(tags, final_cmdline, ramdisk, ramdisk_size);
593#endif
594
595 /* Perform target specific cleanup */
596 target_uninit();
597
598 /* Turn off splash screen if enabled */
599#if DISPLAY_SPLASH_SCREEN
600 target_display_shutdown();
601#endif
602
603
604 dprintf(INFO, "booting linux @ %p, ramdisk @ %p (%d), tags/device tree @ %p\n",
605 entry, ramdisk, ramdisk_size, tags_phys);
606
607 enter_critical_section();
608
609 /* do any platform specific cleanup before kernel entry */
610 platform_uninit();
611
612 arch_disable_cache(UCACHE);
613
614#if ARM_WITH_MMU
615 arch_disable_mmu();
616#endif
617 bs_set_timestamp(BS_KERNEL_ENTRY);
618
619 if (IS_ARM64(kptr))
620 /* Jump to a 64bit kernel */
621 scm_elexec_call((paddr_t)kernel, tags_phys);
622 else
623 /* Jump to a 32bit kernel */
624 entry(0, machtype, (unsigned*)tags_phys);
625}
626
627/* Function to check if the memory address range falls within the aboot
628 * boundaries.
629 * start: Start of the memory region
630 * size: Size of the memory region
631 */
632int check_aboot_addr_range_overlap(uint32_t start, uint32_t size)
633{
634 /* Check for boundary conditions. */
635 if ((UINT_MAX - start) < size)
636 return -1;
637
638 /* Check for memory overlap. */
639 if ((start < MEMBASE) && ((start + size) <= MEMBASE))
640 return 0;
641 else if (start >= (MEMBASE + MEMSIZE))
642 return 0;
643 else
644 return -1;
645}
646
647#define ROUND_TO_PAGE(x,y) (((x) + (y)) & (~(y)))
648
649BUF_DMA_ALIGN(buf, BOOT_IMG_MAX_PAGE_SIZE); //Equal to max-supported pagesize
650#if DEVICE_TREE
651BUF_DMA_ALIGN(dt_buf, BOOT_IMG_MAX_PAGE_SIZE);
652#endif
653
654static void verify_signed_bootimg(uint32_t bootimg_addr, uint32_t bootimg_size)
655{
656 int ret;
657#if IMAGE_VERIF_ALGO_SHA1
658 uint32_t auth_algo = CRYPTO_AUTH_ALG_SHA1;
659#else
660 uint32_t auth_algo = CRYPTO_AUTH_ALG_SHA256;
661#endif
662
663 /* Assume device is rooted at this time. */
664 device.is_tampered = 1;
665
666 dprintf(INFO, "Authenticating boot image (%d): start\n", bootimg_size);
667
668 ret = image_verify((unsigned char *)bootimg_addr,
669 (unsigned char *)(bootimg_addr + bootimg_size),
670 bootimg_size,
671 auth_algo);
672
673 dprintf(INFO, "Authenticating boot image: done return value = %d\n", ret);
674
675 if (ret)
676 {
677 /* Authorized kernel */
678 device.is_tampered = 0;
679 auth_kernel_img = 1;
680 }
681
682#if USE_PCOM_SECBOOT
683 set_tamper_flag(device.is_tampered);
684#endif
685
686 if(device.is_tampered)
687 {
688 write_device_info_mmc(&device);
689 #ifdef TZ_TAMPER_FUSE
690 set_tamper_fuse_cmd();
691 #endif
692 #ifdef ASSERT_ON_TAMPER
693 dprintf(CRITICAL, "Device is tampered. Asserting..\n");
694 ASSERT(0);
695 #endif
696 }
697}
698
699static bool check_format_bit()
700{
701 bool ret = false;
702 int index;
703 uint64_t offset;
704 struct boot_selection_info *in = NULL;
705 char *buf = NULL;
706
707 index = partition_get_index("bootselect");
708 if (index == INVALID_PTN)
709 {
710 dprintf(INFO, "Unable to locate /bootselect partition\n");
711 return ret;
712 }
713 offset = partition_get_offset(index);
714 if(!offset)
715 {
716 dprintf(INFO, "partition /bootselect doesn't exist\n");
717 return ret;
718 }
719 buf = (char *) memalign(CACHE_LINE, ROUNDUP(page_size, CACHE_LINE));
720 ASSERT(buf);
721 if (mmc_read(offset, (unsigned int *)buf, page_size))
722 {
723 dprintf(INFO, "mmc read failure /bootselect %d\n", page_size);
724 free(buf);
725 return ret;
726 }
727 in = (struct boot_selection_info *) buf;
728 if ((in->signature == BOOTSELECT_SIGNATURE) &&
729 (in->version == BOOTSELECT_VERSION)) {
730 if ((in->state_info & BOOTSELECT_FORMAT) &&
731 !(in->state_info & BOOTSELECT_FACTORY))
732 ret = true;
733 } else {
734 dprintf(CRITICAL, "Signature: 0x%08x or version: 0x%08x mismatched of /bootselect\n",
735 in->signature, in->version);
736 ASSERT(0);
737 }
738 free(buf);
739 return ret;
740}
741
742int boot_linux_from_mmc(void)
743{
744 struct boot_img_hdr *hdr = (void*) buf;
745 struct boot_img_hdr *uhdr;
746 unsigned offset = 0;
747 int rcode;
748 unsigned long long ptn = 0;
749 int index = INVALID_PTN;
750
751 unsigned char *image_addr = 0;
752 unsigned kernel_actual;
753 unsigned ramdisk_actual;
754 unsigned imagesize_actual;
755 unsigned second_actual = 0;
756
757#if DEVICE_TREE
758 struct dt_table *table;
759 struct dt_entry dt_entry;
760 unsigned dt_table_offset;
761 uint32_t dt_actual;
762 uint32_t dt_hdr_size;
763#endif
764 BUF_DMA_ALIGN(kbuf, BOOT_IMG_MAX_PAGE_SIZE);
765 struct kernel64_hdr *kptr = (void*) kbuf;
766
767 if (check_format_bit())
768 boot_into_recovery = 1;
769
770 if (!boot_into_recovery) {
771 memset(ffbm_mode_string, '\0', sizeof(ffbm_mode_string));
772 rcode = get_ffbm(ffbm_mode_string, sizeof(ffbm_mode_string));
773 if (rcode <= 0) {
774 boot_into_ffbm = false;
775 if (rcode < 0)
776 dprintf(CRITICAL,"failed to get ffbm cookie");
777 } else
778 boot_into_ffbm = true;
779 } else
780 boot_into_ffbm = false;
781 uhdr = (struct boot_img_hdr *)EMMC_BOOT_IMG_HEADER_ADDR;
782 if (!memcmp(uhdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
783 dprintf(INFO, "Unified boot method!\n");
784 hdr = uhdr;
785 goto unified_boot;
786 }
787 if (!boot_into_recovery) {
788 index = partition_get_index("boot");
789 ptn = partition_get_offset(index);
790 if(ptn == 0) {
791 dprintf(CRITICAL, "ERROR: No boot partition found\n");
792 return -1;
793 }
794 }
795 else {
796 index = partition_get_index("recovery");
797 ptn = partition_get_offset(index);
798 if(ptn == 0) {
799 dprintf(CRITICAL, "ERROR: No recovery partition found\n");
800 return -1;
801 }
802 }
803
804 if (mmc_read(ptn + offset, (unsigned int *) buf, page_size)) {
805 dprintf(CRITICAL, "ERROR: Cannot read boot image header\n");
806 return -1;
807 }
808
809 if (memcmp(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
810 dprintf(CRITICAL, "ERROR: Invalid boot image header\n");
811 return -1;
812 }
813
814 if (hdr->page_size && (hdr->page_size != page_size)) {
815
816 if (hdr->page_size > BOOT_IMG_MAX_PAGE_SIZE) {
817 dprintf(CRITICAL, "ERROR: Invalid page size\n");
818 return -1;
819 }
820 page_size = hdr->page_size;
821 page_mask = page_size - 1;
822 }
823
824 /* Read the next page to get kernel Image header
825 * which lives in the second page for arm64 targets.
826 */
827
828 if (mmc_read(ptn + page_size, (unsigned int *) kbuf, page_size)) {
829 dprintf(CRITICAL, "ERROR: Cannot read boot image header\n");
830 return -1;
831 }
832
833 /*
834 * Update the kernel/ramdisk/tags address if the boot image header
835 * has default values, these default values come from mkbootimg when
836 * the boot image is flashed using fastboot flash:raw
837 */
838 update_ker_tags_rdisk_addr(hdr, IS_ARM64(kptr));
839
840 /* Get virtual addresses since the hdr saves physical addresses. */
841 hdr->kernel_addr = VA((addr_t)(hdr->kernel_addr));
842 hdr->ramdisk_addr = VA((addr_t)(hdr->ramdisk_addr));
843 hdr->tags_addr = VA((addr_t)(hdr->tags_addr));
844
845 kernel_actual = ROUND_TO_PAGE(hdr->kernel_size, page_mask);
846 ramdisk_actual = ROUND_TO_PAGE(hdr->ramdisk_size, page_mask);
847
848 /* Check if the addresses in the header are valid. */
849 if (check_aboot_addr_range_overlap(hdr->kernel_addr, kernel_actual) ||
850 check_aboot_addr_range_overlap(hdr->ramdisk_addr, ramdisk_actual))
851 {
852 dprintf(CRITICAL, "kernel/ramdisk addresses overlap with aboot addresses.\n");
853 return -1;
854 }
855
856#ifndef DEVICE_TREE
857 if (check_aboot_addr_range_overlap(hdr->tags_addr, MAX_TAGS_SIZE))
858 {
859 dprintf(CRITICAL, "Tags addresses overlap with aboot addresses.\n");
860 return -1;
861 }
862#endif
863
864 /* Authenticate Kernel */
865 dprintf(INFO, "use_signed_kernel=%d, is_unlocked=%d, is_tampered=%d.\n",
866 (int) target_use_signed_kernel(),
867 device.is_unlocked,
868 device.is_tampered);
869
870 if(target_use_signed_kernel() && (!device.is_unlocked))
871 {
872 offset = 0;
873
874 image_addr = (unsigned char *)target_get_scratch_address();
875
876#if DEVICE_TREE
877 dt_actual = ROUND_TO_PAGE(hdr->dt_size, page_mask);
878 imagesize_actual = (page_size + kernel_actual + ramdisk_actual + dt_actual);
879
880 if (check_aboot_addr_range_overlap(hdr->tags_addr, dt_actual))
881 {
882 dprintf(CRITICAL, "Device tree addresses overlap with aboot addresses.\n");
883 return -1;
884 }
885#else
886 imagesize_actual = (page_size + kernel_actual + ramdisk_actual);
887
888#endif
889
890 dprintf(INFO, "Loading boot image (%d): start\n", imagesize_actual);
891 bs_set_timestamp(BS_KERNEL_LOAD_START);
892
893 if (check_aboot_addr_range_overlap(image_addr, imagesize_actual))
894 {
895 dprintf(CRITICAL, "Boot image buffer address overlaps with aboot addresses.\n");
896 return -1;
897 }
898
899 /* Read image without signature */
900 if (mmc_read(ptn + offset, (void *)image_addr, imagesize_actual))
901 {
902 dprintf(CRITICAL, "ERROR: Cannot read boot image\n");
903 return -1;
904 }
905
906 dprintf(INFO, "Loading boot image (%d): done\n", imagesize_actual);
907 bs_set_timestamp(BS_KERNEL_LOAD_DONE);
908
909 offset = imagesize_actual;
910
911 if (check_aboot_addr_range_overlap(image_addr + offset, page_size))
912 {
913 dprintf(CRITICAL, "Signature read buffer address overlaps with aboot addresses.\n");
914 return -1;
915 }
916
917 /* Read signature */
918 if(mmc_read(ptn + offset, (void *)(image_addr + offset), page_size))
919 {
920 dprintf(CRITICAL, "ERROR: Cannot read boot image signature\n");
921 return -1;
922 }
923
924 verify_signed_bootimg(image_addr, imagesize_actual);
925
926 /* Move kernel, ramdisk and device tree to correct address */
927 memmove((void*) hdr->kernel_addr, (char *)(image_addr + page_size), hdr->kernel_size);
928 memmove((void*) hdr->ramdisk_addr, (char *)(image_addr + page_size + kernel_actual), hdr->ramdisk_size);
929
930 #if DEVICE_TREE
931 if(hdr->dt_size) {
932 dt_table_offset = ((uint32_t)image_addr + page_size + kernel_actual + ramdisk_actual + second_actual);
933 table = (struct dt_table*) dt_table_offset;
934
935 if (dev_tree_validate(table, hdr->page_size, &dt_hdr_size) != 0) {
936 dprintf(CRITICAL, "ERROR: Cannot validate Device Tree Table \n");
937 return -1;
938 }
939
940 /* Find index of device tree within device tree table */
941 if(dev_tree_get_entry_info(table, &dt_entry) != 0){
942 dprintf(CRITICAL, "ERROR: Device Tree Blob cannot be found\n");
943 return -1;
944 }
945
946 /* Validate and Read device device tree in the "tags_add */
947 if (check_aboot_addr_range_overlap(hdr->tags_addr, dt_entry.size))
948 {
949 dprintf(CRITICAL, "Device tree addresses overlap with aboot addresses.\n");
950 return -1;
951 }
952
953 memmove((void *)hdr->tags_addr, (char *)dt_table_offset + dt_entry.offset, dt_entry.size);
954 } else {
955 /*
956 * If appended dev tree is found, update the atags with
957 * memory address to the DTB appended location on RAM.
958 * Else update with the atags address in the kernel header
959 */
960 void *dtb;
961 dtb = dev_tree_appended((void*) hdr->kernel_addr,
962 hdr->kernel_size,
963 (void *)hdr->tags_addr);
964 if (!dtb) {
965 dprintf(CRITICAL, "ERROR: Appended Device Tree Blob not found\n");
966 return -1;
967 }
968 }
969 #endif
970 }
971 else
972 {
973 second_actual = ROUND_TO_PAGE(hdr->second_size, page_mask);
974
975 dprintf(INFO, "Loading boot image (%d): start\n",
976 kernel_actual + ramdisk_actual);
977 bs_set_timestamp(BS_KERNEL_LOAD_START);
978
979 offset = page_size;
980
981 /* Load kernel */
982 if (mmc_read(ptn + offset, (void *)hdr->kernel_addr, kernel_actual)) {
983 dprintf(CRITICAL, "ERROR: Cannot read kernel image\n");
984 return -1;
985 }
986 offset += kernel_actual;
987
988 /* Load ramdisk */
989 if(ramdisk_actual != 0)
990 {
991 if (mmc_read(ptn + offset, (void *)hdr->ramdisk_addr, ramdisk_actual)) {
992 dprintf(CRITICAL, "ERROR: Cannot read ramdisk image\n");
993 return -1;
994 }
995 }
996 offset += ramdisk_actual;
997
998 dprintf(INFO, "Loading boot image (%d): done\n",
999 kernel_actual + ramdisk_actual);
1000 bs_set_timestamp(BS_KERNEL_LOAD_DONE);
1001
1002 if(hdr->second_size != 0) {
1003 offset += second_actual;
1004 /* Second image loading not implemented. */
1005 ASSERT(0);
1006 }
1007
1008 #if DEVICE_TREE
1009 if(hdr->dt_size != 0) {
1010 /* Read the first page of device tree table into buffer */
1011 if(mmc_read(ptn + offset,(unsigned int *) dt_buf, page_size)) {
1012 dprintf(CRITICAL, "ERROR: Cannot read the Device Tree Table\n");
1013 return -1;
1014 }
1015 table = (struct dt_table*) dt_buf;
1016
1017 if (dev_tree_validate(table, hdr->page_size, &dt_hdr_size) != 0) {
1018 dprintf(CRITICAL, "ERROR: Cannot validate Device Tree Table \n");
1019 return -1;
1020 }
1021
1022 table = (struct dt_table*) memalign(CACHE_LINE, dt_hdr_size);
1023 if (!table)
1024 return -1;
1025
1026 /* Read the entire device tree table into buffer */
1027 if(mmc_read(ptn + offset,(unsigned int *) table, dt_hdr_size)) {
1028 dprintf(CRITICAL, "ERROR: Cannot read the Device Tree Table\n");
1029 return -1;
1030 }
1031
1032 /* Find index of device tree within device tree table */
1033 if(dev_tree_get_entry_info(table, &dt_entry) != 0){
1034 dprintf(CRITICAL, "ERROR: Getting device tree address failed\n");
1035 return -1;
1036 }
1037
1038 /* Validate and Read device device tree in the "tags_add */
1039 if (check_aboot_addr_range_overlap(hdr->tags_addr, dt_entry.size))
1040 {
1041 dprintf(CRITICAL, "Device tree addresses overlap with aboot addresses.\n");
1042 return -1;
1043 }
1044
1045 if(mmc_read(ptn + offset + dt_entry.offset,
1046 (void *)hdr->tags_addr, dt_entry.size)) {
1047 dprintf(CRITICAL, "ERROR: Cannot read device tree\n");
1048 return -1;
1049 }
1050 #ifdef TZ_SAVE_KERNEL_HASH
1051 aboot_save_boot_hash_mmc(hdr->kernel_addr, kernel_actual,
1052 hdr->ramdisk_addr, ramdisk_actual,
1053 ptn, offset, hdr->dt_size);
1054 #endif /* TZ_SAVE_KERNEL_HASH */
1055
1056 } else {
1057
1058 /* Validate the tags_addr */
1059 if (check_aboot_addr_range_overlap(hdr->tags_addr, kernel_actual))
1060 {
1061 dprintf(CRITICAL, "Device tree addresses overlap with aboot addresses.\n");
1062 return -1;
1063 }
1064 /*
1065 * If appended dev tree is found, update the atags with
1066 * memory address to the DTB appended location on RAM.
1067 * Else update with the atags address in the kernel header
1068 */
1069 void *dtb;
1070 dtb = dev_tree_appended((void*) hdr->kernel_addr,
1071 kernel_actual,
1072 (void *)hdr->tags_addr);
1073 if (!dtb) {
1074 dprintf(CRITICAL, "ERROR: Appended Device Tree Blob not found\n");
1075 return -1;
1076 }
1077 }
1078 #endif
1079 }
1080
1081 if (boot_into_recovery && !device.is_unlocked && !device.is_tampered)
1082 target_load_ssd_keystore();
1083
1084unified_boot:
1085
1086 boot_linux((void *)hdr->kernel_addr, (void *)hdr->tags_addr,
1087 (const char *)hdr->cmdline, board_machtype(),
1088 (void *)hdr->ramdisk_addr, hdr->ramdisk_size);
1089
1090 return 0;
1091}
1092
1093int boot_linux_from_flash(void)
1094{
1095 struct boot_img_hdr *hdr = (void*) buf;
1096 struct ptentry *ptn;
1097 struct ptable *ptable;
1098 unsigned offset = 0;
1099
1100 unsigned char *image_addr = 0;
1101 unsigned kernel_actual;
1102 unsigned ramdisk_actual;
1103 unsigned imagesize_actual;
1104 unsigned second_actual;
1105
1106#if DEVICE_TREE
1107 struct dt_table *table;
1108 struct dt_entry dt_entry;
1109 uint32_t dt_actual;
1110 uint32_t dt_hdr_size;
1111#endif
1112
1113 if (target_is_emmc_boot()) {
1114 hdr = (struct boot_img_hdr *)EMMC_BOOT_IMG_HEADER_ADDR;
1115 if (memcmp(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
1116 dprintf(CRITICAL, "ERROR: Invalid boot image header\n");
1117 return -1;
1118 }
1119 goto continue_boot;
1120 }
1121
1122 ptable = flash_get_ptable();
1123 if (ptable == NULL) {
1124 dprintf(CRITICAL, "ERROR: Partition table not found\n");
1125 return -1;
1126 }
1127
1128 if(!boot_into_recovery)
1129 {
1130 ptn = ptable_find(ptable, "boot");
1131
1132 if (ptn == NULL) {
1133 dprintf(CRITICAL, "ERROR: No boot partition found\n");
1134 return -1;
1135 }
1136 }
1137 else
1138 {
1139 ptn = ptable_find(ptable, "recovery");
1140 if (ptn == NULL) {
1141 dprintf(CRITICAL, "ERROR: No recovery partition found\n");
1142 return -1;
1143 }
1144 }
1145
1146 if (flash_read(ptn, offset, buf, page_size)) {
1147 dprintf(CRITICAL, "ERROR: Cannot read boot image header\n");
1148 return -1;
1149 }
1150
1151 if (memcmp(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
1152 dprintf(CRITICAL, "ERROR: Invalid boot image header\n");
1153 return -1;
1154 }
1155
1156 if (hdr->page_size != page_size) {
1157 dprintf(CRITICAL, "ERROR: Invalid boot image pagesize. Device pagesize: %d, Image pagesize: %d\n",page_size,hdr->page_size);
1158 return -1;
1159 }
1160
1161 /*
1162 * Update the kernel/ramdisk/tags address if the boot image header
1163 * has default values, these default values come from mkbootimg when
1164 * the boot image is flashed using fastboot flash:raw
1165 */
1166 update_ker_tags_rdisk_addr(hdr, false);
1167
1168 /* Get virtual addresses since the hdr saves physical addresses. */
1169 hdr->kernel_addr = VA((addr_t)(hdr->kernel_addr));
1170 hdr->ramdisk_addr = VA((addr_t)(hdr->ramdisk_addr));
1171 hdr->tags_addr = VA((addr_t)(hdr->tags_addr));
1172
1173 kernel_actual = ROUND_TO_PAGE(hdr->kernel_size, page_mask);
1174 ramdisk_actual = ROUND_TO_PAGE(hdr->ramdisk_size, page_mask);
1175
1176 /* Check if the addresses in the header are valid. */
1177 if (check_aboot_addr_range_overlap(hdr->kernel_addr, kernel_actual) ||
1178 check_aboot_addr_range_overlap(hdr->ramdisk_addr, ramdisk_actual))
1179 {
1180 dprintf(CRITICAL, "kernel/ramdisk addresses overlap with aboot addresses.\n");
1181 return -1;
1182 }
1183
1184#ifndef DEVICE_TREE
1185 if (check_aboot_addr_range_overlap(hdr->tags_addr, MAX_TAGS_SIZE))
1186 {
1187 dprintf(CRITICAL, "Tags addresses overlap with aboot addresses.\n");
1188 return -1;
1189 }
1190#endif
1191
1192 /* Authenticate Kernel */
1193 if(target_use_signed_kernel() && (!device.is_unlocked))
1194 {
1195 image_addr = (unsigned char *)target_get_scratch_address();
1196 offset = 0;
1197
1198#if DEVICE_TREE
1199 dt_actual = ROUND_TO_PAGE(hdr->dt_size, page_mask);
1200 imagesize_actual = (page_size + kernel_actual + ramdisk_actual + dt_actual);
1201
1202 if (check_aboot_addr_range_overlap(hdr->tags_addr, hdr->dt_size))
1203 {
1204 dprintf(CRITICAL, "Device tree addresses overlap with aboot addresses.\n");
1205 return -1;
1206 }
1207#else
1208 imagesize_actual = (page_size + kernel_actual + ramdisk_actual);
1209#endif
1210
1211 dprintf(INFO, "Loading boot image (%d): start\n", imagesize_actual);
1212 bs_set_timestamp(BS_KERNEL_LOAD_START);
1213
1214 /* Read image without signature */
1215 if (flash_read(ptn, offset, (void *)image_addr, imagesize_actual))
1216 {
1217 dprintf(CRITICAL, "ERROR: Cannot read boot image\n");
1218 return -1;
1219 }
1220
1221 dprintf(INFO, "Loading boot image (%d): done\n", imagesize_actual);
1222 bs_set_timestamp(BS_KERNEL_LOAD_DONE);
1223
1224 offset = imagesize_actual;
1225 /* Read signature */
1226 if (flash_read(ptn, offset, (void *)(image_addr + offset), page_size))
1227 {
1228 dprintf(CRITICAL, "ERROR: Cannot read boot image signature\n");
1229 return -1;
1230 }
1231
1232 verify_signed_bootimg(image_addr, imagesize_actual);
1233
1234 /* Move kernel and ramdisk to correct address */
1235 memmove((void*) hdr->kernel_addr, (char *)(image_addr + page_size), hdr->kernel_size);
1236 memmove((void*) hdr->ramdisk_addr, (char *)(image_addr + page_size + kernel_actual), hdr->ramdisk_size);
1237#if DEVICE_TREE
1238 /* Validate and Read device device tree in the "tags_add */
1239 if (check_aboot_addr_range_overlap(hdr->tags_addr, dt_entry.size))
1240 {
1241 dprintf(CRITICAL, "Device tree addresses overlap with aboot addresses.\n");
1242 return -1;
1243 }
1244
1245 memmove((void*) hdr->tags_addr, (char *)(image_addr + page_size + kernel_actual + ramdisk_actual), hdr->dt_size);
1246#endif
1247
1248 /* Make sure everything from scratch address is read before next step!*/
1249 if(device.is_tampered)
1250 {
1251 write_device_info_flash(&device);
1252 }
1253#if USE_PCOM_SECBOOT
1254 set_tamper_flag(device.is_tampered);
1255#endif
1256 }
1257 else
1258 {
1259 offset = page_size;
1260
1261 kernel_actual = ROUND_TO_PAGE(hdr->kernel_size, page_mask);
1262 ramdisk_actual = ROUND_TO_PAGE(hdr->ramdisk_size, page_mask);
1263 second_actual = ROUND_TO_PAGE(hdr->second_size, page_mask);
1264
1265 dprintf(INFO, "Loading boot image (%d): start\n",
1266 kernel_actual + ramdisk_actual);
1267 bs_set_timestamp(BS_KERNEL_LOAD_START);
1268
1269 if (flash_read(ptn, offset, (void *)hdr->kernel_addr, kernel_actual)) {
1270 dprintf(CRITICAL, "ERROR: Cannot read kernel image\n");
1271 return -1;
1272 }
1273 offset += kernel_actual;
1274
1275 if (flash_read(ptn, offset, (void *)hdr->ramdisk_addr, ramdisk_actual)) {
1276 dprintf(CRITICAL, "ERROR: Cannot read ramdisk image\n");
1277 return -1;
1278 }
1279 offset += ramdisk_actual;
1280
1281 dprintf(INFO, "Loading boot image (%d): done\n",
1282 kernel_actual + ramdisk_actual);
1283 bs_set_timestamp(BS_KERNEL_LOAD_DONE);
1284
1285 if(hdr->second_size != 0) {
1286 offset += second_actual;
1287 /* Second image loading not implemented. */
1288 ASSERT(0);
1289 }
1290
1291#if DEVICE_TREE
1292 if(hdr->dt_size != 0) {
1293
1294 /* Read the device tree table into buffer */
1295 if(flash_read(ptn, offset, (void *) dt_buf, page_size)) {
1296 dprintf(CRITICAL, "ERROR: Cannot read the Device Tree Table\n");
1297 return -1;
1298 }
1299
1300 table = (struct dt_table*) dt_buf;
1301
1302 if (dev_tree_validate(table, hdr->page_size, &dt_hdr_size) != 0) {
1303 dprintf(CRITICAL, "ERROR: Cannot validate Device Tree Table \n");
1304 return -1;
1305 }
1306
1307 table = (struct dt_table*) memalign(CACHE_LINE, dt_hdr_size);
1308 if (!table)
1309 return -1;
1310
1311 /* Read the entire device tree table into buffer */
1312 if(flash_read(ptn, offset, (void *)table, dt_hdr_size)) {
1313 dprintf(CRITICAL, "ERROR: Cannot read the Device Tree Table\n");
1314 return -1;
1315 }
1316
1317
1318 /* Find index of device tree within device tree table */
1319 if(dev_tree_get_entry_info(table, &dt_entry) != 0){
1320 dprintf(CRITICAL, "ERROR: Getting device tree address failed\n");
1321 return -1;
1322 }
1323
1324 /* Validate and Read device device tree in the "tags_add */
1325 if (check_aboot_addr_range_overlap(hdr->tags_addr, dt_entry.size))
1326 {
1327 dprintf(CRITICAL, "Device tree addresses overlap with aboot addresses.\n");
1328 return -1;
1329 }
1330
1331 /* Read device device tree in the "tags_add */
1332 if(flash_read(ptn, offset + dt_entry.offset,
1333 (void *)hdr->tags_addr, dt_entry.size)) {
1334 dprintf(CRITICAL, "ERROR: Cannot read device tree\n");
1335 return -1;
1336 }
1337 }
1338#endif
1339
1340 }
1341continue_boot:
1342
1343 /* TODO: create/pass atags to kernel */
1344
1345 boot_linux((void *)hdr->kernel_addr, (void *)hdr->tags_addr,
1346 (const char *)hdr->cmdline, board_machtype(),
1347 (void *)hdr->ramdisk_addr, hdr->ramdisk_size);
1348
1349 return 0;
1350}
1351
1352BUF_DMA_ALIGN(info_buf, BOOT_IMG_MAX_PAGE_SIZE);
1353void write_device_info_mmc(device_info *dev)
1354{
1355 struct device_info *info = (void*) info_buf;
1356 unsigned long long ptn = 0;
1357 unsigned long long size;
1358 int index = INVALID_PTN;
1359 uint32_t blocksize;
1360 uint8_t lun = 0;
1361
1362 index = partition_get_index("aboot");
1363 ptn = partition_get_offset(index);
1364 if(ptn == 0)
1365 {
1366 return;
1367 }
1368
1369 lun = partition_get_lun(index);
1370 mmc_set_lun(lun);
1371
1372 size = partition_get_size(index);
1373
1374 memcpy(info, dev, sizeof(device_info));
1375
1376 blocksize = mmc_get_device_blocksize();
1377
1378 if(mmc_write((ptn + size - blocksize), blocksize, (void *)info_buf))
1379 {
1380 dprintf(CRITICAL, "ERROR: Cannot write device info\n");
1381 return;
1382 }
1383}
1384
1385void read_device_info_mmc(device_info *dev)
1386{
1387 struct device_info *info = (void*) info_buf;
1388 unsigned long long ptn = 0;
1389 unsigned long long size;
1390 int index = INVALID_PTN;
1391 uint32_t blocksize;
1392
1393 index = partition_get_index("aboot");
1394 ptn = partition_get_offset(index);
1395 if(ptn == 0)
1396 {
1397 return;
1398 }
1399
1400 size = partition_get_size(index);
1401
1402 blocksize = mmc_get_device_blocksize();
1403
1404 if(mmc_read((ptn + size - blocksize), (void *)info_buf, blocksize))
1405 {
1406 dprintf(CRITICAL, "ERROR: Cannot read device info\n");
1407 return;
1408 }
1409
1410 if (memcmp(info->magic, DEVICE_MAGIC, DEVICE_MAGIC_SIZE))
1411 {
1412 memcpy(info->magic, DEVICE_MAGIC, DEVICE_MAGIC_SIZE);
1413 info->is_unlocked = 0;
1414 info->is_tampered = 0;
1415 info->charger_screen_enabled = 0;
1416
1417 write_device_info_mmc(info);
1418 }
1419 memcpy(dev, info, sizeof(device_info));
1420}
1421
1422void write_device_info_flash(device_info *dev)
1423{
1424 struct device_info *info = (void *) info_buf;
1425 struct ptentry *ptn;
1426 struct ptable *ptable;
1427
1428 ptable = flash_get_ptable();
1429 if (ptable == NULL)
1430 {
1431 dprintf(CRITICAL, "ERROR: Partition table not found\n");
1432 return;
1433 }
1434
1435 ptn = ptable_find(ptable, "devinfo");
1436 if (ptn == NULL)
1437 {
1438 dprintf(CRITICAL, "ERROR: No boot partition found\n");
1439 return;
1440 }
1441
1442 memcpy(info, dev, sizeof(device_info));
1443
1444 if (flash_write(ptn, 0, (void *)info_buf, page_size))
1445 {
1446 dprintf(CRITICAL, "ERROR: Cannot write device info\n");
1447 return;
1448 }
1449}
1450
1451void read_device_info_flash(device_info *dev)
1452{
1453 struct device_info *info = (void*) info_buf;
1454 struct ptentry *ptn;
1455 struct ptable *ptable;
1456
1457 ptable = flash_get_ptable();
1458 if (ptable == NULL)
1459 {
1460 dprintf(CRITICAL, "ERROR: Partition table not found\n");
1461 return;
1462 }
1463
1464 ptn = ptable_find(ptable, "devinfo");
1465 if (ptn == NULL)
1466 {
1467 dprintf(CRITICAL, "ERROR: No boot partition found\n");
1468 return;
1469 }
1470
1471 if (flash_read(ptn, 0, (void *)info_buf, page_size))
1472 {
1473 dprintf(CRITICAL, "ERROR: Cannot write device info\n");
1474 return;
1475 }
1476
1477 if (memcmp(info->magic, DEVICE_MAGIC, DEVICE_MAGIC_SIZE))
1478 {
1479 memcpy(info->magic, DEVICE_MAGIC, DEVICE_MAGIC_SIZE);
1480 info->is_unlocked = 0;
1481 info->is_tampered = 0;
1482 write_device_info_flash(info);
1483 }
1484 memcpy(dev, info, sizeof(device_info));
1485}
1486
1487void write_device_info(device_info *dev)
1488{
1489 if(target_is_emmc_boot())
1490 {
1491 write_device_info_mmc(dev);
1492 }
1493 else
1494 {
1495 write_device_info_flash(dev);
1496 }
1497}
1498
1499void read_device_info(device_info *dev)
1500{
1501 if(target_is_emmc_boot())
1502 {
1503 read_device_info_mmc(dev);
1504 }
1505 else
1506 {
1507 read_device_info_flash(dev);
1508 }
1509}
1510
1511void reset_device_info()
1512{
1513 dprintf(ALWAYS, "reset_device_info called.");
1514 device.is_tampered = 0;
1515 write_device_info(&device);
1516}
1517
1518void set_device_root()
1519{
1520 dprintf(ALWAYS, "set_device_root called.");
1521 device.is_tampered = 1;
1522 write_device_info(&device);
1523}
1524
1525#if DEVICE_TREE
1526int copy_dtb(uint8_t *boot_image_start)
1527{
1528 uint32 dt_image_offset = 0;
1529 uint32_t n;
1530 struct dt_table *table;
1531 struct dt_entry dt_entry;
1532 uint32_t dt_hdr_size;
1533
1534 struct boot_img_hdr *hdr = (struct boot_img_hdr *) (boot_image_start);
1535
1536 if(hdr->dt_size != 0) {
1537
1538 /* add kernel offset */
1539 dt_image_offset += page_size;
1540 n = ROUND_TO_PAGE(hdr->kernel_size, page_mask);
1541 dt_image_offset += n;
1542
1543 /* add ramdisk offset */
1544 n = ROUND_TO_PAGE(hdr->ramdisk_size, page_mask);
1545 dt_image_offset += n;
1546
1547 /* add second offset */
1548 if(hdr->second_size != 0) {
1549 n = ROUND_TO_PAGE(hdr->second_size, page_mask);
1550 dt_image_offset += n;
1551 }
1552
1553 /* offset now point to start of dt.img */
1554 table = (struct dt_table*)(boot_image_start + dt_image_offset);
1555
1556 if (dev_tree_validate(table, hdr->page_size, &dt_hdr_size) != 0) {
1557 dprintf(CRITICAL, "ERROR: Cannot validate Device Tree Table \n");
1558 return -1;
1559 }
1560 /* Find index of device tree within device tree table */
1561 if(dev_tree_get_entry_info(table, &dt_entry) != 0){
1562 dprintf(CRITICAL, "ERROR: Getting device tree address failed\n");
1563 return -1;
1564 }
1565
1566 /* Validate and Read device device tree in the "tags_add */
1567 if (check_aboot_addr_range_overlap(hdr->tags_addr, dt_entry.size))
1568 {
1569 dprintf(CRITICAL, "Device tree addresses overlap with aboot addresses.\n");
1570 return -1;
1571 }
1572
1573 /* Read device device tree in the "tags_add */
1574 memmove((void*) hdr->tags_addr,
1575 boot_image_start + dt_image_offset + dt_entry.offset,
1576 dt_entry.size);
1577 } else
1578 return -1;
1579
1580 /* Everything looks fine. Return success. */
1581 return 0;
1582}
1583#endif
1584
1585void cmd_boot(const char *arg, void *data, unsigned sz)
1586{
1587 unsigned kernel_actual;
1588 unsigned ramdisk_actual;
1589 uint32_t image_actual;
1590 uint32_t dt_actual = 0;
1591 uint32_t sig_actual = SIGNATURE_SIZE;
1592 struct boot_img_hdr *hdr;
1593 struct kernel64_hdr *kptr;
1594 char *ptr = ((char*) data);
1595 int ret = 0;
1596 uint8_t dtb_copied = 0;
1597
1598 if (sz < sizeof(hdr)) {
1599 fastboot_fail("invalid bootimage header");
1600 return;
1601 }
1602
1603 hdr = (struct boot_img_hdr *)data;
1604
1605 /* ensure commandline is terminated */
1606 hdr->cmdline[BOOT_ARGS_SIZE-1] = 0;
1607
1608 if(target_is_emmc_boot() && hdr->page_size) {
1609 page_size = hdr->page_size;
1610 page_mask = page_size - 1;
1611 }
1612
1613 kernel_actual = ROUND_TO_PAGE(hdr->kernel_size, page_mask);
1614 ramdisk_actual = ROUND_TO_PAGE(hdr->ramdisk_size, page_mask);
1615#if DEVICE_TREE
1616 dt_actual = ROUND_TO_PAGE(hdr->dt_size, page_mask);
1617#endif
1618
1619 image_actual = ADD_OF(page_size, kernel_actual);
1620 image_actual = ADD_OF(image_actual, ramdisk_actual);
1621 image_actual = ADD_OF(image_actual, dt_actual);
1622
1623 if (target_use_signed_kernel() && (!device.is_unlocked))
1624 image_actual = ADD_OF(image_actual, sig_actual);
1625
1626 /* sz should have atleast raw boot image */
1627 if (image_actual > sz) {
1628 fastboot_fail("bootimage: incomplete or not signed");
1629 return;
1630 }
1631
1632 /* Verify the boot image
1633 * device & page_size are initialized in aboot_init
1634 */
1635 if (target_use_signed_kernel() && (!device.is_unlocked))
1636 /* Pass size excluding signature size, otherwise we would try to
1637 * access signature beyond its length
1638 */
1639 verify_signed_bootimg((uint32_t)data, (image_actual - sig_actual));
1640
1641 /*
1642 * Update the kernel/ramdisk/tags address if the boot image header
1643 * has default values, these default values come from mkbootimg when
1644 * the boot image is flashed using fastboot flash:raw
1645 */
1646 kptr = (struct kernel64_hdr*)((char*) data + page_size);
1647 update_ker_tags_rdisk_addr(hdr, IS_ARM64(kptr));
1648
1649 /* Get virtual addresses since the hdr saves physical addresses. */
1650 hdr->kernel_addr = VA(hdr->kernel_addr);
1651 hdr->ramdisk_addr = VA(hdr->ramdisk_addr);
1652 hdr->tags_addr = VA(hdr->tags_addr);
1653
1654 /* Check if the addresses in the header are valid. */
1655 if (check_aboot_addr_range_overlap(hdr->kernel_addr, kernel_actual) ||
1656 check_aboot_addr_range_overlap(hdr->ramdisk_addr, ramdisk_actual))
1657 {
1658 dprintf(CRITICAL, "kernel/ramdisk addresses overlap with aboot addresses.\n");
1659 return;
1660 }
1661
1662#if DEVICE_TREE
1663 /* find correct dtb and copy it to right location */
1664 ret = copy_dtb(data);
1665
1666 dtb_copied = !ret ? 1 : 0;
1667#else
1668 if (check_aboot_addr_range_overlap(hdr->tags_addr, MAX_TAGS_SIZE))
1669 {
1670 dprintf(CRITICAL, "Tags addresses overlap with aboot addresses.\n");
1671 return;
1672 }
1673#endif
1674
1675 /* Load ramdisk & kernel */
1676 memmove((void*) hdr->ramdisk_addr, ptr + page_size + kernel_actual, hdr->ramdisk_size);
1677 memmove((void*) hdr->kernel_addr, ptr + page_size, hdr->kernel_size);
1678
1679#if DEVICE_TREE
1680 /*
1681 * If dtb is not found look for appended DTB in the kernel.
1682 * If appended dev tree is found, update the atags with
1683 * memory address to the DTB appended location on RAM.
1684 * Else update with the atags address in the kernel header
1685 */
1686 if (!dtb_copied) {
1687 void *dtb;
1688 dtb = dev_tree_appended((void *)hdr->kernel_addr, hdr->kernel_size,
1689 (void *)hdr->tags_addr);
1690 if (!dtb) {
1691 fastboot_fail("dtb not found");
1692 return;
1693 }
1694 }
1695#endif
1696
1697#ifndef DEVICE_TREE
1698 if (check_aboot_addr_range_overlap(hdr->tags_addr, MAX_TAGS_SIZE))
1699 {
1700 dprintf(CRITICAL, "Tags addresses overlap with aboot addresses.\n");
1701 return;
1702 }
1703#endif
1704
1705 fastboot_okay("");
1706 fastboot_stop();
1707
1708 boot_linux((void*) hdr->kernel_addr, (void*) hdr->tags_addr,
1709 (const char*) hdr->cmdline, board_machtype(),
1710 (void*) hdr->ramdisk_addr, hdr->ramdisk_size);
1711}
1712
1713void cmd_erase(const char *arg, void *data, unsigned sz)
1714{
1715 struct ptentry *ptn;
1716 struct ptable *ptable;
1717
1718 ptable = flash_get_ptable();
1719 if (ptable == NULL) {
1720 fastboot_fail("partition table doesn't exist");
1721 return;
1722 }
1723
1724 ptn = ptable_find(ptable, arg);
1725 if (ptn == NULL) {
1726 fastboot_fail("unknown partition name");
1727 return;
1728 }
1729
1730 if (flash_erase(ptn)) {
1731 fastboot_fail("failed to erase partition");
1732 return;
1733 }
1734 fastboot_okay("");
1735}
1736
1737
1738void cmd_erase_mmc(const char *arg, void *data, unsigned sz)
1739{
1740 BUF_DMA_ALIGN(out, DEFAULT_ERASE_SIZE);
1741 unsigned long long ptn = 0;
1742 unsigned long long size = 0;
1743 int index = INVALID_PTN;
1744 uint8_t lun = 0;
1745
1746 index = partition_get_index(arg);
1747 ptn = partition_get_offset(index);
1748 size = partition_get_size(index);
1749
1750 if(ptn == 0) {
1751 fastboot_fail("Partition table doesn't exist\n");
1752 return;
1753 }
1754
1755 lun = partition_get_lun(index);
1756 mmc_set_lun(lun);
1757
1758#if MMC_SDHCI_SUPPORT
1759 if (mmc_erase_card(ptn, size)) {
1760 fastboot_fail("failed to erase partition\n");
1761 return;
1762 }
1763#else
1764 size = partition_get_size(index);
1765 if (size > DEFAULT_ERASE_SIZE)
1766 size = DEFAULT_ERASE_SIZE;
1767
1768 /* Simple inefficient version of erase. Just writing
1769 0 in first several blocks */
1770 if (mmc_write(ptn , size, (unsigned int *)out)) {
1771 fastboot_fail("failed to erase partition");
1772 return;
1773 }
1774#endif
1775 fastboot_okay("");
1776}
1777
1778
1779void cmd_flash_mmc_img(const char *arg, void *data, unsigned sz)
1780{
1781 unsigned long long ptn = 0;
1782 unsigned long long size = 0;
1783 int index = INVALID_PTN;
1784 char *token = NULL;
1785 char *pname = NULL;
1786 uint8_t lun = 0;
1787 bool lun_set = false;
1788
1789 token = strtok(arg, ":");
1790 pname = token;
1791 token = strtok(NULL, ":");
1792 if(token)
1793 {
1794 lun = atoi(token);
1795 mmc_set_lun(lun);
1796 lun_set = true;
1797 }
1798
1799 if (pname)
1800 {
1801 if (!strcmp(pname, "partition"))
1802 {
1803 dprintf(INFO, "Attempt to write partition image.\n");
1804 if (write_partition(sz, (unsigned char *) data)) {
1805 fastboot_fail("failed to write partition");
1806 return;
1807 }
1808 }
1809 else
1810 {
1811 index = partition_get_index(pname);
1812 ptn = partition_get_offset(index);
1813 if(ptn == 0) {
1814 fastboot_fail("partition table doesn't exist");
1815 return;
1816 }
1817
1818 if (!strcmp(pname, "boot") || !strcmp(pname, "recovery")) {
1819 if (memcmp((void *)data, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
1820 fastboot_fail("image is not a boot image");
1821 return;
1822 }
1823 }
1824
1825 if(!lun_set)
1826 {
1827 lun = partition_get_lun(index);
1828 mmc_set_lun(lun);
1829 }
1830
1831 size = partition_get_size(index);
1832 if (ROUND_TO_PAGE(sz,511) > size) {
1833 fastboot_fail("size too large");
1834 return;
1835 }
1836 else if (mmc_write(ptn , sz, (unsigned int *)data)) {
1837 fastboot_fail("flash write failure");
1838 return;
1839 }
1840 }
1841 }
1842 fastboot_okay("");
1843 return;
1844}
1845
1846void cmd_flash_mmc_sparse_img(const char *arg, void *data, unsigned sz)
1847{
1848 unsigned int chunk;
1849 unsigned int chunk_data_sz;
1850 uint32_t *fill_buf = NULL;
1851 uint32_t fill_val;
1852 uint32_t chunk_blk_cnt = 0;
1853 sparse_header_t *sparse_header;
1854 chunk_header_t *chunk_header;
1855 uint32_t total_blocks = 0;
1856 unsigned long long ptn = 0;
1857 unsigned long long size = 0;
1858 int index = INVALID_PTN;
1859 int i;
1860 uint8_t lun = 0;
1861
1862 index = partition_get_index(arg);
1863 ptn = partition_get_offset(index);
1864 if(ptn == 0) {
1865 fastboot_fail("partition table doesn't exist");
1866 return;
1867 }
1868
1869 size = partition_get_size(index);
1870 if (ROUND_TO_PAGE(sz,511) > size) {
1871 fastboot_fail("size too large");
1872 return;
1873 }
1874
1875 lun = partition_get_lun(index);
1876 mmc_set_lun(lun);
1877
1878 /* Read and skip over sparse image header */
1879 sparse_header = (sparse_header_t *) data;
1880 if ((sparse_header->total_blks * sparse_header->blk_sz) > size) {
1881 fastboot_fail("size too large");
1882 return;
1883 }
1884
1885 data += sparse_header->file_hdr_sz;
1886 if(sparse_header->file_hdr_sz > sizeof(sparse_header_t))
1887 {
1888 /* Skip the remaining bytes in a header that is longer than
1889 * we expected.
1890 */
1891 data += (sparse_header->file_hdr_sz - sizeof(sparse_header_t));
1892 }
1893
1894 dprintf (SPEW, "=== Sparse Image Header ===\n");
1895 dprintf (SPEW, "magic: 0x%x\n", sparse_header->magic);
1896 dprintf (SPEW, "major_version: 0x%x\n", sparse_header->major_version);
1897 dprintf (SPEW, "minor_version: 0x%x\n", sparse_header->minor_version);
1898 dprintf (SPEW, "file_hdr_sz: %d\n", sparse_header->file_hdr_sz);
1899 dprintf (SPEW, "chunk_hdr_sz: %d\n", sparse_header->chunk_hdr_sz);
1900 dprintf (SPEW, "blk_sz: %d\n", sparse_header->blk_sz);
1901 dprintf (SPEW, "total_blks: %d\n", sparse_header->total_blks);
1902 dprintf (SPEW, "total_chunks: %d\n", sparse_header->total_chunks);
1903
1904 /* Start processing chunks */
1905 for (chunk=0; chunk<sparse_header->total_chunks; chunk++)
1906 {
1907 /* Read and skip over chunk header */
1908 chunk_header = (chunk_header_t *) data;
1909 data += sizeof(chunk_header_t);
1910
1911 dprintf (SPEW, "=== Chunk Header ===\n");
1912 dprintf (SPEW, "chunk_type: 0x%x\n", chunk_header->chunk_type);
1913 dprintf (SPEW, "chunk_data_sz: 0x%x\n", chunk_header->chunk_sz);
1914 dprintf (SPEW, "total_size: 0x%x\n", chunk_header->total_sz);
1915
1916 if(sparse_header->chunk_hdr_sz > sizeof(chunk_header_t))
1917 {
1918 /* Skip the remaining bytes in a header that is longer than
1919 * we expected.
1920 */
1921 data += (sparse_header->chunk_hdr_sz - sizeof(chunk_header_t));
1922 }
1923
1924 chunk_data_sz = sparse_header->blk_sz * chunk_header->chunk_sz;
1925 switch (chunk_header->chunk_type)
1926 {
1927 case CHUNK_TYPE_RAW:
1928 if(chunk_header->total_sz != (sparse_header->chunk_hdr_sz +
1929 chunk_data_sz))
1930 {
1931 fastboot_fail("Bogus chunk size for chunk type Raw");
1932 return;
1933 }
1934
1935 if(mmc_write(ptn + ((uint64_t)total_blocks*sparse_header->blk_sz),
1936 chunk_data_sz,
1937 (unsigned int*)data))
1938 {
1939 fastboot_fail("flash write failure");
1940 return;
1941 }
1942 total_blocks += chunk_header->chunk_sz;
1943 data += chunk_data_sz;
1944 break;
1945
1946 case CHUNK_TYPE_FILL:
1947 if(chunk_header->total_sz != (sparse_header->chunk_hdr_sz +
1948 sizeof(uint32_t)))
1949 {
1950 fastboot_fail("Bogus chunk size for chunk type FILL");
1951 return;
1952 }
1953
1954 fill_buf = (uint32_t *)memalign(CACHE_LINE, ROUNDUP(sparse_header->blk_sz, CACHE_LINE));
1955 if (!fill_buf)
1956 {
1957 fastboot_fail("Malloc failed for: CHUNK_TYPE_FILL");
1958 return;
1959 }
1960
1961 fill_val = *(uint32_t *)data;
1962 data = (char *) data + sizeof(uint32_t);
1963 chunk_blk_cnt = chunk_data_sz / sparse_header->blk_sz;
1964
1965 for (i = 0; i < (sparse_header->blk_sz / sizeof(fill_val)); i++)
1966 {
1967 fill_buf[i] = fill_val;
1968 }
1969
1970 for (i = 0; i < chunk_blk_cnt; i++)
1971 {
1972 if(mmc_write(ptn + ((uint64_t)total_blocks*sparse_header->blk_sz),
1973 sparse_header->blk_sz,
1974 fill_buf))
1975 {
1976 fastboot_fail("flash write failure");
1977 free(fill_buf);
1978 return;
1979 }
1980
1981 total_blocks++;
1982 }
1983
1984 free(fill_buf);
1985 break;
1986
1987 case CHUNK_TYPE_DONT_CARE:
1988 total_blocks += chunk_header->chunk_sz;
1989 break;
1990
1991 case CHUNK_TYPE_CRC:
1992 if(chunk_header->total_sz != sparse_header->chunk_hdr_sz)
1993 {
1994 fastboot_fail("Bogus chunk size for chunk type Dont Care");
1995 return;
1996 }
1997 total_blocks += chunk_header->chunk_sz;
1998 data += chunk_data_sz;
1999 break;
2000
2001 default:
2002 dprintf(CRITICAL, "Unkown chunk type: %x\n",chunk_header->chunk_type);
2003 fastboot_fail("Unknown chunk type");
2004 return;
2005 }
2006 }
2007
2008 dprintf(INFO, "Wrote %d blocks, expected to write %d blocks\n",
2009 total_blocks, sparse_header->total_blks);
2010
2011 if(total_blocks != sparse_header->total_blks)
2012 {
2013 fastboot_fail("sparse image write failure");
2014 }
2015
2016 fastboot_okay("");
2017 return;
2018}
2019
2020void cmd_flash_mmc(const char *arg, void *data, unsigned sz)
2021{
2022 sparse_header_t *sparse_header;
2023 /* 8 Byte Magic + 2048 Byte xml + Encrypted Data */
2024 unsigned int *magic_number = (unsigned int *) data;
2025
2026#ifdef SSD_ENABLE
2027 int ret=0;
2028 uint32 major_version=0;
2029 uint32 minor_version=0;
2030
2031 ret = scm_svc_version(&major_version,&minor_version);
2032 if(!ret)
2033 {
2034 if(major_version >= 2)
2035 {
2036 if( !strcmp(arg, "ssd") || !strcmp(arg, "tqs") )
2037 {
2038 ret = encrypt_scm((uint32 **) &data, &sz);
2039 if (ret != 0) {
2040 dprintf(CRITICAL, "ERROR: Encryption Failure\n");
2041 return;
2042 }
2043
2044 /* Protect only for SSD */
2045 if (!strcmp(arg, "ssd")) {
2046 ret = scm_protect_keystore((uint32 *) data, sz);
2047 if (ret != 0) {
2048 dprintf(CRITICAL, "ERROR: scm_protect_keystore Failed\n");
2049 return;
2050 }
2051 }
2052 }
2053 else
2054 {
2055 ret = decrypt_scm_v2((uint32 **) &data, &sz);
2056 if(ret != 0)
2057 {
2058 dprintf(CRITICAL,"ERROR: Decryption Failure\n");
2059 return;
2060 }
2061 }
2062 }
2063 else
2064 {
2065 if (magic_number[0] == DECRYPT_MAGIC_0 &&
2066 magic_number[1] == DECRYPT_MAGIC_1)
2067 {
2068 ret = decrypt_scm((uint32 **) &data, &sz);
2069 if (ret != 0) {
2070 dprintf(CRITICAL, "ERROR: Invalid secure image\n");
2071 return;
2072 }
2073 }
2074 else if (magic_number[0] == ENCRYPT_MAGIC_0 &&
2075 magic_number[1] == ENCRYPT_MAGIC_1)
2076 {
2077 ret = encrypt_scm((uint32 **) &data, &sz);
2078 if (ret != 0) {
2079 dprintf(CRITICAL, "ERROR: Encryption Failure\n");
2080 return;
2081 }
2082 }
2083 }
2084 }
2085 else
2086 {
2087 dprintf(CRITICAL,"INVALID SVC Version\n");
2088 return;
2089 }
2090#endif /* SSD_ENABLE */
2091
2092 sparse_header = (sparse_header_t *) data;
2093 if (sparse_header->magic != SPARSE_HEADER_MAGIC)
2094 cmd_flash_mmc_img(arg, data, sz);
2095 else
2096 cmd_flash_mmc_sparse_img(arg, data, sz);
2097 return;
2098}
2099
2100void cmd_flash(const char *arg, void *data, unsigned sz)
2101{
2102 struct ptentry *ptn;
2103 struct ptable *ptable;
2104 unsigned extra = 0;
2105
2106 ptable = flash_get_ptable();
2107 if (ptable == NULL) {
2108 fastboot_fail("partition table doesn't exist");
2109 return;
2110 }
2111
2112 ptn = ptable_find(ptable, arg);
2113 if (ptn == NULL) {
2114 fastboot_fail("unknown partition name");
2115 return;
2116 }
2117
2118 if (!strcmp(ptn->name, "boot") || !strcmp(ptn->name, "recovery")) {
2119 if (memcmp((void *)data, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
2120 fastboot_fail("image is not a boot image");
2121 return;
2122 }
2123 }
2124
2125 if (!strcmp(ptn->name, "system")
2126 || !strcmp(ptn->name, "userdata")
2127 || !strcmp(ptn->name, "persist")
2128 || !strcmp(ptn->name, "recoveryfs")
2129 || !strcmp(ptn->name, "modem"))
2130 {
2131 if (memcmp((void *)data, UBI_MAGIC, UBI_MAGIC_SIZE))
2132 extra = 1;
2133 else
2134 extra = 0;
2135 }
2136 else
2137 sz = ROUND_TO_PAGE(sz, page_mask);
2138
2139 dprintf(INFO, "writing %d bytes to '%s'\n", sz, ptn->name);
2140 if (flash_write(ptn, extra, data, sz)) {
2141 fastboot_fail("flash write failure");
2142 return;
2143 }
2144 dprintf(INFO, "partition '%s' updated\n", ptn->name);
2145 fastboot_okay("");
2146}
2147
2148void cmd_continue(const char *arg, void *data, unsigned sz)
2149{
2150 fastboot_okay("");
2151 fastboot_stop();
2152 if (target_is_emmc_boot())
2153 {
2154 boot_linux_from_mmc();
2155 }
2156 else
2157 {
2158 boot_linux_from_flash();
2159 }
2160}
2161
2162void cmd_reboot(const char *arg, void *data, unsigned sz)
2163{
2164 dprintf(INFO, "rebooting the device\n");
2165 fastboot_okay("");
2166 reboot_device(0);
2167}
2168
2169void cmd_reboot_bootloader(const char *arg, void *data, unsigned sz)
2170{
2171 dprintf(INFO, "rebooting the device\n");
2172 fastboot_okay("");
2173 reboot_device(FASTBOOT_MODE);
2174}
2175
2176void cmd_oem_enable_charger_screen(const char *arg, void *data, unsigned size)
2177{
2178 dprintf(INFO, "Enabling charger screen check\n");
2179 device.charger_screen_enabled = 1;
2180 write_device_info(&device);
2181 fastboot_okay("");
2182}
2183
2184void cmd_oem_disable_charger_screen(const char *arg, void *data, unsigned size)
2185{
2186 dprintf(INFO, "Disabling charger screen check\n");
2187 device.charger_screen_enabled = 0;
2188 write_device_info(&device);
2189 fastboot_okay("");
2190}
2191
2192void cmd_oem_select_display_panel(const char *arg, void *data, unsigned size)
2193{
2194 dprintf(INFO, "Selecting display panel %s\n", arg);
2195 if (arg)
2196 strlcpy(device.display_panel, arg,
2197 sizeof(device.display_panel));
2198 write_device_info(&device);
2199 fastboot_okay("");
2200}
2201
2202void cmd_oem_unlock(const char *arg, void *data, unsigned sz)
2203{
2204 if(!device.is_unlocked)
2205 {
2206 device.is_unlocked = 1;
2207 write_device_info(&device);
2208 }
2209 fastboot_okay("");
2210}
2211
2212void cmd_oem_devinfo(const char *arg, void *data, unsigned sz)
2213{
2214 char response[128];
2215 snprintf(response, sizeof(response), "\tDevice tampered: %s", (device.is_tampered ? "true" : "false"));
2216 fastboot_info(response);
2217 snprintf(response, sizeof(response), "\tDevice unlocked: %s", (device.is_unlocked ? "true" : "false"));
2218 fastboot_info(response);
2219 snprintf(response, sizeof(response), "\tCharger screen enabled: %s", (device.charger_screen_enabled ? "true" : "false"));
2220 fastboot_info(response);
2221 snprintf(response, sizeof(response), "\tDisplay panel: %s", (device.display_panel));
2222 fastboot_info(response);
2223 fastboot_okay("");
2224}
2225
2226void cmd_preflash(const char *arg, void *data, unsigned sz)
2227{
2228 fastboot_okay("");
2229}
2230
2231static struct fbimage logo_header = {0};
2232struct fbimage* splash_screen_flash();
2233
2234int splash_screen_check_header(struct fbimage *logo)
2235{
2236 if (memcmp(logo->header.magic, LOGO_IMG_MAGIC, 8))
2237 return -1;
2238 if (logo->header.width == 0 || logo->header.height == 0)
2239 return -1;
2240 return 0;
2241}
2242
2243struct fbimage* splash_screen_flash()
2244{
2245 struct ptentry *ptn;
2246 struct ptable *ptable;
2247 struct fbcon_config *fb_display = NULL;
2248 struct fbimage *logo = &logo_header;
2249
2250
2251 ptable = flash_get_ptable();
2252 if (ptable == NULL) {
2253 dprintf(CRITICAL, "ERROR: Partition table not found\n");
2254 return NULL;
2255 }
2256 ptn = ptable_find(ptable, "splash");
2257 if (ptn == NULL) {
2258 dprintf(CRITICAL, "ERROR: splash Partition not found\n");
2259 return NULL;
2260 }
2261
2262 if (flash_read(ptn, 0,(unsigned int *) logo, sizeof(logo->header))) {
2263 dprintf(CRITICAL, "ERROR: Cannot read boot image header\n");
2264 return NULL;
2265 }
2266
2267 if (splash_screen_check_header(logo)) {
2268 dprintf(CRITICAL, "ERROR: Boot image header invalid\n");
2269 return NULL;
2270 }
2271
2272 fb_display = fbcon_display();
2273 if (fb_display) {
2274 uint8_t *base = (uint8_t *) fb_display->base;
2275 if (logo->header.width != fb_display->width || logo->header.height != fb_display->height) {
2276 base += LOGO_IMG_OFFSET;
2277 }
2278
2279 if (flash_read(ptn + sizeof(logo->header), 0,
2280 base,
2281 ((((logo->header.width * logo->header.height * fb_display->bpp/8) + 511) >> 9) << 9))) {
2282 fbcon_clear();
2283 dprintf(CRITICAL, "ERROR: Cannot read splash image\n");
2284 return NULL;
2285 }
2286 logo->image = base;
2287 }
2288
2289 return logo;
2290}
2291
2292struct fbimage* splash_screen_mmc()
2293{
2294 int index = INVALID_PTN;
2295 unsigned long long ptn = 0;
2296 struct fbcon_config *fb_display = NULL;
2297 struct fbimage *logo = &logo_header;
2298
2299 index = partition_get_index("splash");
2300 if (index == 0) {
2301 dprintf(CRITICAL, "ERROR: splash Partition table not found\n");
2302 return NULL;
2303 }
2304
2305 ptn = partition_get_offset(index);
2306 if (ptn == 0) {
2307 dprintf(CRITICAL, "ERROR: splash Partition invalid\n");
2308 return NULL;
2309 }
2310
2311 if (mmc_read(ptn, (unsigned int *) logo, sizeof(logo->header))) {
2312 dprintf(CRITICAL, "ERROR: Cannot read splash image header\n");
2313 return NULL;
2314 }
2315
2316 if (splash_screen_check_header(logo)) {
2317 dprintf(CRITICAL, "ERROR: Splash image header invalid\n");
2318 return NULL;
2319 }
2320
2321 fb_display = fbcon_display();
2322 if (fb_display) {
2323 uint8_t *base = (uint8_t *) fb_display->base;
2324 if (logo->header.width != fb_display->width || logo->header.height != fb_display->height)
2325 base += LOGO_IMG_OFFSET;
2326
2327 if (mmc_read(ptn + sizeof(logo->header),
2328 base,
2329 ((((logo->header.width * logo->header.height * fb_display->bpp/8) + 511) >> 9) << 9))) {
2330 fbcon_clear();
2331 dprintf(CRITICAL, "ERROR: Cannot read splash image\n");
2332 return NULL;
2333 }
2334
2335 logo->image = base;
2336 }
2337
2338 return logo;
2339}
2340
2341
2342struct fbimage* fetch_image_from_partition()
2343{
2344 if (target_is_emmc_boot()) {
2345 return splash_screen_mmc();
2346 } else {
2347 return splash_screen_flash();
2348 }
2349}
2350
2351/* Get the size from partiton name */
2352static void get_partition_size(const char *arg, char *response)
2353{
2354 uint64_t ptn = 0;
2355 uint64_t size;
2356 int index = INVALID_PTN;
2357
2358 index = partition_get_index(arg);
2359
2360 if (index == INVALID_PTN)
2361 {
2362 dprintf(CRITICAL, "Invalid partition index\n");
2363 return;
2364 }
2365
2366 ptn = partition_get_offset(index);
2367
2368 if(!ptn)
2369 {
2370 dprintf(CRITICAL, "Invalid partition name %s\n", arg);
2371 return;
2372 }
2373
2374 size = partition_get_size(index);
2375
2376 snprintf(response, MAX_RSP_SIZE, "\t 0x%llx", size);
2377 return;
2378}
2379
2380/*
2381 * Publish the partition type & size info
2382 * fastboot getvar will publish the required information.
2383 * fastboot getvar partition_size:<partition_name>: partition size in hex
2384 * fastboot getvar partition_type:<partition_name>: partition type (ext/fat)
2385 */
2386static void publish_getvar_partition_info(struct getvar_partition_info *info, uint8_t num_parts)
2387{
2388 uint8_t i;
2389
2390 for (i = 0; i < num_parts; i++) {
2391 get_partition_size(info[i].part_name, info[i].size_response);
2392
2393 if (strlcat(info[i].getvar_size, info[i].part_name, MAX_GET_VAR_NAME_SIZE) >= MAX_GET_VAR_NAME_SIZE)
2394 {
2395 dprintf(CRITICAL, "partition size name truncated\n");
2396 return;
2397 }
2398 if (strlcat(info[i].getvar_type, info[i].part_name, MAX_GET_VAR_NAME_SIZE) >= MAX_GET_VAR_NAME_SIZE)
2399 {
2400 dprintf(CRITICAL, "partition type name truncated\n");
2401 return;
2402 }
2403
2404 /* publish partition size & type info */
2405 fastboot_publish((const char *) info[i].getvar_size, (const char *) info[i].size_response);
2406 fastboot_publish((const char *) info[i].getvar_type, (const char *) info[i].type_response);
2407 }
2408}
2409
2410/* register commands and variables for fastboot */
2411void aboot_fastboot_register_commands(void)
2412{
2413 if (target_is_emmc_boot())
2414 {
2415 fastboot_register("flash:", cmd_flash_mmc);
2416 fastboot_register("erase:", cmd_erase_mmc);
2417 }
2418 else
2419 {
2420 fastboot_register("flash:", cmd_flash);
2421 fastboot_register("erase:", cmd_erase);
2422 }
2423
2424 fastboot_register("boot", cmd_boot);
2425 fastboot_register("continue", cmd_continue);
2426 fastboot_register("reboot", cmd_reboot);
2427 fastboot_register("reboot-bootloader", cmd_reboot_bootloader);
2428 fastboot_register("oem unlock", cmd_oem_unlock);
2429 fastboot_register("oem device-info", cmd_oem_devinfo);
2430 fastboot_register("preflash", cmd_preflash);
2431 fastboot_register("oem enable-charger-screen",
2432 cmd_oem_enable_charger_screen);
2433 fastboot_register("oem disable-charger-screen",
2434 cmd_oem_disable_charger_screen);
2435 fastboot_register("oem select-display-panel",
2436 cmd_oem_select_display_panel);
2437 /* publish variables and their values */
2438 fastboot_publish("product", TARGET(BOARD));
2439 fastboot_publish("kernel", "lk");
2440 fastboot_publish("serialno", sn_buf);
2441
2442 /*
2443 * partition info is supported only for emmc partitions
2444 * Calling this for NAND prints some error messages which
2445 * is harmless but misleading. Avoid calling this for NAND
2446 * devices.
2447 */
2448 if (target_is_emmc_boot())
2449 publish_getvar_partition_info(part_info, ARRAY_SIZE(part_info));
2450
2451 /* Max download size supported */
2452 snprintf(max_download_size, MAX_RSP_SIZE, "\t0x%x",
2453 target_get_max_flash_size());
2454 fastboot_publish("max-download-size", (const char *) max_download_size);
2455 /* Is the charger screen check enabled */
2456 snprintf(charger_screen_enabled, MAX_RSP_SIZE, "%d",
2457 device.charger_screen_enabled);
2458 fastboot_publish("charger-screen-enabled",
2459 (const char *) charger_screen_enabled);
2460 snprintf(panel_display_mode, MAX_RSP_SIZE, "%s",
2461 device.display_panel);
2462 fastboot_publish("display-panel",
2463 (const char *) panel_display_mode);
2464}
2465
2466void aboot_init(const struct app_descriptor *app)
2467{
2468 unsigned reboot_mode = 0;
2469 bool boot_into_fastboot = false;
2470
2471 /* Setup page size information for nv storage */
2472 if (target_is_emmc_boot())
2473 {
2474 page_size = mmc_page_size();
2475 page_mask = page_size - 1;
2476 }
2477 else
2478 {
2479 page_size = flash_page_size();
2480 page_mask = page_size - 1;
2481 }
2482
2483 ASSERT((MEMBASE + MEMSIZE) > MEMBASE);
2484
2485 read_device_info(&device);
2486
2487 /* Display splash screen if enabled */
2488#if DISPLAY_SPLASH_SCREEN
2489 dprintf(SPEW, "Display Init: Start\n");
2490 target_display_init(device.display_panel);
2491 dprintf(SPEW, "Display Init: Done\n");
2492#endif
2493
2494
2495 target_serialno((unsigned char *) sn_buf);
2496 dprintf(SPEW,"serial number: %s\n",sn_buf);
2497
2498 memset(display_panel_buf, '\0', MAX_PANEL_BUF_SIZE);
2499
2500 /* Check if we should do something other than booting up */
2501 if (keys_get_state(KEY_VOLUMEUP) && keys_get_state(KEY_VOLUMEDOWN))
2502 {
2503 dprintf(ALWAYS,"dload mode key sequence detected\n");
2504 if (set_download_mode(EMERGENCY_DLOAD))
2505 {
2506 dprintf(CRITICAL,"dload mode not supported by target\n");
2507 }
2508 else
2509 {
2510 reboot_device(DLOAD);
2511 dprintf(CRITICAL,"Failed to reboot into dload mode\n");
2512 }
2513 boot_into_fastboot = true;
2514 }
2515 if (!boot_into_fastboot)
2516 {
2517 if (keys_get_state(KEY_HOME) || keys_get_state(KEY_VOLUMEUP))
2518 boot_into_recovery = 1;
2519 if (!boot_into_recovery &&
2520 (keys_get_state(KEY_BACK) || keys_get_state(KEY_VOLUMEDOWN)))
2521 boot_into_fastboot = true;
2522 }
2523 #if NO_KEYPAD_DRIVER
2524 if (fastboot_trigger())
2525 boot_into_fastboot = true;
2526 #endif
2527
2528 reboot_mode = check_reboot_mode();
2529 if (reboot_mode == RECOVERY_MODE) {
2530 boot_into_recovery = 1;
2531 } else if(reboot_mode == FASTBOOT_MODE) {
2532 boot_into_fastboot = true;
2533 }
2534
2535 if (!boot_into_fastboot)
2536 {
2537 if (target_is_emmc_boot())
2538 {
2539 if(emmc_recovery_init())
2540 dprintf(ALWAYS,"error in emmc_recovery_init\n");
2541 if(target_use_signed_kernel())
2542 {
2543 if((device.is_unlocked) || (device.is_tampered))
2544 {
2545 #ifdef TZ_TAMPER_FUSE
2546 set_tamper_fuse_cmd();
2547 #endif
2548 #if USE_PCOM_SECBOOT
2549 set_tamper_flag(device.is_tampered);
2550 #endif
2551 }
2552 }
2553 boot_linux_from_mmc();
2554 }
2555 else
2556 {
2557 recovery_init();
2558 #if USE_PCOM_SECBOOT
2559 if((device.is_unlocked) || (device.is_tampered))
2560 set_tamper_flag(device.is_tampered);
2561 #endif
2562 boot_linux_from_flash();
2563 }
2564 dprintf(CRITICAL, "ERROR: Could not do normal boot. Reverting "
2565 "to fastboot mode.\n");
2566 }
2567
2568 /* We are here means regular boot did not happen. Start fastboot. */
2569
2570 /* register aboot specific fastboot commands */
2571 aboot_fastboot_register_commands();
2572
2573 /* dump partition table for debug info */
2574 partition_dump();
2575
2576 /* initialize and start fastboot */
2577 fastboot_init(target_get_scratch_address(), target_get_max_flash_size());
2578}
2579
2580uint32_t get_page_size()
2581{
2582 return page_size;
2583}
2584
2585/*
2586 * Calculated and save hash (SHA256) for non-signed boot image.
2587 *
2588 * Hash the same data that is checked on the signed boot image.
2589 * Kernel and Ramdisk are already read to memory buffers.
2590 * Need to read the entire device-tree from mmc
2591 * since non-signed image only read the DT tags of the relevant platform.
2592 *
2593 * @param kernel_addr - kernel bufer
2594 * @param kernel_actual - kernel size in bytes
2595 * @param ramdisk_addr - ramdisk buffer
2596 * @param ramdisk_actual - ramdisk size
2597 * @param ptn - partition
2598 * @param dt_offset - device tree offset on mmc partition
2599 * @param dt_size
2600 *
2601 * @return int - 0 on success, negative value on failure.
2602 */
2603int aboot_save_boot_hash_mmc(void *kernel_addr, unsigned kernel_actual,
2604 void *ramdisk_addr, unsigned ramdisk_actual,
2605 unsigned long long ptn,
2606 unsigned dt_offset, unsigned dt_size)
2607{
2608 SHA256_CTX sha256_ctx;
2609 char digest[32]={0};
2610 char *buf = (char *)target_get_scratch_address();
2611 unsigned dt_actual = ROUND_TO_PAGE(dt_size, page_mask);
2612 unsigned imagesize_actual = page_size + kernel_actual + ramdisk_actual + dt_actual;
2613
2614 SHA256_Init(&sha256_ctx);
2615
2616 /* Read Boot Header */
2617 if (mmc_read(ptn, buf, page_size))
2618 {
2619 dprintf(CRITICAL, "ERROR: mmc_read() fail.\n");
2620 return -1;
2621 }
2622 /* Read entire Device Tree */
2623 if (mmc_read(ptn + dt_offset, buf+page_size, dt_actual))
2624 {
2625 dprintf(CRITICAL, "ERROR: mmc_read() fail.\n");
2626 return -1;
2627 }
2628 SHA256_Update(&sha256_ctx, buf, page_size); // Boot Header
2629 SHA256_Update(&sha256_ctx, kernel_addr, kernel_actual);
2630 SHA256_Update(&sha256_ctx, ramdisk_addr, ramdisk_actual);
2631 SHA256_Update(&sha256_ctx, buf+page_size, dt_actual); // Device Tree
2632
2633 SHA256_Final(digest, &sha256_ctx);
2634
2635 save_kernel_hash_cmd(digest);
2636 dprintf(INFO, "aboot_save_boot_hash_mmc: imagesize_actual size %d bytes.\n", (int) imagesize_actual);
2637
2638 return 0;
2639}
2640
2641APP_START(aboot)
2642 .init = aboot_init,
2643APP_END