| /* |
| * This file is part of the coreboot project. |
| * |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License as |
| * published by the Free Software Foundation; version 2 of |
| * the License. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| */ |
| |
| #include <bootblock_common.h> |
| #include <commonlib/bsd/compression.h> |
| #include <delay.h> |
| #include <program_loading.h> |
| #include <symbols.h> |
| #include <timestamp.h> |
| |
| extern u8 compressed_bootblock[]; |
| asm ( |
| ".pushsection .data.compressed_bootblock,\"a\",@progbits\n\t" |
| ".type compressed_bootblock, %object\n\t" |
| ".balign 8\n" |
| "compressed_bootblock:\n\t" |
| ".incbin \"" __BUILD_DIR__ "/cbfs/" CONFIG_CBFS_PREFIX "/bootblock.lz4\"\n\t" |
| ".size compressed_bootblock, . - compressed_bootblock\n\t" |
| ".popsection\n\t" |
| ); |
| |
| struct bootblock_arg arg = { |
| .base_timestamp = 0, |
| .num_timestamps = 2, |
| .timestamps = { |
| { .entry_id = TS_START_ULZ4F }, |
| { .entry_id = TS_END_ULZ4F }, |
| }, |
| }; |
| |
| struct prog prog_bootblock = { |
| .type = PROG_BOOTBLOCK, |
| .entry = (void *)_bootblock, |
| .arg = &arg, |
| }; |
| |
| __weak void decompressor_soc_init(void) { /* no-op */ } |
| |
| void main(void) |
| { |
| init_timer(); |
| |
| if (CONFIG(COLLECT_TIMESTAMPS)) |
| arg.base_timestamp = timestamp_get(); |
| |
| decompressor_soc_init(); |
| |
| if (CONFIG(COLLECT_TIMESTAMPS)) |
| arg.timestamps[0].entry_stamp = timestamp_get(); |
| |
| size_t out_size = ulz4f(compressed_bootblock, _bootblock); |
| prog_segment_loaded((uintptr_t)_bootblock, out_size, SEG_FINAL); |
| |
| if (CONFIG(COLLECT_TIMESTAMPS)) |
| arg.timestamps[1].entry_stamp = timestamp_get(); |
| |
| prog_run(&prog_bootblock); |
| } |