From e7f4040697702e0a799bae50fd0387486f3ee842 Mon Sep 17 00:00:00 2001 From: Alexander von Gluck IV Date: Fri, 5 Aug 2011 05:34:28 +0000 Subject: [PATCH] * improve debugging in AtomBIOS atom.c parser git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42579 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../accelerants/radeon_hd/atombios/atom.cpp | 150 +++++++++--------- 1 file changed, 78 insertions(+), 72 deletions(-) diff --git a/src/add-ons/accelerants/radeon_hd/atombios/atom.cpp b/src/add-ons/accelerants/radeon_hd/atombios/atom.cpp index 5a96a8c562..6508d95bb2 100644 --- a/src/add-ons/accelerants/radeon_hd/atombios/atom.cpp +++ b/src/add-ons/accelerants/radeon_hd/atombios/atom.cpp @@ -138,7 +138,7 @@ atom_iio_execute(atom_context *ctx, int base, uint32 index, uint32 data) case ATOM_IIO_END: return temp; default: - TRACE("Unknown IIO opcode.\n"); + TRACE("%s: Unknown IIO opcode.\n", __func__); return 0; } } @@ -162,18 +162,19 @@ atom_get_src_int(atom_exec_context *ctx, uint8 attr, int *ptr, val = gctx->card->reg_read(idx); break; case ATOM_IO_PCI: - TRACE("PCI registers are not implemented.\n"); + TRACE("%s: PCI registers are not implemented.\n", __func__); return 0; case ATOM_IO_SYSIO: - TRACE("SYSIO registers are not implemented.\n"); + TRACE("%s: SYSIO registers are not implemented.\n", __func__); return 0; default: if (!(gctx->io_mode&0x80)) { - TRACE("Bad IO mode.\n"); + TRACE("%s: Bad IO mode.\n", __func__); return 0; } if (!gctx->iio[gctx->io_mode&0x7F]) { - TRACE("Undefined indirect IO read method %d.\n", gctx->io_mode&0x7F); + TRACE("%s: Undefined indirect IO read method %d.\n", __func__, + gctx->io_mode&0x7F); return 0; } val = atom_iio_execute(gctx, gctx->iio[gctx->io_mode&0x7F], idx, 0); @@ -224,7 +225,7 @@ atom_get_src_int(atom_exec_context *ctx, uint8 attr, int *ptr, case ATOM_ARG_FB: idx = U8(*ptr); (*ptr)++; - TRACE("FB access is not implemented.\n"); + TRACE("%s: FB access is not implemented.\n", __func__); return 0; case ATOM_ARG_IMM: switch(align) { @@ -256,7 +257,7 @@ atom_get_src_int(atom_exec_context *ctx, uint8 attr, int *ptr, case ATOM_ARG_MC: idx = U8(*ptr); (*ptr)++; - TRACE("MC registers are not implemented.\n"); + TRACE("%s: MC registers are not implemented.\n", __func__); return 0; } if (saved) @@ -354,14 +355,14 @@ atom_put_dst(atom_exec_context *ctx, int arg, uint8 attr, gctx->card->reg_write(idx, val); break; case ATOM_IO_PCI: - TRACE("PCI registers are not implemented.\n"); + TRACE("%s: PCI registers are not implemented.\n", __func__); return; case ATOM_IO_SYSIO: - TRACE("SYSIO registers are not implemented.\n"); + TRACE("%s: SYSIO registers are not implemented.\n", __func__); return; default: if (!(gctx->io_mode&0x80)) { - TRACE("Bad IO mode.\n"); + TRACE("%s: Bad IO mode.\n", __func__); return; } if (!gctx->iio[gctx->io_mode&0xFF]) { @@ -407,7 +408,7 @@ atom_put_dst(atom_exec_context *ctx, int arg, uint8 attr, case ATOM_ARG_FB: idx = U8(*ptr); (*ptr)++; - TRACE("FB access is not implemented.\n"); + TRACE("%s: FB access is not implemented.\n", __func__); return; case ATOM_ARG_PLL: idx = U8(*ptr); @@ -418,7 +419,7 @@ atom_put_dst(atom_exec_context *ctx, int arg, uint8 attr, case ATOM_ARG_MC: idx = U8(*ptr); (*ptr)++; - TRACE("MC registers are not implemented.\n"); + TRACE("%s: MC registers are not implemented.\n", __func__); return; } } @@ -430,12 +431,13 @@ atom_op_add(atom_exec_context *ctx, int *ptr, int arg) uint8 attr = U8((*ptr)++); uint32 dst, src, saved; int dptr = *ptr; - TRACE(" dst: "); dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); - TRACE(" src: "); src = atom_get_src(ctx, attr, ptr); + #ifdef TRACE_ATOM + TRACE("%s: 0x%" B_PRIX32 " + 0x%" B_PRIX32 " is 0x%" B_PRIX32 "\n", + __func__, dst, src, dst + src); + #endif dst += src; - TRACE(" dst: "); atom_put_dst(ctx, arg, attr, &dptr, dst, saved); } @@ -446,12 +448,13 @@ atom_op_and(atom_exec_context *ctx, int *ptr, int arg) uint8 attr = U8((*ptr)++); uint32 dst, src, saved; int dptr = *ptr; - TRACE(" dst: "); dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); - TRACE(" src: "); src = atom_get_src(ctx, attr, ptr); + #ifdef TRACE_ATOM + TRACE("%s: 0x%" B_PRIX32 " & 0x%" B_PRIX32 " is 0x%" B_PRIX32 "\n", + __func__, src, dst, dst & src); + #endif dst &= src; - TRACE(" dst: "); atom_put_dst(ctx, arg, attr, &dptr, dst, saved); } @@ -459,7 +462,7 @@ atom_op_and(atom_exec_context *ctx, int *ptr, int arg) static void atom_op_beep(atom_exec_context *ctx, int *ptr, int arg) { - TRACE("ATOM BIOS beeped!\n"); + TRACE("%s: Quack!\n", __func__); } @@ -467,7 +470,7 @@ static void atom_op_calltable(atom_exec_context *ctx, int *ptr, int arg) { int idx = U8((*ptr)++); - TRACE(" table: %d\n", idx); + TRACE("%s: table: %d\n", __func__, idx); if (U16(ctx->ctx->cmd_table + 4 + 2 * idx)) atom_execute_table(ctx->ctx, idx, ctx->ps + ctx->ps_shift); } @@ -482,7 +485,7 @@ atom_op_clear(atom_exec_context *ctx, int *ptr, int arg) attr &= 0x38; attr |= atom_def_dst[attr>>3]<<6; atom_get_dst(ctx, arg, attr, ptr, &saved, 0); - TRACE(" dst: "); + TRACE("%s\n", __func__); atom_put_dst(ctx, arg, attr, &dptr, 0, saved); } @@ -492,14 +495,12 @@ atom_op_compare(atom_exec_context *ctx, int *ptr, int arg) { uint8 attr = U8((*ptr)++); uint32 dst, src; - TRACE(" src1: "); dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1); - TRACE(" src2: "); src = atom_get_src(ctx, attr, ptr); ctx->ctx->cs_equal = (dst == src); ctx->ctx->cs_above = (dst > src); - TRACE(" result: %s %s\n", ctx->ctx->cs_equal ? "EQ" : "NE", - ctx->ctx->cs_above ? "GT" : "LE"); + TRACE("%s: 0x%" B_PRIX32 " %s 0x%" B_PRIX32 "\n", __func__, + dst, ctx->ctx->cs_above ? ">" : "<=", src); } @@ -507,11 +508,12 @@ static void atom_op_delay(atom_exec_context *ctx, int *ptr, int arg) { uint8 count = U8((*ptr)++); - TRACE(" count: %d\n", count); if (arg == ATOM_UNIT_MICROSEC) { + TRACE("%s: %" B_PRIu8 " microseconds\n", __func__, count); // Microseconds usleep(count); } else { + TRACE("%s: %" B_PRIu8 " milliseconds\n", __func__, count); // TODO : check // Milliseconds usleep(count); @@ -524,9 +526,7 @@ atom_op_div(atom_exec_context *ctx, int *ptr, int arg) { uint8 attr = U8((*ptr)++); uint32 dst, src; - TRACE(" src1: "); dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1); - TRACE(" src2: "); src = atom_get_src(ctx, attr, ptr); if (src != 0) { ctx->ctx->divmul[0] = dst / src; @@ -535,6 +535,11 @@ atom_op_div(atom_exec_context *ctx, int *ptr, int arg) ctx->ctx->divmul[0] = 0; ctx->ctx->divmul[1] = 0; } + #ifdef ATOM_TRACE + TRACE("%s: 0x%" B_PRIX32 " / 0x%" B_PRIX32 " is 0x%" B_PRIX32 + " remander 0x%" B_PRIX32 "\n", __func__, dst, src, + ctx->ctx->divmul[0], ctx->ctx->divmul[1]); + #endif } @@ -573,11 +578,10 @@ atom_op_jump(atom_exec_context *ctx, int *ptr, int arg) execute = !ctx->ctx->cs_equal; break; } - if (arg != ATOM_COND_ALWAYS) - TRACE(" taken: %s\n", execute?"yes":"no"); - TRACE(" target: 0x%04X\n", target); + TRACE("%s: execute jump: %s; target: 0x%04X\n", __func__, + execute? "yes" : "no", target); if (execute) - *ptr = ctx->start + target; + *ptr = ctx->start + target; } @@ -587,15 +591,13 @@ atom_op_mask(atom_exec_context *ctx, int *ptr, int arg) uint8 attr = U8((*ptr)++); uint32 dst, src1, src2, saved; int dptr = *ptr; - TRACE(" dst: "); dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); - TRACE(" src1: "); src1 = atom_get_src(ctx, attr, ptr); - TRACE(" src2: "); src2 = atom_get_src(ctx, attr, ptr); dst &= src1; dst |= src2; - TRACE(" dst: "); + TRACE("%s: src: 0x%" B_PRIX32 " mask 0x%" B_PRIX32 " is 0x%" B_PRIX32 "\n", + __func__, src1, src2, dst); atom_put_dst(ctx, arg, attr, &dptr, dst, saved); } @@ -607,14 +609,14 @@ atom_op_move(atom_exec_context *ctx, int *ptr, int arg) uint32 src, saved; int dptr = *ptr; if (((attr>>3)&7) != ATOM_SRC_DWORD) - atom_get_dst(ctx, arg, attr, ptr, &saved, 0); + atom_get_dst(ctx, arg, attr, ptr, &saved, 0); else { - atom_skip_dst(ctx, arg, attr, ptr); - saved = 0xCDCDCDCD; + atom_skip_dst(ctx, arg, attr, ptr); + saved = 0xCDCDCDCD; } - TRACE(" src: "); src = atom_get_src(ctx, attr, ptr); - TRACE(" dst: "); + TRACE("%s: src: 0x%" B_PRIX32 "; saved: 0x%" B_PRIX32 "\n", + __func__, src, saved); atom_put_dst(ctx, arg, attr, &dptr, src, saved); } @@ -624,11 +626,11 @@ atom_op_mul(atom_exec_context *ctx, int *ptr, int arg) { uint8 attr = U8((*ptr)++); uint32 dst, src; - TRACE(" src1: "); dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1); - TRACE(" src2: "); src = atom_get_src(ctx, attr, ptr); ctx->ctx->divmul[0] = dst * src; + TRACE("%s: 0x%" B_PRIX32 " * 0x%" B_PRIX32 " is 0x%" B_PRIX32 "\n", + __func__, dst, src, ctx->ctx->divmul[0]); } @@ -645,12 +647,13 @@ atom_op_or(atom_exec_context *ctx, int *ptr, int arg) uint8 attr = U8((*ptr)++); uint32 dst, src, saved; int dptr = *ptr; - TRACE(" dst: "); dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); - TRACE(" src: "); src = atom_get_src(ctx, attr, ptr); + #ifdef ATOM_TRACE + TRACE("%s: 0x%" B_PRIX32 " | 0x%" B_PRIX32 " is 0x%" B_PRIX32 "\n", + __func__, dst, src, dst | src); + #endif dst |= src; - TRACE(" dst: "); atom_put_dst(ctx, arg, attr, &dptr, dst, saved); } @@ -658,27 +661,27 @@ atom_op_or(atom_exec_context *ctx, int *ptr, int arg) static void atom_op_postcard(atom_exec_context *ctx, int *ptr, int arg) { - TRACE("unimplemented!\n"); + TRACE("%s: unimplemented!\n", __func__); } static void atom_op_repeat(atom_exec_context *ctx, int *ptr, int arg) { - TRACE("unimplemented!\n"); + TRACE("%s: unimplemented!\n", __func__); } static void atom_op_restorereg(atom_exec_context *ctx, int *ptr, int arg) { - TRACE("unimplemented!\n"); + TRACE("%s: unimplemented!\n", __func__); } static void atom_op_savereg(atom_exec_context *ctx, int *ptr, int arg) { - TRACE("unimplemented!\n"); + TRACE("%s: unimplemented!\n", __func__); } @@ -687,7 +690,7 @@ atom_op_setdatablock(atom_exec_context *ctx, int *ptr, int arg) { int idx = U8(*ptr); (*ptr)++; - TRACE(" block: %d\n", idx); + TRACE("%s: block: %d\n", __func__, idx); if (!idx) ctx->ctx->data_block = 0; else if (idx==255) @@ -701,8 +704,8 @@ static void atom_op_setfbbase(atom_exec_context *ctx, int *ptr, int arg) { uint8 attr = U8((*ptr)++); - TRACE(" fb_base: "); ctx->ctx->fb_base = atom_get_src(ctx, attr, ptr); + TRACE("%s: fb_base: 0x%" B_PRIX32 "\n", __func__, ctx->ctx->fb_base); } @@ -713,7 +716,7 @@ atom_op_setport(atom_exec_context *ctx, int *ptr, int arg) switch(arg) { case ATOM_PORT_ATI: port = U16(*ptr); - TRACE(" port: %d\n", port); + TRACE("%s: port: %d\n", __func__, port); if (!port) ctx->ctx->io_mode = ATOM_IO_MM; else @@ -748,12 +751,13 @@ atom_op_shl(atom_exec_context *ctx, int *ptr, int arg) int dptr = *ptr; attr &= 0x38; attr |= atom_def_dst[attr>>3]<<6; - TRACE(" dst: "); dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); shift = U8((*ptr)++); - TRACE(" shift: %d\n", shift); + #ifdef ATOM_TRACE + TRACE("%s: 0x%" B_PRIX32 " << %" B_PRId8 " is 0X%" B_PRIX32 "\n", + __func__, dst, shift, dst << shift); + #endif dst <<= shift; - TRACE(" dst: "); atom_put_dst(ctx, arg, attr, &dptr, dst, saved); } @@ -766,12 +770,13 @@ atom_op_shr(atom_exec_context *ctx, int *ptr, int arg) int dptr = *ptr; attr &= 0x38; attr |= atom_def_dst[attr>>3]<<6; - TRACE(" dst: "); dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); shift = U8((*ptr)++); - TRACE(" shift: %d\n", shift); + #ifdef ATOM_TRACE + TRACE("%s: 0x%" B_PRIX32 " >> %" B_PRId8 " is 0X%" B_PRIX32 "\n", + __func__, dst, shift, dst >> shift); + #endif dst >>= shift; - TRACE(" dst: "); atom_put_dst(ctx, arg, attr, &dptr, dst, saved); } @@ -782,12 +787,13 @@ atom_op_sub(atom_exec_context *ctx, int *ptr, int arg) uint8 attr = U8((*ptr)++); uint32 dst, src, saved; int dptr = *ptr; - TRACE(" dst: "); dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); - TRACE(" src: "); src = atom_get_src(ctx, attr, ptr); + #ifdef TRACE_ATOM + TRACE("%s: 0x%" B_PRIX32 " - 0x%" B_PRIX32 " is 0x%" B_PRIX32 "\n", + __func__, dst, src, dst - src); + #endif dst -= src; - TRACE(" dst: "); atom_put_dst(ctx, arg, attr, &dptr, dst, saved); } @@ -797,12 +803,12 @@ atom_op_switch(atom_exec_context *ctx, int *ptr, int arg) { uint8 attr = U8((*ptr)++); uint32 src, val, target; - TRACE(" switch: "); + TRACE("%s: switch start\n", __func__); src = atom_get_src(ctx, attr, ptr); while (U16(*ptr) != ATOM_CASE_END) if (U8(*ptr) == ATOM_CASE_MAGIC) { (*ptr)++; - TRACE(" case: "); + TRACE("%s: switch case\n", __func__); val = atom_get_src(ctx, (attr&0x38)|ATOM_ARG_IMM, ptr); target = U16(*ptr); if (val == src) { @@ -811,7 +817,7 @@ atom_op_switch(atom_exec_context *ctx, int *ptr, int arg) } (*ptr) += 2; } else { - TRACE("Bad case.\n"); + TRACE("%s: ERROR bad case\n", __func__); return; } (*ptr) += 2; @@ -823,12 +829,11 @@ atom_op_test(atom_exec_context *ctx, int *ptr, int arg) { uint8 attr = U8((*ptr)++); uint32 dst, src; - TRACE(" src1: "); dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1); - TRACE(" src2: "); src = atom_get_src(ctx, attr, ptr); ctx->ctx->cs_equal = ((dst & src) == 0); - TRACE(" result: %s\n", ctx->ctx->cs_equal?"EQ":"NE"); + TRACE("%s: 0x%" B_PRIX32 " and 0x%" B_PRIX32 " are %s\n", __func__, + dst, src, ctx->ctx->cs_equal ? "EQ" : "NE"); } @@ -838,12 +843,13 @@ atom_op_xor(atom_exec_context *ctx, int *ptr, int arg) uint8 attr = U8((*ptr)++); uint32 dst, src, saved; int dptr = *ptr; - TRACE(" dst: "); dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); - TRACE(" src: "); src = atom_get_src(ctx, attr, ptr); + #ifdef ATOM_TRACE + TRACE("%s: 0x%" B_PRIX32 " ^ 0X%" B_PRIX32 " is " B_PRIX32 "\n", + __func__, dst, src, dst ^ src); + #endif dst ^= src; - TRACE(" dst: "); atom_put_dst(ctx, arg, attr, &dptr, dst, saved); } @@ -851,7 +857,7 @@ atom_op_xor(atom_exec_context *ctx, int *ptr, int arg) static void atom_op_debug(atom_exec_context *ctx, int *ptr, int arg) { - TRACE("unimplemented!\n"); + TRACE("%s: unimplemented!\n", __func__); }