1 /* SPDX-License-Identifier: GPL-2.0-only */
2
3 #include <bootblock_common.h>
4 #include <commonlib/bsd/compression.h>
5 #include <delay.h>
6 #include <metadata_hash.h>
7 #include <program_loading.h>
8 #include <symbols.h>
9 #include <timestamp.h>
10
11 extern u8 compressed_bootblock[];
12 asm (
13 ".pushsection .data.compressed_bootblock,\"a\",@progbits\n\t"
14 ".type compressed_bootblock, %object\n\t"
15 ".balign 8\n"
16 "compressed_bootblock:\n\t"
17 ".incbin \"" __BUILD_DIR__ "/cbfs/" CONFIG_CBFS_PREFIX "/bootblock.lz4\"\n\t"
18 ".size compressed_bootblock, . - compressed_bootblock\n\t"
19 ".popsection\n\t"
20 );
21
22 struct bootblock_arg arg = {
23 .base_timestamp = 0,
24 .num_timestamps = 2,
25 .timestamps = {
26 { .entry_id = TS_ULZ4F_START },
27 { .entry_id = TS_ULZ4F_END },
28 },
29 };
30
31 struct prog prog_bootblock = {
32 .type = PROG_BOOTBLOCK,
33 .entry = (void *)_bootblock,
34 .arg = &arg,
35 };
36
decompressor_soc_init(void)37 __weak void decompressor_soc_init(void) { /* no-op */ }
38
main(void)39 void main(void)
40 {
41 init_timer();
42
43 if (CONFIG(COLLECT_TIMESTAMPS))
44 arg.base_timestamp = timestamp_get();
45
46 if (CONFIG(CBFS_VERIFICATION))
47 arg.metadata_hash_anchor = metadata_hash_export_anchor();
48
49 decompressor_soc_init();
50
51 if (CONFIG(COLLECT_TIMESTAMPS))
52 arg.timestamps[0].entry_stamp = timestamp_get();
53
54 size_t out_size = ulz4f(compressed_bootblock, _bootblock);
55 prog_segment_loaded((uintptr_t)_bootblock, out_size, SEG_FINAL);
56
57 if (CONFIG(COLLECT_TIMESTAMPS))
58 arg.timestamps[1].entry_stamp = timestamp_get();
59
60 prog_run(&prog_bootblock);
61 }
62