cmdline_early.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. #include <linux/types.h>
  3. #include <linux/init.h>
  4. #include <linux/libfdt.h>
  5. #include <linux/string.h>
  6. #include <asm/pgtable.h>
  7. #include <asm/setup.h>
  8. #include "pi.h"
  9. static char early_cmdline[COMMAND_LINE_SIZE];
  10. static char *get_early_cmdline(uintptr_t dtb_pa)
  11. {
  12. const char *fdt_cmdline = NULL;
  13. unsigned int fdt_cmdline_size = 0;
  14. int chosen_node;
  15. if (!IS_ENABLED(CONFIG_CMDLINE_FORCE)) {
  16. chosen_node = fdt_path_offset((void *)dtb_pa, "/chosen");
  17. if (chosen_node >= 0) {
  18. fdt_cmdline = fdt_getprop((void *)dtb_pa, chosen_node,
  19. "bootargs", NULL);
  20. if (fdt_cmdline) {
  21. fdt_cmdline_size = strlen(fdt_cmdline);
  22. strscpy(early_cmdline, fdt_cmdline,
  23. COMMAND_LINE_SIZE);
  24. }
  25. }
  26. }
  27. if (IS_ENABLED(CONFIG_CMDLINE_EXTEND) ||
  28. IS_ENABLED(CONFIG_CMDLINE_FORCE) ||
  29. fdt_cmdline_size == 0 /* CONFIG_CMDLINE_FALLBACK */) {
  30. strlcat(early_cmdline, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
  31. }
  32. return early_cmdline;
  33. }
  34. static u64 match_noXlvl(char *cmdline)
  35. {
  36. if (strstr(cmdline, "no4lvl"))
  37. return SATP_MODE_48;
  38. else if (strstr(cmdline, "no5lvl"))
  39. return SATP_MODE_57;
  40. return 0;
  41. }
  42. u64 set_satp_mode_from_cmdline(uintptr_t dtb_pa)
  43. {
  44. char *cmdline = get_early_cmdline(dtb_pa);
  45. return match_noXlvl(cmdline);
  46. }
  47. static bool match_nokaslr(char *cmdline)
  48. {
  49. return strstr(cmdline, "nokaslr");
  50. }
  51. bool set_nokaslr_from_cmdline(uintptr_t dtb_pa)
  52. {
  53. char *cmdline = get_early_cmdline(dtb_pa);
  54. return match_nokaslr(cmdline);
  55. }