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 };
106 
107 #define GDB_THREAD_PACKET_NOT_CONSUMED (-40)
108 
109 int rtos_create(struct jim_getopt_info *goi, struct target *target);
110 void rtos_destroy(struct target *target);
111 int rtos_set_reg(struct connection *connection, int reg_num,
112  uint8_t *reg_value);
114  const struct rtos_register_stacking *stacking,
115  int64_t stack_ptr,
116  struct rtos_reg **reg_list,
117  int *num_regs);
118 int gdb_thread_packet(struct connection *connection, char const *packet, int packet_size);
119 int rtos_get_gdb_reg(struct connection *connection, int reg_num);
121 int rtos_update_threads(struct target *target);
122 void rtos_free_threadlist(struct rtos *rtos);
123 int rtos_smp_init(struct target *target);
124 /* function for handling symbol access */
125 int rtos_qsymbol(struct connection *connection, char const *packet, int packet_size);
126 int rtos_read_buffer(struct target *target, target_addr_t address,
127  uint32_t size, uint8_t *buffer);
128 int rtos_write_buffer(struct target *target, target_addr_t address,
129  uint32_t size, const uint8_t *buffer);
130 
131 #endif /* OPENOCD_RTOS_RTOS_H */
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:617
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:164
int rtos_set_reg(struct connection *connection, int reg_num, uint8_t *reg_value)
Definition: rtos.c:603
int rtos_get_gdb_reg_list(struct connection *connection)
Return a list of general registers.
Definition: rtos.c:570
void rtos_destroy(struct target *target)
Definition: rtos.c:159
int rtos_write_buffer(struct target *target, target_addr_t address, uint32_t size, const uint8_t *buffer)
Definition: rtos.c:733
int rtos_update_threads(struct target *target)
Definition: rtos.c:700
int rtos_read_buffer(struct target *target, target_addr_t address, uint32_t size, uint8_t *buffer)
Definition: rtos.c:725
int rtos_smp_init(struct target *target)
Definition: rtos.c:55
int64_t threadid_t
Definition: rtos.h:15
int rtos_create(struct jim_getopt_info *goi, struct target *target)
Definition: rtos.c:114
int rtos_qsymbol(struct connection *connection, char const *packet, int packet_size)
Definition: rtos.c:226
void rtos_free_threadlist(struct rtos *rtos)
Definition: rtos.c:707
int rtos_get_gdb_reg(struct connection *connection, int reg_num)
Look through all registers to find this register.
Definition: rtos.c:518
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:135
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
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:120
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