提交 6682bc1e 编写于 作者: S Stephen Checkoway 提交者: Philippe Mathieu-Daudé

hw/block/pflash_cfi02: Fix command address comparison

Most AMD commands only examine 11 bits of the address. This masks the
addresses used in the comparison to 11 bits. The exceptions are word or
sector addresses which use offset directly rather than the shifted
offset, boff.
Signed-off-by: NStephen Checkoway <stephen.checkoway@oberlin.edu>
Message-Id: <20190426162624.55977-4-stephen.checkoway@oberlin.edu>
Acked-by: NThomas Huth <thuth@redhat.com>
Acked-by: NAlistair Francis <alistair.francis@wdc.com>
Acked-by: NPhilippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: NPhilippe Mathieu-Daudé <philmd@redhat.com>
上级 aff498cf
......@@ -281,11 +281,13 @@ static void pflash_write(void *opaque, hwaddr offset, uint64_t value,
}
offset &= pfl->chip_len - 1;
boff = offset & (pfl->sector_len - 1);
boff = offset;
if (pfl->width == 2)
boff = boff >> 1;
else if (pfl->width == 4)
boff = boff >> 2;
/* Only the least-significant 11 bits are used in most cases. */
boff &= 0x7FF;
switch (pfl->wcycle) {
case 0:
/* Set the device in I/O access mode if required */
......@@ -538,6 +540,10 @@ static void pflash_cfi02_realize(DeviceState *dev, Error **errp)
}
}
/* Only 11 bits are used in the comparison. */
pfl->unlock_addr0 &= 0x7FF;
pfl->unlock_addr1 &= 0x7FF;
pflash_setup_mappings(pfl);
pfl->rom_mode = 1;
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem);
......
......@@ -21,8 +21,8 @@
#define FLASH_WIDTH 2
#define CFI_ADDR (FLASH_WIDTH * 0x55)
#define UNLOCK0_ADDR (FLASH_WIDTH * 0x5555)
#define UNLOCK1_ADDR (FLASH_WIDTH * 0x2AAA)
#define UNLOCK0_ADDR (FLASH_WIDTH * 0x555)
#define UNLOCK1_ADDR (FLASH_WIDTH * 0x2AA)
#define CFI_CMD 0x98
#define UNLOCK0_CMD 0xAA
......@@ -190,6 +190,14 @@ static void test_flash(void)
g_assert_cmphex(flash_read(6), ==, 0xCDEF);
g_assert_cmphex(flash_read(8), ==, 0xFFFF);
/* Test ignored high order bits of address. */
flash_write(FLASH_WIDTH * 0x5555, UNLOCK0_CMD);
flash_write(FLASH_WIDTH * 0x2AAA, UNLOCK1_CMD);
flash_write(FLASH_WIDTH * 0x5555, AUTOSELECT_CMD);
g_assert_cmpint(flash_read(FLASH_WIDTH * 0x0000), ==, 0x00BF);
g_assert_cmpint(flash_read(FLASH_WIDTH * 0x0001), ==, 0x236D);
reset();
qtest_quit(global_qtest);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册