OpenOCD
rtos.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 /***************************************************************************
4  * Copyright (C) 2011 by Broadcom Corporation *
5  * Evan Hunter - ehunter@broadcom.com *
6  ***************************************************************************/
7 
8 #ifndef OPENOCD_RTOS_RTOS_H
9 #define OPENOCD_RTOS_RTOS_H
10 
11 #include "server/server.h"
12 #include "target/target.h"
13 #include <helper/jim-nvp.h>
14 
15 typedef int64_t threadid_t;
16 typedef int64_t symbol_address_t;
17 
18 struct reg;
19 
24  const char *symbol_name;
26  bool optional;
27 };
28 
29 struct thread_detail {
31  bool exists;
34 };
35 
36 struct rtos {
37  const struct rtos_type *type;
38 
40  struct target *target;
41  /* add a context variable instead of global variable */
42  /* The thread currently selected by gdb. */
44  /* The currently selected thread according to the target. */
48  int (*gdb_thread_packet)(struct connection *connection, char const *packet, int packet_size);
49  int (*gdb_target_for_threadid)(struct connection *connection, int64_t thread_id, struct target **p_target);
51 };
52 
53 struct rtos_reg {
54  uint32_t number;
55  uint32_t size;
56  uint8_t value[16];
57 };
58 
59 struct rtos_type {
60  const char *name;
61  bool (*detect_rtos)(struct target *target);
62  int (*create)(struct target *target);
63  int (*smp_init)(struct target *target);
64  int (*update_threads)(struct rtos *rtos);
66  int (*get_thread_reg_list)(struct rtos *rtos, int64_t thread_id,
67  struct rtos_reg **reg_list, int *num_regs);
68  int (*get_thread_reg)(struct rtos *rtos, int64_t thread_id,
69  uint32_t reg_num, struct rtos_reg *reg);
70  int (*get_symbol_list_to_lookup)(struct symbol_table_elem *symbol_list[]);
71  int (*clean)(struct target *target);
72  char * (*ps_command)(struct target *target);
73  int (*set_reg)(struct rtos *rtos, uint32_t reg_num, uint8_t *reg_value);
74  /* Implement these if different threads in the RTOS can see memory
75  * differently (for instance because address translation might be different
76  * for each thread). */
77  int (*read_buffer)(struct rtos *rtos, target_addr_t address, uint32_t size,
78  uint8_t *buffer);
79  int (*write_buffer)(struct rtos *rtos, target_addr_t address, uint32_t size,
80  const uint8_t *buffer);
81 };
82 
84  unsigned short number; /* register number */
85  signed short offset; /* offset in bytes from stack head, or -1 to indicate
86  * register is not stacked, or -2 to indicate this is the
87  * stack pointer register */
88  unsigned short width_bits;
89 };
90 
92  unsigned char stack_registers_size;
94  unsigned char num_output_registers;
95  /* Some targets require evaluating the stack to determine the
96  * actual stack pointer for a process. If this field is NULL,
97  * just use stacking->stack_registers_size * stack_growth_direction
98  * to calculate adjustment.
99  */
101  const uint8_t *stack_data,
102  const struct rtos_register_stacking *stacking,
103  target_addr_t stack_ptr);
105  /* Optional field for targets which may have to implement their own stack read function.
106  * Because stack format can be weird or stack data needed to be edited before passing to the gdb.
107  */
108  int (*read_stack)(struct target *target,
109  int64_t stack_ptr,
110  const struct rtos_register_stacking *stacking,
111  uint8_t *stack_data);
112 };
113 
114 #define GDB_THREAD_PACKET_NOT_CONSUMED (-40)
115 
116 int rtos_create(struct jim_getopt_info *goi, struct target *target);
117 void rtos_destroy(struct target *target);
118 int rtos_set_reg(struct connection *connection, int reg_num,
119  uint8_t *reg_value);
121  const struct rtos_register_stacking *stacking,
122  int64_t stack_ptr,
123  struct rtos_reg **reg_list,
124  int *num_regs);
125 int gdb_thread_packet(struct connection *connection, char const *packet, int packet_size);
126 int rtos_thread_packet(struct connection *connection, const char *packet, int packet_size);
127 int rtos_get_gdb_reg(struct connection *connection, int reg_num);
129 int rtos_update_threads(struct target *target);
130 void rtos_free_threadlist(struct rtos *rtos);
131 int rtos_smp_init(struct target *target);
132 /* function for handling symbol access */
133 int rtos_qsymbol(struct connection *connection, char const *packet, int packet_size);
134 int rtos_read_buffer(struct target *target, target_addr_t address,
135  uint32_t size, uint8_t *buffer);
136 int rtos_write_buffer(struct target *target, target_addr_t address,
137  uint32_t size, const uint8_t *buffer);
138 
139 extern const struct rtos_type chibios_rtos;
140 extern const struct rtos_type chromium_ec_rtos;
141 extern const struct rtos_type ecos_rtos;
142 extern const struct rtos_type embkernel_rtos;
143 extern const struct rtos_type freertos_rtos;
144 extern const struct rtos_type hwthread_rtos;
145 extern const struct rtos_type linux_rtos;
146 extern const struct rtos_type mqx_rtos;
147 extern const struct rtos_type nuttx_rtos;
148 extern const struct rtos_type riot_rtos;
149 extern const struct rtos_type rtkernel_rtos;
150 extern const struct rtos_type threadx_rtos;
151 extern const struct rtos_type ucos_iii_rtos;
152 extern const struct rtos_type zephyr_rtos;
153 
154 #endif /* OPENOCD_RTOS_RTOS_H */
const struct rtos_type embkernel_rtos
Definition: embKernel.c:29
int rtos_generic_stack_read(struct target *target, const struct rtos_register_stacking *stacking, int64_t stack_ptr, struct rtos_reg **reg_list, int *num_regs)
Definition: rtos.c:602
int rtos_thread_packet(struct connection *connection, const char *packet, int packet_size)
Definition: rtos.c:331
int64_t symbol_address_t
Definition: rtos.h:16
int gdb_thread_packet(struct connection *connection, char const *packet, int packet_size)
Definition: rtos.c:149
const struct rtos_type chromium_ec_rtos
Definition: chromium-ec.c:383
const struct rtos_type zephyr_rtos
Definition: zephyr.c:788
const struct rtos_type ecos_rtos
Definition: eCos.c:455
const struct rtos_type threadx_rtos
Definition: ThreadX.c:193
const struct rtos_type hwthread_rtos
Definition: hwthread.c:50
const struct rtos_type freertos_rtos
Definition: FreeRTOS.c:82
int rtos_set_reg(struct connection *connection, int reg_num, uint8_t *reg_value)
Definition: rtos.c:588
const struct rtos_type nuttx_rtos
Definition: nuttx.c:396
int rtos_get_gdb_reg_list(struct connection *connection)
Return a list of general registers.
Definition: rtos.c:555
void rtos_destroy(struct target *target)
Definition: rtos.c:144
const struct rtos_type linux_rtos
Definition: linux.c:250
int rtos_write_buffer(struct target *target, target_addr_t address, uint32_t size, const uint8_t *buffer)
Definition: rtos.c:721
const struct rtos_type chibios_rtos
Definition: chibios.c:99
int rtos_update_threads(struct target *target)
Definition: rtos.c:688
int rtos_read_buffer(struct target *target, target_addr_t address, uint32_t size, uint8_t *buffer)
Definition: rtos.c:713
int rtos_smp_init(struct target *target)
Definition: rtos.c:39
int64_t threadid_t
Definition: rtos.h:15
const struct rtos_type ucos_iii_rtos
Definition: uCOS-III.c:501
const struct rtos_type riot_rtos
Definition: riot.c:97
int rtos_create(struct jim_getopt_info *goi, struct target *target)
Definition: rtos.c:99
const struct rtos_type rtkernel_rtos
Definition: rtkernel.c:375
int rtos_qsymbol(struct connection *connection, char const *packet, int packet_size)
Definition: rtos.c:211
void rtos_free_threadlist(struct rtos *rtos)
Definition: rtos.c:695
int rtos_get_gdb_reg(struct connection *connection, int reg_num)
Look through all registers to find this register.
Definition: rtos.c:503
const struct rtos_type mqx_rtos
Definition: mqx.c:500
struct target * target
Definition: rtt/rtt.c:26
size_t size
Size of the control block search area.
Definition: rtt/rtt.c:30
A TCL -ish GetOpt like code.
Definition: jim-nvp.h:136
Definition: register.h:111
Definition: rtos.h:53
uint32_t number
Definition: rtos.h:54
uint8_t value[16]
Definition: rtos.h:56
uint32_t size
Definition: rtos.h:55
const struct stack_register_offset * register_offsets
Definition: rtos.h:104
unsigned char num_output_registers
Definition: rtos.h:94
target_addr_t(* calculate_process_stack)(struct target *target, const uint8_t *stack_data, const struct rtos_register_stacking *stacking, target_addr_t stack_ptr)
Definition: rtos.h:100
unsigned char stack_registers_size
Definition: rtos.h:92
int(* read_stack)(struct target *target, int64_t stack_ptr, const struct rtos_register_stacking *stacking, uint8_t *stack_data)
Definition: rtos.h:108
signed char stack_growth_direction
Definition: rtos.h:93
Definition: rtos.h:59
int(* create)(struct target *target)
Definition: rtos.h:62
int(* smp_init)(struct target *target)
Definition: rtos.h:63
int(* update_threads)(struct rtos *rtos)
Definition: rtos.h:64
int(* get_thread_reg)(struct rtos *rtos, int64_t thread_id, uint32_t reg_num, struct rtos_reg *reg)
Definition: rtos.h:68
int(* get_symbol_list_to_lookup)(struct symbol_table_elem *symbol_list[])
Definition: rtos.h:70
const char * name
Definition: rtos.h:60
int(* write_buffer)(struct rtos *rtos, target_addr_t address, uint32_t size, const uint8_t *buffer)
Definition: rtos.h:79
int(* clean)(struct target *target)
Definition: rtos.h:71
int(* read_buffer)(struct rtos *rtos, target_addr_t address, uint32_t size, uint8_t *buffer)
Definition: rtos.h:77
bool(* detect_rtos)(struct target *target)
Definition: rtos.h:61
int(* get_thread_reg_list)(struct rtos *rtos, int64_t thread_id, struct rtos_reg **reg_list, int *num_regs)
Return a list of general registers, with their values filled out.
Definition: rtos.h:66
int(* set_reg)(struct rtos *rtos, uint32_t reg_num, uint8_t *reg_value)
Definition: rtos.h:73
Definition: rtos.h:36
const struct rtos_type * type
Definition: rtos.h:37
int thread_count
Definition: rtos.h:47
int(* gdb_thread_packet)(struct connection *connection, char const *packet, int packet_size)
Definition: rtos.h:48
struct thread_detail * thread_details
Definition: rtos.h:46
struct symbol_table_elem * symbols
Definition: rtos.h:39
struct target * target
Definition: rtos.h:40
void * rtos_specific_params
Definition: rtos.h:50
int(* gdb_target_for_threadid)(struct connection *connection, int64_t thread_id, struct target **p_target)
Definition: rtos.h:49
threadid_t current_thread
Definition: rtos.h:45
int64_t current_threadid
Definition: rtos.h:43
unsigned short width_bits
Definition: rtos.h:88
unsigned short number
Definition: rtos.h:84
signed short offset
Definition: rtos.h:85
Table should be terminated by an element with NULL in symbol_name.
Definition: rtos.h:23
symbol_address_t address
Definition: rtos.h:25
bool optional
Definition: rtos.h:26
const char * symbol_name
Definition: rtos.h:24
Definition: target.h:116
char * extra_info_str
Definition: rtos.h:33
char * thread_name_str
Definition: rtos.h:32
bool exists
Definition: rtos.h:31
threadid_t threadid
Definition: rtos.h:30
uint64_t target_addr_t
Definition: types.h:335