@ -1609,6 +1609,20 @@ static void handle_query_thread_extra(GArray *params, void *user_ctx)
gdb_put_strbuf ( ) ;
}
static char * extended_qsupported_features ;
void gdb_extend_qsupported_features ( char * qsupported_features )
{
/*
* We don ' t support different sets of CPU gdb features on different CPUs yet
* so assert the feature strings are the same on all CPUs , or is set only
* once ( 1 CPU ) .
*/
g_assert ( extended_qsupported_features = = NULL | |
g_strcmp0 ( extended_qsupported_features , qsupported_features ) = = 0 ) ;
extended_qsupported_features = qsupported_features ;
}
static void handle_query_supported ( GArray * params , void * user_ctx )
{
CPUClass * cc ;
@ -1648,6 +1662,11 @@ static void handle_query_supported(GArray *params, void *user_ctx)
}
g_string_append ( gdbserver_state . str_buf , " ;vContSupported+;multiprocess+ " ) ;
if ( extended_qsupported_features ) {
g_string_append ( gdbserver_state . str_buf , extended_qsupported_features ) ;
}
gdb_put_strbuf ( ) ;
}
@ -1729,6 +1748,41 @@ static const GdbCmdParseEntry gdb_gen_query_set_common_table[] = {
} ,
} ;
/* Compares if a set of command parsers is equal to another set of parsers. */
static bool cmp_cmds ( GdbCmdParseEntry * c , GdbCmdParseEntry * d , int size )
{
for ( int i = 0 ; i < size ; i + + ) {
if ( ! ( c [ i ] . handler = = d [ i ] . handler & &
g_strcmp0 ( c [ i ] . cmd , d [ i ] . cmd ) = = 0 & &
c [ i ] . cmd_startswith = = d [ i ] . cmd_startswith & &
g_strcmp0 ( c [ i ] . schema , d [ i ] . schema ) = = 0 ) ) {
/* Sets are different. */
return false ;
}
}
/* Sets are equal, i.e. contain the same command parsers. */
return true ;
}
static GdbCmdParseEntry * extended_query_table ;
static int extended_query_table_size ;
void gdb_extend_query_table ( GdbCmdParseEntry * table , int size )
{
/*
* We don ' t support different sets of CPU gdb features on different CPUs yet
* so assert query table is the same on all CPUs , or is set only once
* ( 1 CPU ) .
*/
g_assert ( extended_query_table = = NULL | |
( extended_query_table_size = = size & &
cmp_cmds ( extended_query_table , table , size ) ) ) ;
extended_query_table = table ;
extended_query_table_size = size ;
}
static const GdbCmdParseEntry gdb_gen_query_table [ ] = {
{
. handler = handle_query_curr_tid ,
@ -1821,6 +1875,22 @@ static const GdbCmdParseEntry gdb_gen_query_table[] = {
# endif
} ;
static GdbCmdParseEntry * extended_set_table ;
static int extended_set_table_size ;
void gdb_extend_set_table ( GdbCmdParseEntry * table , int size )
{
/*
* We don ' t support different sets of CPU gdb features on different CPUs yet
* so assert set table is the same on all CPUs , or is set only once ( 1 CPU ) .
*/
g_assert ( extended_set_table = = NULL | |
( extended_set_table_size = = size & &
cmp_cmds ( extended_set_table , table , size ) ) ) ;
extended_set_table = table ;
extended_set_table_size = size ;
}
static const GdbCmdParseEntry gdb_gen_set_table [ ] = {
/* Order is important if has same prefix */
{
@ -1859,11 +1929,21 @@ static void handle_gen_query(GArray *params, void *user_ctx)
return ;
}
if ( ! process_string_cmd ( gdb_get_cmd_param ( params , 0 ) - > data ,
gdb_gen_query_table ,
ARRAY_SIZE ( gdb_gen_query_table ) ) ) {
gdb_put_packet ( " " ) ;
if ( process_string_cmd ( gdb_get_cmd_param ( params , 0 ) - > data ,
gdb_gen_query_table ,
ARRAY_SIZE ( gdb_gen_query_table ) ) ) {
return ;
}
if ( extended_query_table & &
process_string_cmd ( gdb_get_cmd_param ( params , 0 ) - > data ,
extended_query_table ,
extended_query_table_size ) ) {
return ;
}
/* Can't handle query, return Empty response. */
gdb_put_packet ( " " ) ;
}
static void handle_gen_set ( GArray * params , void * user_ctx )
@ -1878,11 +1958,21 @@ static void handle_gen_set(GArray *params, void *user_ctx)
return ;
}
if ( ! process_string_cmd ( gdb_get_cmd_param ( params , 0 ) - > data ,
if ( process_string_cmd ( gdb_get_cmd_param ( params , 0 ) - > data ,
gdb_gen_set_table ,
ARRAY_SIZE ( gdb_gen_set_table ) ) ) {
gdb_put_packet ( " " ) ;
return ;
}
if ( extended_set_table & &
process_string_cmd ( gdb_get_cmd_param ( params , 0 ) - > data ,
extended_set_table ,
extended_set_table_size ) ) {
return ;
}
/* Can't handle set, return Empty response. */
gdb_put_packet ( " " ) ;
}
static void handle_target_halt ( GArray * params , void * user_ctx )