You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mcd_arm.c 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. * Copyright (c) 2025, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2025-08-16 Rbb666 Unified ARM architecture implementation
  9. */
  10. #include <stdint.h>
  11. #include "mcd_cfg.h"
  12. #include "mcd_arm_define.h"
  13. /* Global task ID counter for note generation */
  14. static uint32_t task_id_counter = 3539;
  15. #if MCD_ARM_ARCH_32BIT
  16. /**
  17. * @brief Fill prstatus note description for ARM32
  18. *
  19. * @param desc Pointer to description buffer
  20. * @param regset Pointer to core register set
  21. */
  22. void arm32_fill_note_prstatus_desc(uint8_t *desc, core_regset_type *regset)
  23. {
  24. uint16_t *signal = (uint16_t *)&desc[12];
  25. uint32_t *lwpid = (uint32_t *)&desc[24];
  26. mcd_memset(desc, 0, MCOREDUMP_PRSTATUS_SIZE);
  27. *signal = 0;
  28. *lwpid = task_id_counter++;
  29. /* Copy ARM32 registers to offset 72 */
  30. mcd_memcpy(desc + MCD_PRSTATUS_REG_OFFSET, regset, sizeof(core_regset_type));
  31. }
  32. /**
  33. * @brief Fill fpregset note description for ARM32
  34. *
  35. * @param desc Pointer to description buffer
  36. * @param regset Pointer to floating point register set
  37. */
  38. void arm32_fill_note_fpregset_desc(uint8_t *desc, fp_regset_type *regset)
  39. {
  40. if (regset != 0)
  41. {
  42. /* Copy VFP registers (32 * 8 bytes = 256 bytes) */
  43. mcd_memcpy(desc, regset, sizeof(fp_regset_type) - sizeof(uint32_t));
  44. /* Copy FPSCR at the end */
  45. mcd_memcpy(desc + 32 * 8, &regset->fpscr, sizeof(uint32_t));
  46. }
  47. else
  48. {
  49. mcd_memset(desc, 0, MCOREDUMP_FPREGSET_SIZE);
  50. }
  51. }
  52. #endif /* MCD_ARM_ARCH_32BIT */
  53. #if MCD_ARM_ARCH_64BIT
  54. /**
  55. * @brief Fill prstatus note description for ARM64
  56. *
  57. * @param desc Pointer to description buffer
  58. * @param regset Pointer to core register set
  59. */
  60. void arm64_fill_note_prstatus_desc(uint8_t *desc, core_regset_type *regset)
  61. {
  62. uint16_t *signal = (uint16_t *)&desc[12];
  63. uint32_t *lwpid = (uint32_t *)&desc[32];
  64. mcd_memset(desc, 0, MCOREDUMP_PRSTATUS_SIZE);
  65. *signal = 0;
  66. *lwpid = task_id_counter++;
  67. /* Copy ARM64 registers to offset 112 */
  68. mcd_memcpy(desc + MCD_PRSTATUS_REG_OFFSET, regset, sizeof(core_regset_type));
  69. }
  70. /**
  71. * @brief Fill fpregset note description for ARM64
  72. *
  73. * @param desc Pointer to description buffer
  74. * @param regset Pointer to floating point register set
  75. */
  76. void arm64_fill_note_fpregset_desc(uint8_t *desc, fp_regset_type *regset)
  77. {
  78. if (regset != NULL)
  79. {
  80. /* Copy SIMD/FP registers (32 * 16 bytes = 512 bytes) */
  81. mcd_memcpy(desc, regset, sizeof(fp_regset_type) - 8);
  82. /* Copy FPSR and FPCR at the end */
  83. mcd_memcpy(desc + 32 * 16, &regset->fpsr, sizeof(uint32_t));
  84. mcd_memcpy(desc + 32 * 16 + 4, &regset->fpcr, sizeof(uint32_t));
  85. }
  86. else
  87. {
  88. mcd_memset(desc, 0, MCOREDUMP_FPREGSET_SIZE);
  89. }
  90. }
  91. #endif /* MCD_ARM_ARCH_64BIT */