translate_init.c

来自「xen虚拟机源代码安装包」· C语言 代码 · 共 1,866 行 · 第 1/5 页

C
1,866
字号
{    gen_op_store_booke_tcr();}static void spr_write_booke_tsr (void *opaque, int sprn){    gen_op_store_booke_tsr();}#endif/* PowerPC 403 specific registers *//* PBL1 / PBU1 / PBL2 / PBU2 */#if !defined(CONFIG_USER_ONLY)static void spr_read_403_pbr (void *opaque, int sprn){    gen_op_load_403_pb(sprn - SPR_403_PBL1);}static void spr_write_403_pbr (void *opaque, int sprn){    gen_op_store_403_pb(sprn - SPR_403_PBL1);}static void spr_write_pir (void *opaque, int sprn){    gen_op_store_pir();}#endif#if !defined(CONFIG_USER_ONLY)/* Callback used to write the exception vector base */static void spr_write_excp_prefix (void *opaque, int sprn){    gen_op_store_excp_prefix();    gen_op_store_spr(sprn);}static void spr_write_excp_vector (void *opaque, int sprn){    DisasContext *ctx = opaque;    if (sprn >= SPR_BOOKE_IVOR0 && sprn <= SPR_BOOKE_IVOR15) {        gen_op_store_excp_vector(sprn - SPR_BOOKE_IVOR0);        gen_op_store_spr(sprn);    } else if (sprn >= SPR_BOOKE_IVOR32 && sprn <= SPR_BOOKE_IVOR37) {        gen_op_store_excp_vector(sprn - SPR_BOOKE_IVOR32 + 32);        gen_op_store_spr(sprn);    } else {        printf("Trying to write an unknown exception vector %d %03x\n",               sprn, sprn);        GEN_EXCP_PRIVREG(ctx);    }}#endif#if defined(CONFIG_USER_ONLY)#define spr_register(env, num, name, uea_read, uea_write,                     \                     oea_read, oea_write, initial_value)                      \do {                                                                          \     _spr_register(env, num, name, uea_read, uea_write, initial_value);       \} while (0)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),                                  target_ulong initial_value)#elsestatic 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)#endif{    ppc_spr_t *spr;    spr = &env->spr_cb[num];    if (spr->name != NULL ||env-> spr[num] != 0x00000000 ||#if !defined(CONFIG_USER_ONLY)        spr->oea_read != NULL || spr->oea_write != NULL ||#endif        spr->uea_read != NULL || spr->uea_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 " ADDRX "\n", num, num, name,           initial_value);#endif    spr->name = name;    spr->uea_read = uea_read;    spr->uea_write = uea_write;#if !defined(CONFIG_USER_ONLY)    spr->oea_read = oea_read;    spr->oea_write = oea_write;#endif    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){#if !defined(CONFIG_USER_ONLY)    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;#endif}/* BATs 4-7 */static void gen_high_BATs (CPUPPCState *env){#if !defined(CONFIG_USER_ONLY)    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 += 4;#endif}/* 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);}/* Softare table search registers */static void gen_6xx_7xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways){#if !defined(CONFIG_USER_ONLY)    env->nb_tlb = nb_tlbs;    env->nb_ways = nb_ways;    env->id_tlbs = 1;    spr_register(env, SPR_DMISS, "DMISS",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, SPR_NOACCESS,                 0x00000000);    spr_register(env, SPR_DCMP, "DCMP",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, SPR_NOACCESS,                 0x00000000);    spr_register(env, SPR_HASH1, "HASH1",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, SPR_NOACCESS,                 0x00000000);    spr_register(env, SPR_HASH2, "HASH2",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, SPR_NOACCESS,                 0x00000000);    spr_register(env, SPR_IMISS, "IMISS",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, SPR_NOACCESS,                 0x00000000);    spr_register(env, SPR_ICMP, "ICMP",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, SPR_NOACCESS,                 0x00000000);    spr_register(env, SPR_RPA, "RPA",                 SPR_NOACCESS, SPR_NOACCESS,                 &spr_read_generic, &spr_write_generic,                 0x00000000);#endif}/* SPR common to MPC755 and G2 */

⌨️ 快捷键说明

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