Systems
-------
FreeBSD #defines: see svn diff -r 3697:3698 util/
+i586: assembly instruction system driver, may have to ignore -c CPU # option
Other ideas
-----------
Move MSR definitions and probe instructions into an external text file?
-Handle PCI registers as well?
+Handle PCI and port IO registers as well?
test -n "$DEBUG" && myCFLAGS="-O2 -g" || myCFLAGS="-Os"
CFLAGS="${CFLAGS} ${myCFLAGS} -Wall -Werror"
+cat > .config.c << EOF
+#include <pci/pci.h>
+struct pci_access *pacc;
+int main(int argc, char *argv[])
+{ pacc = pci_alloc(); return 0; }
+EOF
+
+pc_CFLAGS="$(pkg-config libpci --cflags 2>/dev/null)"
+pc_LDFLAGS="$(pkg-config libpci --libs 2>/dev/null)"
+CFLAGS=$(trycompile "libpci (from pciutils)" "${pc_CFLAGS}" "-I/usr/local/include") || {
+ rm -f .config.c
+ exit 1
+}
+LDFLAGS=$(trylink "libpci (from pciutils)" "${pc_LDFLAGS}" "-lpci -lz" "-L/usr/local/lib -lpci -lz") || {
+ rm -f .config.c .config.o
+ exit 1
+}
+rm -f .config.c .config.o .config
+
PREFIX="${PREFIX:-/usr/local}"
OS_ARCH=$(uname)
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
+#include <pci/pci.h>
#include "msrtool.h"
const struct sysdef *sys = NULL;
uint8_t reserved = 0, verbose = 0, quiet = 0;
+struct pci_access *pacc = NULL;
+
static struct targetdef alltargets[] = {
{ "geodelx", "AMD Geode(tm) LX", geodelx_probe, geodelx_msrs },
{ "cs5536", "AMD Geode(tm) CS5536", cs5536_probe, cs5536_msrs },
printf_quiet("msrtool %s\n", VERSION);
+ pacc = pci_alloc();
+ if (NULL == pacc) {
+ fprintf(stderr, "Could not initialize PCI library! pci_alloc() failed.\n");
+ return 1;
+ }
+ pci_init(pacc);
+ pci_scan_bus(pacc);
+
if (!sys && !input && !listknown)
for (sys = allsystems; !SYSTEM_ISEOT(*sys); sys++) {
printf_verbose("Probing for system %s: %s\n", sys->name, sys->prettyname);
#include <stdio.h>
#include <stdint.h>
+#include <pci/pci.h>
#define HEXCHARS "0123456789abcdefABCDEF"
extern uint8_t reserved, verbose, quiet;
+extern struct pci_access *pacc;
+
#define printf_quiet(x...) do { if (!quiet) fprintf(stderr,x); } while(0)
#define printf_verbose(x...) do { if (verbose && !quiet) fprintf(stderr,x); } while(0)
/* sys.c */
struct cpuid_t *cpuid(void);
+struct pci_dev *pci_dev_find(uint16_t vendor, uint16_t device);
/* msrutils.c */
void hexprint(FILE *f, const struct msr val, const uint8_t bits);
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <pci/pci.h>
+
#include "msrtool.h"
static struct cpuid_t id;
}
return &id;
}
+
+struct pci_dev *pci_dev_find(uint16_t vendor, uint16_t device) {
+ struct pci_dev *temp;
+ struct pci_filter filter;
+
+ pci_filter_init(NULL, &filter);
+ filter.vendor = vendor;
+ filter.device = device;
+
+ for (temp = pacc->devices; temp; temp = temp->next)
+ if (pci_filter_match(&filter, temp))
+ return temp;
+
+ return NULL;
+}