<div dir="ltr">Hi.<div><br></div><div>Sorry for not replying, i got buried with other stuff.</div><div><br></div><div>So, after some hassle with svn, i managed to apply that patch (patch -l -m -i ../flashrom.patch) ontop of current svn tip (r1857)</div><div>That indeed fixed flash reading (-r), md5 of files generated with this patch, and with r1832 match.</div><div><br></div><div>Here is the output, also do note "Invalid locking change 0xf8 requested" at the end!!!</div><div><br></div><div><div># flashrom --programmer internal -r 1002.bin.patch -V  </div><div>flashrom v0.9.7-r1857 on Linux 3.16.0-4-686-pae (i686)</div><div>flashrom is free software, get the source code at <a href="http://www.flashrom.org">http://www.flashrom.org</a></div><div><br></div><div>flashrom was built with libpci 3.2.1, GCC 4.9.2, little endian</div><div>Command line (5 args): flashrom --programmer internal -r 1002.bin.patch -V</div><div>Calibrating delay loop... OS timer resolution is 1 usecs, 534M loops per second, 10 myus = 10 us, 100 myus = 100 us, 1000 myus = 999 us, 10000 myus = 10002 us, 4 myus = 4 us, OK.</div><div>Initializing internal programmer</div><div>No coreboot table found.</div><div>Using Internal DMI decoder.</div><div>DMI string chassis-type: "Desktop"</div><div>DMI string system-manufacturer: "ASUSTeK COMPUTER INC."</div><div>DMI string system-product-name: "PCH-DR"</div><div>DMI string system-version: "1.XX    "</div><div>DMI string baseboard-manufacturer: "ASUSTek Computer INC."</div><div>DMI string baseboard-product-name: "PCH-DR"</div><div>DMI string baseboard-version: "1.XX    "</div><div>Found Winbond Super I/O, id 0x82</div><div>W836xx enter config mode worked or we were already in config mode. W836xx leave config mode had no effect.</div><div>Active config mode, unknown reg 0x20 ID: 00.</div><div>Please send the output of "flashrom -V -p internal" to </div><div><a href="mailto:flashrom@flashrom.org">flashrom@flashrom.org</a> with W836xx: your board name: flashrom -V</div><div>as the subject to help us finish support for your Super I/O. Thanks.</div><div>Found chipset "Intel 6300ESB" with PCI ID 8086:25a1. Enabling flash write... 0xfff80000/0xffb80000 FWH IDSEL: 0x0</div><div>0xfff00000/0xffb00000 FWH IDSEL: 0x0</div><div>0xffe80000/0xffa80000 FWH IDSEL: 0x1</div><div>0xffe00000/0xffa00000 FWH IDSEL: 0x1</div><div>0xffd80000/0xff980000 FWH IDSEL: 0x2</div><div>0xffd00000/0xff900000 FWH IDSEL: 0x2</div><div>0xffc80000/0xff880000 FWH IDSEL: 0x3</div><div>0xffc00000/0xff800000 FWH IDSEL: 0x3</div><div>0xff700000/0xff300000 FWH IDSEL: 0x4</div><div>0xff600000/0xff200000 FWH IDSEL: 0x5</div><div>0xff500000/0xff100000 FWH IDSEL: 0x6</div><div>0xff400000/0xff000000 FWH IDSEL: 0x7</div><div>0xfff80000/0xffb80000 FWH decode enabled</div><div>0xfff00000/0xffb00000 FWH decode enabled</div><div>0xffe80000/0xffa80000 FWH decode disabled</div><div>0xffe00000/0xffa00000 FWH decode disabled</div><div>0xffd80000/0xff980000 FWH decode disabled</div><div>0xffd00000/0xff900000 FWH decode disabled</div><div>0xffc80000/0xff880000 FWH decode disabled</div><div>0xffc00000/0xff800000 FWH decode disabled</div><div>0xff700000/0xff300000 FWH decode disabled</div><div>0xff600000/0xff200000 FWH decode disabled</div><div>0xff500000/0xff100000 FWH decode disabled</div><div>0xff400000/0xff000000 FWH decode disabled</div><div>Maximum FWH chip size: 0x100000 bytes</div><div><br></div><div>BIOS_CNTL = 0x01: BIOS Lock Enable: disabled, BIOS Write Enable: enabled</div><div>OK.</div><div>The following protocols are supported: FWH.</div><div>Probing for Atmel AT49LH002, 256 kB: probe_82802ab: id1 0x08, id2 0x14, id1 is normal flash content, id2 is normal flash content</div><div>Probing for Atmel AT49LH00B4, 512 kB: probe_82802ab: id1 0x49, id2 0x4d, id1 is normal flash content, id2 is normal flash content</div><div>Probing for Atmel AT49LH004, 512 kB: probe_82802ab: id1 0x49, id2 0x4d, id1 is normal flash content, id2 is normal flash content</div><div>Probing for Intel 82802AB, 512 kB: probe_82802ab: id1 0x49, id2 0x4d, id1 is normal flash content, id2 is normal flash content</div><div>Probing for Intel 82802AC, 1024 kB: probe_82802ab: id1 0x49, id2 0x4d, id1 is normal flash content, id2 is normal flash content</div><div>Probing for PMC Pm49FL002, 256 kB: probe_jedec_common: id1 0x9d, id2 0x6e</div><div>Probing for PMC Pm49FL004, 512 kB: probe_jedec_common: id1 0x9d, id2 0x6e</div><div>Found PMC flash chip "Pm49FL004" (512 kB, LPC, FWH) mapped at physical address 0xfff80000.</div><div>Probing for Sharp LHF00L04, 1024 kB: probe_82802ab: id1 0x49, id2 0x4d, id1 is normal flash content, id2 is normal flash content</div><div>Probing for SST SST49LF002A/B, 256 kB: probe_jedec_common: id1 0x9d, id2 0x6e</div><div>Probing for SST SST49LF003A/B, 384 kB: probe_jedec_common: id1 0x9d, id2 0x6e</div><div>Probing for SST SST49LF004A/B, 512 kB: probe_jedec_common: id1 0x9d, id2 0x6e</div><div>Probing for SST SST49LF004C, 512 kB: probe_82802ab: id1 0x49, id2 0x4d, id1 is normal flash content, id2 is normal flash content</div><div>Probing for SST SST49LF008A, 1024 kB: probe_jedec_common: id1 0x9d, id2 0x6e</div><div>Probing for SST SST49LF008C, 1024 kB: probe_82802ab: id1 0x49, id2 0x4d, id1 is normal flash content, id2 is normal flash content</div><div>Probing for SST SST49LF016C, 2048 kB: probe_82802ab: id1 0xff, id2 0xff, id1 parity violation, id1 is normal flash content, id2 is normal flash content</div><div>Probing for ST M50FLW040A, 512 kB: probe_82802ab: id1 0x49, id2 0x4d, id1 is normal flash content, id2 is normal flash content</div><div>Probing for ST M50FLW040B, 512 kB: probe_82802ab: id1 0x49, id2 0x4d, id1 is normal flash content, id2 is normal flash content</div><div>Probing for ST M50FLW080A, 1024 kB: probe_82802ab: id1 0x49, id2 0x4d, id1 is normal flash content, id2 is normal flash content</div><div>Probing for ST M50FLW080B, 1024 kB: probe_82802ab: id1 0x49, id2 0x4d, id1 is normal flash content, id2 is normal flash content</div><div>Probing for ST M50FW002, 256 kB: probe_82802ab: id1 0x08, id2 0x14, id1 is normal flash content, id2 is normal flash content</div><div>Probing for ST M50FW016, 2048 kB: probe_82802ab: id1 0xff, id2 0xff, id1 parity violation, id1 is normal flash content, id2 is normal flash content</div><div>Probing for ST M50FW040, 512 kB: probe_82802ab: id1 0x49, id2 0x4d, id1 is normal flash content, id2 is normal flash content</div><div>Probing for ST M50FW080, 1024 kB: probe_82802ab: id1 0x49, id2 0x4d, id1 is normal flash content, id2 is normal flash content</div><div>Probing for Winbond W39V040FA, 512 kB: probe_jedec_common: id1 0x9d, id2 0x6e</div><div>Probing for Winbond W39V040FB, 512 kB: probe_jedec_common: id1 0x9d, id2 0x6e</div><div>Probing for Winbond W39V040FC, 512 kB: probe_jedec_common: id1 0x9d, id2 0x6e</div><div>Probing for Winbond W49V002FA, 256 kB: probe_jedec_common: id1 0x9d, id2 0x6e</div><div>Probing for Winbond W39V080FA, 1024 kB: probe_jedec_common: id1 0x9d, id2 0x6e</div><div>Probing for Winbond W39V080FA (dual mode), 512 kB: probe_jedec_common: id1 0x9d, id2 0x6e</div><div>Found PMC flash chip "Pm49FL004" (512 kB, LPC, FWH).</div><div>===</div><div>This flash part has status UNTESTED for operations: ERASE WRITE</div><div>The test status of this chip may have been updated in the latest development</div><div>version of flashrom. If you are running the latest development version,</div><div>please email a report to <a href="mailto:flashrom@flashrom.org">flashrom@flashrom.org</a> if any of the above operations</div><div>work correctly for you with this flash chip. Please include the flashrom log</div><div>file for all operations you tested (see the man page for details), and mention</div><div>which mainboard or programmer you tested in the subject line.</div><div>Thanks for your help!</div><div>Invalid locking change 0xf8 requested at 0xb7323002! Please report a bug at <a href="mailto:flashrom@flashrom.org">flashrom@flashrom.org</a></div><div>Reading flash... done.</div></div><div>#</div><div><br></div><div>Roman.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Dec 7, 2014 at 2:06 AM, Stefan Tauner <span dir="ltr"><<a href="mailto:stefan.tauner@alumni.tuwien.ac.at" target="_blank">stefan.tauner@alumni.tuwien.ac.at</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Previously we added the offset of the virtual register in several<br>
functions, which produced segfaults. This patch renames a few<br>
parameters hence the rather big diff.<br>
<br>
Thanks to Roman Lebedev for reporting this issue.<br>
<br>
Signed-off-by: Stefan Tauner <<a href="mailto:stefan.tauner@alumni.tuwien.ac.at">stefan.tauner@alumni.tuwien.ac.at</a>><br>
---<br>
 chipdrivers.h |  1 -<br>
 jedec.c       | 54 ++++++++++++++++++++++++------------------------------<br>
 2 files changed, 24 insertions(+), 31 deletions(-)<br>
