105 lines
3.0 KiB
C
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
|