Skip to content

Commit

Permalink
gdbstub: fix gdb_get_cpu(s, pid, tid) when pid and/or tid are 0
Browse files Browse the repository at this point in the history
a TID or PID value means "any thread" (resp. "any process"). This commit
fixes the different combinations when at least one value is 0.

When both are 0, the function now returns the first attached CPU,
instead of the CPU with TID 1, which is not necessarily attached or even
existent.

When PID is specified but TID is 0, the function returns the first CPU
in the process, or NULL if the process does not exist or is not
attached.

In other cases, it returns the corresponding CPU, while ignoring the PID
check when PID is 0.

Reported-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Luc Michel <luc.michel@greensocs.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Message-id: 20190119140000.11767-1-luc.michel@greensocs.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
Luc Michel authored and pm215 committed Jan 29, 2019
1 parent 7e3f122 commit ab65eed
Showing 1 changed file with 43 additions and 29 deletions.
72 changes: 43 additions & 29 deletions gdbstub.c
Original file line number Diff line number Diff line change
Expand Up @@ -756,35 +756,6 @@ static CPUState *gdb_next_cpu_in_process(const GDBState *s, CPUState *cpu)
return cpu;
}

static CPUState *gdb_get_cpu(const GDBState *s, uint32_t pid, uint32_t tid)
{
GDBProcess *process;
CPUState *cpu;

if (!tid) {
/* 0 means any thread, we take the first one */
tid = 1;
}

cpu = find_cpu(tid);

if (cpu == NULL) {
return NULL;
}

process = gdb_get_cpu_process(s, cpu);

if (process->pid != pid) {
return NULL;
}

if (!process->attached) {
return NULL;
}

return cpu;
}

/* Return the cpu following @cpu, while ignoring unattached processes. */
static CPUState *gdb_next_attached_cpu(const GDBState *s, CPUState *cpu)
{
Expand Down Expand Up @@ -814,6 +785,49 @@ static CPUState *gdb_first_attached_cpu(const GDBState *s)
return cpu;
}

static CPUState *gdb_get_cpu(const GDBState *s, uint32_t pid, uint32_t tid)
{
GDBProcess *process;
CPUState *cpu;

if (!pid && !tid) {
/* 0 means any process/thread, we take the first attached one */
return gdb_first_attached_cpu(s);
} else if (pid && !tid) {
/* any thread in a specific process */
process = gdb_get_process(s, pid);

if (process == NULL) {
return NULL;
}

if (!process->attached) {
return NULL;
}

return get_first_cpu_in_process(s, process);
} else {
/* a specific thread */
cpu = find_cpu(tid);

if (cpu == NULL) {
return NULL;
}

process = gdb_get_cpu_process(s, cpu);

if (pid && process->pid != pid) {
return NULL;
}

if (!process->attached) {
return NULL;
}

return cpu;
}
}

static const char *get_feature_xml(const GDBState *s, const char *p,
const char **newp, GDBProcess *process)
{
Expand Down

0 comments on commit ab65eed

Please sign in to comment.