1
0
mirror of https://gitlab.os-k.eu/os-k-team/kvisc.git synced 2023-08-25 14:05:46 +02:00
kvisc/vm/pc/dump.c

142 lines
2.8 KiB
C
Raw Normal View History

2019-06-12 15:30:35 +02:00
// The OS/K Team licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#include <pc/arch.h>
char *cond_suffixes[] =
{
2019-06-12 15:36:52 +02:00
"-",
"c", "o", "z", "s", "p",
"a", "ae", "b", "be",
"g", "ge", "l", "le",
"cxz",
"?"
2019-06-12 15:30:35 +02:00
};
2019-06-16 19:52:32 +02:00
#ifndef _ATT_STYLE
2019-06-17 13:15:57 +02:00
#define _ATT_STYLE 0
2019-06-16 19:52:32 +02:00
#endif
2019-06-16 19:42:10 +02:00
2019-06-21 22:19:55 +02:00
void dump_acc(ctx_t *ctx, acc_t *p);
2019-06-16 19:42:10 +02:00
void dump_instr(ctx_t *ctx,
instr_t *in,
acc_t *p1,
acc_t *p2,
bool lock,
bool rep,
2019-06-23 21:12:25 +02:00
uint cond)
2019-06-16 19:42:10 +02:00
{
2019-06-23 12:40:18 +02:00
/*
2019-06-21 22:19:55 +02:00
trace("%03lu 0x%lX:\t", ctx->ninstrs, pc);
2019-06-23 12:40:18 +02:00
*/
2019-06-23 21:12:25 +02:00
trace("0x%lX:\t", rpc);
2019-06-16 19:42:10 +02:00
if (lock)
2019-06-19 21:41:22 +02:00
trace("lock");
2019-06-16 19:42:10 +02:00
2019-06-19 21:41:22 +02:00
trace("%s", in->name);
2019-06-16 19:44:34 +02:00
2019-06-16 19:42:10 +02:00
if (rep)
2019-06-19 21:41:22 +02:00
trace(".rep");
2019-06-16 19:42:10 +02:00
if (cond)
{
2019-06-19 21:41:22 +02:00
trace(".");
2019-06-16 19:42:10 +02:00
if (cond & (1 << 4))
{
cond &= ~(1 << 4);
2019-06-19 21:41:22 +02:00
trace("n");
2019-06-16 19:42:10 +02:00
}
assert(cond <= sizeof(cond_suffixes)/sizeof(char *));
2019-06-19 21:41:22 +02:00
trace("%s", cond_suffixes[cond]);
2019-06-16 19:42:10 +02:00
}
2019-06-19 21:41:22 +02:00
if (!rep) trace("\t\t");
2019-06-16 19:42:10 +02:00
else
2019-06-19 21:41:22 +02:00
trace("\t");
2019-06-16 19:42:10 +02:00
2019-06-16 19:52:32 +02:00
if (p1)
{
2019-06-16 19:42:10 +02:00
dump_acc(ctx, p1);
if (p2) {
2019-06-19 21:41:22 +02:00
trace(", ");
2019-06-16 19:42:10 +02:00
dump_acc(ctx, p2);
}
2019-06-16 19:44:34 +02:00
}
2019-06-16 19:42:10 +02:00
2019-06-19 21:41:22 +02:00
trace("\n");
2019-06-16 19:42:10 +02:00
}
void dump_acc(ctx_t *ctx, acc_t *p)
2019-06-12 15:30:35 +02:00
{
uint mfmt;
2019-06-19 13:47:10 +02:00
sym_t *sym;
2019-06-12 15:30:35 +02:00
if (p->type == A_REG)
2019-06-19 21:41:22 +02:00
trace("%s", ctx->r[p->reg].name);
2019-06-12 15:30:35 +02:00
else if (p->type == A_IMM64)
2019-06-14 16:47:01 +02:00
{
if (p->val < 0xA)
2019-06-19 21:41:22 +02:00
trace("%lu", p->val);
2019-06-14 16:47:01 +02:00
else
2019-06-19 13:47:10 +02:00
{
sym = find_sym_by_addr(p->val);
if (sym)
2019-06-19 21:41:22 +02:00
trace("$%s(0x%lX)", sym->name, sym->addr);
2019-06-19 13:47:10 +02:00
else
2019-06-19 21:41:22 +02:00
trace("0x%lX", p->val);
2019-06-19 13:47:10 +02:00
}
2019-06-14 16:47:01 +02:00
}
2019-06-12 15:30:35 +02:00
else
{
2019-06-19 21:41:22 +02:00
trace("%c[", getmempref(p->mlen));
2019-06-12 15:30:35 +02:00
mfmt = p->type & AM_MFMT_MASK;
if (mfmt == AM_IMM64)
2019-06-19 21:41:22 +02:00
trace("0x%lX]", p->addr);
2019-06-14 16:47:01 +02:00
2019-06-12 15:30:35 +02:00
else if (mfmt == AM_RR)
{
if (p->reg1 && p->reg2)
2019-06-19 21:41:22 +02:00
trace("%s+%s]", ctx->r[p->reg1].name, ctx->r[p->reg2].name);
2019-06-12 15:30:35 +02:00
2019-06-19 21:41:22 +02:00
else trace("%s]", ctx->r[p->reg1 ? p->reg1 : p->reg2].name);
2019-06-12 15:30:35 +02:00
}
else if (mfmt == AM_RRI)
{
if (p->reg1 && p->reg2)
2019-06-19 21:41:22 +02:00
trace("%s+%s+%hd]", ctx->r[p->reg1].name,
2019-06-12 15:58:57 +02:00
ctx->r[p->reg2].name, p->imm2);
2019-06-12 15:30:35 +02:00
2019-06-19 21:41:22 +02:00
else trace("%s+%hd]",
2019-06-16 19:42:10 +02:00
ctx->r[p->reg1 ? p->reg1 : p->reg2].name, p->imm2);
2019-06-12 15:30:35 +02:00
}
else if (mfmt == AM_RRII)
{
if (p->reg1)
2019-06-19 21:41:22 +02:00
trace("%s+%s*%u+%hd]",
2019-06-12 15:30:35 +02:00
ctx->r[p->reg1].name,
ctx->r[p->reg2].name,
p->imm1, p->imm2);
else
2019-06-19 21:41:22 +02:00
trace("%s*%u+%hd]",
2019-06-12 15:30:35 +02:00
ctx->r[p->reg2].name,
p->imm1, p->imm2);
}
}
}