summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmitay Isaacs <amitay@ozlabs.org>2018-11-16 12:14:31 +1100
committerAlistair Popple <alistair@popple.id.au>2018-11-16 15:32:53 +1100
commit1d60e8b8410a946353c342a293e0e3445b1acc40 (patch)
treed6b718c2c024bc5477db4f01f25af1090bd23804
parent4d3968285af7d4c33179995d1d79d1752eb284b4 (diff)
downloadpdbg-1d60e8b8410a946353c342a293e0e3445b1acc40.tar.gz
pdbg-1d60e8b8410a946353c342a293e0e3445b1acc40.zip
main: Convert register functions to path based targeting
Signed-off-by: Amitay Isaacs <amitay@ozlabs.org> Reviewed-by: Alistair Popple <alistair@popple.id.au>
-rw-r--r--src/reg.c155
1 files changed, 95 insertions, 60 deletions
diff --git a/src/reg.c b/src/reg.c
index fcf6f4c..8fdb386 100644
--- a/src/reg.c
+++ b/src/reg.c
@@ -18,11 +18,13 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#include <libpdbg.h>
#include "main.h"
#include "optcmd.h"
+#include "path.h"
#define REG_CR -5
#define REG_XER -4
@@ -31,14 +33,14 @@
#define REG_NIA -1
#define REG_R31 31
-static void print_proc_reg(struct pdbg_target *target, uint64_t reg, uint64_t value, int rc)
+static void print_proc_reg(struct pdbg_target *target, int reg, uint64_t *value, int rc)
{
int proc_index, chip_index, thread_index;
thread_index = pdbg_target_index(target);
chip_index = pdbg_parent_index(target, "core");
proc_index = pdbg_parent_index(target, "pib");
- printf("p%d:c%d:t%d:", proc_index, chip_index, thread_index);
+ printf("p%d:c%d:t%d: ", proc_index, chip_index, thread_index);
if (reg == REG_MSR)
printf("msr: ");
@@ -49,145 +51,178 @@ static void print_proc_reg(struct pdbg_target *target, uint64_t reg, uint64_t va
else if (reg == REG_CR)
printf("cr: ");
else if (reg > REG_R31)
- printf("spr%03" PRIu64 ": ", reg - REG_R31);
+ printf("spr%03d: ", reg - REG_R31);
else if (reg >= 0 && reg <= 31)
- printf("gpr%02" PRIu64 ": ", reg);
+ printf("gpr%02d: ", reg);
if (rc == 1) {
printf("Check threadstatus - not all threads on this chiplet are quiesced\n");
} else if (rc == 2)
printf("Thread in incorrect state\n");
else
- printf("0x%016" PRIx64 "\n", value);
+ printf("0x%016" PRIx64 "\n", *value);
}
-static int putprocreg(struct pdbg_target *target, uint32_t index, uint64_t *reg, uint64_t *value)
+static int putprocreg(struct pdbg_target *target, int reg, uint64_t *value)
{
+ uint32_t u32;
int rc;
- if (*reg == REG_MSR)
+ if (reg == REG_MSR)
rc = ram_putmsr(target, *value);
- else if (*reg == REG_NIA)
+ else if (reg == REG_NIA)
rc = ram_putnia(target, *value);
- else if (*reg == REG_XER)
+ else if (reg == REG_XER)
rc = ram_putxer(target, *value);
- else if (*reg == REG_CR)
- rc = ram_putcr(target, *value);
- else if (*reg > REG_R31)
- rc = ram_putspr(target, *reg - REG_R31, *value);
- else if (*reg >= 0 && *reg <= 31)
- rc = ram_putgpr(target, *reg, *value);
-
- print_proc_reg(target, *reg, *value, rc);
+ else if (reg == REG_CR) {
+ u32 = *value;
+ rc = ram_putcr(target, u32);
+ } else if (reg > REG_R31)
+ rc = ram_putspr(target, reg - REG_R31, *value);
+ else if (reg >= 0 && reg <= 31)
+ rc = ram_putgpr(target, reg, *value);
+ else
+ assert(0);
- return 0;
+ return rc;
}
-static int getprocreg(struct pdbg_target *target, uint32_t index, uint64_t *reg, uint64_t *unused)
+static int getprocreg(struct pdbg_target *target, uint32_t reg, uint64_t *value)
{
+ uint32_t u32 = 0;
int rc;
- uint64_t value;
- if (*reg == REG_MSR)
- rc = ram_getmsr(target, &value);
- else if (*reg == REG_NIA)
- rc = ram_getnia(target, &value);
- else if (*reg == REG_XER)
- rc = ram_getxer(target, &value);
- else if (*reg == REG_CR)
- rc = ram_getcr(target, (uint32_t *)&value);
- else if (*reg > REG_R31)
- rc = ram_getspr(target, *reg - REG_R31, &value);
- else if (*reg >= 0 && *reg <= 31)
- rc = ram_getgpr(target, *reg, &value);
+ if (reg == REG_MSR)
+ rc = ram_getmsr(target, value);
+ else if (reg == REG_NIA)
+ rc = ram_getnia(target, value);
+ else if (reg == REG_XER)
+ rc = ram_getxer(target, value);
+ else if (reg == REG_CR) {
+ rc = ram_getcr(target, &u32);
+ *value = u32;
+ } else if (reg > REG_R31)
+ rc = ram_getspr(target, reg - REG_R31, value);
+ else if (reg >= 0 && reg <= 31)
+ rc = ram_getgpr(target, reg, value);
+ else
+ assert(0);
+
+ return rc;
+}
+
+static int getreg(int reg)
+{
+ struct pdbg_target *target;
+ int count = 0;
+
+ for_each_path_target_class("thread", target) {
+ uint64_t value = 0;
+ int rc;
+
+ if (pdbg_target_status(target) != PDBG_TARGET_ENABLED)
+ continue;
+
+ rc = getprocreg(target, reg, &value);
+ print_proc_reg(target, reg, &value, rc);
+
+ if (!rc)
+ count++;
+ }
+
+ return count;
+}
+
+static int putreg(int reg, uint64_t *value)
+{
+ struct pdbg_target *target;
+ int count = 0;
+
+ for_each_path_target_class("thread", target) {
+ int rc;
+
+ if (pdbg_target_status(target) != PDBG_TARGET_ENABLED)
+ continue;
+
+ rc = putprocreg(target, reg, value);
+ print_proc_reg(target, reg, value, rc);
- print_proc_reg(target, *reg, value, rc);
+ if (!rc)
+ count++;
+ }
- return !rc;
+ return count;
}
static int getgpr(int gpr)
{
- uint64_t reg = gpr;
- return for_each_target("thread", getprocreg, &reg, NULL);
+ return getreg(gpr);
}
OPTCMD_DEFINE_CMD_WITH_ARGS(getgpr, getgpr, (GPR));
static int putgpr(int gpr, uint64_t data)
{
- uint64_t reg = gpr;
- return for_each_target("thread", putprocreg, &reg, &data);
+ return putreg(gpr, &data);
}
OPTCMD_DEFINE_CMD_WITH_ARGS(putgpr, putgpr, (GPR, DATA));
static int getnia(void)
{
- uint64_t reg = REG_NIA;
- return for_each_target("thread", getprocreg, &reg, NULL);
+ return getreg(REG_NIA);
}
OPTCMD_DEFINE_CMD(getnia, getnia);
static int putnia(uint64_t nia)
{
- uint64_t reg = REG_NIA;
- return for_each_target("thread", putprocreg, &reg, &nia);
+ return putreg(REG_NIA, &nia);
}
OPTCMD_DEFINE_CMD_WITH_ARGS(putnia, putnia, (DATA));
static int getspr(int spr)
{
- uint64_t reg = spr + REG_R31;
- return for_each_target("thread", getprocreg, &reg, NULL);
+ return getreg(spr + REG_R31);
}
OPTCMD_DEFINE_CMD_WITH_ARGS(getspr, getspr, (SPR));
static int putspr(int spr, uint64_t data)
{
- uint64_t reg = spr + REG_R31;
- return for_each_target("thread", putprocreg, &reg, &data);
+ return putreg(spr + REG_R31, &data);
}
OPTCMD_DEFINE_CMD_WITH_ARGS(putspr, putspr, (SPR, DATA));
static int getmsr(void)
{
- uint64_t reg = REG_MSR;
- return for_each_target("thread", getprocreg, &reg, NULL);
+ return getreg(REG_MSR);
}
OPTCMD_DEFINE_CMD(getmsr, getmsr);
static int putmsr(uint64_t data)
{
- uint64_t reg = REG_MSR;
- return for_each_target("thread", putprocreg, &reg, &data);
+ return putreg(REG_MSR, &data);
}
OPTCMD_DEFINE_CMD_WITH_ARGS(putmsr, putmsr, (DATA));
static int getxer(void)
{
- uint64_t reg = REG_XER;
- return for_each_target("thread", getprocreg, &reg, NULL);
+ return getreg(REG_XER);
}
OPTCMD_DEFINE_CMD(getxer, getxer);
static int putxer(uint64_t data)
{
- uint64_t reg = REG_XER;
- uint64_t d = data;
- return for_each_target("thread", putprocreg, &reg, &d);
+ return putreg(REG_XER, &data);
}
OPTCMD_DEFINE_CMD_WITH_ARGS(putxer, putxer, (DATA));
static int getcr(void)
{
- uint64_t cr = REG_CR;
- return for_each_target("thread", getprocreg, &cr, NULL);
+ return getreg(REG_CR);
}
OPTCMD_DEFINE_CMD(getcr, getcr);
static int putcr(uint32_t data)
{
- uint64_t cr = REG_CR;
- uint64_t d = data;
- return for_each_target("thread", putprocreg, &cr, &d);
+ uint64_t u64 = data;
+ return putreg(REG_CR, &u64);
}
OPTCMD_DEFINE_CMD_WITH_ARGS(putcr, putcr, (DATA32));
OpenPOWER on IntegriCloud