Read BIOS

Autif Khan autif.mlist at gmail.com
Tue Jul 30 23:04:13 EDT 2013


On Sun, Jun 9, 2013 at 10:24 AM, Satya Prakash Prasad
<satyaprakash.prasad at gmail.com> wrote:
> I am trying to write a code to read BIOS details. Below is the program but I
> believe that I am not reading BIOS details. Can anyone please correct me in
> my understanding:
>
> Note I found that /proc/ioports gives the I/O ports details like:
>
> [root at ioport]# cat /proc/ioports
> 0000-001f : dma1
> 0020-0021 : pic1
> 0040-0043 : timer0
> 0050-0053 : timer1
> ........and so on..................
>
>
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <unistd.h>
> #include <sys/io.h>
> #include <ctype.h>
> #include <string.h>
>
> main(int argc, char *argv[])
> {
>         unsigned char c;
>         if(argc != 2) {
>                 printf("-1. Invalid args : usage %s start-end address\n",
> argv[0]);
>                 exit(-1);
>         }
>         char * temp = argv[1];
>         while(*temp != '\0' && (isxdigit(*temp) || *temp=='-'))
>                 temp++;
>         char * delim = strchr(argv[1], '-');
>         if(*temp != '\0' || !delim ) {
>                 printf("-2. Invalid args : usage %s start-end address\n",
> argv[0]);
>                 exit(-2);
>         }
>         *delim = '\0';
>         int start = (int)strtol(argv[1], '\0', 16), end =
> (int)strtol(delim+1, '\0', 16), index = 0;
>         if(start < 0 || end <= 0 ) {
>                 printf("-3. Invalid args : usage %s start-end address\n",
> argv[0]);
>                 exit(-3);
>         }
>         if(iopl(3) == -1) {
>                 printf("-4. Unable to set privilege level\n");
>                 exit(-4);
>         }
>         if(ioperm(start, end - start, 1) == -1) {
>                 printf("-5. Unable to set access permission bits\n");
>                 exit(-5);
>         }
>         for(index = start ; index <= end ; index ++)
>         {
>                 c = inb(index);
>                 printf("%X", c);
>         }
>         ioperm(start, end - start, 0);
>         printf("\n");
> }
>
>
> So my program dumps the data in-between the ports assigned for devices:
>
> [root at ioport]# ./a.out 0000-001f
> 01000007D0FFFFFFFFFFFFF0100000
> 7D0FFFFFFFFFFFFF
>
> Please let me know if I am in the right path or not and guide me
> appropriately.
>


Please take a look at source code for dmidecode. I am a newbie myself,
so I do not know much beyond that :-)



More information about the Kernelnewbies mailing list