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

📄 mpc8xxinc.c

📁 motorola 针对coldfire 5275 评估板的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
 *
 * 
 */

#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("    #\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 + -