start.S 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * armboot - Startup Code for ARM720 CPU-core
  3. *
  4. * Copyright (c) 2001 Marius Gröger <mag@sysgo.de>
  5. * Copyright (c) 2002 Alex Züpke <azu@sysgo.de>
  6. *
  7. * SPDX-License-Identifier: GPL-2.0+
  8. */
  9. #include <asm-offsets.h>
  10. #include <config.h>
  11. /*
  12. *************************************************************************
  13. *
  14. * Startup Code (reset vector)
  15. *
  16. * do important init only if we don't start from RAM!
  17. * relocate armboot to ram
  18. * setup stack
  19. * jump to second stage
  20. *
  21. *************************************************************************
  22. */
  23. .globl reset
  24. reset:
  25. /*
  26. * set the cpu to SVC32 mode
  27. */
  28. mrs r0,cpsr
  29. bic r0,r0,#0x1f
  30. orr r0,r0,#0xd3
  31. msr cpsr,r0
  32. /*
  33. * we do sys-critical inits only at reboot,
  34. * not when booting from ram!
  35. */
  36. #if !defined(CONFIG_SKIP_LOWLEVEL_INIT) && \
  37. !defined(CONFIG_SKIP_LOWLEVEL_INIT_ONLY)
  38. bl cpu_init_crit
  39. #endif
  40. bl _main
  41. /*------------------------------------------------------------------------------*/
  42. .globl c_runtime_cpu_setup
  43. c_runtime_cpu_setup:
  44. mov pc, lr
  45. /*
  46. *************************************************************************
  47. *
  48. * CPU_init_critical registers
  49. *
  50. * setup important registers
  51. * setup memory timing
  52. *
  53. *************************************************************************
  54. */
  55. #if !defined(CONFIG_SKIP_LOWLEVEL_INIT) && \
  56. !defined(CONFIG_SKIP_LOWLEVEL_INIT_ONLY)
  57. cpu_init_crit:
  58. mov ip, lr
  59. /*
  60. * before relocating, we have to setup RAM timing
  61. * because memory timing is board-dependent, you will
  62. * find a lowlevel_init.S in your board directory.
  63. */
  64. bl lowlevel_init
  65. mov lr, ip
  66. mov pc, lr
  67. #endif /* CONFIG_SKIP_LOWLEVEL_INIT */