| /* |
| * Copyright (c) 2020 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef ZEPHYR_INCLUDE_DEBUG_GDBSTUB_H_ |
| #define ZEPHYR_INCLUDE_DEBUG_GDBSTUB_H_ |
| |
| /* Map from CPU exceptions to GDB */ |
| #define GDB_EXCEPTION_INVALID_INSTRUCTION 4UL |
| #define GDB_EXCEPTION_BREAKPOINT 5UL |
| #define GDB_EXCEPTION_MEMORY_FAULT 7UL |
| #define GDB_EXCEPTION_DIVIDE_ERROR 8UL |
| #define GDB_EXCEPTION_INVALID_MEMORY 11UL |
| #define GDB_EXCEPTION_OVERFLOW 16UL |
| |
| /* Access permissions for memory regions */ |
| #define GDB_MEM_REGION_NO_ACCESS 0UL |
| #define GDB_MEM_REGION_READ BIT(0) |
| #define GDB_MEM_REGION_WRITE BIT(1) |
| |
| #define GDB_MEM_REGION_RO \ |
| (GDB_MEM_REGION_READ) |
| |
| #define GDB_MEM_REGION_RW \ |
| (GDB_MEM_REGION_READ | GDB_MEM_REGION_WRITE) |
| |
| /** Describe one memory region */ |
| struct gdb_mem_region { |
| /** Start address of a memory region */ |
| uintptr_t start; |
| |
| /** End address of a memory region */ |
| uintptr_t end; |
| |
| /** Memory region attributes */ |
| uint16_t attributes; |
| |
| /** Read/write alignment, 0 if using default alignment */ |
| uint8_t alignment; |
| }; |
| |
| /** |
| * Memory region descriptions used for GDB memory access. |
| * |
| * This array specifies which region of memory GDB can access |
| * with read/write attributes. This is used to restrict |
| * memory read/write in GDB stub to memory that can be |
| * legally accessed without resulting in memory faults. |
| */ |
| extern const struct gdb_mem_region gdb_mem_region_array[]; |
| |
| /** |
| * Number of Memory Regions. |
| * |
| * Number of elements in gdb_mem_region_array[]; |
| */ |
| extern const size_t gdb_mem_num_regions; |
| |
| /** |
| * @brief Convert a binary array into string representation. |
| * |
| * Note that this is similar to bin2hex() but does not force |
| * a null character at the end of the hexadecimal output buffer. |
| * |
| * @param buf The binary array to convert |
| * @param buflen The length of the binary array to convert |
| * @param hex Address of where to store the string representation. |
| * @param hexlen Size of the storage area for string representation. |
| * |
| * @return The length of the converted string, or 0 if an error occurred. |
| */ |
| size_t gdb_bin2hex(const uint8_t *buf, size_t buflen, |
| char *hex, size_t hexlen); |
| |
| |
| /** |
| * @brief Check if a memory block can be read. |
| * |
| * This checks if the specified memory block can be read. |
| * |
| * @param[in] addr Starting address of the memory block |
| * @param[in] len Size of memory block |
| * @param[out] align Read alignment of region |
| * |
| * @return True if memory block can be read, false otherwise. |
| */ |
| bool gdb_mem_can_read(const uintptr_t addr, const size_t len, uint8_t *align); |
| |
| /** |
| * @brief Check if a memory block can be written into. |
| * |
| * This checks if the specified memory block can be written into. |
| * |
| * @param[in] addr Starting address of the memory block |
| * @param[in] len Size of memory block |
| * @param[out] align Write alignment of region |
| * |
| * @return True if GDB stub can write to the block, false otherwise. |
| */ |
| bool gdb_mem_can_write(const uintptr_t addr, const size_t len, uint8_t *align); |
| |
| #endif |