1115013Smarcel#include <stdio.h>
2115013Smarcel#include <inttypes.h>
3115013Smarcel
4121642Smarcel#define IP 0
5121642Smarcel#define SP 1
6121642Smarcel#define BSP 2
7121642Smarcel#define CFM 3
8121642Smarcel#define RP 4
9121642Smarcel#define PSP 5
10121642Smarcel#define PFS 6
11121642Smarcel#define PREDS 7
12121642Smarcel#define PRIUNAT 8
13121642Smarcel#define AR_BSPSTORE 9
14121642Smarcel#define AR_RNAT 10
15121642Smarcel#define AR_UNAT 11
16121642Smarcel#define AR_FPSR 12
17121642Smarcel#define AR_LC 13
18121642Smarcel#define AR_PFS 14
19121642Smarcel#define GR4 16
20121642Smarcel#define GR5 17
21121642Smarcel#define GR6 18
22121642Smarcel#define GR7 19
23121642Smarcel#define BR1 20
24121642Smarcel#define BR2 21
25121642Smarcel#define BR3 22
26121642Smarcel#define BR4 23
27121642Smarcel#define BR5 24
28121642Smarcel
29115013Smarcelvoid dump_context(uint64_t *context)
30115013Smarcel{
31115013Smarcel    int i, j;
32121642Smarcel    unsigned int valid;
33115013Smarcel    uint64_t val;
34115013Smarcel    static char *names[] = {
35121642Smarcel	/*  0 */ "ip", "sp", "bsp", "cfm",
36121642Smarcel	/*  4 */ "rp", "psp", "pfs", "preds",
37121642Smarcel	/*  8 */ "priunat", "ar.bspstore", "ar.rnat", "ar.unat",
38121642Smarcel	/* 12 */ "ar.fpsr", "ar.lc", "ar.pfs", "(pad)",
39121642Smarcel	/* 16 */ "gr4", "gr5", "gr6", "gr7",
40121642Smarcel	/* 20 */ "br1", "br2", "br3", "br4", "br5"
41115013Smarcel    };
42121642Smarcel    static int col1[] = {
43121642Smarcel	IP,
44121642Smarcel	SP,
45121642Smarcel	BSP,
46121642Smarcel	CFM,
47121642Smarcel	RP,
48121642Smarcel	PSP,
49121642Smarcel	PFS,
50121642Smarcel	AR_RNAT,
51121642Smarcel	AR_UNAT,
52121642Smarcel	AR_FPSR,
53121642Smarcel	AR_LC,
54121642Smarcel	AR_PFS,
55115013Smarcel    };
56121642Smarcel    static int col2[] = {
57121642Smarcel	PREDS,
58121642Smarcel	PRIUNAT,
59121642Smarcel	GR4,
60121642Smarcel	GR5,
61121642Smarcel	GR6,
62121642Smarcel	GR7,
63121642Smarcel	BR1,
64121642Smarcel	BR2,
65121642Smarcel	BR3,
66121642Smarcel	BR4,
67121642Smarcel	BR5,
68121642Smarcel    };
69115013Smarcel
70121642Smarcel#define NCOL1 (sizeof(col1)/sizeof(int))
71121642Smarcel#define NCOL2 (sizeof(col2)/sizeof(int))
72121642Smarcel#define NPRINT (NCOL1 > NCOL2 ? NCOL1 : NCOL2)
73121642Smarcel
74121642Smarcel    valid = (unsigned int)(context[0] >> 32);
75121642Smarcel    printf("  valid_regs (%08lx):", valid);
76121642Smarcel    for (i = 0; i <= BR5; i++) {
77121642Smarcel	if (valid & 1) printf(" %s", names[i]);
78121642Smarcel	valid >>= 1;
79121642Smarcel    }
80121642Smarcel    printf("\n");
81121642Smarcel    for (i = 0; i < NPRINT; i++) {
82121642Smarcel	if (i < NCOL1) {
83121642Smarcel	    j = col1[i];
84115013Smarcel	    val = context[j+1];
85115013Smarcel	    printf("  %-8s %08x %08x", names[j],
86115013Smarcel			(unsigned int)(val >> 32),
87115013Smarcel			(unsigned int)val);
88115013Smarcel	}
89115013Smarcel	else
90115013Smarcel	    printf("                            ");
91121642Smarcel	if (i < NCOL2) {
92121642Smarcel	    j = col2[i];
93115013Smarcel	    val = context[j+1];
94115013Smarcel	    printf("      %-8s %08x %08x", names[j],
95115013Smarcel			(unsigned int)(val >> 32),
96115013Smarcel			(unsigned int)val);
97115013Smarcel	}
98115013Smarcel	putchar('\n');
99115013Smarcel    }
100115013Smarcel}
101