Line data Source code
1 0 : /*
2 : * Copyright (c) 2020 Intel Corporation
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : #ifndef ZEPHYR_INCLUDE_DEBUG_GDBSTUB_H_
8 : #define ZEPHYR_INCLUDE_DEBUG_GDBSTUB_H_
9 :
10 : /* Map from CPU exceptions to GDB */
11 0 : #define GDB_EXCEPTION_INVALID_INSTRUCTION 4UL
12 0 : #define GDB_EXCEPTION_BREAKPOINT 5UL
13 0 : #define GDB_EXCEPTION_MEMORY_FAULT 7UL
14 0 : #define GDB_EXCEPTION_DIVIDE_ERROR 8UL
15 0 : #define GDB_EXCEPTION_INVALID_MEMORY 11UL
16 0 : #define GDB_EXCEPTION_OVERFLOW 16UL
17 :
18 : /* Access permissions for memory regions */
19 0 : #define GDB_MEM_REGION_NO_ACCESS 0UL
20 0 : #define GDB_MEM_REGION_READ BIT(0)
21 0 : #define GDB_MEM_REGION_WRITE BIT(1)
22 :
23 0 : #define GDB_MEM_REGION_RO \
24 : (GDB_MEM_REGION_READ)
25 :
26 0 : #define GDB_MEM_REGION_RW \
27 : (GDB_MEM_REGION_READ | GDB_MEM_REGION_WRITE)
28 :
29 : /** Describe one memory region */
30 1 : struct gdb_mem_region {
31 : /** Start address of a memory region */
32 1 : uintptr_t start;
33 :
34 : /** End address of a memory region */
35 1 : uintptr_t end;
36 :
37 : /** Memory region attributes */
38 1 : uint16_t attributes;
39 :
40 : /** Read/write alignment, 0 if using default alignment */
41 1 : uint8_t alignment;
42 : };
43 :
44 : /**
45 : * State of the packet processing loop
46 : */
47 0 : enum gdb_loop_state {
48 : GDB_LOOP_RECEIVING,
49 : GDB_LOOP_CONTINUE,
50 : GDB_LOOP_ERROR,
51 : };
52 :
53 : /**
54 : * Memory region descriptions used for GDB memory access.
55 : *
56 : * This array specifies which region of memory GDB can access
57 : * with read/write attributes. This is used to restrict
58 : * memory read/write in GDB stub to memory that can be
59 : * legally accessed without resulting in memory faults.
60 : */
61 1 : extern const struct gdb_mem_region gdb_mem_region_array[];
62 :
63 : /**
64 : * Number of Memory Regions.
65 : *
66 : * Number of elements in gdb_mem_region_array[];
67 : */
68 1 : extern const size_t gdb_mem_num_regions;
69 :
70 : /**
71 : * @brief Convert a binary array into string representation.
72 : *
73 : * Note that this is similar to bin2hex() but does not force
74 : * a null character at the end of the hexadecimal output buffer.
75 : *
76 : * @param buf The binary array to convert
77 : * @param buflen The length of the binary array to convert
78 : * @param hex Address of where to store the string representation.
79 : * @param hexlen Size of the storage area for string representation.
80 : *
81 : * @return The length of the converted string, or 0 if an error occurred.
82 : */
83 1 : size_t gdb_bin2hex(const uint8_t *buf, size_t buflen,
84 : char *hex, size_t hexlen);
85 :
86 :
87 : /**
88 : * @brief Check if a memory block can be read.
89 : *
90 : * This checks if the specified memory block can be read.
91 : *
92 : * @param[in] addr Starting address of the memory block
93 : * @param[in] len Size of memory block
94 : * @param[out] align Read alignment of region
95 : *
96 : * @return True if memory block can be read, false otherwise.
97 : */
98 1 : bool gdb_mem_can_read(const uintptr_t addr, const size_t len, uint8_t *align);
99 :
100 : /**
101 : * @brief Check if a memory block can be written into.
102 : *
103 : * This checks if the specified memory block can be written into.
104 : *
105 : * @param[in] addr Starting address of the memory block
106 : * @param[in] len Size of memory block
107 : * @param[out] align Write alignment of region
108 : *
109 : * @return True if GDB stub can write to the block, false otherwise.
110 : */
111 1 : bool gdb_mem_can_write(const uintptr_t addr, const size_t len, uint8_t *align);
112 :
113 : #endif
|