Show
Ignore:
Timestamp:
10/13/01 18:37:16 (12 years ago)
Author:
mds
Message:

add flat address space support (isadump -f 0x6000) so we can

get dumps of chips like the via686a.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/trunk/prog/dump/isadump.c

    r1107 r1200  
    11/* 
    2     isadump.c - Part of isadump, a user-space program to dump ISA registers 
     2    isadump.c - isadump, a user-space program to dump ISA registers 
    33    Copyright (c) 2000  Frodo Looijaard <frodol@dds.nl>, and 
    44                        Mark D. Studebaker <mdsxyz123@yahoo.com> 
     
    1717    along with this program; if not, write to the Free Software 
    1818    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
     19*/ 
     20 
     21/* 
     22        Typical usage: 
     23        isadump 0x295 0x296             Basic winbond dump using address/data registers 
     24        isadump 0x295 0x296 2           Winbond dump, bank 2 
     25        isadump -f 0x5000               Flat address space dump like for Via 686a 
    1926*/ 
    2027 
     
    4855{ 
    4956  fprintf(stderr,"Syntax: isadump ADDRREG DATAREG [BANK [BANKREG]]\n"); 
     57  fprintf(stderr,"        isadump -f ADDRESS (for flat address space)\n"); 
    5058} 
    5159 
    5260int main(int argc, char *argv[]) 
    5361{ 
    54   int addrreg, datareg, bank = 0, bankreg = 0x4E; 
     62  int addrreg, datareg = 0, bank = 0, bankreg = 0x4E; 
     63  int i,j,res; 
     64  int flat = 0; 
    5565  char *end; 
    56   int i,j,res; 
    57  
    58   if (argc < 2) { 
    59     fprintf(stderr,"Error: No registers specified!\n"); 
    60     help(); 
    61     exit(1); 
    62   } 
    63  
    64   addrreg = strtol(argv[1],&end,0); 
     66 
     67  if (argc < 3) { 
     68    help(); 
     69    exit(1); 
     70  } 
     71 
     72  if(strcmp(argv[1], "-f")) { 
     73    addrreg = strtol(argv[1],&end,0); 
     74  } else { 
     75    if(argc != 3) { 
     76      help(); 
     77      exit(1); 
     78    } 
     79    flat = 1; 
     80    addrreg = strtol(argv[2],&end,0) & 0xff00; 
     81  } 
    6582  if (*end) { 
    66     fprintf(stderr,"Error: First argument not a number!\n"); 
    67     help(); 
    68     exit(1); 
    69   } 
    70   if ((addrreg < 0) || (addrreg > 0xfff)) { 
    71     fprintf(stderr,"Error: Address register out of range!\n"); 
    72     help(); 
    73     exit(1); 
    74   } 
    75  
    76   if (argc < 3) { 
    77     fprintf(stderr,"Error: No data register specified!\n"); 
    78     help(); 
    79     exit(1); 
    80   } 
     83    fprintf(stderr,"Error: Invalid address!\n"); 
     84    help(); 
     85    exit(1); 
     86  } 
     87  if ((addrreg < 0) || (addrreg > 0xffff)) { 
     88    fprintf(stderr,"Error: Address out of range!\n"); 
     89    help(); 
     90    exit(1); 
     91  } 
     92 
     93  if(flat) 
     94    goto START; 
    8195 
    8296  datareg = strtol(argv[2],&end,0); 
    8397  if (*end) { 
    84     fprintf(stderr,"Error: Second argument not a number!\n"); 
    85     help(); 
    86     exit(1); 
    87   } 
    88   if ((datareg < 0) || (datareg > 0xfff)) { 
     98    fprintf(stderr,"Error: Invalid data register!\n"); 
     99    help(); 
     100    exit(1); 
     101  } 
     102  if ((datareg < 0) || (datareg > 0xffff)) { 
    89103    fprintf(stderr,"Error: Data register out of range!\n"); 
    90104    help(); 
     
    108122      bankreg = strtol(argv[4],&end,0); 
    109123      if (*end) { 
    110         fprintf(stderr,"Error: Invalid bank register number!\n"); 
     124        fprintf(stderr,"Error: Invalid bank register!\n"); 
    111125        help(); 
    112126        exit(1); 
     
    120134  } 
    121135 
     136START: 
     137 
    122138  if (getuid()) { 
    123139    fprintf(stderr,"Error: Can only be run as root (or make it suid root)\n"); 
     
    127143  fprintf(stderr,"  WARNING! Running this program can cause system crashes, " 
    128144          "data loss and worse!\n"); 
    129   fprintf(stderr,"  I will probe address register 0x%04x and " 
     145  if(flat) 
     146        fprintf(stderr,"  I will probe address range 0x%04x to " 
     147                 "0x%04x.\n",addrreg, addrreg + 0xff); 
     148  else 
     149        fprintf(stderr,"  I will probe address register 0x%04x and " 
    130150                 "data register 0x%04x.\n",addrreg,datareg); 
    131151  if(bank)       
     
    136156 
    137157#ifndef __powerpc__ 
    138   if ((datareg < 0x400) && (addrreg < 0x400)) { 
     158  if ((datareg < 0x400) && (addrreg < 0x400) && !flat) { 
    139159    if(ioperm(datareg,1,1)) { 
    140160      fprintf(stderr,"Error: Could not ioperm() data register!\n"); 
     
    163183    printf("%c0: ",hexchar(i/16)); 
    164184    for(j = 0; j < 16; j++) { 
    165       outb(i+j,addrreg); 
    166       res = inb(datareg); 
    167       printf("%c%c ",hexchar(res/16),hexchar(res%16)); 
     185        if(flat) { 
     186              res = inb(addrreg + i + j); 
     187        } else {         
     188              outb(i+j,addrreg); 
     189              res = inb(datareg); 
     190        } 
     191        printf("%c%c ",hexchar(res/16),hexchar(res%16)); 
    168192    } 
    169193    printf("\n");