sysboot.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // SPDX-License-Identifier: GPL-2.0+
  2. #include <common.h>
  3. #include <command.h>
  4. #include <env.h>
  5. #include <fs.h>
  6. #include "pxe_utils.h"
  7. static char *fs_argv[5];
  8. static int do_get_ext2(cmd_tbl_t *cmdtp, const char *file_path, char *file_addr)
  9. {
  10. #ifdef CONFIG_CMD_EXT2
  11. fs_argv[0] = "ext2load";
  12. fs_argv[3] = file_addr;
  13. fs_argv[4] = (void *)file_path;
  14. if (!do_ext2load(cmdtp, 0, 5, fs_argv))
  15. return 1;
  16. #endif
  17. return -ENOENT;
  18. }
  19. static int do_get_fat(cmd_tbl_t *cmdtp, const char *file_path, char *file_addr)
  20. {
  21. #ifdef CONFIG_CMD_FAT
  22. fs_argv[0] = "fatload";
  23. fs_argv[3] = file_addr;
  24. fs_argv[4] = (void *)file_path;
  25. if (!do_fat_fsload(cmdtp, 0, 5, fs_argv))
  26. return 1;
  27. #endif
  28. return -ENOENT;
  29. }
  30. static int do_get_any(cmd_tbl_t *cmdtp, const char *file_path, char *file_addr)
  31. {
  32. #ifdef CONFIG_CMD_FS_GENERIC
  33. fs_argv[0] = "load";
  34. fs_argv[3] = file_addr;
  35. fs_argv[4] = (void *)file_path;
  36. if (!do_load(cmdtp, 0, 5, fs_argv, FS_TYPE_ANY))
  37. return 1;
  38. #endif
  39. return -ENOENT;
  40. }
  41. /*
  42. * Boots a system using a local disk syslinux/extlinux file
  43. *
  44. * Returns 0 on success, 1 on error.
  45. */
  46. static int do_sysboot(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  47. {
  48. unsigned long pxefile_addr_r;
  49. struct pxe_menu *cfg;
  50. char *pxefile_addr_str;
  51. char *filename;
  52. int prompt = 0;
  53. is_pxe = false;
  54. if (argc > 1 && strstr(argv[1], "-p")) {
  55. prompt = 1;
  56. argc--;
  57. argv++;
  58. }
  59. if (argc < 4)
  60. return cmd_usage(cmdtp);
  61. if (argc < 5) {
  62. pxefile_addr_str = from_env("pxefile_addr_r");
  63. if (!pxefile_addr_str)
  64. return 1;
  65. } else {
  66. pxefile_addr_str = argv[4];
  67. }
  68. if (argc < 6) {
  69. filename = env_get("bootfile");
  70. } else {
  71. filename = argv[5];
  72. env_set("bootfile", filename);
  73. }
  74. if (strstr(argv[3], "ext2")) {
  75. do_getfile = do_get_ext2;
  76. } else if (strstr(argv[3], "fat")) {
  77. do_getfile = do_get_fat;
  78. } else if (strstr(argv[3], "any")) {
  79. do_getfile = do_get_any;
  80. } else {
  81. printf("Invalid filesystem: %s\n", argv[3]);
  82. return 1;
  83. }
  84. fs_argv[1] = argv[1];
  85. fs_argv[2] = argv[2];
  86. if (strict_strtoul(pxefile_addr_str, 16, &pxefile_addr_r) < 0) {
  87. printf("Invalid pxefile address: %s\n", pxefile_addr_str);
  88. return 1;
  89. }
  90. if (get_pxe_file(cmdtp, filename, pxefile_addr_r) < 0) {
  91. printf("Error reading config file\n");
  92. return 1;
  93. }
  94. cfg = parse_pxefile(cmdtp, pxefile_addr_r);
  95. if (!cfg) {
  96. printf("Error parsing config file\n");
  97. return 1;
  98. }
  99. if (prompt)
  100. cfg->prompt = 1;
  101. handle_pxe_menu(cmdtp, cfg);
  102. destroy_pxe_menu(cfg);
  103. return 0;
  104. }
  105. U_BOOT_CMD(sysboot, 7, 1, do_sysboot,
  106. "command to get and boot from syslinux files",
  107. "[-p] <interface> <dev[:part]> <ext2|fat|any> [addr] [filename]\n"
  108. " - load and parse syslinux menu file 'filename' from ext2, fat\n"
  109. " or any filesystem on 'dev' on 'interface' to address 'addr'"
  110. );