Patchwork nvramtool: Teach it to work on data in memory

login
register
about
Submitter Patrick Georgi
Date 2011-01-20 13:35:08
Message ID <1295530508.10580.24.camel@linux-0a8x.site>
Download mbox | patch
Permalink /patch/2541/
State Accepted
Headers show

Comments

Patrick Georgi - 2011-01-20 13:35:08
Attached patch allows nvramtool to work on in-memory data.

Signed-off-by: Patrick Georgi <patrick.georgi@secunet.com>
Stefan Reinauer - 2011-01-20 18:43:40
* Georgi, Patrick <Patrick.Georgi@secunet.com> [110120 14:35]:
> Attached patch allows nvramtool to work on in-memory data.
> 
> Signed-off-by: Patrick Georgi <patrick.georgi@secunet.com>

Acked-by: Stefan Reinauer <stepan@coreboot.org>

Patch

Index: coreboot/util/nvramtool/cmos_lowlevel.c

===================================================================
--- coreboot.orig/util/nvramtool/cmos_lowlevel.c

+++ coreboot/util/nvramtool/cmos_lowlevel.c

@@ -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 @@  static void cmos_hal_write(unsigned inde

 	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 cmos_write_all(unsigned char data[]

  ****************************************************************************/
 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 @@  void set_iopl(int level)

 #endif
 }
 
+static void mem_set_iopl(__attribute__ ((unused)) int level)

+{

+}

+

 /****************************************************************************
  * verify_cmos_op
  *
Index: coreboot/util/nvramtool/cmos_lowlevel.h

===================================================================
--- coreboot.orig/util/nvramtool/cmos_lowlevel.h

+++ coreboot/util/nvramtool/cmos_lowlevel.h

@@ -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)