cmd_boot.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. /*
  2. * (C) Copyright 2008-2011
  3. * Graeme Russ, <graeme.russ@gmail.com>
  4. *
  5. * (C) Copyright 2002
  6. * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
  7. *
  8. * (C) Copyright 2002
  9. * Wolfgang Denk, DENX Software Engineering, <wd@denx.de>
  10. *
  11. * (C) Copyright 2002
  12. * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
  13. * Marius Groeger <mgroeger@sysgo.de>
  14. *
  15. * Copyright 2015 ATS Advanced Telematics Systems GmbH
  16. * Copyright 2015 Konsulko Group, Matt Porter <mporter@konsulko.com>
  17. *
  18. * SPDX-License-Identifier: GPL-2.0+
  19. */
  20. #include <common.h>
  21. #include <command.h>
  22. DECLARE_GLOBAL_DATA_PTR;
  23. /*
  24. * ARMv7M does not support ARM instruction mode. However, the
  25. * interworking BLX and BX instructions do encode the ARM/Thumb
  26. * field in bit 0. This means that when executing any Branch
  27. * and eXchange instruction we must set bit 0 to one to guarantee
  28. * that we keep the processor in Thumb instruction mode. From The
  29. * ARMv7-M Instruction Set A4.1.1:
  30. * "ARMv7-M only supports the Thumb instruction execution state,
  31. * therefore the value of address bit [0] must be 1 in interworking
  32. * instructions, otherwise a fault occurs."
  33. */
  34. unsigned long do_go_exec(ulong (*entry)(int, char * const []),
  35. int argc, char * const argv[])
  36. {
  37. ulong addr = (ulong)entry | 1;
  38. entry = (void *)addr;
  39. return entry(argc, argv);
  40. }