Annotation of mstools/samples/sdktools/image/drwatson/mips/regs.c, revision 1.1.1.1

1.1       root        1: /*++
                      2: 
                      3: Copyright (c) 1993  Microsoft Corporation
                      4: 
                      5: Module Name:
                      6: 
                      7:     regs.c
                      8: 
                      9: Abstract:
                     10: 
                     11:     This file provides access to the machine's register set.
                     12: 
                     13: Author:
                     14: 
                     15:     Wesley Witt (wesw) 1-May-1993  (ported from ntsd)
                     16: 
                     17: Environment:
                     18: 
                     19:     User Mode
                     20: 
                     21: --*/
                     22: 
                     23: #include <windows.h>
                     24: #include <stdlib.h>
                     25: #include <stdio.h>
                     26: #include <string.h>
                     27: 
                     28: #include "drwatson.h"
                     29: #include "proto.h"
                     30: #include "regs.h"
                     31: 
                     32: PUCHAR  UserRegs[10] = {0};
                     33: 
                     34: 
                     35: ULONG GetRegFlagValue (PDEBUGPACKET dp, ULONG regnum);
                     36: ULONG GetRegValue (PDEBUGPACKET dp, ULONG regnum);
                     37: ULONG GetRegName (void);
                     38: ULONG GetRegString (PUCHAR pszString);
                     39: void  GetRegPCValue (PDEBUGPACKET dp, PULONG Address);
                     40: PULONG GetRegFPValue (PDEBUGPACKET dp);
                     41: void OutputAllRegs(PDEBUGPACKET dp);
                     42: void OutputOneReg (PDEBUGPACKET dp, ULONG regnum);
                     43: PUCHAR RegNameFromIndex (ULONG index);
                     44: 
                     45: 
                     46: 
                     47: 
                     48: static ULONG   ProcessorType = 0;
                     49: ULONG   cbBrkptLength = 4;
                     50: ULONG   trapInstr = 0x0016000dL;  //  break 0x16 for brkpts
                     51: ULONG   ContextType = CONTEXT_CONTROL | CONTEXT_INTEGER;
                     52: 
                     53: //
                     54: // Define MIPS nonvolatile register test macros.
                     55: //
                     56: 
                     57: #define IS_FLOATING_SAVED(Register) ((SAVED_FLOATING_MASK >> Register) & 1L)
                     58: #define IS_INTEGER_SAVED(Register) ((SAVED_INTEGER_MASK >> Register) & 1L)
                     59: 
                     60: //
                     61: // Define MIPS instruction opcode values.
                     62: //
                     63: 
                     64: #define ADDIU_OP 0x9                    // add immediate unsigned integer register
                     65: #define ADDU_OP 0x21                    // add unsigned integer register
                     66: #define JUMP_RA 0x3e00008               // jump indirect return address register
                     67: #define LUI_OP 0xf                      // load upper immediate integer register
                     68: #define SD_OP 0x2f                      // store double integer register
                     69: #define SW_OP 0x2b                      // store word integer register
                     70: #define SDC1_OP 0x3d                    // store double floating register
                     71: #define SWC1_OP 0x39                    // store word floating register
                     72: #define SPEC_OP 0x0                     // special opcode - use function field
                     73: #define SUBU_OP 0x23                    // subtract unsigned integer register
                     74: 
                     75: //
                     76: // Define stack register and zero register numbers.
                     77: //
                     78: 
                     79: #define RA 0x1f                         // integer register 31
                     80: #define SP 0x1d                         // integer register 29
                     81: #define ZERO 0x0                        // integer register 0
                     82: 
                     83: //
                     84: // Define saved register masks.
                     85: //
                     86: 
                     87: #define SAVED_FLOATING_MASK 0xfff00000  // saved floating registers
                     88: #define SAVED_INTEGER_MASK 0xf3ffff02   // saved integer registers
                     89: 
                     90: 
                     91: UCHAR   szF0[]  = "f0";
                     92: UCHAR   szF1[]  = "f1";
                     93: UCHAR   szF2[]  = "f2";
                     94: UCHAR   szF3[]  = "f3";
                     95: UCHAR   szF4[]  = "f4";
                     96: UCHAR   szF5[]  = "f5";
                     97: UCHAR   szF6[]  = "f6";
                     98: UCHAR   szF7[]  = "f7";
                     99: UCHAR   szF8[]  = "f8";
                    100: UCHAR   szF9[]  = "f9";
                    101: UCHAR   szF10[] = "f10";
                    102: UCHAR   szF11[] = "f11";
                    103: UCHAR   szF12[] = "f12";
                    104: UCHAR   szF13[] = "f13";
                    105: UCHAR   szF14[] = "f14";
                    106: UCHAR   szF15[] = "f15";
                    107: UCHAR   szF16[] = "f16";
                    108: UCHAR   szF17[] = "f17";
                    109: UCHAR   szF18[] = "f18";
                    110: UCHAR   szF19[] = "f19";
                    111: UCHAR   szF20[] = "f20";
                    112: UCHAR   szF21[] = "f21";
                    113: UCHAR   szF22[] = "f22";
                    114: UCHAR   szF23[] = "f23";
                    115: UCHAR   szF24[] = "f24";
                    116: UCHAR   szF25[] = "f25";
                    117: UCHAR   szF26[] = "f26";
                    118: UCHAR   szF27[] = "f27";
                    119: UCHAR   szF28[] = "f28";
                    120: UCHAR   szF29[] = "f29";
                    121: UCHAR   szF30[] = "f30";
                    122: UCHAR   szF31[] = "f31";
                    123: 
                    124: UCHAR   szR0[]  = "zero";
                    125: UCHAR   szR1[]  = "at";
                    126: UCHAR   szR2[]  = "v0";
                    127: UCHAR   szR3[]  = "v1";
                    128: UCHAR   szR4[]  = "a0";
                    129: UCHAR   szR5[]  = "a1";
                    130: UCHAR   szR6[]  = "a2";
                    131: UCHAR   szR7[]  = "a3";
                    132: UCHAR   szR8[]  = "t0";
                    133: UCHAR   szR9[]  = "t1";
                    134: UCHAR   szR10[] = "t2";
                    135: UCHAR   szR11[] = "t3";
                    136: UCHAR   szR12[] = "t4";
                    137: UCHAR   szR13[] = "t5";
                    138: UCHAR   szR14[] = "t6";
                    139: UCHAR   szR15[] = "t7";
                    140: UCHAR   szR16[] = "s0";
                    141: UCHAR   szR17[] = "s1";
                    142: UCHAR   szR18[] = "s2";
                    143: UCHAR   szR19[] = "s3";
                    144: UCHAR   szR20[] = "s4";
                    145: UCHAR   szR21[] = "s5";
                    146: UCHAR   szR22[] = "s6";
                    147: UCHAR   szR23[] = "s7";
                    148: UCHAR   szR24[] = "t8";
                    149: UCHAR   szR25[] = "t9";
                    150: UCHAR   szR26[] = "k0";
                    151: UCHAR   szR27[] = "k1";
                    152: UCHAR   szR28[] = "gp";
                    153: UCHAR   szR29[] = "sp";
                    154: UCHAR   szR30[] = "s8";
                    155: UCHAR   szR31[] = "ra";
                    156: 
                    157: UCHAR   szLo[]  = "lo";
                    158: UCHAR   szHi[]  = "hi";
                    159: UCHAR   szFsr[] = "fsr";
                    160: UCHAR   szFir[] = "fir";
                    161: UCHAR   szPsr[] = "psr";
                    162: 
                    163: UCHAR   szFlagCu[] = "cu";
                    164: UCHAR   szFlagCu3[] = "cu3";
                    165: UCHAR   szFlagCu2[] = "cu2";
                    166: UCHAR   szFlagCu1[] = "cu1";
                    167: UCHAR   szFlagCu0[] = "cu0";
                    168: UCHAR   szFlagImsk[] = "imsk";
                    169: UCHAR   szFlagInt5[] = "int5";
                    170: UCHAR   szFlagInt4[] = "int4";
                    171: UCHAR   szFlagInt3[] = "int3";
                    172: UCHAR   szFlagInt2[] = "int2";
                    173: UCHAR   szFlagInt1[] = "int1";
                    174: UCHAR   szFlagInt0[] = "int0";
                    175: UCHAR   szFlagSw1[] = "sw1";
                    176: UCHAR   szFlagSw0[] = "sw0";
                    177: UCHAR   szFlagKuo[] = "kuo";
                    178: UCHAR   szFlagIeo[] = "ieo";
                    179: UCHAR   szFlagKup[] = "kup";
                    180: UCHAR   szFlagIep[] = "iep";
                    181: UCHAR   szFlagKuc[] = "kuc";
                    182: UCHAR   szFlagIec[] = "iec";
                    183: UCHAR   szFlagKsu[] = "ksu";
                    184: UCHAR   szFlagErl[] = "erl";
                    185: UCHAR   szFlagExl[] = "exl";
                    186: UCHAR   szFlagIe[]  = "ie";
                    187: UCHAR   szFlagFpc[] = "fpc";
                    188: 
                    189: char    szEaPReg[]   = "$ea";
                    190: char    szExpPReg[]  = "$exp";
                    191: char    szRaPReg[]   = "$ra";
                    192: char    szPPReg[]    = "$p";
                    193: char    szU0Preg[]   = "$u0";
                    194: char    szU1Preg[]   = "$u1";
                    195: char    szU2Preg[]   = "$u2";
                    196: char    szU3Preg[]   = "$u3";
                    197: char    szU4Preg[]   = "$u4";
                    198: char    szU5Preg[]   = "$u5";
                    199: char    szU6Preg[]   = "$u6";
                    200: char    szU7Preg[]   = "$u7";
                    201: char    szU8Preg[]   = "$u8";
                    202: char    szU9Preg[]   = "$u9";
                    203: 
                    204: PUCHAR  pszReg[] = {
                    205:     szF0,  szF1,  szF2,  szF3,  szF4,  szF5,  szF6,  szF7,
                    206:     szF8,  szF9,  szF10, szF11, szF12, szF13, szF14, szF15,
                    207:     szF16, szF17, szF18, szF19, szF20, szF21, szF22, szF23,
                    208:     szF24, szF25, szF26, szF27, szF28, szF29, szF30, szF31,
                    209: 
                    210:     szR0,  szR1,  szR2,  szR3,  szR4,  szR5,  szR6,  szR7,
                    211:     szR8,  szR9,  szR10, szR11, szR12, szR13, szR14, szR15,
                    212:     szR16, szR17, szR18, szR19, szR20, szR21, szR22, szR23,
                    213:     szR24, szR25, szR26, szR27, szR28, szR29, szR30, szR31,
                    214: 
                    215:     szLo,  szHi,  szFsr, szFir, szPsr,
                    216: 
                    217:     szFlagCu,   szFlagCu3,  szFlagCu2,  szFlagCu1,  szFlagCu0,
                    218:     szFlagImsk,
                    219:     szFlagInt5, szFlagInt4, szFlagInt3, szFlagInt2, szFlagInt1, szFlagInt0,
                    220:     szFlagSw1,  szFlagSw0,
                    221:     szFlagKuo,  szFlagIeo,                              //  R3000 flags
                    222:     szFlagKup,  szFlagIep,                              //  ...
                    223:     szFlagKuc,  szFlagIec,                              //  ...
                    224:     szFlagKsu,  szFlagErl,  szFlagExl,  szFlagIe,       //  R4000 flags
                    225: 
                    226:     szFlagFpc,                                          //  fl pt condition
                    227: 
                    228:     szEaPReg, szExpPReg, szRaPReg, szPPReg,             //  psuedo-registers
                    229:     szU0Preg, szU1Preg,  szU2Preg, szU3Preg, szU4Preg,
                    230:     szU5Preg, szU6Preg,  szU7Preg, szU8Preg, szU9Preg
                    231:     };
                    232: 
                    233: #define REGNAMESIZE     sizeof(pszReg) / sizeof(PUCHAR)
                    234: 
                    235: struct Reg {
                    236:         char    *psz;
                    237:         ULONG   value;
                    238:         };
                    239: 
                    240: struct SubReg {
                    241:         ULONG   regindex;
                    242:         ULONG   shift;
                    243:         ULONG   mask;
                    244:         };
                    245: 
                    246: struct SubReg subregname[] = {
                    247:     { REGPSR,   28,  0xf },             //  CU mask
                    248:     { REGPSR,   31,    1 },             //  CU3 flag
                    249:     { REGPSR,   30,    1 },             //  CU2 flag
                    250:     { REGPSR,   29,    1 },             //  CU1 flag
                    251:     { REGPSR,   28,    1 },             //  CU0 flag
                    252:     { REGPSR,   8,  0xff },             //  IMSK mask
                    253:     { REGPSR,   15,    1 },             //  INT5 - int 5 enable
                    254:     { REGPSR,   14,    1 },             //  INT4 - int 4 enable
                    255:     { REGPSR,   13,    1 },             //  INT3 - int 3 enable
                    256:     { REGPSR,   12,    1 },             //  INT2 - int 2 enable
                    257:     { REGPSR,   11,    1 },             //  INT1 - int 1 enable
                    258:     { REGPSR,   10,    1 },             //  INT0 - int 0 enable
                    259:     { REGPSR,   9,     1 },             //  SW1  - software int 1 enable
                    260:     { REGPSR,   8,     1 },             //  SW0  - software int 0 enable
                    261: 
                    262:     //  R3000-specific status bits
                    263: 
                    264:     { REGPSR,   5,     1 },             //  KUO
                    265:     { REGPSR,   4,     1 },             //  IEO
                    266:     { REGPSR,   3,     1 },             //  KUP
                    267:     { REGPSR,   2,     1 },             //  IEP
                    268:     { REGPSR,   1,     1 },             //  KUC
                    269:     { REGPSR,   0,     1 },             //  IEC
                    270: 
                    271:     //  R4000-specific status bits
                    272: 
                    273:     { REGPSR,   3,     2 },             //  KSU
                    274:     { REGPSR,   2,     1 },             //  ERL
                    275:     { REGPSR,   1,     1 },             //  EXL
                    276:     { REGPSR,   0,     1 },             //  IE
                    277: 
                    278:     { REGFSR,   23,    1 }              //  FPC - floating point condition
                    279:     };
                    280: 
                    281: 
                    282: /*** UserRegTest - test if index is a user-defined register
                    283: *
                    284: *   Purpose:
                    285: *       Test if register is user-defined for upper routines.
                    286: *
                    287: *   Input:
                    288: *       index - index of register
                    289: *
                    290: *   Returns:
                    291: *       TRUE if user-defined register, else FALSE
                    292: *
                    293: *************************************************************************/
                    294: 
                    295: BOOLEAN
                    296: UserRegTest (ULONG index)
                    297: {
                    298:     return (BOOLEAN)(index >= PREGU0 && index <= PREGU9);
                    299: }
                    300: 
                    301: /*** GetRegFlagValue - get register or flag value
                    302: *
                    303: *   Purpose:
                    304: *       Return the value of the specified register or flag.
                    305: *       This routine calls GetRegValue to get the register
                    306: *       value and shifts and masks appropriately to extract a
                    307: *       flag value.
                    308: *
                    309: *   Input:
                    310: *       regnum - register or flag specification
                    311: *
                    312: *   Returns:
                    313: *       Value of register or flag.
                    314: 
                    315: *************************************************************************/
                    316: 
                    317: ULONG
                    318: GetRegFlagValue (PDEBUGPACKET dp, ULONG regnum)
                    319: {
                    320:     ULONG value;
                    321: 
                    322:     if (regnum < FLAGBASE || regnum >= PREGBASE)
                    323:         value = GetRegValue(dp,regnum);
                    324:     else {
                    325:         regnum -= FLAGBASE;
                    326:         value = GetRegValue(dp,subregname[regnum].regindex);
                    327:         value = (value >> subregname[regnum].shift) & subregname[regnum].mask;
                    328:         }
                    329:     return value;
                    330: }
                    331: 
                    332: /*** GetRegValue - get register value
                    333: *
                    334: *   Purpose:
                    335: *       Returns the value of the register from the processor
                    336: *       context structure.
                    337: *
                    338: *   Input:
                    339: *       regnum - register specification
                    340: *
                    341: *   Returns:
                    342: *       value of the register from the context structure
                    343: *
                    344: *************************************************************************/
                    345: 
                    346: ULONG
                    347: GetRegValue (PDEBUGPACKET dp, ULONG regnum)
                    348: {
                    349:     return *(&dp->tctx->context.FltF0 + regnum);
                    350: }
                    351: 
                    352: 
                    353: ULONG
                    354: GetRegString (PUCHAR pszString)
                    355: {
                    356:     ULONG   count;
                    357: 
                    358:     for (count = 0; count < REGNAMESIZE; count++)
                    359:         if (!strcmp(pszString, pszReg[count]))
                    360:             return count;
                    361:     return (ULONG)-1;
                    362: }
                    363: 
                    364: void
                    365: GetRegPCValue (PDEBUGPACKET dp, PULONG Address)
                    366: {
                    367:     *Address = GetRegValue(dp,REGFIR);
                    368:     return;
                    369: }
                    370: 
                    371: PULONG
                    372: GetRegFPValue (PDEBUGPACKET dp)
                    373: {
                    374:     static ULONG addrFP;
                    375: 
                    376:     addrFP = GetRegValue(dp,REGGP);
                    377:     return &addrFP;
                    378: }
                    379: 
                    380: /*** OutputAllRegs - output all registers and present instruction
                    381: *
                    382: *   Purpose:
                    383: *       Function of "r" command.
                    384: *
                    385: *       To output the current register state of the processor.
                    386: *       All integer registers are output as well as processor status
                    387: *       registers.  Important flag fields are also output separately.
                    388: *       OutDisCurrent is called to output the current instruction(s).
                    389: *
                    390: *   Input:
                    391: *       None.
                    392: *
                    393: *   Output:
                    394: *       None.
                    395: *
                    396: *************************************************************************/
                    397: 
                    398: void
                    399: OutputAllRegs(PDEBUGPACKET dp)
                    400: {
                    401:     int     regindex;
                    402: 
                    403:     for (regindex = 1; regindex < 37; regindex++) {
                    404:         if (regindex == 34)
                    405:             lprintfs("          ");
                    406:         else {
                    407:             lprintfs("%s=%08lx", pszReg[regindex + REGBASE],
                    408:                                GetRegValue(dp,regindex + REGBASE));
                    409:             if (regindex % 6 == 0)
                    410:                 lprintfs("\r\n");
                    411:             else
                    412:                 lprintfs(" ");
                    413:             }
                    414:         }
                    415:     lprintfs("cu=%1lx%1lx%1lx%1lx intr(5:0)=%1lx%1lx%1lx%1lx%1lx%1lx ",
                    416:                 GetRegFlagValue(dp,FLAGCU3),
                    417:                 GetRegFlagValue(dp,FLAGCU2),
                    418:                 GetRegFlagValue(dp,FLAGCU1),
                    419:                 GetRegFlagValue(dp,FLAGCU0),
                    420:                 GetRegFlagValue(dp,FLAGINT5),
                    421:                 GetRegFlagValue(dp,FLAGINT4),
                    422:                 GetRegFlagValue(dp,FLAGINT3),
                    423:                 GetRegFlagValue(dp,FLAGINT2),
                    424:                 GetRegFlagValue(dp,FLAGINT1),
                    425:                 GetRegFlagValue(dp,FLAGINT0));
                    426:     lprintfs("sw(1:0)=%1lx%1lx ",
                    427:                 GetRegFlagValue(dp,FLAGSW1),
                    428:                 GetRegFlagValue(dp,FLAGSW0));
                    429:     if (ProcessorType == 0)
                    430:         lprintfs("kuo=%01lx ieo=%01lx kup=%01lx "
                    431:                 "iep=%01lx kuc=%01lx iec=%01lx\r\n",
                    432:                 GetRegFlagValue(dp,FLAGKUO),
                    433:                 GetRegFlagValue(dp,FLAGIEO),
                    434:                 GetRegFlagValue(dp,FLAGKUP),
                    435:                 GetRegFlagValue(dp,FLAGIEP),
                    436:                 GetRegFlagValue(dp,FLAGKUC),
                    437:                 GetRegFlagValue(dp,FLAGIEC));
                    438:     else
                    439:         lprintfs("ksu=%01lx erl=%01lx exl=%01lx ie=%01lx\r\n",
                    440:                 GetRegFlagValue(dp,FLAGKSU),
                    441:                 GetRegFlagValue(dp,FLAGERL),
                    442:                 GetRegFlagValue(dp,FLAGEXL),
                    443:                 GetRegFlagValue(dp,FLAGIE));
                    444:     lprintfs("\r\n\r\n");
                    445: }
                    446: 
                    447: /*** OutputOneReg - output one register value
                    448: *
                    449: *   Purpose:
                    450: *       Function for the "r <regname>" command.
                    451: *
                    452: *       Output the value for the specified register or flag.
                    453: *
                    454: *   Input:
                    455: *       regnum - register or flag specification
                    456: *
                    457: *   Output:
                    458: *       None.
                    459: *
                    460: *************************************************************************/
                    461: 
                    462: void
                    463: OutputOneReg (PDEBUGPACKET dp, ULONG regnum)
                    464: {
                    465:     ULONG value;
                    466: 
                    467:     value = GetRegFlagValue(dp,regnum);
                    468:     if (regnum < FLAGBASE)
                    469:         lprintfs("%08lx\r\n", value);
                    470:     else
                    471:         lprintfs("%lx\r\n", value);
                    472: }
                    473: 
                    474: PUCHAR
                    475: RegNameFromIndex (ULONG index)
                    476: {
                    477:     return pszReg[index];
                    478: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.