aboutsummaryrefslogtreecommitdiff
path: root/src/rtos/rtos.h
blob: a6378c63050d4bd0b1746cf82430aa8bbe8df5c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/***************************************************************************
 *   Copyright (C) 2011 by Broadcom Corporation                            *
 *   Evan Hunter - ehunter@broadcom.com                                    *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#ifndef RTOS_H
#define RTOS_H


#include "server/server.h"
#include <helper/types.h>
#include <jim-nvp.h>

typedef int64_t threadid_t;
typedef int64_t symbol_address_t;

struct reg;

/**
 * Table should be terminated by an element with NULL in symbol_name
 */
typedef struct symbol_table_elem_struct
{
	char * symbol_name;
	symbol_address_t address;

} symbol_table_elem_t;

struct thread_detail
{
	threadid_t threadid;
	bool exists;
	char * display_str;
	char * thread_name_str;
	char * extra_info_str;
};

struct rtos
{
	const struct rtos_type *type;


	symbol_table_elem_t * symbols;
	struct target *target;

	threadid_t current_thread;
	struct thread_detail* thread_details;
	int thread_count;

	void * rtos_specific_params;

};



struct rtos_type
{
	char * name;
	int (*detect_rtos)                 ( struct target* target );
	int (*create)                      ( 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 );
	int (*get_symbol_list_to_lookup)   (symbol_table_elem_t * symbol_list[] );
};


struct stack_register_offset
{
	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
	unsigned short width_bits;

};

struct rtos_register_stacking
{
	unsigned char                       stack_registers_size;
	signed   char                       stack_growth_direction;
	unsigned char                       num_output_registers;
	const struct stack_register_offset* register_offsets;
};

#define GDB_THREAD_PACKET_NOT_CONSUMED (-40)

int rtos_create(Jim_GetOptInfo *goi, struct target * target);
int rtos_generic_stack_read( struct target * target, const struct rtos_register_stacking* stacking, int64_t stack_ptr, char ** hex_reg_list );
int rtos_try_next( struct target * target );
int gdb_thread_packet(struct connection *connection, struct target *target, char *packet, int packet_size);
int rtos_get_gdb_reg_list(struct connection *connection, struct target *target, struct reg **reg_list[], int *reg_list_size);
int rtos_update_threads( struct target *target );

#endif // RTOS_H