From patchwork Thu Jan 20 13:35:08 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: nvramtool: Teach it to work on data in memory Date: Thu, 20 Jan 2011 13:35:08 -0000 From: Patrick Georgi X-Patchwork-Id: 2541 Message-Id: <1295530508.10580.24.camel@linux-0a8x.site> To: Attached patch allows nvramtool to work on in-memory data. Signed-off-by: Patrick Georgi Acked-by: Stefan Reinauer 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)