From patchwork Fri Nov 16 01:14:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amitay Isaacs X-Patchwork-Id: 998663 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42x0fd4Vg6z9sBQ for ; Fri, 16 Nov 2018 12:15:53 +1100 (AEDT) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=ozlabs.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; secure) header.d=ozlabs.org header.i=@ozlabs.org header.b="DN7jvjuI"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 42x0fd2Wk6zF3hK for ; Fri, 16 Nov 2018 12:15:53 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=ozlabs.org Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; secure) header.d=ozlabs.org header.i=@ozlabs.org header.b="DN7jvjuI"; dkim-atps=neutral X-Original-To: pdbg@lists.ozlabs.org Delivered-To: pdbg@lists.ozlabs.org Received: from ozlabs.org (bilbo.ozlabs.org [IPv6:2401:3900:2:1::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 42x0dQ2nkVzF3fW for ; Fri, 16 Nov 2018 12:14:50 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=ozlabs.org Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=ozlabs.org header.i=@ozlabs.org header.b="DN7jvjuI"; dkim-atps=neutral Received: from authenticated.ozlabs.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPSA id 42x0dP6kB1z9sCQ; Fri, 16 Nov 2018 12:14:49 +1100 (AEDT) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=ozlabs.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ozlabs.org; s=201707; t=1542330890; bh=t5VaZx4a+SFORDboaQKt+eXn5gKqui0Ly3ib72fVMuA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DN7jvjuIEgdGKQaIXSIrb5BFbsCR2ae/2BKM+99/kpYu9mhIgOYRPezdnFU25chIf n05LJ2lJzpsXwBjhqCX009xgcsNYLE4x8FUzUhodPNWBpfklLg9yBMBsNSU0pX8OIF 5YrnMfsLu50/mAuIicFjajDbVPZoKlBj28fJNVeb2T52WRfU0jLXe8HMKFuBKd3g4o sDVKbGTDr89+0A8HISxtqolL21Viz1eYSz/OqHBUKCapU1PGUUjt97mKvEMCePPj+A X4hC0cDSgs2gMZ86Bx/+XJfj/fG0UTE1xHlujBmCl/MDUTn+K8L9dKnn89oKttDFbk x8cjhSQ+Jq9sg== From: Amitay Isaacs To: pdbg@lists.ozlabs.org Date: Fri, 16 Nov 2018 12:14:31 +1100 Message-Id: <20181116011431.246208-17-amitay@ozlabs.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181116011431.246208-1-amitay@ozlabs.org> References: <20181116011431.246208-1-amitay@ozlabs.org> MIME-Version: 1.0 Subject: [Pdbg] [PATCH v4 16/16] main: Convert register functions to path based targeting X-BeenThere: pdbg@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "mailing list for https://github.com/open-power/pdbg development" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Amitay Isaacs Errors-To: pdbg-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Pdbg" Signed-off-by: Amitay Isaacs Reviewed-by: Alistair Popple --- src/reg.c | 155 +++++++++++++++++++++++++++++++++--------------------- 1 file 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 #include #include +#include #include #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, ®, 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, ®, &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, ®, 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, ®, &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, ®, 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, ®, &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, ®, 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, ®, &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, ®, 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, ®, &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));