Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

coredump_cmd.S 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // SPDX-License-Identifier: GPL-3.0-only
  2. /*
  3. * Copyright (c) 2008-2023 100askTeam : Dongshan WEI <weidongshan@qq.com>
  4. * Discourse: https://forums.100ask.net
  5. */
  6. /* Copyright (C) 2008-2023 深圳百问网科技有限公司
  7. * All rights reserved
  8. *
  9. * 免责声明: 百问网编写的文档, 仅供学员学习使用, 可以转发或引用(请保留作者信息),禁止用于商业用途!
  10. * 免责声明: 百问网编写的程序, 可以用于商业用途, 但百问网不承担任何后果!
  11. *
  12. * 本程序遵循GPL V3协议, 请遵循协议
  13. * 百问网学习平台 : https://www.100ask.net
  14. * 百问网交流社区 : https://forums.100ask.net
  15. * 百问网官方B站 : https://space.bilibili.com/275908810
  16. * 百问网官方淘宝 : https://100ask.taobao.com
  17. * 联系我们(E-mail): weidongshan@qq.com
  18. *
  19. * 版权所有,盗版必究。
  20. *
  21. * 修改历史 版本号 作者 修改内容
  22. *-----------------------------------------------------
  23. * 2024.10.17 v01 百问科技 创建文件
  24. *-----------------------------------------------------
  25. */
  26. SECTION .text:CODE(2)
  27. THUMB
  28. REQUIRE8
  29. PRESERVE8
  30. IMPORT DumpCore
  31. EXPORT coredump_cmd_asm
  32. coredump_cmd_asm:
  33. MRS r0, xpsr
  34. PUSH {r0}
  35. ADR r0, .
  36. PUSH {r0} /* pc */
  37. PUSH {r0-r3,r12,lr}
  38. PUSH {r4-r11}
  39. #if defined ( __ARMVFP__ )
  40. MOV r0, #0
  41. PUSH {r0} /* flag, 表示是否使用FPU,我们写入0表示不使用FPU */
  42. #endif
  43. MOV r0, sp
  44. BL DumpCore
  45. #if defined ( __ARMVFP__ )
  46. POP {r0} /* flag */
  47. #endif
  48. POP {r4-r11}
  49. POP {r0-r3,r12,lr}
  50. POP {r0} /* pc */
  51. POP {r0} /* xpsr */
  52. BX LR
  53. IMPORT rt_hw_hard_fault_exception
  54. EXPORT HardFault_Handler
  55. HardFault_Handler:
  56. ; get current context
  57. MRS r0, msp ; get fault context from handler.
  58. TST lr, #0x04 ; if(!EXC_RETURN[2])
  59. BEQ _get_sp_done
  60. MRS r0, psp ; get fault context from thread.
  61. _get_sp_done
  62. #if defined ( __ARMVFP__ )
  63. TST lr, #0x10 ; if(!EXC_RETURN[4])
  64. BNE skip_push_fpu
  65. VSTMDB r0!, {d8 - d15} ; push FPU register s16~s31
  66. skip_push_fpu
  67. #endif
  68. STMFD r0!, {r4 - r11} ; push r4 - r11 register
  69. #if defined ( __ARMVFP__ )
  70. MOV r4, #0x00 ; flag = 0
  71. TST lr, #0x10 ; if(!EXC_RETURN[4])
  72. BNE push_flag
  73. MOV r4, #0x01 ; flag = 1
  74. push_flag
  75. STMFD r0!, {r4} ; push flag
  76. #endif
  77. STMFD r0!, {lr} ; push flag
  78. TST lr, #0x04 ; if(!EXC_RETURN[2])
  79. BEQ _update_msp
  80. MSR psp, r0 ; update stack pointer to PSP.
  81. B _update_done
  82. _update_msp
  83. MSR msp, r0 ; update stack pointer to MSP.
  84. _update_done
  85. PUSH {lr}
  86. BL rt_hw_hard_fault_exception
  87. POP {lr}
  88. ORR lr, lr, #0x04
  89. BX lr
  90. END