📄 mpc8xxinc.c
字号:
/*
* This program generates the offsets used by the assembly file
* to access the MPC8XX registers buffer.
*
* NOTE: There is an important assumption in that the PowerPC
* C compiler and the C compiler used to generate this file
* match EXACTLY in the way the REGISTERS data structure is
* produced. Ie, no reordering, no alignment issues...
*
* NOTE: By using the form below, maximum capability between Diab and
* GNU PPC assembler is achieved!!!!
*
* .equ symbol,value
*
* When compiling this utility from this directory, use:
*
* gcc -D CPU_MPC860 -I ../../../../../include/cpu mpc8xxinc.c
*
*
*/
#include <cpu.h>
#include "mpc8xx.h"
static REGISTERS regs;
#define ENTRY(PPC,REG,SPR) {#PPC, #REG, SPR, (void *)®s.REG}
typedef struct
{
char * proc;
char * reg;
int spr;
void * offset;
} ppc_reg;
#define REGTAB_SIZE (sizeof(regtab) / sizeof(ppc_reg))
#define REG_OFFSET(X) (void *)((char *)X - (char *)®s)
static const ppc_reg regtab[] =
{
ENTRY(0,r0,0),
ENTRY(0,r1,0),
ENTRY(0,r2,0),
ENTRY(0,r3,0),
ENTRY(0,r4,0),
ENTRY(0,r5,0),
ENTRY(0,r6,0),
ENTRY(0,r7,0),
ENTRY(0,r8,0),
ENTRY(0,r9,0),
ENTRY(0,r10,0),
ENTRY(0,r11,0),
ENTRY(0,r12,0),
ENTRY(0,r13,0),
ENTRY(0,r14,0),
ENTRY(0,r15,0),
ENTRY(0,r16,0),
ENTRY(0,r17,0),
ENTRY(0,r18,0),
ENTRY(0,r19,0),
ENTRY(0,r20,0),
ENTRY(0,r21,0),
ENTRY(0,r22,0),
ENTRY(0,r23,0),
ENTRY(0,r24,0),
ENTRY(0,r25,0),
ENTRY(0,r26,0),
ENTRY(0,r27,0),
ENTRY(0,r28,0),
ENTRY(0,r29,0),
ENTRY(0,r30,0),
ENTRY(0,r31,0),
ENTRY(0,cr,0),
ENTRY(0,msr,0),
ENTRY(0,xer,1),
ENTRY(0,lr,8),
ENTRY(0,ctr,9),
ENTRY(0,dsisr,18),
ENTRY(0,dar,19),
ENTRY(0,dec,22),
ENTRY(0,srr0,26),
ENTRY(0,srr1,27),
ENTRY(0,tbl,268),
ENTRY(0,tbu,269),
ENTRY(0,sprg0,272),
ENTRY(0,sprg1,273),
ENTRY(0,sprg2,274),
ENTRY(0,sprg3,275),
ENTRY(0,pvr,287),
/*
* MPC8xx
*/
ENTRY(8xx,eie,80),
ENTRY(8xx,eid,81),
ENTRY(8xx,nri,82),
ENTRY(8xx,cmpa,144),
ENTRY(8xx,cmpb,145),
ENTRY(8xx,cmpc,146),
ENTRY(8xx,cmpd,147),
ENTRY(8xx,icr,148),
ENTRY(8xx,der,149),
ENTRY(8xx,counta,150),
ENTRY(8xx,countb,151),
ENTRY(8xx,cmpe,152),
ENTRY(8xx,cmpf,153),
ENTRY(8xx,cmpg,154),
ENTRY(8xx,cmph,155),
ENTRY(8xx,lctrl1,156),
ENTRY(8xx,lctrl2,157),
ENTRY(8xx,ictrl,158),
ENTRY(8xx,bar,159),
ENTRY(8xx,dpdr,630),
ENTRY(8xx,dpir,631),
ENTRY(8xx,immr,638),
ENTRY(8xx,ic_cst,560),
ENTRY(8xx,ic_adr,561),
ENTRY(8xx,ic_dat,562),
ENTRY(8xx,dc_cst,568),
ENTRY(8xx,dc_adr,569),
ENTRY(8xx,dc_dat,570),
ENTRY(8xx,mi_ctr,784),
ENTRY(8xx,mi_ap,786),
ENTRY(8xx,mi_epn,787),
ENTRY(8xx,mi_twc,789),
ENTRY(8xx,mi_rpn,790),
ENTRY(8xx,mi_dbcam,816),
ENTRY(8xx,mi_dbram0,817),
ENTRY(8xx,mi_dbram1,818),
ENTRY(8xx,md_ctr,792),
ENTRY(8xx,m_casid,793),
ENTRY(8xx,md_ap,794),
ENTRY(8xx,md_epn,795),
ENTRY(8xx,m_twb,796),
ENTRY(8xx,md_twc,797),
ENTRY(8xx,md_rpn,798),
ENTRY(8xx,m_tw,799),
ENTRY(8xx,md_dbcam,824),
ENTRY(8xx,md_dbram0,825),
ENTRY(8xx,md_dbram1,826),
} ;
static void
get_reg (char *outstr, char *instr)
{
/*
* Strip structure dereferences to get register name
* Outstr can not be equal to instr
*/
int slen = strlen(instr);
int i, j;
i = slen;
while ((instr[i] != '.') && (i > 0))
--i;
if (instr[i] == '.') ++i;
for (j = 0; i <= slen; ++j, ++i)
outstr[j] = instr[i];
}
static void
dump_sprs (void)
{
int index;
char ppcreg[60];
for (index = 0; index < REGTAB_SIZE; ++index)
{
get_reg(ppcreg, regtab[index].reg);
if (regtab[index].spr != 0)
{
if (strcmp("0",regtab[index].proc) == 0)
printf(" .equ spr_%s,%d\n",
ppcreg,
regtab[index].spr);
else
printf(" .equ spr_%s_%s,%d\n",
regtab[index].proc,
ppcreg,
regtab[index].spr);
}
}
}
static void
dump_offsets (void)
{
int index;
char ppcreg[60];
for (index = 0; index < REGTAB_SIZE; ++index)
{
get_reg(ppcreg, regtab[index].reg);
if (strcmp("0",regtab[index].proc) == 0)
printf(" .equ o_%s,%#06x\n",
ppcreg,
REG_OFFSET(regtab[index].offset));
else
printf(" .equ o_%s_%s,%#06x\n",
regtab[index].proc,
ppcreg,
REG_OFFSET(regtab[index].offset));
}
}
void main (void)
{
printf(" #\n");
printf(" # File: mpc8xx.inc\n");
printf(" #\n");
printf(" # Purpose: Definitions for the MPC8XX registers\n");
printf(" #\n");
printf(" #\n");
printf(" # Notes: This file automatically generated.\n");
printf(" # See mpc8xxinc.c utility.\n");
printf(" #\n");
printf("\n");
printf("\n");
printf(" #\n");
printf(" # Offsets of registers in the REGISTERS data structure.\n");
printf(" # NOTE: Offsets must match compiler calculated offsets!\n");
printf(" #\n");
printf("\n");
dump_offsets();
printf("\n");
printf("\n");
printf(" #\n");
printf(" # PowerPC Special Purpose Register numbers\n");
printf(" #\n");
printf("\n");
dump_sprs();
printf("\n");
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -