summaryrefslogtreecommitdiffstats
path: root/dummyflasher.c
diff options
context:
space:
mode:
authorCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2012-02-08 23:28:54 +0000
committerCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2012-02-08 23:28:54 +0000
commit1b83be5cd45b86d2a52ec6962de2910901972b38 (patch)
tree4bea7df2226bbaf8a68ab01a1410bf43acb24f4b /dummyflasher.c
parent23907d8903487dc350783e85e190cf21e47e82e4 (diff)
downloadast2050-flashrom-1b83be5cd45b86d2a52ec6962de2910901972b38.zip
ast2050-flashrom-1b83be5cd45b86d2a52ec6962de2910901972b38.tar.gz
SPI command black-/ignorelisting for the flash chip emulator in the dummy programmer
Usage: flashrom -p dummy:spi_blacklist=commandlist flashrom -p dummy:spi_ignorelist=commandlist If commandlist is 0302, flashrom will refuse (blacklist) or ignore (ignorelist) command 0x03 (READ) and command 0x02 (WRITE). The commandlist can be up to 512 bytes (256 commands) long. Specifying flash chip emulation is a good idea to get useful results. Very useful for testing corner cases if you don't own a locked down Intel chipset and want to simulate such a thing. Example usage: dd if=/dev/zeros bs=1024k count=4 of=dummy_simulator.rom dd if=/dev/urandom bs=1024k count=4 of=randomimage.rom flashrom -p dummy:emulate=SST25VF032B,image=dummy_simulator.rom,\ spi_blacklist=20,spi_ignorelist=52 -w randomimage.rom -V Corresponding to flashrom svn r1490. Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: David Hendricks <dhendrix@google.com>
Diffstat (limited to 'dummyflasher.c')
-rw-r--r--dummyflasher.c92
1 files changed, 89 insertions, 3 deletions
diff --git a/dummyflasher.c b/dummyflasher.c
index 99f81f5..6281ff8 100644
--- a/dummyflasher.c
+++ b/dummyflasher.c
@@ -19,6 +19,8 @@
#include <string.h>
#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
#include "flash.h"
#include "chipdrivers.h"
#include "programmer.h"
@@ -55,6 +57,10 @@ static unsigned int emu_jedec_be_52_size = 0;
static unsigned int emu_jedec_be_d8_size = 0;
static unsigned int emu_jedec_ce_60_size = 0;
static unsigned int emu_jedec_ce_c7_size = 0;
+unsigned char spi_blacklist[256];
+unsigned char spi_ignorelist[256];
+int spi_blacklist_size = 0;
+int spi_ignorelist_size = 0;
#endif
#endif
@@ -126,6 +132,7 @@ int dummy_init(void)
{
char *bustext = NULL;
char *tmp = NULL;
+ int i;
#if EMULATE_CHIP
struct stat image_stat;
#endif
@@ -170,6 +177,68 @@ int dummy_init(void)
}
}
+ tmp = extract_programmer_param("spi_blacklist");
+ if (tmp) {
+ i = strlen(tmp);
+ if (!strncmp(tmp, "0x", 2)) {
+ i -= 2;
+ memmove(tmp, tmp + 2, i + 1);
+ }
+ if ((i > 512) || (i % 2)) {
+ msg_perr("Invalid SPI command blacklist length\n");
+ free(tmp);
+ return 1;
+ }
+ spi_blacklist_size = i / 2;
+ for (i = 0; i < spi_blacklist_size * 2; i++) {
+ if (!isxdigit((unsigned char)tmp[i])) {
+ msg_perr("Invalid char \"%c\" in SPI command "
+ "blacklist\n", tmp[i]);
+ free(tmp);
+ return 1;
+ }
+ }
+ for (i = 0; i < spi_blacklist_size; i++) {
+ sscanf(tmp + i * 2, "%2hhx", &spi_blacklist[i]);
+ }
+ msg_pdbg("SPI blacklist is ");
+ for (i = 0; i < spi_blacklist_size; i++)
+ msg_pdbg("%02x ", spi_blacklist[i]);
+ msg_pdbg(", size %i\n", spi_blacklist_size);
+ }
+ free(tmp);
+
+ tmp = extract_programmer_param("spi_ignorelist");
+ if (tmp) {
+ i = strlen(tmp);
+ if (!strncmp(tmp, "0x", 2)) {
+ i -= 2;
+ memmove(tmp, tmp + 2, i + 1);
+ }
+ if ((i > 512) || (i % 2)) {
+ msg_perr("Invalid SPI command ignorelist length\n");
+ free(tmp);
+ return 1;
+ }
+ spi_ignorelist_size = i / 2;
+ for (i = 0; i < spi_ignorelist_size * 2; i++) {
+ if (!isxdigit((unsigned char)tmp[i])) {
+ msg_perr("Invalid char \"%c\" in SPI command "
+ "ignorelist\n", tmp[i]);
+ free(tmp);
+ return 1;
+ }
+ }
+ for (i = 0; i < spi_ignorelist_size; i++) {
+ sscanf(tmp + i * 2, "%2hhx", &spi_ignorelist[i]);
+ }
+ msg_pdbg("SPI ignorelist is ");
+ for (i = 0; i < spi_ignorelist_size; i++)
+ msg_pdbg("%02x ", spi_ignorelist[i]);
+ msg_pdbg(", size %i\n", spi_ignorelist_size);
+ }
+ free(tmp);
+
#if EMULATE_CHIP
tmp = extract_programmer_param("emulate");
if (!tmp) {
@@ -348,7 +417,7 @@ static int emulate_spi_chip_response(unsigned int writecnt,
const unsigned char *writearr,
unsigned char *readarr)
{
- unsigned int offs;
+ unsigned int offs, i;
static int unsigned aai_offs;
static int aai_active = 0;
@@ -356,7 +425,24 @@ static int emulate_spi_chip_response(unsigned int writecnt,
msg_perr("No command sent to the chip!\n");
return 1;
}
- /* TODO: Implement command blacklists here. */
+ /* spi_blacklist has precedence before spi_ignorelist. */
+ for (i = 0; i < spi_blacklist_size; i++) {
+ if (writearr[0] == spi_blacklist[i]) {
+ msg_pdbg("Refusing blacklisted SPI command 0x%02x\n",
+ spi_blacklist[i]);
+ return SPI_INVALID_OPCODE;
+ }
+ }
+ for (i = 0; i < spi_ignorelist_size; i++) {
+ if (writearr[0] == spi_ignorelist[i]) {
+ msg_cdbg("Ignoring ignorelisted SPI command 0x%02x\n",
+ spi_ignorelist[i]);
+ /* Return success because the command does not fail,
+ * it is simply ignored.
+ */
+ return 0;
+ }
+ }
switch (writearr[0]) {
case JEDEC_RES:
if (emu_chip != EMULATE_ST_M25P10_RES)
@@ -563,7 +649,7 @@ static int dummy_spi_send_command(struct flashctx *flash, unsigned int writecnt,
case EMULATE_SST_SST25VF032B:
if (emulate_spi_chip_response(writecnt, readcnt, writearr,
readarr)) {
- msg_perr("Invalid command sent to flash chip!\n");
+ msg_pdbg("Invalid command sent to flash chip!\n");
return 1;
}
break;
OpenPOWER on IntegriCloud