zephyr/include/debug/gdbstub.h

105 lines
3.0 KiB
C

/*
* 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