log: let command "log_output" to set back its default
[fw/openocd] / src / rtos / rtos.h
index 8ec155e35aaa1f2fa09409274982d37eeb5cd6cd..a649e2449d956a775830889c8b8707ec23491e49 100644 (file)
  *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
-#ifndef RTOS_H
-#define RTOS_H
+#ifndef OPENOCD_RTOS_RTOS_H
+#define OPENOCD_RTOS_RTOS_H
 
 #include "server/server.h"
+#include "target/target.h"
 #include <jim-nvp.h>
 
 typedef int64_t threadid_t;
@@ -39,7 +40,6 @@ typedef struct symbol_table_elem_struct {
 struct thread_detail {
        threadid_t threadid;
        bool exists;
-       char *display_str;
        char *thread_name_str;
        char *extra_info_str;
 };
@@ -50,27 +50,42 @@ struct rtos {
        symbol_table_elem_t *symbols;
        struct target *target;
        /*  add a context variable instead of global variable */
+       /* The thread currently selected by gdb. */
        int64_t current_threadid;
+       /* The currently selected thread according to the target. */
        threadid_t current_thread;
        struct thread_detail *thread_details;
        int thread_count;
        int (*gdb_thread_packet)(struct connection *connection, char const *packet, int packet_size);
+       int (*gdb_target_for_threadid)(struct connection *connection, int64_t thread_id, struct target **p_target);
        void *rtos_specific_params;
 };
 
+struct rtos_reg {
+       uint32_t number;
+       uint32_t size;
+       uint8_t value[16];
+};
+
 struct rtos_type {
        const char *name;
-       int (*detect_rtos)(struct target *target);
+       bool (*detect_rtos)(struct target *target);
        int (*create)(struct target *target);
        int (*smp_init)(struct target *target);
        int (*update_threads)(struct rtos *rtos);
-       int (*get_thread_reg_list)(struct rtos *rtos, int64_t thread_id, char **hex_reg_list);
+       /** Return a list of general registers, with their values filled out. */
+       int (*get_thread_reg_list)(struct rtos *rtos, int64_t thread_id,
+                       struct rtos_reg **reg_list, int *num_regs);
+       int (*get_thread_reg)(struct rtos *rtos, int64_t thread_id,
+                       uint32_t reg_num, struct rtos_reg *reg);
        int (*get_symbol_list_to_lookup)(symbol_table_elem_t *symbol_list[]);
        int (*clean)(struct target *target);
        char * (*ps_command)(struct target *target);
+       int (*set_reg)(struct rtos *rtos, uint32_t reg_num, uint8_t *reg_value);
 };
 
 struct stack_register_offset {
+       unsigned short number;          /* register number */
        signed short offset;            /* offset in bytes from stack head, or -1 to indicate
                                         * register is not stacked, or -2 to indicate this is the
                                         * stack pointer register */
@@ -96,12 +111,16 @@ struct rtos_register_stacking {
 #define GDB_THREAD_PACKET_NOT_CONSUMED (-40)
 
 int rtos_create(Jim_GetOptInfo *goi, struct target *target);
+int rtos_set_reg(struct connection *connection, int reg_num,
+               uint8_t *reg_value);
 int rtos_generic_stack_read(struct target *target,
                const struct rtos_register_stacking *stacking,
                int64_t stack_ptr,
-               char **hex_reg_list);
+               struct rtos_reg **reg_list,
+               int *num_regs);
 int rtos_try_next(struct target *target);
 int gdb_thread_packet(struct connection *connection, char const *packet, int packet_size);
+int rtos_get_gdb_reg(struct connection *connection, int reg_num);
 int rtos_get_gdb_reg_list(struct connection *connection);
 int rtos_update_threads(struct target *target);
 void rtos_free_threadlist(struct rtos *rtos);
@@ -109,4 +128,4 @@ int rtos_smp_init(struct target *target);
 /*  function for handling symbol access */
 int rtos_qsymbol(struct connection *connection, char const *packet, int packet_size);
 
-#endif /* RTOS_H */
+#endif /* OPENOCD_RTOS_RTOS_H */