Move CMOS handling into separate files in accessors
authorPatrick Georgi <patrick.georgi@secunet.com>
Fri, 28 Jan 2011 07:54:11 +0000 (07:54 +0000)
committerPatrick Georgi <patrick.georgi@coresystems.de>
Fri, 28 Jan 2011 07:54:11 +0000 (07:54 +0000)
Signed-off-by: Patrick Georgi <patrick.georgi@secunet.com>
Acked-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@6313 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

util/nvramtool/Makefile
util/nvramtool/accessors/cmos-hw-unix.c [new file with mode: 0644]
util/nvramtool/accessors/cmos-mem.c [new file with mode: 0644]
util/nvramtool/cmos_lowlevel.c
util/nvramtool/cmos_lowlevel.h
util/nvramtool/common.h

index ff9072e2b64093f854e58a9a2cb7fe47cab196ac..a7054944685224265f8f7ec74b9335d7deb7d946 100644 (file)
@@ -31,7 +31,7 @@ CLI_OBJS = cli/nvramtool.o cli/opts.o
 
 OBJS =  cmos_lowlevel.o cmos_ops.o common.o compute_ip_checksum.o \
        hexdump.o input_file.o layout.o accessors/layout-text.o lbtable.o   \
-       reg_expr.o cbfs.o
+       reg_expr.o cbfs.o accessors/cmos-hw-unix.o accessors/cmos-mem.o
 
 OBJS += $(CLI_OBJS)
 
diff --git a/util/nvramtool/accessors/cmos-hw-unix.c b/util/nvramtool/accessors/cmos-hw-unix.c
new file mode 100644 (file)
index 0000000..06855d7
--- /dev/null
@@ -0,0 +1,122 @@
+#include <assert.h>
+#include "cmos_lowlevel.h"
+
+#if defined(__FreeBSD__)
+#include <sys/types.h>
+#include <machine/cpufunc.h>
+#define OUTB(x, y) do { u_int tmp = (y); outb(tmp, (x)); } while (0)
+#define OUTW(x, y) do { u_int tmp = (y); outw(tmp, (x)); } while (0)
+#define OUTL(x, y) do { u_int tmp = (y); outl(tmp, (x)); } while (0)
+#define INB(x) __extension__ ({ u_int tmp = (x); inb(tmp); })
+#define INW(x) __extension__ ({ u_int tmp = (x); inw(tmp); })
+#define INL(x) __extension__ ({ u_int tmp = (x); inl(tmp); })
+#else
+#if defined(__GLIBC__)
+#include <sys/io.h>
+#endif
+#if (defined(__MACH__) && defined(__APPLE__))
+#include <DirectIO/darwinio.h>
+#endif
+#define OUTB outb
+#define OUTW outw
+#define OUTL outl
+#define INB  inb
+#define INW  inw
+#define INL  inl
+#endif
+
+static void cmos_hal_init(void* data);
+static unsigned char cmos_hal_read(unsigned addr);
+static void cmos_hal_write(unsigned addr, unsigned char value);
+static void cmos_set_iopl(int level);
+
+/* no need to initialize anything */
+static void cmos_hal_init(__attribute__((unused)) void *data)
+{
+}
+
+static unsigned char cmos_hal_read(unsigned index)
+{
+       unsigned short port_0, port_1;
+
+       assert(!verify_cmos_byte_index(index));
+
+       if (index < 128) {
+               port_0 = 0x70;
+               port_1 = 0x71;
+       } else {
+               port_0 = 0x72;
+               port_1 = 0x73;
+       }
+
+       OUTB(index, port_0);
+       return INB(port_1);
+}
+
+static void cmos_hal_write(unsigned index, unsigned char value)
+{
+       unsigned short port_0, port_1;
+
+       assert(!verify_cmos_byte_index(index));
+
+       if (index < 128) {
+               port_0 = 0x70;
+               port_1 = 0x71;
+       } else {
+               port_0 = 0x72;
+               port_1 = 0x73;
+       }
+
+       OUTB(index, port_0);
+       OUTB(value, port_1);
+}
+
+
+/****************************************************************************
+ * cmos_set_iopl
+ *
+ * Set the I/O privilege level of the executing process.  Root privileges are
+ * required for performing this action.  A sufficient I/O privilege level
+ * allows the process to access x86 I/O address space and to disable/reenable
+ * interrupts while executing in user space.  Messing with the I/O privilege
+ * level is therefore somewhat dangerous.
+ ****************************************************************************/
+static void cmos_set_iopl(int level)
+{
+#if defined(__FreeBSD__)
+       static int io_fd = -1;
+#endif
+
+       assert((level >= 0) && (level <= 3));
+
+#if defined(__FreeBSD__)
+       if (level == 0) {
+               if (io_fd != -1) {
+                       close(io_fd);
+                       io_fd = -1;
+               }
+       } else {
+               if (io_fd == -1) {
+                       io_fd = open("/dev/io", O_RDWR);
+                       if (io_fd < 0) {
+                               perror("/dev/io");
+                               exit(1);
+                       }
+               }
+       }
+#else
+       if (iopl(level)) {
+               fprintf(stderr, "%s: iopl() system call failed.  "
+                       "You must be root to do this.\n", prog_name);
+               exit(1);
+       }
+#endif
+}
+
+cmos_access_t cmos_hal = {
+       .init = cmos_hal_init,
+       .read = cmos_hal_read,
+       .write = cmos_hal_write,
+       .set_iopl = cmos_set_iopl,
+};
+
diff --git a/util/nvramtool/accessors/cmos-mem.c b/util/nvramtool/accessors/cmos-mem.c
new file mode 100644 (file)
index 0000000..c124cde
--- /dev/null
@@ -0,0 +1,37 @@
+#include <assert.h>
+#include "cmos_lowlevel.h"
+
+static void mem_hal_init(void* data);
+static unsigned char mem_hal_read(unsigned addr);
+static void mem_hal_write(unsigned addr, unsigned char value);
+static void mem_set_iopl(int level);
+
+static unsigned char* mem_hal_data = (unsigned char*)-1;
+static void mem_hal_init(void *data)
+{
+       mem_hal_data = data;
+}
+
+static unsigned char mem_hal_read(unsigned index)
+{
+       assert(mem_hal_data != (unsigned char*)-1);
+       return mem_hal_data[index];
+}
+
+static void mem_hal_write(unsigned index, unsigned char value)
+{
+       assert(mem_hal_data != (unsigned char*)-1);
+       mem_hal_data[index] = value;
+}
+
+static void mem_set_iopl(__attribute__ ((unused)) int level)
+{
+}
+
+cmos_access_t memory_hal = {
+       .init = mem_hal_init,
+       .read = mem_hal_read,
+       .write = mem_hal_write,
+       .set_iopl = mem_set_iopl,
+};
+
index 8e19f515aa70743dadd57c0cd48111f30cd6abcd..58494f9c5849bdf1f45024bb555f3c6be6b37714 100644 (file)
 
 /* Hardware Abstraction Layer: lowlevel byte-wise write access */
 
