X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Frtos%2Flinux.c;h=8c150af2e7f093c1b133ececab0625785e3ab9b8;hp=15d52366fb83d9fa7a92223cb090c71c69ec0054;hb=d0e763ac7ef6aa17b17bd00ccdfbccfb4eacda69;hpb=60a932b36804bff8b6ca40adc665a33a59475db1
diff --git a/src/rtos/linux.c b/src/rtos/linux.c
index 15d52366fb..8c150af2e7 100644
--- a/src/rtos/linux.c
+++ b/src/rtos/linux.c
@@ -14,9 +14,7 @@
* 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. *
+ * along with this program. If not, see . *
***************************************************************************/
#ifdef HAVE_CONFIG_H
@@ -28,8 +26,8 @@
#include "target/target.h"
#include "target/target_type.h"
#include "helper/log.h"
+#include "helper/types.h"
#include "rtos.h"
-#include "helper/log.h"
#include "rtos_standard_stackings.h"
#include
#include "server/gdb_server.h"
@@ -40,7 +38,7 @@
#define MAX_THREADS 200
/* specific task */
struct linux_os {
- char *name;
+ const char *name;
uint32_t init_task_addr;
int thread_count;
int threadid_count;
@@ -140,9 +138,9 @@ static int linux_read_memory(struct target *target,
return ERROR_FAIL;
}
#ifdef PHYS
- target->type->read_phys_memory(target, pa, size, count, buffer);
+ target_read_phys_memory(target, pa, size, count, buffer);
#endif
- target->type->read_memory(target, address, size, count, buffer);
+ target_read_memory(target, address, size, count, buffer);
return ERROR_OK;
}
@@ -160,7 +158,7 @@ int fill_buffer(struct target *target, uint32_t addr, uint8_t *buffer)
{
if ((addr & 0xfffffffc) != addr)
- LOG_INFO("unaligned address %x!!", addr);
+ LOG_INFO("unaligned address %" PRIx32 "!!", addr);
int retval = linux_read_memory(target, addr, 4, 1, buffer);
return retval;
@@ -217,7 +215,7 @@ static int linux_os_thread_reg_list(struct rtos *rtos,
if (found == 0) {
LOG_ERROR
(
- "current thread %" PRIx64 ": no target to perform access of core id %x",
+ "current thread %" PRIx64 ": no target to perform access of core id %" PRIx32,
thread_id,
next->core_id);
return ERROR_FAIL;
@@ -226,7 +224,8 @@ static int linux_os_thread_reg_list(struct rtos *rtos,
/*LOG_INFO("thread %lx current on core %x",thread_id,
* target->coreid);*/
retval =
- target_get_gdb_reg_list(target, ®_list, ®_list_size);
+ target_get_gdb_reg_list(target, ®_list, ®_list_size,
+ REG_CLASS_GENERAL);
if (retval != ERROR_OK)
return retval;
@@ -234,6 +233,8 @@ static int linux_os_thread_reg_list(struct rtos *rtos,
for (i = 0; i < reg_list_size; i++)
reg_packet_size += reg_list[i]->size;
+ assert(reg_packet_size > 0);
+
*hex_reg_list = malloc(DIV_ROUND_UP(reg_packet_size, 8) * 2);
hex_string = *hex_reg_list;
@@ -251,7 +252,7 @@ static int linux_os_thread_reg_list(struct rtos *rtos,
} else {
struct threads *temp = linux_os->thread_list;
- *hex_reg_list = (char *)calloc(1, 500 * sizeof(char));
+ *hex_reg_list = calloc(1, 500 * sizeof(char));
hex_string = *hex_reg_list;
for (i = 0; i < 16; i++)
@@ -317,7 +318,7 @@ static int linux_os_detect(struct target *target)
static int linux_os_smp_init(struct target *target);
static int linux_os_clean(struct target *target);
#define INIT_TASK 0
-static char *linux_symbol_list[] = {
+static const char * const linux_symbol_list[] = {
"init_task",
NULL
};
@@ -326,9 +327,9 @@ static int linux_get_symbol_list_to_lookup(symbol_table_elem_t *symbol_list[])
{
unsigned int i;
*symbol_list = (symbol_table_elem_t *)
- malloc(sizeof(symbol_table_elem_t) / sizeof(char *));
+ calloc(ARRAY_SIZE(linux_symbol_list), sizeof(symbol_table_elem_t));
- for (i = 0; i < sizeof(linux_symbol_list) / sizeof(char *); i++)
+ for (i = 0; i < ARRAY_SIZE(linux_symbol_list); i++)
(*symbol_list)[i].symbol_name = linux_symbol_list[i];
return 0;
@@ -348,7 +349,7 @@ const struct rtos_type Linux_os = {
.ps_command = linux_ps_command,
};
-static int linux_thread_packet(struct connection *connection, char *packet,
+static int linux_thread_packet(struct connection *connection, char const *packet,
int packet_size);
static void linux_identify_current_threads(struct target *target);
@@ -496,7 +497,7 @@ int get_current(struct target *target, int create)
int retval;
if (target_get_gdb_reg_list(head->target, ®_list,
- ®_list_size) != ERROR_OK) {
+ ®_list_size, REG_CLASS_GENERAL) != ERROR_OK) {
free(buffer);
return ERROR_TARGET_FAILURE;
}
@@ -530,7 +531,7 @@ int get_current(struct target *target, int create)
LOG_ERROR
("error in linux current thread update");
- if (create) {
+ if (create && ct) {
struct threads *t;
t = calloc(1, sizeof(struct threads));
t->base_addr = ct->TS;
@@ -1114,7 +1115,7 @@ static int linux_task_update(struct target *target, int context)
}
int linux_gdb_thread_packet(struct target *target,
- struct connection *connection, char *packet,
+ struct connection *connection, char const *packet,
int packet_size)
{
int retval;
@@ -1133,25 +1134,25 @@ int linux_gdb_thread_packet(struct target *target,
if (retval != ERROR_OK)
return ERROR_TARGET_FAILURE;
- char *out_str = (char *)calloc(1, 350 * sizeof(int64_t));
+ char *out_str = calloc(1, 350 * sizeof(int64_t));
char *tmp_str = out_str;
tmp_str += sprintf(tmp_str, "m");
struct threads *temp = linux_os->thread_list;
- tmp_str += sprintf(tmp_str, "%016" PRIx64, temp->threadid);
- temp = temp->next;
while (temp != NULL) {
- tmp_str += sprintf(tmp_str, ",");
tmp_str += sprintf(tmp_str, "%016" PRIx64, temp->threadid);
temp = temp->next;
+ if (temp)
+ tmp_str += sprintf(tmp_str, ",");
}
gdb_put_packet(connection, out_str, strlen(out_str));
+ free(out_str);
return ERROR_OK;
}
int linux_gdb_thread_update(struct target *target,
- struct connection *connection, char *packet,
+ struct connection *connection, char const *packet,
int packet_size)
{
int found = 0;
@@ -1170,7 +1171,7 @@ int linux_gdb_thread_update(struct target *target,
if (found == 1) {
/*LOG_INFO("INTO GDB THREAD UPDATE FOUNDING START TASK");*/
- char *out_strr = (char *)calloc(1, 350 * sizeof(int64_t));
+ char *out_strr = calloc(1, 350 * sizeof(int64_t));
char *tmp_strr = out_strr;
tmp_strr += sprintf(tmp_strr, "m");
/*LOG_INFO("CHAR MALLOC & M DONE");*/
@@ -1198,7 +1199,7 @@ int linux_gdb_thread_update(struct target *target,
}
int linux_thread_extra_info(struct target *target,
- struct connection *connection, char *packet,
+ struct connection *connection, char const *packet,
int packet_size)
{
int64_t threadid = 0;
@@ -1214,10 +1215,10 @@ int linux_thread_extra_info(struct target *target,
char *pid_current = "*PID: ";
char *name = "NAME: ";
int str_size = strlen(pid) + strlen(name);
- char *tmp_str = (char *)calloc(1, str_size + 50);
+ char *tmp_str = calloc(1, str_size + 50);
char *tmp_str_ptr = tmp_str;
- /* discriminate cuurent task */
+ /* discriminate current task */
if (temp->status == 3)
tmp_str_ptr += sprintf(tmp_str_ptr, "%s",
pid_current);
@@ -1229,10 +1230,9 @@ int linux_thread_extra_info(struct target *target,
tmp_str_ptr += sprintf(tmp_str_ptr, "%s", " | ");
sprintf(tmp_str_ptr, "%s", name);
sprintf(tmp_str_ptr, "%s", temp->name);
- char *hex_str =
- (char *)calloc(1, strlen(tmp_str) * 2 + 1);
- str_to_hex(hex_str, tmp_str);
- gdb_put_packet(connection, hex_str, strlen(hex_str));
+ char *hex_str = calloc(1, strlen(tmp_str) * 2 + 1);
+ int pkt_len = hexify(hex_str, tmp_str, 0, strlen(tmp_str) * 2 + 1);
+ gdb_put_packet(connection, hex_str, pkt_len);
free(hex_str);
free(tmp_str);
return ERROR_OK;
@@ -1246,7 +1246,7 @@ int linux_thread_extra_info(struct target *target,
}
int linux_gdb_T_packet(struct connection *connection,
- struct target *target, char *packet, int packet_size)
+ struct target *target, char const *packet, int packet_size)
{
int64_t threadid;
struct linux_os *linux_os = (struct linux_os *)
@@ -1307,7 +1307,7 @@ int linux_gdb_T_packet(struct connection *connection,
}
int linux_gdb_h_packet(struct connection *connection,
- struct target *target, char *packet, int packet_size)
+ struct target *target, char const *packet, int packet_size)
{
struct linux_os *linux_os = (struct linux_os *)
target->rtos->rtos_specific_params;
@@ -1375,7 +1375,7 @@ int linux_gdb_h_packet(struct connection *connection,
return ERROR_OK;
}
-static int linux_thread_packet(struct connection *connection, char *packet,
+static int linux_thread_packet(struct connection *connection, char const *packet,
int packet_size)
{
int retval = ERROR_OK;
@@ -1396,10 +1396,8 @@ static int linux_thread_packet(struct connection *connection, char *packet,
break;
case 'q':
- if ((strstr(packet, "qSymbol"))) {
+ if (strncmp(packet, "qSymbol", 7) == 0) {
if (rtos_qsymbol(connection, packet, packet_size) == 1) {
- gdb_put_packet(connection, "OK", 2);
-
linux_compute_virt2phys(target,
target->rtos->
symbols[INIT_TASK].
@@ -1407,7 +1405,7 @@ static int linux_thread_packet(struct connection *connection, char *packet,
}
break;
- } else if (strstr(packet, "qfThreadInfo")) {
+ } else if (strncmp(packet, "qfThreadInfo", 12) == 0) {
if (linux_os->thread_list == NULL) {
retval = linux_gdb_thread_packet(target,
connection,
@@ -1421,10 +1419,10 @@ static int linux_thread_packet(struct connection *connection, char *packet,
packet_size);
break;
}
- } else if (strstr(packet, "qsThreadInfo")) {
+ } else if (strncmp(packet, "qsThreadInfo", 12) == 0) {
gdb_put_packet(connection, "l", 1);
break;
- } else if (strstr(packet, "qThreadExtraInfo,")) {
+ } else if (strncmp(packet, "qThreadExtraInfo,", 17) == 0) {
linux_thread_extra_info(target, connection, packet,
packet_size);
break;
@@ -1525,7 +1523,7 @@ static int linux_os_create(struct target *target)
os_linux->threads_needs_update = 0;
os_linux->threadid_count = 1;
os_linux->current_threads = NULL;
- target->rtos->rtos_specific_params = (void *)os_linux;
+ target->rtos->rtos_specific_params = os_linux;
ct->core_id = target->coreid;
ct->threadid = -1;
ct->TS = 0xdeadbeef;
@@ -1572,14 +1570,14 @@ static char *linux_ps_command(struct target *target)
if (temp->context)
tmp +=
sprintf(tmp,
- "%d\t\t%d\t\t%x\t\t%s\n",
- (int)temp->pid, temp->oncpu,
+ "%" PRId32 "\t\t%" PRId32 "\t\t%" PRIx32 "\t\t%s\n",
+ temp->pid, temp->oncpu,
temp->asid, temp->name);
else
tmp +=
sprintf(tmp,
- "%d\t\t%d\t\t%x\t\t%s\n",
- (int)temp->pid, temp->oncpu,
+ "%" PRId32 "\t\t%" PRId32 "\t\t%" PRIx32 "\t\t%s\n",
+ temp->pid, temp->oncpu,
temp->asid, temp->name);
}