[flashrom] MSR access fix on ALIX2D13 running OpenBSD-5.3
Leonardo Guardati
leonardo at guardati.it
Wed Apr 10 20:36:48 CEST 2013
Using flashrom-trunk on PCEngines' ALIX2D13 board running
OpenBSD-5.3 (current) doesn't work.
The chipset is AMD Geode CS5536.
Here the steps:
1. Applied patch amdmsr.patch to openbsd kernel (/usr/src/sys/arch/i386/i386/amdmsr.c)
Explaination: the original code checks for GPU presence (alix has no GPU) and fails; I
just skip the check.
2. got last flashrom version (trunk)
3. applied given patch http://patchwork.coreboot.org/patch/3932/
4. applied given patch http://patchwork.coreboot.org/patch/3933/
5. applied patch hwaccess.patch
Explaination: openbsd uses a different way to retrieve IO Priviledge Level, see i386_iopl(2) man page.
6. applied patch physmap.patch
Explaination: minor code mismatches fixed and /dev/amdmsr0 changed to /dev/amdmsr.
The 3 patches are attached.
I confirm running "./flashrom -p internal -r bios.bin" extracts the same bios image
got from flashrom run on linux. (md5 checks)
Thank You.
Leonardo.
-------------- next part --------------
--- amdmsr.c 2013-04-10 19:18:05.038996550 +0200
+++ amdmsr-fix.c 2013-04-10 19:22:13.508890253 +0200
@@ -77,8 +77,8 @@
/* Check for graphics processor presence */
gld_msr_cap = rdmsr(GLX_CPU_GLD_MSR_CAP);
if (((gld_msr_cap >> 8) & 0x0fff) == GLX_CPU_DID) {
- gld_msr_cap = rdmsr(GLX_GP_GLD_MSR_CAP);
- if (((gld_msr_cap >> 8) & 0x0fff) == GLX_GP_DID)
+ //gld_msr_cap = rdmsr(GLX_GP_GLD_MSR_CAP);
+ //if (((gld_msr_cap >> 8) & 0x0fff) == GLX_GP_DID)
return 1;
}
}
-------------- next part --------------
--- ../hwaccess.c Wed Apr 10 20:11:35 2013
+++ hwaccess-fix.c Wed Apr 10 20:10:45 2013
@@ -86,6 +86,8 @@
#if IS_X86 && !(defined(__DJGPP__) || defined(__LIBPAYLOAD__))
#if defined (__sun)
if (sysi86(SI86V86, V86SC_IOPL, PS_IOPL) != 0) {
+#elif defined (__OpenBSD__)
+ if (i386_iopl(3) == -1) {
#elif IS_BSD
if ((io_fd = open("/dev/io", O_RDWR)) < 0) {
#elif IS_LINUX || IS_MACOSX
-------------- next part --------------
--- ../physmap.c Wed Apr 10 19:58:38 2013
+++ physmap-fix.c Wed Apr 10 20:15:50 2013
@@ -388,11 +388,16 @@
#include <sys/ioctl.h>
#include <machine/amdmsr.h>
+typedef struct {
+ int msr;
+ uint64_t data;
+} cpu_msr_args_t;
+
static int fd_msr = -1;
msr_t rdmsr(int addr)
{
- amdmsr_req args;
+ struct amdmsr_req args;
msr_t msr = { 0xffffffff, 0xffffffff };
@@ -415,7 +420,7 @@
cpu_msr_args_t args;
args.msr = addr;
- args.val = (((uint64_t)msr.hi) << 32) | msr.lo;
+ args.data = (((uint64_t)msr.hi) << 32) | msr.lo;
if (ioctl(fd_msr, WRMSR, &args) < 0) {
msg_perr("Error while executing WRMSR ioctl: %s\n", strerror(errno));
@@ -430,7 +435,7 @@
{
char msrfilename[64];
memset(msrfilename, 0, sizeof(msrfilename));
- snprintf(msrfilename, sizeof(msrfilename), "/dev/amdmsr%d", cpu);
+ snprintf(msrfilename, sizeof(msrfilename), "/dev/amdmsr");
if (fd_msr != -1) {
msg_pinfo("MSR was already initialized\n");
More information about the flashrom
mailing list