Original code from 2007
[vt-enable.git] / src / find-rsdp.c
1 #include <stdio.h>
2 #include <fcntl.h>
3 #include <unistd.h>
4 #include <string.h>
5
6 #define VER "0.1"
7
8 int main( int argc, char **argv, char **env) {
9         int ret = 0;
10         unsigned char *device = "/dev/mem";
11         
12  printf("\n"
13         "find-RSDP version %s © 2007 TJ http://intuitivenipple.net\n"
14         "Licensed on the terms of GPL version 3\n\n"
15         "Finds ACPI Root System Descriptor Pointer (for supported BIOS's only).\n\n", VER);
16         
17  if (ret == 0) {
18         int fd;
19         unsigned long i, len, address, byte_count;
20         unsigned char checksum;
21         off_t pos, extent;
22         ssize_t qty;
23         unsigned char buffer[256];
24         unsigned char *sig = "RSD PTR ";
25         unsigned int address_offset = 16, length_table = 20;
26         
27         if ((fd = open(device, O_RDONLY)) > 0) {
28                 /* get memory extent */
29                 extent = lseek(fd, 0, SEEK_END);
30                 printf("0x%0.16lX Memory size\n", extent);
31                 len = strlen(sig);
32                 for (pos = 0; pos < (unsigned)extent; pos+=0x10) { 
33                 pos = lseek(fd, pos, SEEK_SET);
34                 if ((qty = read(fd, buffer, 20)) > 0) {
35                          if (buffer[0] == sig[0]) {
36                         // printf("= 0x%0.16lX\n", pos);
37                                 if (strncmp(sig, buffer, len) == 0) {
38                                         printf("0x%0.16lX \"%s\" ", pos, sig);
39                                                                 
40                                 for (checksum = 0, i = 0; i < length_table; i++)
41                                         // checksum += buffer[i];
42                                  checksum += ((unsigned char *)(buffer))[i];
43
44                                 if (checksum == 0) {
45                                 for (address = 0, i = 0; i < length_table; i++) {
46                                                 // printf("%0.2X", buffer[i]);
47                                          if (i >= address_offset && i <= address_offset+3)
48                                                 address |= ((unsigned long)buffer[i]) << ((i-address_offset) * 8);
49                                  }
50                                 buffer[15] = 0; // make preceeding OEM_ID string zero-terminated, so we can print it easily
51                                         printf(" RSDT @ %0.8lX OEM: \"%s\" sum: %u", address, &buffer[9], checksum);
52                                 }
53                                 printf("\n");
54                                 }
55                          }
56                 }
57                 else {
58                         break;
59                 }
60                 }
61                 close(fd);
62         }
63         else perror("Cannot open /dev/mem, need superuser privileges to access");
64  }
65         return ret;
66 }