| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- /*
- * Copyright (c) 2025, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2025-08-16 Rbb666 Unified ARM architecture implementation
- */
-
- #include <stdint.h>
- #include "mcd_cfg.h"
- #include "mcd_arm_define.h"
-
- /* Global task ID counter for note generation */
- static uint32_t task_id_counter = 3539;
-
- #if MCD_ARM_ARCH_32BIT
- /**
- * @brief Fill prstatus note description for ARM32
- *
- * @param desc Pointer to description buffer
- * @param regset Pointer to core register set
- */
- void arm32_fill_note_prstatus_desc(uint8_t *desc, core_regset_type *regset)
- {
- uint16_t *signal = (uint16_t *)&desc[12];
- uint32_t *lwpid = (uint32_t *)&desc[24];
-
- mcd_memset(desc, 0, MCOREDUMP_PRSTATUS_SIZE);
- *signal = 0;
- *lwpid = task_id_counter++;
-
- /* Copy ARM32 registers to offset 72 */
- mcd_memcpy(desc + MCD_PRSTATUS_REG_OFFSET, regset, sizeof(core_regset_type));
- }
-
- /**
- * @brief Fill fpregset note description for ARM32
- *
- * @param desc Pointer to description buffer
- * @param regset Pointer to floating point register set
- */
- void arm32_fill_note_fpregset_desc(uint8_t *desc, fp_regset_type *regset)
- {
- if (regset != 0)
- {
- /* Copy VFP registers (32 * 8 bytes = 256 bytes) */
- mcd_memcpy(desc, regset, sizeof(fp_regset_type) - sizeof(uint32_t));
- /* Copy FPSCR at the end */
- mcd_memcpy(desc + 32 * 8, ®set->fpscr, sizeof(uint32_t));
- }
- else
- {
- mcd_memset(desc, 0, MCOREDUMP_FPREGSET_SIZE);
- }
- }
- #endif /* MCD_ARM_ARCH_32BIT */
-
- #if MCD_ARM_ARCH_64BIT
- /**
- * @brief Fill prstatus note description for ARM64
- *
- * @param desc Pointer to description buffer
- * @param regset Pointer to core register set
- */
- void arm64_fill_note_prstatus_desc(uint8_t *desc, core_regset_type *regset)
- {
- uint16_t *signal = (uint16_t *)&desc[12];
- uint32_t *lwpid = (uint32_t *)&desc[32];
-
- mcd_memset(desc, 0, MCOREDUMP_PRSTATUS_SIZE);
- *signal = 0;
- *lwpid = task_id_counter++;
-
- /* Copy ARM64 registers to offset 112 */
- mcd_memcpy(desc + MCD_PRSTATUS_REG_OFFSET, regset, sizeof(core_regset_type));
- }
-
- /**
- * @brief Fill fpregset note description for ARM64
- *
- * @param desc Pointer to description buffer
- * @param regset Pointer to floating point register set
- */
- void arm64_fill_note_fpregset_desc(uint8_t *desc, fp_regset_type *regset)
- {
- if (regset != NULL)
- {
- /* Copy SIMD/FP registers (32 * 16 bytes = 512 bytes) */
- mcd_memcpy(desc, regset, sizeof(fp_regset_type) - 8);
-
- /* Copy FPSR and FPCR at the end */
- mcd_memcpy(desc + 32 * 16, ®set->fpsr, sizeof(uint32_t));
- mcd_memcpy(desc + 32 * 16 + 4, ®set->fpcr, sizeof(uint32_t));
- }
- else
- {
- mcd_memset(desc, 0, MCOREDUMP_FPREGSET_SIZE);
- }
- }
- #endif /* MCD_ARM_ARCH_64BIT */
|