Actually thread and process ID's are positive values. Accorting to http://man7.org/linux/man-pages/man7/pthreads.7.html threads are creating using "clone" syscall, so the ID generation mechanism is similar for threads and processes. According to Linux source code there is a function call tree, which allocates PID[TID]: clone |->_do_fork |->copy_process |->alloc_pid |->idr_alloc_cyclic |->idr_alloc_u32(idr, ptr, &id, max, gfp); And in idr_alloc_u32() "id" is u32 value, which means positiveness. Also according to: https://elixir.bootlin.com/linux/latest/source/kernel/pid.c#L177 PID cannot be less than 1. In Zephyr RTOS the k_thread_create function returns thread ID which is actually pointer to k_thread structure. If the memory addressing starts from 0x80000000, passing such big values to write_ptid() leads to overflow of "int tid" variable and thread ID becomes negative. So lets remove the code, which handles negative tid/pid values. gdb/ChangeLog: 2019-11-06 Evgeniy Didin <didin@xxxxxxxxxxxx> * remote.c (remote_target::write_ptid): Remove handling negative tid,pid. Change "int" to "unsigned int" for pid/tid. Signed-off-by: Evgeniy Didin <didin@xxxxxxxxxxxx> Cc: Alexey Brodkin <abrodkin@xxxxxxxxxxxx> Cc: Claudiu Zissulescu <claziss@xxxxxxxxxxxx> Cc: Cupertino Miranda <cmiranda@xxxxxxxxxxxx> Cc: Vineet Gupta <vgupta@xxxxxxxxxxxx> Cc: Shahab Vahedi <shahab@xxxxxxxxxxxx> Cc: linux-snps-arc@xxxxxxxxxxxxxxxxxxx Signed-off-by: Evgeniy Didin <didin@xxxxxxxxxxxx> --- Changes v1-v2: -make no change of tid/pid bitness, use generic "unsigned int" instead of "uint32_t" gdb/ChangeLog | 6 ++++++ gdb/remote.c | 12 +++--------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e886480d62..cd55d65ced 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2019-11-06 Evgeniy Didin <didin@xxxxxxxxxxxx> + + * remote.c (remote_target::write_ptid): Remove handling + negative tid,pid. Change "int" to "unsigned int" for pid/tid. + + 2019-11-05 Tom Tromey <tom@xxxxxxxxxx> * tui/tui-disasm.c (struct tui_asm_line) <addr_size>: New member. diff --git a/gdb/remote.c b/gdb/remote.c index 8ea52d355a..ea12d738c8 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -2909,22 +2909,16 @@ static int remote_newthread_step (threadref *ref, void *context); char * remote_target::write_ptid (char *buf, const char *endbuf, ptid_t ptid) { - int pid, tid; + unsigned int pid, tid; struct remote_state *rs = get_remote_state (); if (remote_multi_process_p (rs)) { pid = ptid.pid (); - if (pid < 0) - buf += xsnprintf (buf, endbuf - buf, "p-%x.", -pid); - else - buf += xsnprintf (buf, endbuf - buf, "p%x.", pid); + buf += xsnprintf (buf, endbuf - buf, "p%x.", pid); } tid = ptid.lwp (); - if (tid < 0) - buf += xsnprintf (buf, endbuf - buf, "-%x", -tid); - else - buf += xsnprintf (buf, endbuf - buf, "%x", tid); + buf += xsnprintf (buf, endbuf - buf, "%x", tid); return buf; } -- 2.17.2 _______________________________________________ linux-snps-arc mailing list linux-snps-arc@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/linux-snps-arc