acked-by: idlogin <<span><a href="mailto:putlinuxonit@gmail.com" target="_blank">putlinuxonit@gmail.com</a></span>><br><br><div class="gmail_quote">2009/8/17 Carl-Daniel Hailfinger <span dir="ltr"><<a href="mailto:c-d.hailfinger.devel.2006@gmx.net">c-d.hailfinger.devel.2006@gmx.net</a>></span><br>

<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">On 13.08.2009 00:43, Carl-Daniel Hailfinger wrote:<br>
> On 13.08.2009 00:19, Carl-Daniel Hailfinger wrote:<br>
><br>
>> On 12.08.2009 20:44, Stefan Reinauer wrote:<br>
>><br>
>><br>
>>> This needs /dev/cpu0 from ports/sysutils<br>
>>><br>
>>><br>
>> Stefan, since the original patch is from you, you may want to add<br>
>> your Signoff here as well.<br>
>><br>
<br>
Compiles on FreeBSD and Linux and is the least invasive solution I could<br>
come up with.<br>
<br>
This is 0.9.1 material.<br>
<br>
Signed-off-by: Carl-Daniel Hailfinger <<a href="mailto:c-d.hailfinger.devel.2006@gmx.net">c-d.hailfinger.devel.2006@gmx.net</a>><br>
<br>
Index: flashrom-rdmsr_freebsd/flash.h<br>
===================================================================<br>
--- flashrom-rdmsr_freebsd/flash.h      (Revision 685)<br>
+++ flashrom-rdmsr_freebsd/flash.h      (Arbeitskopie)<br>
@@ -309,11 +309,21 @@<br>
 void physunmap(void *virt_addr, size_t len);<br>
 int setup_cpu_msr(int cpu);<br>
 void cleanup_cpu_msr(void);<br>
-#ifndef __DARWIN__<br>
+#if !defined(__DARWIN__) && !defined(__FreeBSD__) && !defined(__DragonFly__)<br>
 typedef struct { uint32_t hi, lo; } msr_t;<br>
 msr_t rdmsr(int addr);<br>
 int wrmsr(int addr, msr_t msr);<br>
 #endif<br>
+#if defined(__FreeBSD__) || defined(__DragonFly__)<br>
+/* FreeBSD already has conflicting definitions for wrmsr/rdmsr. */<br>
+#undef rdmsr<br>
+#undef wrmsr<br>
+#define rdmsr freebsd_rdmsr<br>
+#define wrmsr freebsd_wrmsr<br>
+typedef struct { uint32_t hi, lo; } msr_t;<br>
+msr_t freebsd_rdmsr(int addr);<br>
+int freebsd_wrmsr(int addr, msr_t msr);<br>
+#endif<br>
<br>
 /* internal.c */<br>
 struct pci_dev *pci_dev_find_filter(struct pci_filter filter);<br>
Index: flashrom-rdmsr_freebsd/physmap.c<br>
===================================================================<br>
--- flashrom-rdmsr_freebsd/physmap.c    (Revision 685)<br>
+++ flashrom-rdmsr_freebsd/physmap.c    (Arbeitskopie)<br>
@@ -215,6 +215,91 @@<br>
        fd_msr = -1;<br>
 }<br>
 #else<br>
+#if defined(__FreeBSD__) || defined(__DragonFly__)<br>
+#include <sys/ioctl.h><br>
+<br>
+typedef struct {<br>
+       int msr;<br>
+       uint64_t data;<br>
+} cpu_msr_args_t;<br>
+#define CPU_RDMSR _IOWR('c', 1, cpu_msr_args_t)<br>
+#define CPU_WRMSR _IOWR('c', 2, cpu_msr_args_t)<br>
+<br>
+static int fd_msr = -1;<br>
+<br>
+msr_t rdmsr(int addr)<br>
+{<br>
+       cpu_msr_args_t args;<br>
+<br>
+       msr_t msr = { 0xffffffff, 0xffffffff };<br>
+<br>
+       args.msr = addr;<br>
+<br>
+       if (ioctl(fd_msr, CPU_RDMSR, &args) < 0) {<br>
+               perror("CPU_RDMSR");<br>
+               close(fd_msr);<br>
+               exit(1);<br>
+       }<br>
+<br>
+       msr.lo = args.data & 0xffffffff;<br>
+       msr.hi = args.data >> 32;<br>
+<br>
+       return msr;<br>
+}<br>
+<br>
+int wrmsr(int addr, msr_t msr)<br>
+{<br>
+       cpu_msr_args_t args;<br>
+<br>
+       args.msr = addr;<br>
+       args.data = (((uint64_t)msr.hi) << 32) | msr.lo;<br>
+<br>
+       if (ioctl(fd_msr, CPU_WRMSR, &args) < 0) {<br>
+               perror("CPU_WRMSR");<br>
+               close(fd_msr);<br>
+               exit(1);<br>
+       }<br>
+<br>
+       return 0;<br>
+}<br>
+<br>
+int setup_cpu_msr(int cpu)<br>
+{<br>
+       char msrfilename[64];<br>
+       memset(msrfilename, 0, 64);<br>
+       sprintf(msrfilename, "/dev/cpu%d", cpu);<br>
+<br>
+       if (fd_msr != -1) {<br>
+               printf("MSR was already initialized\n");<br>
+               return -1;<br>
+       }<br>
+<br>
+       fd_msr = open(msrfilename, O_RDWR);<br>
+<br>
+       if (fd_msr < 0) {<br>
+               perror("Error while opening /dev/cpu0");<br>
+               printf("Did you install ports/sysutils/devcpu?\n");<br>
+               return -1;<br>
+       }<br>
+<br>
+       return 0;<br>
+}<br>
+<br>
+void cleanup_cpu_msr(void)<br>
+{<br>
+       if (fd_msr == -1) {<br>
+               printf("No MSR initialized.\n");<br>
+               return;<br>
+       }<br>
+<br>
+       close(fd_msr);<br>
+<br>
+       /* Clear MSR file descriptor */<br>
+       fd_msr = -1;<br>
+}<br>
+<br>
+#else<br>
+<br>
 #ifdef __DARWIN__<br>
 int setup_cpu_msr(int cpu)<br>
 {<br>
@@ -251,4 +336,5 @@<br>
 }<br>
 #endif<br>
 #endif<br>
+#endif<br>
<font color="#888888"><br>
<br>
<br>
--<br>
<a href="http://www.hailfinger.org/" target="_blank">http://www.hailfinger.org/</a><br>
<br>
<br>
_______________________________________________<br>
flashrom mailing list<br>
<a href="mailto:flashrom@flashrom.org">flashrom@flashrom.org</a><br>
<a href="http://www.flashrom.org/mailman/listinfo/flashrom" target="_blank">http://www.flashrom.org/mailman/listinfo/flashrom</a><br>
</font></blockquote></div><br><br clear="all"><br>-- <br> Udu E. Ogah<br>.~~~~~~~~~~.<br>