1 /*************************************************************************** 2 * Copyright (C) 2011 by Broadcom Corporation * 3 * Evan Hunter - ehunter@broadcom.com * 4 * * 5 * This program is free software; you can redistribute it and/or modify * 6 * it under the terms of the GNU General Public License as published by * 7 * the Free Software Foundation; either version 2 of the License, or * 8 * (at your option) any later version. * 9 * * 10 * This program is distributed in the hope that it will be useful, * 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 13 * GNU General Public License for more details. * 14 * * 15 * You should have received a copy of the GNU General Public License * 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. * 17 ***************************************************************************/ 18 19 #ifndef OPENOCD_RTOS_RTOS_H 20 #define OPENOCD_RTOS_RTOS_H 21 22 #include "server/server.h" 23 #include "target/target.h" 24 #include <jim-nvp.h> 25 26 typedef int64_t threadid_t; 27 typedef int64_t symbol_address_t; 28 29 struct reg; 30 31 /** 32 * Table should be terminated by an element with NULL in symbol_name 33 */ 34 typedef struct symbol_table_elem_struct { 35 const char *symbol_name; 36 symbol_address_t address; 37 bool optional; 38 } symbol_table_elem_t; 39 40 struct thread_detail { 41 threadid_t threadid; 42 bool exists; 43 char *thread_name_str; 44 char *extra_info_str; 45 }; 46 47 struct rtos { 48 const struct rtos_type *type; 49 50 symbol_table_elem_t *symbols; 51 struct target *target; 52 /* add a context variable instead of global variable */ 53 /* The thread currently selected by gdb. */ 54 int64_t current_threadid; 55 /* The currently selected thread according to the target. */ 56 threadid_t current_thread; 57 struct thread_detail *thread_details; 58 int thread_count; 59 int (*gdb_thread_packet)(struct connection *connection, char const *packet, int packet_size); 60 int (*gdb_target_for_threadid)(struct connection *connection, int64_t thread_id, struct target **p_target); 61 void *rtos_specific_params; 62 }; 63 64 struct rtos_reg { 65 uint32_t number; 66 uint32_t size; 67 uint8_t value[16]; 68 }; 69 70 struct rtos_type { 71 const char *name; 72 bool (*detect_rtos)(struct target *target); 73 int (*create)(struct target *target); 74 int (*smp_init)(struct target *target); 75 int (*update_threads)(struct rtos *rtos); 76 /** Return a list of general registers, with their values filled out. */ 77 int (*get_thread_reg_list)(struct rtos *rtos, int64_t thread_id, 78 struct rtos_reg **reg_list, int *num_regs); 79 int (*get_thread_reg)(struct rtos *rtos, int64_t thread_id, 80 uint32_t reg_num, struct rtos_reg *reg); 81 int (*get_symbol_list_to_lookup)(symbol_table_elem_t *symbol_list[]); 82 int (*clean)(struct target *target); 83 char * (*ps_command)(struct target *target); 84 int (*set_reg)(struct rtos *rtos, uint32_t reg_num, uint8_t *reg_value); 85 }; 86 87 struct stack_register_offset { 88 unsigned short number; /* register number */ 89 signed short offset; /* offset in bytes from stack head, or -1 to indicate 90 * register is not stacked, or -2 to indicate this is the 91 * stack pointer register */ 92 unsigned short width_bits; 93 }; 94 95 struct rtos_register_stacking { 96 unsigned char stack_registers_size; 97 signed char stack_growth_direction; 98 unsigned char num_output_registers; 99 /* Some targets require evaluating the stack to determine the 100 * actual stack pointer for a process. If this field is NULL, 101 * just use stacking->stack_registers_size * stack_growth_direction 102 * to calculate adjustment. 103 */ 104 int64_t (*calculate_process_stack)(struct target *target, 105 const uint8_t *stack_data, 106 const struct rtos_register_stacking *stacking, 107 int64_t stack_ptr); 108 const struct stack_register_offset *register_offsets; 109 }; 110 111 #define GDB_THREAD_PACKET_NOT_CONSUMED (-40) 112 113 int rtos_create(Jim_GetOptInfo *goi, struct target *target); 114 void rtos_destroy(struct target *target); 115 int rtos_set_reg(struct connection *connection, int reg_num, 116 uint8_t *reg_value); 117 int rtos_generic_stack_read(struct target *target, 118 const struct rtos_register_stacking *stacking, 119 int64_t stack_ptr, 120 struct rtos_reg **reg_list, 121 int *num_regs); 122 int gdb_thread_packet(struct connection *connection, char const *packet, int packet_size); 123 int rtos_get_gdb_reg(struct connection *connection, int reg_num); 124 int rtos_get_gdb_reg_list(struct connection *connection); 125 int rtos_update_threads(struct target *target); 126 void rtos_free_threadlist(struct rtos *rtos); 127 int rtos_smp_init(struct target *target); 128 /* function for handling symbol access */ 129 int rtos_qsymbol(struct connection *connection, char const *packet, int packet_size); 130 131 #endif /* OPENOCD_RTOS_RTOS_H */ 132