8 int main( int argc, char **argv, char **env) {
10 unsigned char *device = "/dev/mem";
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);
19 unsigned long i, len, address, byte_count;
20 unsigned char checksum;
23 unsigned char buffer[256];
24 unsigned char *sig = "RSD PTR ";
25 unsigned int address_offset = 16, length_table = 20;
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);
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);
40 for (checksum = 0, i = 0; i < length_table; i++)
41 // checksum += buffer[i];
42 checksum += ((unsigned char *)(buffer))[i];
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);
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);
63 else perror("Cannot open /dev/mem, need superuser privileges to access");