<br>
diff --git a/chipdrivers.h b/chipdrivers.h<br>
index 8529c74..cac94f3 100644<br>
--- a/chipdrivers.h<br>
+++ b/chipdrivers.h<br>
@@ -150,7 +150,6 @@ int unlock_regspace2_uniform_32k(struct flashctx *flash);<br>
 int unlock_regspace2_uniform_64k(struct flashctx *flash);<br>
 int unlock_regspace2_block_eraser_0(struct flashctx *flash);<br>
 int unlock_regspace2_block_eraser_1(struct flashctx *flash);<br>
-int unlock_regspace2_block(const struct flashctx *flash, chipaddr off);<br>
 int printlock_regspace2_uniform_64k(struct flashctx *flash);<br>
 int printlock_regspace2_block_eraser_0(struct flashctx *flash);<br>
 int printlock_regspace2_block_eraser_1(struct flashctx *flash);<br>
diff --git a/jedec.c b/jedec.c<br>
index 1345b89..944f9d0 100644<br>
--- a/jedec.c<br>
+++ b/jedec.c<br>
@@ -589,11 +589,10 @@ static int regspace2_walk_unlockblocks(const struct flashctx *flash, const struc<br>
 #define REG2_LOCKDOWN (1 << 1)<br>
 #define REG2_MASK (REG2_RWLOCK | REG2_LOCKDOWN)<br>
<br>
-static int printlock_regspace2_block(const struct flashctx *flash, chipaddr offset)<br>
+static int printlock_regspace2_block(const struct flashctx *flash, chipaddr wrprotect)<br>
 {<br>
-       chipaddr wrprotect = flash->virtual_registers + offset + 2;<br>
        uint8_t state = chip_readb(flash, wrprotect);<br>
-       msg_cdbg("Lock status of block at 0x%0*" PRIxPTR " is ", PRIxPTR_WIDTH, offset);<br>
+       msg_cdbg("Lock status of block at 0x%0*" PRIxPTR " is ", PRIxPTR_WIDTH, wrprotect);<br>
        switch (state & REG2_MASK) {<br>
        case 0:<br>
                msg_cdbg("Full Access.\n");<br>
@@ -656,47 +655,43 @@ int printlock_regspace2_block_eraser_1(struct flashctx *flash)<br>
        return regspace2_walk_unlockblocks(flash, unlockblocks, &printlock_regspace2_block);<br>
 }<br>
<br>
-static int changelock_regspace2_block(const struct flashctx *flash, chipaddr offset, uint8_t new_bits)<br>
+static int changelock_regspace2_block(const struct flashctx *flash, chipaddr wrprotect, uint8_t old, uint8_t new)<br>
 {<br>
-       chipaddr wrprotect = flash->virtual_registers + offset + 2;<br>
-       uint8_t old;<br>
-<br>
-       if (new_bits & ~REG2_MASK) {<br>
+       if (new & ~REG2_MASK) {<br>
                msg_cerr("Invalid locking change 0x%02x requested at 0x%0*" PRIxPTR "! "<br>
                         "Please report a bug at <a href="mailto:flashrom@flashrom.org">flashrom@flashrom.org</a>\n",<br>
-                        new_bits, PRIxPTR_WIDTH, offset);<br>
+                        new, PRIxPTR_WIDTH, wrprotect);<br>
                return -1;<br>
        }<br>
-       old = chip_readb(flash, wrprotect);<br>
        /* Early exist if no change (of read/write/lockdown) was requested. */<br>
-       if (((old ^ new_bits) & REG2_MASK) == 0) {<br>
-               msg_cdbg2("Locking status at 0x%0*" PRIxPTR " not changed\n", PRIxPTR_WIDTH, offset);<br>
+       if (((old ^ new) & REG2_MASK) == 0) {<br>
+               msg_cdbg2("Locking status at 0x%0*" PRIxPTR " not changed\n", PRIxPTR_WIDTH, wrprotect);<br>
                return 0;<br>
        }<br>
        /* Normally lockdowns can not be cleared. Try nevertheless if requested. */<br>
-       if ((old & REG2_LOCKDOWN) && !(new_bits & REG2_LOCKDOWN)) {<br>
+       if ((old & REG2_LOCKDOWN) && !(new & REG2_LOCKDOWN)) {<br>
                chip_writeb(flash, old & ~REG2_LOCKDOWN, wrprotect);<br>
                if (chip_readb(flash, wrprotect) != (old & ~REG2_LOCKDOWN)) {<br>
-                       msg_cerr("Lockdown can't be removed at 0x%0*" PRIxPTR "!\n", PRIxPTR_WIDTH, offset);<br>
+                       msg_cerr("Lockdown can't be removed at 0x%0*" PRIxPTR "!\n", PRIxPTR_WIDTH, wrprotect);<br>
                        return -1;<br>
                }<br>
        }<br>
        /* Change read or write lock? */<br>
-       if ((old ^ new_bits) & REG2_RWLOCK) {<br>
+       if ((old ^ new) & REG2_RWLOCK) {<br>
                /* Do not lockdown yet. */<br>
-               msg_cdbg("Changing locking status at 0x%0*" PRIxPTR " to 0x%02x\n", PRIxPTR_WIDTH, offset, new_bits & REG2_RWLOCK);<br>
-               chip_writeb(flash, new_bits & REG2_RWLOCK, wrprotect);<br>
-               if (chip_readb(flash, wrprotect) != (new_bits & REG2_RWLOCK)) {<br>
-                       msg_cerr("Locking status change FAILED at 0x%0*" PRIxPTR "!\n", PRIxPTR_WIDTH, offset);<br>
+               msg_cdbg("Changing locking status at 0x%0*" PRIxPTR " to 0x%02x\n", PRIxPTR_WIDTH, wrprotect, new & REG2_RWLOCK);<br>
+               chip_writeb(flash, new & REG2_RWLOCK, wrprotect);<br>
+               if (chip_readb(flash, wrprotect) != (new & REG2_RWLOCK)) {<br>
+                       msg_cerr("Locking status change FAILED at 0x%0*" PRIxPTR "!\n", PRIxPTR_WIDTH, wrprotect);<br>
                        return -1;<br>
                }<br>
        }<br>
        /* Enable lockdown if requested. */<br>
-       if (!(old & REG2_LOCKDOWN) && (new_bits & REG2_LOCKDOWN)) {<br>
-               msg_cdbg("Enabling lockdown at 0x%0*" PRIxPTR "\n", PRIxPTR_WIDTH, offset);<br>
-               chip_writeb(flash, new_bits, wrprotect);<br>
-               if (chip_readb(flash, wrprotect) != new_bits) {<br>
-                       msg_cerr("Enabling lockdown FAILED at 0x%0*" PRIxPTR "!\n", PRIxPTR_WIDTH, offset);<br>
+       if (!(old & REG2_LOCKDOWN) && (new & REG2_LOCKDOWN)) {<br>
+               msg_cdbg("Enabling lockdown at 0x%0*" PRIxPTR "\n", PRIxPTR_WIDTH, wrprotect);<br>
+               chip_writeb(flash, new, wrprotect);<br>
+               if (chip_readb(flash, wrprotect) != new) {<br>
+                       msg_cerr("Enabling lockdown FAILED at 0x%0*" PRIxPTR "!\n", PRIxPTR_WIDTH, wrprotect);<br>
                        return -1;<br>
                }<br>
        }<br>
@@ -704,19 +699,18 @@ static int changelock_regspace2_block(const struct flashctx *flash, chipaddr off<br>
        return 0;<br>
 }<br>
<br>
-int unlock_regspace2_block(const struct flashctx *flash, chipaddr off)<br>
+static int unlock_regspace2_block_generic(const struct flashctx *flash, chipaddr wrprotect)<br>
 {<br>
-       chipaddr wrprotect = flash->virtual_registers + off + 2;<br>
        uint8_t old = chip_readb(flash, wrprotect);<br>
        /* We don't care for the lockdown bit as long as the RW locks are 0 after we're done */<br>
-       return changelock_regspace2_block(flash, off, old & ~REG2_RWLOCK);<br>
+       return changelock_regspace2_block(flash, wrprotect, old, old & ~REG2_RWLOCK);<br>
 }<br>
<br>
 static int unlock_regspace2_uniform(struct flashctx *flash, unsigned long block_size)<br>
 {<br>
        const unsigned int elems = flash->chip->total_size * 1024 / block_size;<br>
        struct unlockblock blocks[2] = {{.size = block_size, .count = elems}};<br>
-       return regspace2_walk_unlockblocks(flash, blocks, &unlock_regspace2_block);<br>
+       return regspace2_walk_unlockblocks(flash, blocks, &unlock_regspace2_block_generic);<br>
 }<br>
<br>
 int unlock_regspace2_uniform_64k(struct flashctx *flash)<br>
@@ -734,7 +728,7 @@ int unlock_regspace2_block_eraser_0(struct flashctx *flash)<br>
        // FIXME: this depends on the eraseblocks not to be filled up completely (i.e. to be null-terminated).<br>
        const struct unlockblock *unlockblocks =<br>
                (const struct unlockblock *)flash->chip->block_erasers[0].eraseblocks;<br>
-       return regspace2_walk_unlockblocks(flash, unlockblocks, &unlock_regspace2_block);<br>
+       return regspace2_walk_unlockblocks(flash, unlockblocks, &unlock_regspace2_block_generic);<br>
 }<br>
<br>
 int unlock_regspace2_block_eraser_1(struct flashctx *flash)<br>
@@ -742,6 +736,6 @@ int unlock_regspace2_block_eraser_1(struct flashctx *flash)<br>
        // FIXME: this depends on the eraseblocks not to be filled up completely (i.e. to be null-terminated).<br>
        const struct unlockblock *unlockblocks =<br>
                (const struct unlockblock *)flash->chip->block_erasers[1].eraseblocks;<br>
-       return regspace2_walk_unlockblocks(flash, unlockblocks, &unlock_regspace2_block);<br>
+       return regspace2_walk_unlockblocks(flash, unlockblocks, &unlock_regspace2_block_generic);<br>
 }<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Kind regards, Stefan Tauner<br>
<br>
</font></span></blockquote></div><br></div>