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

📄 translate_init.c

📁 qemu虚拟机代码
💻 C
📖 第 1 页 / 共 4 页
字号:
/* *  PowerPC CPU initialization for qemu. *  *  Copyright (c) 2003-2005 Jocelyn Mayer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA *//* A lot of PowerPC definition have been included here. * Most of them are not usable for now but have been kept * inside "#if defined(TODO) ... #endif" statements to make tests easier. *///#define PPC_DUMP_CPU//#define PPC_DEBUG_SPRstruct ppc_def_t {    const unsigned char *name;    uint32_t pvr;    uint32_t pvr_mask;    uint32_t insns_flags;    uint32_t flags;    uint64_t msr_mask;};/* Generic callbacks: * do nothing but store/retrieve spr value */static void spr_read_generic (void *opaque, int sprn){    gen_op_load_spr(sprn);}static void spr_write_generic (void *opaque, int sprn){    gen_op_store_spr(sprn);}/* SPR common to all PPC *//* XER */static void spr_read_xer (void *opaque, int sprn){    gen_op_load_xer();}static void spr_write_xer (void *opaque, int sprn){    gen_op_store_xer();}/* LR */static void spr_read_lr (void *opaque, int sprn){    gen_op_load_lr();}static void spr_write_lr (void *opaque, int sprn){    gen_op_store_lr();}/* CTR */static void spr_read_ctr (void *opaque, int sprn){    gen_op_load_ctr();}static void spr_write_ctr (void *opaque, int sprn){    gen_op_store_ctr();}/* User read access to SPR *//* USPRx *//* UMMCRx *//* UPMCx *//* USIA *//* UDECR */static void spr_read_ureg (void *opaque, int sprn){    gen_op_load_spr(sprn + 0x10);}/* SPR common to all non-embedded PPC (ie not 4xx) *//* DECR */static void spr_read_decr (void *opaque, int sprn){    gen_op_load_decr();}static void spr_write_decr (void *opaque, int sprn){    gen_op_store_decr();}/* SPR common to all non-embedded PPC, except 601 *//* Time base */static void spr_read_tbl (void *opaque, int sprn){    gen_op_load_tbl();}static void spr_write_tbl (void *opaque, int sprn){    gen_op_store_tbl();}static void spr_read_tbu (void *opaque, int sprn){    gen_op_load_tbu();}static void spr_write_tbu (void *opaque, int sprn){    gen_op_store_tbu();}/* IBAT0U...IBAT0U *//* IBAT0L...IBAT7L */static void spr_read_ibat (void *opaque, int sprn){    gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT0U) / 2);}static void spr_read_ibat_h (void *opaque, int sprn){    gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT4U) / 2);}static void spr_write_ibatu (void *opaque, int sprn){    DisasContext *ctx = opaque;    gen_op_store_ibatu((sprn - SPR_IBAT0U) / 2);    RET_STOP(ctx);}static void spr_write_ibatu_h (void *opaque, int sprn){    DisasContext *ctx = opaque;    gen_op_store_ibatu((sprn - SPR_IBAT4U) / 2);    RET_STOP(ctx);}static void spr_write_ibatl (void *opaque, int sprn){    DisasContext *ctx = opaque;    gen_op_store_ibatl((sprn - SPR_IBAT0L) / 2);    RET_STOP(ctx);}static void spr_write_ibatl_h (void *opaque, int sprn){    DisasContext *ctx = opaque;    gen_op_store_ibatl((sprn - SPR_IBAT4L) / 2);    RET_STOP(ctx);}/* DBAT0U...DBAT7U *//* DBAT0L...DBAT7L */static void spr_read_dbat (void *opaque, int sprn){    gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT0U) / 2);}static void spr_read_dbat_h (void *opaque, int sprn){    gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT4U) / 2);}static void spr_write_dbatu (void *opaque, int sprn){    DisasContext *ctx = opaque;    gen_op_store_dbatu((sprn - SPR_DBAT0U) / 2);    RET_STOP(ctx);}static void spr_write_dbatu_h (void *opaque, int sprn){    DisasContext *ctx = opaque;    gen_op_store_dbatu((sprn - SPR_DBAT4U) / 2);    RET_STOP(ctx);}static void spr_write_dbatl (void *opaque, int sprn){    DisasContext *ctx = opaque;    gen_op_store_dbatl((sprn - SPR_DBAT0L) / 2);    RET_STOP(ctx);}static void spr_write_dbatl_h (void *opaque, int sprn){    DisasContext *ctx = opaque;    gen_op_store_dbatl((sprn - SPR_DBAT4L) / 2);    RET_STOP(ctx);}/* SDR1 */static void spr_read_sdr1 (void *opaque, int sprn){    gen_op_load_sdr1();}static void spr_write_sdr1 (void *opaque, int sprn){    DisasContext *ctx = opaque;    gen_op_store_sdr1();    RET_STOP(ctx);}static void spr_write_pir (void *opaque, int sprn){    gen_op_store_pir();}static inline void spr_register (CPUPPCState *env, int num,                                 const unsigned char *name,                                 void (*uea_read)(void *opaque, int sprn),                                 void (*uea_write)(void *opaque, int sprn),                                 void (*oea_read)(void *opaque, int sprn),                                 void (*oea_write)(void *opaque, int sprn),                                 target_ulong initial_value){    ppc_spr_t *spr;    spr = &env->spr_cb[num];    if (spr->name != NULL ||env-> spr[num] != 0x00000000 ||        spr->uea_read != NULL || spr->uea_write != NULL ||        spr->oea_read != NULL || spr->oea_write != NULL) {        printf("Error: Trying to register SPR %d (%03x) twice !\n", num, num);        exit(1);    }#if defined(PPC_DEBUG_SPR)    printf("*** register spr %d (%03x) %s val %08llx\n", num, num, name,           (unsigned long long)initial_value);#endif    spr->name = name;    spr->uea_read = uea_read;    spr->uea_write = uea_write;    spr->oea_read = oea_read;    spr->oea_write = oea_write;    env->spr[num] = initial_value;}/* Generic PowerPC SPRs */static void gen_spr_generic (CPUPPCState *env){    /* Integer processing */    spr_register(env, SPR_XER, "XER",                 &spr_read_xer, &spr_write_xer,                 &spr_read_xer, &spr_write_xer,                 0x00000000);    /* Branch contol */    spr_register(env, SPR_LR, "LR",                 &spr_read_lr, &spr_write_lr,                 &spr_read_lr, &spr_write_lr,                 0x00000000);    spr_register(env, SPR_CTR, "CTR",                 &spr_read_ctr, &spr_write_ctr,                 &spr_read_ctr, &spr_write_ctr,                 0x00000000);    /* Interrupt processing */    spr_register(env, SPR_SRR0, "SRR0",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, &spr_write_generic,                 0x00000000);    spr_register(env, SPR_SRR1, "SRR1",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, &spr_write_generic,                 0x00000000);    /* Processor control */    spr_register(env, SPR_SPRG0, "SPRG0",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, &spr_write_generic,                 0x00000000);    spr_register(env, SPR_SPRG1, "SPRG1",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, &spr_write_generic,                 0x00000000);    spr_register(env, SPR_SPRG2, "SPRG2",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, &spr_write_generic,                 0x00000000);    spr_register(env, SPR_SPRG3, "SPRG3",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, &spr_write_generic,                 0x00000000);}/* SPR common to all non-embedded PowerPC, including 601 */static void gen_spr_ne_601 (CPUPPCState *env){    /* Exception processing */    spr_register(env, SPR_DSISR, "DSISR",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, &spr_write_generic,                 0x00000000);    spr_register(env, SPR_DAR, "DAR",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, &spr_write_generic,                 0x00000000);    /* Timer */    spr_register(env, SPR_DECR, "DECR",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_decr, &spr_write_decr,                 0x00000000);    /* Memory management */    spr_register(env, SPR_SDR1, "SDR1",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_sdr1, &spr_write_sdr1,                 0x00000000);}/* BATs 0-3 */static void gen_low_BATs (CPUPPCState *env){    spr_register(env, SPR_IBAT0U, "IBAT0U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat, &spr_write_ibatu,                 0x00000000);    spr_register(env, SPR_IBAT0L, "IBAT0L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat, &spr_write_ibatl,                 0x00000000);    spr_register(env, SPR_IBAT1U, "IBAT1U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat, &spr_write_ibatu,                 0x00000000);    spr_register(env, SPR_IBAT1L, "IBAT1L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat, &spr_write_ibatl,                 0x00000000);    spr_register(env, SPR_IBAT2U, "IBAT2U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat, &spr_write_ibatu,                 0x00000000);    spr_register(env, SPR_IBAT2L, "IBAT2L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat, &spr_write_ibatl,                 0x00000000);    spr_register(env, SPR_IBAT3U, "IBAT3U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat, &spr_write_ibatu,                 0x00000000);    spr_register(env, SPR_IBAT3L, "IBAT3L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat, &spr_write_ibatl,                 0x00000000);    spr_register(env, SPR_DBAT0U, "DBAT0U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat, &spr_write_dbatu,                 0x00000000);    spr_register(env, SPR_DBAT0L, "DBAT0L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat, &spr_write_dbatl,                 0x00000000);    spr_register(env, SPR_DBAT1U, "DBAT1U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat, &spr_write_dbatu,                 0x00000000);    spr_register(env, SPR_DBAT1L, "DBAT1L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat, &spr_write_dbatl,                 0x00000000);    spr_register(env, SPR_DBAT2U, "DBAT2U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat, &spr_write_dbatu,                 0x00000000);    spr_register(env, SPR_DBAT2L, "DBAT2L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat, &spr_write_dbatl,                 0x00000000);    spr_register(env, SPR_DBAT3U, "DBAT3U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat, &spr_write_dbatu,                 0x00000000);    spr_register(env, SPR_DBAT3L, "DBAT3L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat, &spr_write_dbatl,                 0x00000000);    env->nb_BATs = 4;}/* BATs 4-7 */static void gen_high_BATs (CPUPPCState *env){    spr_register(env, SPR_IBAT4U, "IBAT4U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat_h, &spr_write_ibatu_h,                 0x00000000);    spr_register(env, SPR_IBAT4L, "IBAT4L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat_h, &spr_write_ibatl_h,                 0x00000000);    spr_register(env, SPR_IBAT5U, "IBAT5U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat_h, &spr_write_ibatu_h,                 0x00000000);    spr_register(env, SPR_IBAT5L, "IBAT5L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat_h, &spr_write_ibatl_h,                 0x00000000);    spr_register(env, SPR_IBAT6U, "IBAT6U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat_h, &spr_write_ibatu_h,                 0x00000000);    spr_register(env, SPR_IBAT6L, "IBAT6L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat_h, &spr_write_ibatl_h,                 0x00000000);    spr_register(env, SPR_IBAT7U, "IBAT7U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat_h, &spr_write_ibatu_h,                 0x00000000);    spr_register(env, SPR_IBAT7L, "IBAT7L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_ibat_h, &spr_write_ibatl_h,                 0x00000000);    spr_register(env, SPR_DBAT4U, "DBAT4U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat_h, &spr_write_dbatu_h,                 0x00000000);    spr_register(env, SPR_DBAT4L, "DBAT4L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat_h, &spr_write_dbatl_h,                 0x00000000);    spr_register(env, SPR_DBAT5U, "DBAT5U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat_h, &spr_write_dbatu_h,                 0x00000000);    spr_register(env, SPR_DBAT5L, "DBAT5L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat_h, &spr_write_dbatl_h,                 0x00000000);    spr_register(env, SPR_DBAT6U, "DBAT6U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat_h, &spr_write_dbatu_h,                 0x00000000);    spr_register(env, SPR_DBAT6L, "DBAT6L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat_h, &spr_write_dbatl_h,                 0x00000000);    spr_register(env, SPR_DBAT7U, "DBAT7U",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat_h, &spr_write_dbatu_h,                 0x00000000);    spr_register(env, SPR_DBAT7L, "DBAT7L",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_dbat_h, &spr_write_dbatl_h,                 0x00000000);    env->nb_BATs = 8;}/* Generic PowerPC time base */static void gen_tbl (CPUPPCState *env){    spr_register(env, SPR_VTBL,  "TBL",                 &spr_read_tbl, SPR_NOACCESS,                 &spr_read_tbl, SPR_NOACCESS,                 0x00000000);    spr_register(env, SPR_TBL,   "TBL",                 SPR_NOACCESS, SPR_NOACCESS,                 SPR_NOACCESS, &spr_write_tbl,                 0x00000000);    spr_register(env, SPR_VTBU,  "TBU",                 &spr_read_tbu, SPR_NOACCESS,                 &spr_read_tbu, SPR_NOACCESS,                 0x00000000);    spr_register(env, SPR_TBU,   "TBU",                 SPR_NOACCESS, SPR_NOACCESS,                 SPR_NOACCESS, &spr_write_tbu,                 0x00000000);}/* SPR common to all 7xx PowerPC implementations */static void gen_spr_7xx (CPUPPCState *env){    /* Breakpoints */    /* XXX : not implemented */    spr_register(env, SPR_DABR, "DABR",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, &spr_write_generic,                 0x00000000);    /* XXX : not implemented */    spr_register(env, SPR_IABR, "IABR",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, &spr_write_generic,                 0x00000000);    /* Cache management */    /* XXX : not implemented */    spr_register(env, SPR_ICTC, "ICTC",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, &spr_write_generic,                 0x00000000);    /* Performance monitors */    /* XXX : not implemented */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -