printf("\n");
}
+uint32_t *
+parse_cp_indirect(uint32_t *dwords, uint32_t sizedwords,
+ uint64_t *ibaddr, uint32_t *ibsize)
+{
+ if (is_64b()) {
+ assert(sizedwords == 3);
+
+ /* a5xx+.. high 32b of gpu addr, then size: */
+ *ibaddr = dwords[0];
+ *ibaddr |= ((uint64_t)dwords[1]) << 32;
+ *ibsize = dwords[2];
+
+ return dwords + 3;
+ } else {
+ assert(sizedwords == 2);
+
+ *ibaddr = dwords[0];
+ *ibsize = dwords[1];
+
+ return dwords + 2;
+ }
+}
+
static void
cp_indirect(uint32_t *dwords, uint32_t sizedwords, int level)
{
uint32_t ibsize;
uint32_t *ptr = NULL;
- if (is_64b()) {
- /* a5xx+.. high 32b of gpu addr, then size: */
- ibaddr = dwords[0];
- ibaddr |= ((uint64_t)dwords[1]) << 32;
- ibsize = dwords[2];
- } else {
- ibaddr = dwords[0];
- ibsize = dwords[1];
- }
+ dwords = parse_cp_indirect(dwords, sizedwords, &ibaddr, &ibsize);
if (!quiet(3)) {
if (is_64b()) {
* executed but never returns. Account for this by checking if
* the IB returned:
*/
- highlight_gpuaddr(gpuaddr(&dwords[is_64b() ? 3 : 2]));
+ highlight_gpuaddr(gpuaddr(dwords));
ib++;
ibs[ib].base = ibaddr;
uint32_t reg_lastval(uint32_t regbase);
uint32_t reg_val(uint32_t regbase);
void reg_set(uint32_t regbase, uint32_t val);
+uint32_t * parse_cp_indirect(uint32_t *dwords, uint32_t sizedwords,
+ uint64_t *ibaddr, uint32_t *ibsize);
void reset_regs(void);
void cffdec_init(const struct cffdec_options *options);
void dump_register_val(struct regacc *r, int level);