#include #include #include #include #include #include #include static inline uint8_t inb(uint16_t port) { uint8_t x; asm volatile("inb %%dx,%%al" : /*outputs*/"=a"(x) : /*inputs*/"d"(port)); return x; } static inline uint16_t inw(uint16_t port) { uint16_t x; asm volatile("inw %%dx,%%ax" : /*outputs*/"=a"(x) : /*inputs*/"d"(port)); return x; } static inline uint32_t inl(uint16_t port) { uint32_t x; asm volatile("inl %%dx,%%eax" : /*outputs*/"=a"(x) : /*inputs*/"d"(port)); return x; } int main(void) { const int pagesize = sysconf(_SC_PAGESIZE); uint32_t pmc[64]; struct { uint16_t rld; uint8_t tdi; uint8_t tdo; uint16_t tsts1; uint16_t tsts2; uint16_t tctl1; uint16_t tctl2; uint16_t tmsg; uint8_t twds; uint8_t le; uint16_t ttmr; } tco; int fd; uint32_t *smbus; unsigned i; if (x86_64_iopl(1) == -1) err(1, "x86_64_iopl(1)"); for (i = 0; i < 64; i++) pmc[i] = inl(0x1800 + 4*i); tco.rld = inw(0x400 + 0x0); tco.tdi = inb(0x400 + 0x2); tco.tdo = inb(0x400 + 0x3); tco.tsts1 = inw(0x400 + 0x4); tco.tsts2 = inw(0x400 + 0x6); tco.tctl1 = inw(0x400 + 0x8); tco.tctl2 = inw(0x400 + 0xA); tco.tmsg = inw(0x400 + 0xC); tco.twds = inb(0x400 + 0xE); tco.le = inb(0x400 + 0x10); tco.ttmr = inw(0x400 + 0x12); if (x86_64_iopl(0) == -1) err(1, "x86_64_iopl(0)"); for (i = 0; i < 64; i++) printf("PMC %02x: %08x\n", 4*i, pmc[i]); printf("TCO RLD [00h]: 0x%04x\n", tco.rld); printf("TCO TDI [02h]: 0x%02x\n", tco.tdi); printf("TCO TDO [03h]: 0x%02x\n", tco.tdo); printf("TCO TSTS1 [04h]: 0x%04x\n", tco.tsts1); printf("TCO TSTS2 [06h]: 0x%04x\n", tco.tsts2); printf("TCO TCTL1 [08h]: 0x%04x\n", tco.tctl1); printf("TCO TCTL2 [0Ah]: 0x%04x\n", tco.tctl2); printf("TCO TMSG [0Ch]: 0x%04x\n", tco.tmsg); printf("TCO TWDS [0Eh]: 0x%02x\n", tco.twds); printf("TCO LE [10h]: 0x%02x\n", tco.le); printf("TCO TTMR [12h]: 0x%04x\n", tco.ttmr); if ((fd = open("/dev/mem", O_RDONLY)) == -1) err(1, "open /dev/mem"); smbus = mmap(NULL, pagesize, PROT_READ, MAP_PRIVATE, fd, (off_t)0xfdc60000); if (smbus == MAP_FAILED) err(1, "mmap SMBus I/O"); printf("SMBus TCOCFG [00h]: 0x%08x\n", smbus[0x00/4]); printf("SMBus ? [04h]: 0x%08x\n", smbus[0x04/4]); printf("SMBus ? [08h]: 0x%08x\n", smbus[0x08/4]); printf("SMBus GC [0ch]: 0x%08x\n", smbus[0x0c/4]); printf("SMBus PCE [10h]: 0x%08x\n", smbus[0x10/4]); if (munmap(smbus, pagesize) == -1) warn("munmap"); if (close(fd) == -1) warn("close"); return 0; }