X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Frtos%2Flinux.c;h=e5a4efcde697e202b175fd46c70ad1f4e6ec2ac5;hb=69ff7354d9c9accf09374772310098f1f00e8ccb;hp=cd7ae0437072fde15d4e5920caa4ddb7f6e4d825;hpb=908ee4dc9641bd3df2eb00264575501867da539d;p=openocd.git
diff --git a/src/rtos/linux.c b/src/rtos/linux.c
index cd7ae04370..e5a4efcde6 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);
@@ -420,6 +421,8 @@ int fill_task(struct target *target, struct threads *t)
} else
LOG_ERROR("fill task: unable to read memory");
+ free(buffer);
+
return retval;
}
@@ -494,8 +497,10 @@ 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;
+ }
if (!reg_list[13]->valid)
reg_list[13]->type->get(reg_list[13]);
@@ -526,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;
@@ -550,6 +555,8 @@ int get_current(struct target *target, int create)
head = head->next;
}
+ free(buffer);
+
return ERROR_OK;
}
@@ -615,6 +622,7 @@ retry:
(uint8_t *) registers);
if (retval != ERROR_OK) {
+ free(buffer);
LOG_ERROR("cpu_context: unable to read memory\n");
return context;
}
@@ -643,6 +651,8 @@ retry:
if (*thread_info_addr_old == 0xdeadbeef)
*thread_info_addr_old = thread_info_addr_update;
+ free(buffer);
+
return context;
}
@@ -655,11 +665,13 @@ uint32_t next_task(struct target *target, struct threads *t)
if (retval == ERROR_OK) {
uint32_t val = get_buffer(target, buffer);
val = val - NEXT;
- return val;
free(buffer);
+ return val;
} else
LOG_ERROR("next task: unable to read memory");
+ free(buffer);
+
return 0;
}
@@ -778,6 +790,7 @@ int linux_get_tasks(struct target *target, int context)
retval = get_name(target, t);
if (loop > MAX_THREADS) {
+ free(t);
LOG_INFO("more than %d threads !!", MAX_THREADS);
return ERROR_FAIL;
}
@@ -829,6 +842,7 @@ int linux_get_tasks(struct target *target, int context)
(timeval_ms() - start) / linux_os->threadid_count);
LOG_INFO("threadid count %d", linux_os->threadid_count);
+ free(t);
return ERROR_OK;
}
@@ -973,7 +987,7 @@ error_handling:
#ifndef PID_CHECK
error_handling:
free(t);
- LOG_ERROR("unable toread pid");
+ LOG_ERROR("unable to read pid");
return;
#endif
@@ -1101,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;
@@ -1120,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;
@@ -1157,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");*/
@@ -1185,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;
@@ -1199,27 +1213,25 @@ int linux_thread_extra_info(struct target *target,
if (temp->threadid == threadid) {
char *pid = " PID: ";
char *pid_current = "*PID: ";
- char *name = "NAME: ";
+ 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);
else
tmp_str_ptr += sprintf(tmp_str_ptr, "%s", pid);
- tmp_str_ptr +=
- sprintf(tmp_str_ptr, "%d", (int)temp->pid);
- tmp_str_ptr += sprintf(tmp_str_ptr, "%s", " | ");
+ tmp_str_ptr += sprintf(tmp_str_ptr, "%d, ", (int)temp->pid);
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);
+ size_t pkt_len = hexify(hex_str, (const uint8_t *)tmp_str,
+ strlen(tmp_str), strlen(tmp_str) * 2 + 1);
+ gdb_put_packet(connection, hex_str, pkt_len);
free(hex_str);
free(tmp_str);
return ERROR_OK;
@@ -1233,7 +1245,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 *)
@@ -1294,7 +1306,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;
@@ -1362,7 +1374,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;
@@ -1383,10 +1395,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].
@@ -1394,7 +1404,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,
@@ -1408,10 +1418,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;
@@ -1454,7 +1464,7 @@ static int linux_thread_packet(struct connection *connection, char *packet,
}
}
- /* if a packet handler returned an error, exit input loop */
+ /* if a packet handler returned an error, exit input loop */
if (retval != ERROR_OK)
return retval;
}
@@ -1512,7 +1522,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;
@@ -1559,14 +1569,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);
}