summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util/flashrom/Makefile4
-rw-r--r--util/flashrom/cbtable.c17
-rw-r--r--util/flashrom/flash.h9
-rw-r--r--util/flashrom/physmap.c20
4 files changed, 45 insertions, 5 deletions
diff --git a/util/flashrom/Makefile b/util/flashrom/Makefile
index a0c195bc29..86f91d4a34 100644
--- a/util/flashrom/Makefile
+++ b/util/flashrom/Makefile
@@ -18,6 +18,10 @@ OS_ARCH = $(shell uname)
ifneq ($(OS_ARCH), SunOS)
STRIP_ARGS = -s
endif
+ifeq ($(OS_ARCH), Darwin)
+CFLAGS += -I/usr/local/include
+LDFLAGS += -framework IOKit -framework DirectIO -L/usr/local/lib
+endif
ifeq ($(OS_ARCH), FreeBSD)
CFLAGS += -I/usr/local/include
LDFLAGS += -L/usr/local/lib
diff --git a/util/flashrom/cbtable.c b/util/flashrom/cbtable.c
index 284140a563..2a3f2a75f0 100644
--- a/util/flashrom/cbtable.c
+++ b/util/flashrom/cbtable.c
@@ -184,11 +184,20 @@ static void search_lb_records(struct lb_record *rec, struct lb_record *last,
int coreboot_init(void)
{
uint8_t *low_1MB;
- unsigned long addr;
+ unsigned long addr, start;
struct lb_header *lb_table;
struct lb_record *rec, *last;
- low_1MB = physmap("low megabyte", 0x0, 1024*1024);
+#ifdef __DARWIN__
+ /* This is a hack. DirectIO fails to map physical address 0x00000000.
+ * Why?
+ */
+ start = 0x400;
+#else
+ start = 0x0;
+#endif
+ low_1MB = physmap("low megabyte", start, 1024*1024);
+
lb_table = find_lb_table(low_1MB, 0x00000, 0x1000);
if (!lb_table)
lb_table = find_lb_table(low_1MB, 0xf0000, 1024*1024);
@@ -197,8 +206,8 @@ int coreboot_init(void)
return -1;
}
- addr = ((char *)lb_table) - ((char *)low_1MB);
- printf_debug("coreboot table found at %p.\n", lb_table);
+ addr = ((char *)lb_table) - ((char *)low_1MB) + start;
+ printf_debug("coreboot table found at %p.\n", lb_table + start);
rec = (struct lb_record *)(((char *)lb_table) + lb_table->header_bytes);
last = (struct lb_record *)(((char *)rec) + lb_table->table_bytes);
printf_debug("coreboot header(%d) checksum: %04x table(%d) checksum: %04x entries: %d\n",
diff --git a/util/flashrom/flash.h b/util/flashrom/flash.h
index bad3110e3e..8b8553826d 100644
--- a/util/flashrom/flash.h
+++ b/util/flashrom/flash.h
@@ -30,6 +30,10 @@
#include <stdint.h>
#include <stdio.h>
+#if (defined(__MACH__) && defined(__APPLE__))
+#define __DARWIN__
+#endif
+
#if defined(__FreeBSD__)
#include <machine/cpufunc.h>
#define off64_t off_t
@@ -41,6 +45,11 @@
#define INW(x) __extension__ ({ u_int tmp = (x); inw(tmp); })
#define INL(x) __extension__ ({ u_int tmp = (x); inl(tmp); })
#else
+#if defined(__DARWIN__)
+ #include <DirectIO/darwinio.h>
+ #define off64_t off_t
+ #define lseek64 lseek
+#endif
#define OUTB outb
#define OUTW outw
#define OUTL outl
diff --git a/util/flashrom/physmap.c b/util/flashrom/physmap.c
index 65d25698c8..92e4dccd75 100644
--- a/util/flashrom/physmap.c
+++ b/util/flashrom/physmap.c
@@ -1,4 +1,3 @@
-#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
@@ -6,6 +5,24 @@
#include <errno.h>
#include "flash.h"
+#ifdef __DARWIN__
+#include <DirectIO/darwinio.h>
+
+#define MEM_DEV "DirectIO"
+
+void *sys_physmap(unsigned long phys_addr, size_t len)
+{
+ return map_physical(phys_addr, len);
+}
+
+void physunmap(void *virt_addr, size_t len)
+{
+ unmap_physical(virt_addr, len);
+}
+
+#else
+#include <sys/mman.h>
+
#if defined (__sun) && (defined(__i386) || defined(__amd64))
# define MEM_DEV "/dev/xsvc"
#else
@@ -34,6 +51,7 @@ void physunmap(void *virt_addr, size_t len)
{
munmap(virt_addr, len);
}
+#endif
void *physmap(const char *descr, unsigned long phys_addr, size_t len)
{