⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpc8xxinc.c

📁 motorola自己开发的针对coldfire 5272的Dbug bootloader程序
💻 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
 *
 * Eric DeVolder
 */

#include <cpu.h>
#include "mpc8xx.h"

static REGISTERS regs;

#define ENTRY(PPC,REG,SPR) {#PPC, #REG, SPR, (void *)&regs.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 *)&regs)

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("	# Author:	Eric DeVolder\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 + -