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 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | // SPDX-License-Identifier: GPL-2.0+ /* * Copyright (c) 2011 The Chromium OS Authors. * (C) Copyright 2002 * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se> */ #define LOG_CATEGORY LOGC_BOOT #include <command.h> #include <env.h> #include <mapmem.h> #include <vsprintf.h> #include <asm/zimage.h> static int do_zboot_start(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { ulong bzimage_addr = 0, bzimage_size, initrd_addr, initrd_size; const char *s, *cmdline; ulong base_addr; int i; log_debug("argc %d:", argc); for (i = 0; i < argc; i++) log_debug(" %s", argv[i]); log_debug("\n"); /* argv[1] holds the address of the bzImage */ s = cmd_arg1(argc, argv) ? : env_get("fileaddr"); if (s) bzimage_addr = hextoul(s, NULL); bzimage_size = argc > 2 ? hextoul(argv[2], NULL) : 0; initrd_addr = argc > 3 ? hextoul(argv[3], NULL) : 0; initrd_size = argc > 4 ? hextoul(argv[4], NULL) : 0; base_addr = argc > 5 ? hextoul(argv[5], NULL) : 0; cmdline = argc > 6 ? env_get(argv[6]) : NULL; zboot_start(bzimage_addr, bzimage_size, initrd_addr, initrd_size, base_addr, cmdline); return 0; } static int do_zboot_load(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { int ret; ret = zboot_load(); if (ret) return ret; return 0; } static int do_zboot_setup(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { if (!state.base_ptr) { printf("base is not set: use 'zboot load' first\n"); return CMD_RET_FAILURE; } if (zboot_setup()) { puts("Setting up boot parameters failed ...\n"); return CMD_RET_FAILURE; } if (zboot_setup()) return CMD_RET_FAILURE; return 0; } static int do_zboot_info(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { zboot_info(); return 0; } static int do_zboot_go(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { int ret; ret = zboot_go(); if (ret) { printf("Kernel returned! (err=%d)\n", ret); return CMD_RET_FAILURE; } return 0; } static int do_zboot_dump(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { struct boot_params *base_ptr = state.base_ptr; if (argc > 1) base_ptr = (void *)hextoul(argv[1], NULL); if (!base_ptr) { printf("No zboot setup_base\n"); return CMD_RET_FAILURE; } zimage_dump(base_ptr, true); return 0; } /* Note: This defines the complete_zboot() function */ U_BOOT_SUBCMDS(zboot, U_BOOT_CMD_MKENT(start, 8, 1, do_zboot_start, "", ""), U_BOOT_CMD_MKENT(load, 1, 1, do_zboot_load, "", ""), U_BOOT_CMD_MKENT(setup, 1, 1, do_zboot_setup, "", ""), U_BOOT_CMD_MKENT(info, 1, 1, do_zboot_info, "", ""), U_BOOT_CMD_MKENT(go, 1, 1, do_zboot_go, "", ""), U_BOOT_CMD_MKENT(dump, 2, 1, do_zboot_dump, "", ""), ) int do_zboot_states(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[], int state_mask) { int ret = 0; log_debug("state_mask %x\n", state_mask); if (state_mask & ZBOOT_STATE_START) ret = do_zboot_start(cmdtp, flag, argc, argv); if (!ret && (state_mask & ZBOOT_STATE_LOAD)) ret = do_zboot_load(cmdtp, flag, argc, argv); if (!ret && (state_mask & ZBOOT_STATE_SETUP)) ret = do_zboot_setup(cmdtp, flag, argc, argv); if (!ret && (state_mask & ZBOOT_STATE_INFO)) ret = do_zboot_info(cmdtp, flag, argc, argv); if (!ret && (state_mask & ZBOOT_STATE_GO)) ret = do_zboot_go(cmdtp, flag, argc, argv); if (ret) return ret; return 0; } int do_zboot_parent(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[], int *repeatable) { /* determine if we have a sub command */ if (argc > 1) { char *endp; hextoul(argv[1], &endp); /* * endp pointing to nul means that argv[1] was just a valid * number, so pass it along to the normal processing */ if (*endp) return do_zboot(cmdtp, flag, argc, argv, repeatable); } do_zboot_states(cmdtp, flag, argc, argv, ZBOOT_STATE_START | ZBOOT_STATE_LOAD | ZBOOT_STATE_SETUP | ZBOOT_STATE_INFO | ZBOOT_STATE_GO); return CMD_RET_FAILURE; } U_BOOT_CMDREP_COMPLETE( zboot, 8, do_zboot_parent, "Boot bzImage", "[addr] [size] [initrd addr] [initrd size] [setup] [cmdline]\n" " addr - The optional starting address of the bzimage.\n" " If not set it defaults to the environment\n" " variable \"fileaddr\".\n" " size - The optional size of the bzimage. Defaults to\n" " zero.\n" " initrd addr - The address of the initrd image to use, if any.\n" " initrd size - The size of the initrd image to use, if any.\n" " setup - The address of the kernel setup region, if this\n" " is not at addr\n" " cmdline - Environment variable containing the kernel\n" " command line, to override U-Boot's normal\n" " cmdline generation\n" "\n" "Sub-commands to do part of the zboot sequence:\n" "\tstart [addr [arg ...]] - specify arguments\n" "\tload - load OS image\n" "\tsetup - set up table\n" "\tinfo - show summary info\n" "\tgo - start OS\n" "\tdump [addr] - dump info (optional address of boot params)", complete_zboot ); |