[coreboot] [commit] r6284 - trunk/util/nvramtool

repository service svn at coreboot.org
Fri Jan 21 08:19:59 CET 2011


Author: oxygene
Date: Fri Jan 21 08:19:59 2011
New Revision: 6284
URL: https://tracker.coreboot.org/trac/coreboot/changeset/6284

Log:
Add support for working on in-memory CMOS data (eg.
as loaded from a file).

Signed-off-by: Patrick Georgi <patrick.georgi at secunet.com>
Acked-by: Stefan Reinauer <stepan at coreboot.org>

Modified:
   trunk/util/nvramtool/cmos_lowlevel.c
   trunk/util/nvramtool/cmos_lowlevel.h

Modified: trunk/util/nvramtool/cmos_lowlevel.c
==============================================================================
--- trunk/util/nvramtool/cmos_lowlevel.c	Fri Jan 21 08:18:20 2011	(r6283)
+++ trunk/util/nvramtool/cmos_lowlevel.c	Fri Jan 21 08:19:59 2011	(r6284)
@@ -37,20 +37,36 @@
 #include "cmos_lowlevel.h"
 
 /* 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
+	.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,
 };
 
 static cmos_access_t *current_access = &cmos_hal;
@@ -96,6 +112,37 @@
 	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) {
+		case HAL_CMOS:
+			current_access = &cmos_hal;
+			break;
+		case HAL_MEMORY:
+			current_access = &memory_hal;
+			break;
+	}
+	current_access->init(data);
+}
+
 /* Bit-level access */
 typedef struct {
 	unsigned byte_index;
@@ -303,6 +350,11 @@
  ****************************************************************************/
 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
@@ -333,6 +385,10 @@
 #endif
 }
 
+static void mem_set_iopl(__attribute__ ((unused)) int level)
+{
+}
+
 /****************************************************************************
  * verify_cmos_op
  *

Modified: trunk/util/nvramtool/cmos_lowlevel.h
==============================================================================
--- trunk/util/nvramtool/cmos_lowlevel.h	Fri Jan 21 08:18:20 2011	(r6283)
+++ trunk/util/nvramtool/cmos_lowlevel.h	Fri Jan 21 08:19:59 2011	(r6284)
@@ -34,6 +34,9 @@
 #include "common.h"
 #include "layout.h"
 
+typedef enum { HAL_CMOS, HAL_MEMORY } hal_t;
+void select_hal(hal_t hal, void *data);
+
 #define CMOS_AREA_OUT_OF_RANGE (CMOS_RESULT_START + 0)
 #define CMOS_AREA_OVERLAPS_RTC (CMOS_RESULT_START + 1)
 #define CMOS_AREA_TOO_WIDE (CMOS_RESULT_START + 2)




More information about the coreboot mailing list