00001 #ifndef SSB_MACHINE_H
00002 #define SSB_MACHINE_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 #include "fuClasses.h"
00059 #include "global.h"
00060
00061 #include <stdio.h>
00062
00063 #include "ssb_host.h"
00064 #include "ssb_misc.h"
00065
00066
00067
00068
00069
00070
00071
00072 #define TARGET_PPC
00073
00074
00075 #define NA 0
00076
00077
00078
00079
00080
00081
00082 #undef MD_QWORD_ADDRS
00083
00084
00085 typedef simAddress md_addr_t;
00086
00087 typedef unsigned long long SS_TIME_TYPE;
00088
00089
00090 typedef unsigned int INST_TAG_TYPE;
00091
00092
00093
00094
00095 typedef unsigned int INST_SEQ_TYPE;
00096
00097
00098
00099
00100
00101
00102
00103 #define MD_PAGE_SIZE 4096
00104
00105 #define MD_LOG_PAGE_SIZE 12
00106
00107
00108
00109
00110
00111
00112 enum md_fault_type {
00113 md_fault_none = 0,
00114 md_fault_access,
00115 md_fault_alignment,
00116 md_fault_overflow,
00117 md_fault_div0,
00118 md_fault_break,
00119 md_fault_unimpl,
00120 md_fault_invalidinstruction,
00121 md_fault_internal
00122 };
00123
00124
00125
00126
00127
00128
00129
00130 #define MD_NUM_IREGS 32
00131 #define MD_NUM_LREGS 1
00132 #define MD_NUM_CTRREGS 1
00133
00134
00135 #define MD_NUM_FREGS 32
00136
00137
00138 #define MD_NUM_CREGS 3
00139
00140
00141 #define MD_TOTAL_REGS \
00142 (32 + 32 + 1 + 1 + 1 + 1+1)
00143
00144
00145 typedef sword_t md_gpr_t[MD_NUM_IREGS];
00146
00147
00148
00149
00150
00151 typedef struct {
00152 dfloat_t d[MD_NUM_FREGS];
00153 } md_fpr_t;
00154
00155
00156 typedef struct {
00157 word_t cr, xer;
00158 word_t fpscr;
00159 } md_ctrl_t;
00160
00161
00162 typedef word_t md_link_t;
00163 typedef word_t md_ctr_t;
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178 typedef word_t md_inst_t;
00179
00180
00181 extern md_inst_t MD_NOP_INST;
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192 #define MD_STACK_BASE 0x80000000
00193
00194
00195 #define MD_MAX_ENVIRON 131072
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206 #define MD_TOP_OP(INST) (((INST) >> 26) & 0x3f)
00207 #define MD_SET_OPCODE(OP, INST) \
00208 { OP = md_mask2op[((INST>>26)&0x3f)]; \
00209 while (md_opmask[OP][md_check_mask(INST)]) \
00210 OP = md_mask2op[((INST) & md_opmask[OP][md_check_mask(INST)])\
00211 + md_opoffset[OP]]; }
00212
00213
00214
00215
00216
00217
00218 enum md_opcode {OP_NA=0, OP_MAX};
00219
00220 #undef DEFINST
00221
00222
00223 #define MD_MAX_MASK 8192
00224
00225
00226
00227
00228 #define MD_OP_ENUM(MSK) (md_mask2op[MSK])
00229 extern enum md_opcode md_mask2op[];
00230
00231
00232 #define MD_OP_NAME(OP) (md_op2name[OP])
00233 extern char *md_op2name[];
00234
00235
00236 #define MD_OP_FORMAT(OP) (md_op2format[OP])
00237 extern char *md_op2format[];
00238
00239
00240
00241
00242
00243 #define MD_OP_FUCLASS(OP) (md_op2fu[OP])
00244 extern enum md_fu_class md_op2fu[];
00245
00246
00247 #define MD_FU_NAME(FU) (md_fu2name[FU])
00248 extern char *md_fu2name[];
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 #undef RS
00259
00260 #define RD ((inst >> 21) & 0x1f)
00261 #define RA ((inst >> 16) & 0x1f)
00262 #define RB ((inst >> 11) & 0x1f)
00263 #define RC ((inst >> 6) & 0x1f)
00264 #define RS RD
00265
00266
00267 #define FS RS
00268 #define FD RD
00269 #define FB RB
00270 #define FA RA
00271 #define FC RC
00272
00273
00274 #define CRBD RD
00275 #define CRBA RA
00276 #define CRBB RB
00277
00278 #define CRFD ((inst & 0x03800000)>>23)
00279 #define CRFS ((inst & 0x001C0000)>>18)
00280
00281
00282 #define MTFSFI_FM ((inst>>17)&0xff)
00283 #define MTFSFI_IMM ((inst>>12)&0xf)
00284 #define MB ( (inst & 0x7C0) >> 6 )
00285 #define ME ( (inst & 0x3E) >> 1 )
00286 #define SPR ( (inst & 0x001FF800) >> 11 )
00287 #define SPRVAL ( (SPR & 0x1F)+((SPR>>5) & 0x1F) )
00288 #define CRM ( (inst >> 12) & 0xff )
00289 #define TO RD
00290 #define BO RD
00291 #define BI RA
00292 #define BD ( (inst>>2) & 0x3fff )
00293 #define SH RB
00294 #define NB RB
00295 #define LK (inst & 0x1)
00296
00297
00298 #define POSZERODP 0x0000000000000000
00299 #define NEGZERODP 0x8000000000000000
00300 #define POSINFDP 0x7ff0000000000000
00301 #define NEGINFDP 0xfff0000000000000
00302
00303 #define POSZEROSP 0x0000000000000000
00304 #define NEGZEROSP 0x8000000000000000
00305 #define POSINFSP 0x0ff0000000000000
00306 #define NEGINFSP 0x8ff0000000000000
00307
00308
00309
00310
00311 #define ISSETL ((inst & 0x00200000)>>21)
00312
00313
00314 #define IMM ((int)((short)(inst & 0xffff)))
00315
00316
00317 #define UIMM (inst & 0xffff)
00318
00319
00320 #define OFS IMM
00321
00322
00323 #define LI ((inst & 0x3fffffc))
00324
00325 #define SEXT24(X) \
00326 (((X) & 0x800000) ? ((sword_t)(X) | 0xff000000):(sword_t)(X))
00327
00328 #define SEXT8(X) \
00329 (((X) & 0x80) ? ((sword_t)(X) | 0xffffff00):(sword_t)(X))
00330
00331
00332 #define SEXT16(X) \
00333 (((X) & 0x8000) ? ((sword_t)(X) | 0xffff0000):(sword_t)(X))
00334
00335 #define SEXT26(X) \
00336 (((X) & 0x2000000) ? ((sword_t)(X) | 0xfc000000):(sword_t)(X))
00337
00338
00339
00340 int isdpNan(qword_t t);
00341 int isdpSNan(qword_t t);
00342 int isdpQNan(qword_t t);
00343
00344 int isspNan(qword_t t);
00345 int isspSNan(qword_t t);
00346 int isspQNan(qword_t t);
00347 dfloat_t convertDWToDouble(qword_t q);
00348
00349
00350 #define MAXINT_VAL 0x7fffffff
00351
00352
00353 #define OVER(X,Y) \
00354 ((((X) > 0) && ((Y) > 0) && (MAXINT_VAL - (X) < (Y))) \
00355 || (((X) < 0) && ((Y) < 0) && (-MAXINT_VAL - (X) > (Y))))
00356
00357
00358 #define UNDER(X,Y) \
00359 ((((X) > 0) && ((Y) < 0) && (MAXINT_VAL + (Y) < (X))) \
00360 || (((X) < 0) && ((Y) > 0) && (-MAXINT_VAL + (Y) > (X))))
00361
00362
00363
00364 int carrygenerated(sword_t a, sword_t b);
00365
00366
00367 #ifndef SET_TPC
00368 #define SET_TPC(PC) (void)0
00369 #endif
00370
00371
00372
00373
00374
00375
00376
00377 #define MD_IS_CALL() ((inst->specificOp() & (F_CTRL|F_CALL)) == (F_CTRL|F_CALL))
00378
00379
00380
00381
00382
00383
00384 #define MD_IS_INDIR(OP) (printf("fix MD_IS_INDIR\n"))
00385
00386
00387 enum md_amode_type {
00388 md_amode_imm,
00389 md_amode_gp,
00390 md_amode_sp,
00391 md_amode_fp,
00392 md_amode_disp,
00393 md_amode_rr,
00394 md_amode_NUM
00395 };
00396 extern char *md_amode_str[md_amode_NUM];
00397
00398
00399
00400
00401
00402
00403
00404 #define MD_AMODE_PREPROBE(OP, FSM)
00405 #define MD_AMODE_POSTPROBE(FSM)
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453 #define MD_EIO_FILE_FORMAT EIO_POWERPC_FORMAT
00454
00455 #define MD_MISC_REGS_TO_EXO(REGS) \
00456 exo_new(ec_list, \
00457 exo_new(ec_integer, (exo_integer_t)sim_num_insn), \
00458 exo_new(ec_address, (exo_integer_t)(REGS)->regs_PC), \
00459 exo_new(ec_address, (exo_integer_t)(REGS)->regs_NPC), \
00460 exo_new(ec_integer, (exo_integer_t)(REGS)->regs_C.cr), \
00461 exo_new(ec_integer, (exo_integer_t)(REGS)->regs_C.xer),\
00462 exo_new(ec_integer, (exo_integer_t)(REGS)->regs_C.fpscr),\
00463 NULL)
00464
00465 #define MD_IREG_TO_EXO(REGS, IDX) \
00466 exo_new(ec_address, (exo_integer_t)(REGS)->regs_R[IDX])
00467
00468
00469
00470 #define MD_FREG_TO_EXO(REGS, IDX) \
00471 exo_new(ec_address, (exo_integer_t)(REGS)->regs_F.d[IDX])
00472
00473
00474
00475
00476 #define MD_EXO_TO_MISC_REGS(EXO, ICNT, REGS) \
00477 \
00478 if (!exo \
00479 || exo->ec != ec_list \
00480 || !exo->as_list.head \
00481 || exo->as_list.head->ec != ec_integer \
00482 || !exo->as_list.head->next \
00483 || exo->as_list.head->next->ec != ec_address \
00484 || !exo->as_list.head->next->next \
00485 || exo->as_list.head->next->next->ec != ec_address \
00486 || !exo->as_list.head->next->next->next \
00487 || exo->as_list.head->next->next->next->ec != ec_integer \
00488 || !exo->as_list.head->next->next->next->next \
00489 || exo->as_list.head->next->next->next->next->ec != ec_integer \
00490 || !exo->as_list.head->next->next->next->next->next \
00491 || exo->as_list.head->next->next->next->next->next->ec != ec_integer\
00492 || exo->as_list.head->next->next->next->next->next->next != NULL) \
00493 fatal("could not read EIO misc regs"); \
00494 (ICNT) = (counter_t)exo->as_list.head->as_integer.val; \
00495 (REGS)->regs_PC = (md_addr_t)exo->as_list.head->next->as_integer.val; \
00496 (REGS)->regs_NPC = \
00497 (md_addr_t)exo->as_list.head->next->next->as_integer.val; \
00498 (REGS)->regs_C.cr = \
00499 (word_t)exo->as_list.head->next->next->next->as_integer.val; \
00500 (REGS)->regs_C.xer = \
00501 (word_t)exo->as_list.head->next->next->next->next->as_integer.val; \
00502 (REGS)->regs_C.fpscr = \
00503 (int)exo->as_list.head->next->next->next->next->next->as_integer.val;
00504
00505 #define MD_EXO_TO_IREG(EXO, REGS, IDX) \
00506 ((REGS)->regs_R[IDX] = (word_t)(EXO)->as_integer.val)
00507
00508
00509
00510 #define MD_EXO_TO_FREG(EXO, REGS, IDX) \
00511 ((REGS)->regs_F.d[IDX] = (word_t)(EXO)->as_integer.val)
00512
00513 #define MD_EXO_CMP_IREG(EXO, REGS, IDX) \
00514 ((REGS)->regs_R[IDX] != (sword_t)(EXO)->as_integer.val)
00515
00516 #define MD_FIRST_IN_REG 0
00517 #define MD_LAST_IN_REG 31
00518
00519 #define MD_FIRST_OUT_REG 0
00520 #define MD_LAST_OUT_REG 31
00521
00522
00523
00524
00525
00526
00527
00528 typedef word_t exo_address_t;
00529
00530
00531 typedef word_t exo_integer_t;
00532
00533
00534 typedef double exo_float_t;
00535
00536
00537
00538
00539
00540
00541
00542 #ifdef HOST_HAS_QWORD
00543 #define stat_reg_counter stat_reg_squad
00544 #define sc_counter sc_squad
00545 #define for_counter for_squad
00546 #else
00547 #define stat_reg_counter stat_reg_double
00548 #define sc_counter sc_double
00549 #define for_counter for_double
00550 #endif
00551
00552
00553 #define stat_reg_addr stat_reg_uint
00554
00555
00556
00557
00558
00559
00560
00561 enum md_reg_type {
00562 rt_lpr,
00563 rt_fpr,
00564 rt_gpr,
00565 rt_dpr,
00566 rt_link,
00567 rt_cntr,
00568 rt_ctrl,
00569 rt_PC,
00570 rt_NPC,
00571 rt_NUM
00572 };
00573
00574
00575
00576 struct md_reg_names_t {
00577 char *str;
00578 enum md_reg_type file;
00579 int reg;
00580 };
00581
00582
00583 extern md_reg_names_t md_reg_names[];
00584
00585
00586 char *md_reg_name(enum md_reg_type rt, int reg);
00587
00588
00589 struct eval_value_t;
00590 struct regs_t;
00591 char *
00592 md_reg_obj(struct regs_t *regs,
00593 int is_write,
00594 enum md_reg_type rt,
00595 int reg,
00596 struct eval_value_t *val);
00597
00598
00599 void md_print_ireg(md_gpr_t regs, int reg, FILE *stream);
00600 void md_print_iregs(md_gpr_t regs, FILE *stream);
00601
00602
00603 void md_print_fpreg(md_fpr_t regs, int reg, FILE *stream);
00604 void md_print_fpregs(md_fpr_t regs, FILE *stream);
00605
00606
00607 void md_print_creg(md_ctrl_t regs, int reg, FILE *stream);
00608 void md_print_cregs(md_ctrl_t regs, FILE *stream);
00609
00610
00611 word_t md_xor_regs(struct regs_t *regs);
00612
00613
00614
00615
00616
00617
00618
00619 #define MD_AGEN_OP ADD
00620
00621
00622 #define MD_NOP_OP 0x18
00623
00624
00625
00626
00627
00628
00629 #define MD_VALID_ADDR(ADDR) (ADDR > 0x100)
00630
00631
00632
00633
00634
00635
00636 #define PPC_SYSCALL_ADDRESS 0x0
00637
00638
00639
00640
00641
00642
00643
00644
00645 #define MD_BR_SHIFT 2
00646
00647
00648
00649
00650
00651
00652
00653 void md_init_decoder(void);
00654
00655
00656 void
00657 md_print_insn(md_inst_t inst,
00658 md_addr_t pc,
00659 FILE *stream);
00660
00661
00662
00663 #define CR_LT_BIT ((unsigned int )0x8)
00664 #define CR_GT_BIT ((unsigned int)0x4)
00665 #define CR_EQ_BIT ((unsigned int)0x2)
00666 #define GET_L(_x) (((_x) >> 21) & 1)
00667
00668 #define GET_AA(_x) (((_x) >> 1) & 1)
00669 #define GET_BA(_x) (((_x) >> 16) & 31)
00670 #define GET_BB(_x) (((_x) >> 11) & 31)
00671 #define GET_BD(_x) ((val) ((int16) ((_x) & -4)))
00672 #define GET_BF(_x) (((_x) >> 23) & 7)
00673
00674 #define GET_BO(_x) (((_x) >> 21) & 31)
00675 #define GET_BI(_x) (((_x) >> 16) & 31)
00676 #define GET_LK(_x) ((_x) & 1)
00677
00678 #define DECREMENTS_CTR(_x) (0 == (GET_BO (_x) & 4))
00679 #define BR_IF_CTR_ZERO(_x) (GET_BO (_x) & 2)
00680 #define CONDITIONAL_BR(_x) (0 == (GET_BO (_x) & 16))
00681 #define BR_IF_TRUE(_x) (GET_BO (_x) & 8)
00682
00683 unsigned int sim_mask32(unsigned int start, unsigned int end);
00684 unsigned int sim_rotate_left_32(unsigned int source, unsigned int count);
00685
00686 #endif