-typedef struct {
-       void (*init)(void* data);
-       unsigned char (*read)(unsigned addr);
-       void (*write)(unsigned addr, unsigned char value);
-       void (*set_iopl)(int level);
-} cmos_access_t;
-
-static void cmos_hal_init(void* data);
-static unsigned char cmos_hal_read(unsigned addr);
-static void cmos_hal_write(unsigned addr, unsigned char value);
-static void cmos_set_iopl(int level);
-
-static cmos_access_t cmos_hal = {
-       .init = cmos_hal_init,
-       .read = cmos_hal_read,
-       .write = cmos_hal_write,
-       .set_iopl = cmos_set_iopl,
-};
-
-static void mem_hal_init(void* data);
-static unsigned char mem_hal_read(unsigned addr);
-static void mem_hal_write(unsigned addr, unsigned char value);
-static void mem_set_iopl(int level);
-
-static cmos_access_t memory_hal = {
-       .init = mem_hal_init,
-       .read = mem_hal_read,
-       .write = mem_hal_write,
-       .set_iopl = mem_set_iopl,
-};
-
+extern cmos_access_t cmos_hal, memory_hal;
 static cmos_access_t *current_access = &cmos_hal;
 
-/* no need to initialize anything */
-static void cmos_hal_init(__attribute__((unused)) void *data)
-{
-}
-
-static unsigned char cmos_hal_read(unsigned index)
-{
-       unsigned short port_0, port_1;
-
-       assert(!verify_cmos_byte_index(index));
-
-       if (index < 128) {
-               port_0 = 0x70;
-               port_1 = 0x71;
-       } else {
-               port_0 = 0x72;
-               port_1 = 0x73;
-       }
-
-       OUTB(index, port_0);
-       return INB(port_1);
-}
-
-static void cmos_hal_write(unsigned index, unsigned char value)
-{
-       unsigned short port_0, port_1;
-
-       assert(!verify_cmos_byte_index(index));
-
-       if (index < 128) {
-               port_0 = 0x70;
-               port_1 = 0x71;
-       } else {
-               port_0 = 0x72;
-               port_1 = 0x73;
-       }
-
-       OUTB(index, port_0);
-       OUTB(value, port_1);
-}
-
-static unsigned char* mem_hal_data = (unsigned char*)-1;
-static void mem_hal_init(void *data)
-{
-       mem_hal_data = data;
-}
-
-static unsigned char mem_hal_read(unsigned index)
-{
-       assert(mem_hal_data != (unsigned char*)-1);
-       return mem_hal_data[index];
-}
-
-static void mem_hal_write(unsigned index, unsigned char value)
-{
-       assert(mem_hal_data != (unsigned char*)-1);
-       mem_hal_data[index] = value;
-}
-
 void select_hal(hal_t hal, void *data)
 {
        switch(hal) {
@@ -353,42 +264,6 @@ void set_iopl(int level)
        current_access->set_iopl(level);
 }
 
-static void cmos_set_iopl(int level)
-{
-#if defined(__FreeBSD__)
-       static int io_fd = -1;
-#endif
-
-       assert((level >= 0) && (level <= 3));
-
-#if defined(__FreeBSD__)
-       if (level == 0) {
-               if (io_fd != -1) {
-                       close(io_fd);
-                       io_fd = -1;
-               }
-       } else {
-               if (io_fd == -1) {
-                       io_fd = open("/dev/io", O_RDWR);
-                       if (io_fd < 0) {
-                               perror("/dev/io");
-                               exit(1);
-                       }
-               }
-       }
-#else
-       if (iopl(level)) {
-               fprintf(stderr, "%s: iopl() system call failed.  "
-                       "You must be root to do this.\n", prog_name);
-               exit(1);
-       }
-#endif
-}
-
-static void mem_set_iopl(__attribute__ ((unused)) int level)
-{
-}
-
 /****************************************************************************
  * verify_cmos_op
  *
index 3c2efce1e1f05dae16247b3bc5df0d5c3048adc1..264bf85b6629142d09a08ac83eed2c4ef16fd499 100644 (file)
 #include "common.h"
 #include "layout.h"
 
+typedef struct {
+       void (*init)(void* data);
+       unsigned char (*read)(unsigned addr);
+       void (*write)(unsigned addr, unsigned char value);
+       void (*set_iopl)(int level);
+} cmos_access_t;
+
 typedef enum { HAL_CMOS, HAL_MEMORY } hal_t;
 void select_hal(hal_t hal, void *data);
 
index 5d6e2046d7628c8b15f4a97d035fd09b714f03bf..8ad0f65a38cc18ff18119a35f9e602423396a439 100644 (file)
 #include <string.h>
 #include <ctype.h>
 
-#if defined(__FreeBSD__)
-#include <sys/types.h>
-#include <machine/cpufunc.h>
-#define OUTB(x, y) do { u_int tmp = (y); outb(tmp, (x)); } while (0)
-#define OUTW(x, y) do { u_int tmp = (y); outw(tmp, (x)); } while (0)
-#define OUTL(x, y) do { u_int tmp = (y); outl(tmp, (x)); } while (0)
-#define INB(x) __extension__ ({ u_int tmp = (x); inb(tmp); })
-#define INW(x) __extension__ ({ u_int tmp = (x); inw(tmp); })
-#define INL(x) __extension__ ({ u_int tmp = (x); inl(tmp); })
-#else
-#if defined(__GLIBC__)
-#include <sys/io.h>
-#endif
-#if (defined(__MACH__) && defined(__APPLE__))
-#include <DirectIO/darwinio.h>
-#endif
-#define OUTB outb
-#define OUTW outw
-#define OUTL outl
-#define INB  inb
-#define INW  inw
-#define INL  inl
-#endif
-
 #define FALSE 0
 #define TRUE 1