diff options
-rw-r--r-- | libpdbg/libpdbg.h | 6 | ||||
-rw-r--r-- | libpdbg/operations.h | 8 | ||||
-rw-r--r-- | libpdbg/p8chip.c | 3 | ||||
-rw-r--r-- | src/thread.c | 7 |
4 files changed, 20 insertions, 4 deletions
diff --git a/libpdbg/libpdbg.h b/libpdbg/libpdbg.h index 8c57193..8dec016 100644 --- a/libpdbg/libpdbg.h +++ b/libpdbg/libpdbg.h @@ -73,6 +73,12 @@ uint64_t thread_status(struct pdbg_target *target); #define THREAD_STATUS_NAP PPC_BIT(61) #define THREAD_STATUS_SLEEP PPC_BITMASK(61, 62) #define THREAD_STATUS_QUIESCE PPC_BIT(60) +#define THREAD_STATUS_SMT PPC_BITMASK(57, 59) +#define THREAD_STATUS_SMT_1 PPC_BIT(59) +#define THREAD_STATUS_SMT_2SH PPC_BIT(58) +#define THREAD_STATUS_SMT_2SP (PPC_BIT(58) | PPC_BIT(59)) +#define THREAD_STATUS_SMT_4 PPC_BIT(57) +#define THREAD_STATUS_SMT_8 (PPC_BIT(57) | PPC_BIT(59)) int htm_start(struct pdbg_target *target); int htm_stop(struct pdbg_target *target); diff --git a/libpdbg/operations.h b/libpdbg/operations.h index a0b7f01..d6c947f 100644 --- a/libpdbg/operations.h +++ b/libpdbg/operations.h @@ -16,6 +16,7 @@ #ifndef __OPERATIONS_H #define __OPERATIONS_H +#include "bitutils.h" #include "target.h" /* Error codes */ @@ -42,6 +43,13 @@ int adu_putmem(struct pdbg_target *target, uint64_t start_addr, uint8_t *input, #define THREAD_STATUS_NAP PPC_BIT(61) #define THREAD_STATUS_SLEEP PPC_BITMASK(61, 62) #define THREAD_STATUS_QUIESCE PPC_BIT(60) +#define THREAD_STATUS_SMT PPC_BITMASK(57, 59) +#define THREAD_STATUS_SMT_1 PPC_BIT(59) +#define THREAD_STATUS_SMT_2SH PPC_BIT(58) +#define THREAD_STATUS_SMT_2SP (PPC_BIT(58) | PPC_BIT(59)) +#define THREAD_STATUS_SMT_4 PPC_BIT(57) +#define THREAD_STATUS_SMT_8 (PPC_BIT(57) | PPC_BIT(59)) + /* Opcodes for instruction ramming */ #define OPCODE_MASK 0xfc0003ffUL diff --git a/libpdbg/p8chip.c b/libpdbg/p8chip.c index d68a521..0123042 100644 --- a/libpdbg/p8chip.c +++ b/libpdbg/p8chip.c @@ -42,6 +42,7 @@ #define RAS_STATUS_TS_QUIESCE PPC_BIT(49) #define POW_STATUS_REG 0x4 #define PMC_POW_STATE PPC_BITMASK(4, 5) +#define PMC_POW_SMT PPC_BITMASK(6, 8) #define CORE_POW_STATE PPC_BITMASK(23, 25) #define THREAD_ACTIVE_REG 0x1310e #define THREAD_ACTIVE PPC_BITMASK(0, 7) @@ -124,7 +125,7 @@ static uint64_t get_thread_status(struct thread *thread) /* Read POW status */ CHECK_ERR(pib_read(&thread->target, POW_STATUS_REG, &val)); thread_status = SETFIELD(THREAD_STATUS_STATE, thread_status, GETFIELD(PMC_POW_STATE, val)); - + thread_status = SETFIELD(THREAD_STATUS_SMT, thread_status, GETFIELD(PMC_POW_SMT, val)); /* Clear debug mode */ mode_reg &= ~MR_THREAD_IN_DEBUG; CHECK_ERR(pib_write(&thread->target, RAS_MODE_REG, mode_reg)); diff --git a/src/thread.c b/src/thread.c index 03e5212..a5fff33 100644 --- a/src/thread.c +++ b/src/thread.c @@ -27,7 +27,7 @@ static int print_thread_status(struct pdbg_target *target, uint32_t index, uint64_t *status, uint64_t *unused1) { - *status = SETFIELD(0xf << (index * 4), *status, thread_status(target) & 0xf); + *status = SETFIELD(0xffULL << (index * 8), *status, thread_status(target) & 0xffULL); return 1; } @@ -38,8 +38,8 @@ static int print_core_thread_status(struct pdbg_target *core_target, uint32_t in printf("c%02d:", index); rc = for_each_child_target("thread", core_target, print_thread_status, &status, NULL); - for (i = 0; i < 8; i++) - switch ((status >> (i * 4)) & 0xf) { + for (i = 0; i < 8; i++) { + switch ((status >> (i * 8)) & 0xf) { case THREAD_STATUS_ACTIVE: printf(" A"); break; @@ -71,6 +71,7 @@ static int print_core_thread_status(struct pdbg_target *core_target, uint32_t in printf(" U"); break; } + } printf("\n"); return rc; |