Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | // SPDX-License-Identifier: GPL-2.0+ /* * Copyright (c) 2016 Google, Inc */ #include <common.h> #include <dm.h> #include <hang.h> #include <handoff.h> #include <init.h> #include <log.h> #include <os.h> #include <spl.h> #include <asm/global_data.h> #include <asm/spl.h> #include <asm/state.h> #include <test/ut.h> DECLARE_GLOBAL_DATA_PTR; int sandbox_find_next_phase(char *fname, int maxlen, bool use_img) { const char *cur_prefix, *next_prefix; int ret; cur_prefix = spl_phase_prefix(spl_phase()); next_prefix = spl_phase_prefix(spl_next_phase()); ret = os_find_u_boot(fname, maxlen, use_img, cur_prefix, next_prefix); if (ret) return log_msg_ret("find", ret); return 0; } /* SPL / TPL / VPL init function */ void board_init_f(ulong flag) { struct sandbox_state *state = state_get_current(); int ret; gd->arch.ram_buf = state->ram_buf; gd->ram_size = state->ram_size; ret = spl_early_init(); if (ret) { debug("spl_early_init() failed: %d\n", ret); hang(); } preloader_console_init(); } u32 spl_boot_device(void) { return BOOT_DEVICE_BOARD; } static int spl_board_load_image(struct spl_image_info *spl_image, struct spl_boot_device *bootdev) { char fname[256]; int ret; ret = sandbox_find_next_phase(fname, sizeof(fname), false); if (ret) { printf("(%s not found, error %d)\n", fname, ret); return ret; } /* * Set up spl_image to boot from jump_to_image_no_args(). Allocate this * outsdide the RAM buffer (i.e. don't use strdup()). */ spl_image->arg = os_malloc(strlen(fname) + 1); if (!spl_image->arg) return log_msg_ret("exec", -ENOMEM); strcpy(spl_image->arg, fname); return 0; } SPL_LOAD_IMAGE_METHOD("sandbox", 9, BOOT_DEVICE_BOARD, spl_board_load_image); void spl_board_init(void) { struct sandbox_state *state = state_get_current(); if (state->run_unittests) { struct unit_test *tests = UNIT_TEST_ALL_START(); const int count = UNIT_TEST_ALL_COUNT(); int ret; ret = ut_run_list("spl", NULL, tests, count, state->select_unittests); /* continue execution into U-Boot */ } } void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image) { const char *fname = spl_image->arg; if (fname) { os_fd_restore(); os_spl_to_uboot(fname); } else { printf("No filename provided for U-Boot\n"); } hang(); } int handoff_arch_save(struct spl_handoff *ho) { ho->arch.magic = TEST_HANDOFF_MAGIC; return 0; } |