[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 26/32] smbus: Fix spd_data_generate() error API violation
From: |
Markus Armbruster |
Subject: |
[PULL 26/32] smbus: Fix spd_data_generate() error API violation |
Date: |
Wed, 29 Apr 2020 09:20:42 +0200 |
The Error ** argument must be NULL, &error_abort, &error_fatal, or a
pointer to a variable containing NULL. Passing an argument of the
latter kind twice without clearing it in between is wrong: if the
first call sets an error, it no longer points to NULL for the second
call.
spd_data_generate() can pass @errp to error_setg() more than once when
it adjusts both memory size and type. Harmless, because no caller
passes anything that needs adjusting. Until the previous commit,
sam460ex passed types that needed adjusting, but not sizes.
spd_data_generate()'s contract is rather awkward:
If everything's fine, return non-null and don't set an error.
Else, if memory size or type need adjusting, return non-null and
set an error describing the adjustment.
Else, return null and set an error reporting why no data can be
generated.
Its callers treat the error as a warning even when null is returned.
They don't create the "smbus-eeprom" device then. Suspicious.
Since the previous commit, only "everything's fine" can actually
happen. Drop the unused code and simplify the callers. This gets rid
of the error API violation.
Signed-off-by: Markus Armbruster <address@hidden>
Message-Id: <address@hidden>
---
include/hw/i2c/smbus_eeprom.h | 2 +-
hw/i2c/smbus_eeprom.c | 30 ++++--------------------------
hw/mips/mips_fulong2e.c | 10 ++--------
hw/ppc/sam460ex.c | 12 +++---------
4 files changed, 10 insertions(+), 44 deletions(-)
diff --git a/include/hw/i2c/smbus_eeprom.h b/include/hw/i2c/smbus_eeprom.h
index 15e2151b50..68b0063ab6 100644
--- a/include/hw/i2c/smbus_eeprom.h
+++ b/include/hw/i2c/smbus_eeprom.h
@@ -31,6 +31,6 @@ void smbus_eeprom_init(I2CBus *bus, int nb_eeprom,
const uint8_t *eeprom_spd, int size);
enum sdram_type { SDR = 0x4, DDR = 0x7, DDR2 = 0x8 };
-uint8_t *spd_data_generate(enum sdram_type type, ram_addr_t size, Error
**errp);
+uint8_t *spd_data_generate(enum sdram_type type, ram_addr_t size);
#endif
diff --git a/hw/i2c/smbus_eeprom.c b/hw/i2c/smbus_eeprom.c
index 5adf3b15b5..07fbbf87f1 100644
--- a/hw/i2c/smbus_eeprom.c
+++ b/hw/i2c/smbus_eeprom.c
@@ -195,8 +195,7 @@ void smbus_eeprom_init(I2CBus *smbus, int nb_eeprom,
}
/* Generate SDRAM SPD EEPROM data describing a module of type and size */
-uint8_t *spd_data_generate(enum sdram_type type, ram_addr_t ram_size,
- Error **errp)
+uint8_t *spd_data_generate(enum sdram_type type, ram_addr_t ram_size)
{
uint8_t *spd;
uint8_t nbanks;
@@ -222,29 +221,10 @@ uint8_t *spd_data_generate(enum sdram_type type,
ram_addr_t ram_size,
g_assert_not_reached();
}
size = ram_size >> 20; /* work in terms of megabytes */
- if (size < 4) {
- error_setg(errp, "SDRAM size is too small");
- return NULL;
- }
sz_log2 = 31 - clz32(size);
size = 1U << sz_log2;
- if (ram_size > size * MiB) {
- error_setg(errp, "SDRAM size 0x"RAM_ADDR_FMT" is not a power of 2, "
- "truncating to %u MB", ram_size, size);
- }
- if (sz_log2 < min_log2) {
- error_setg(errp,
- "Memory size is too small for SDRAM type, adjusting type");
- if (size >= 32) {
- type = DDR;
- min_log2 = 5;
- max_log2 = 12;
- } else {
- type = SDR;
- min_log2 = 2;
- max_log2 = 9;
- }
- }
+ assert(ram_size == size * MiB);
+ assert(sz_log2 >= min_log2);
nbanks = 1;
while (sz_log2 > max_log2 && nbanks < 8) {
@@ -252,9 +232,7 @@ uint8_t *spd_data_generate(enum sdram_type type, ram_addr_t
ram_size,
nbanks++;
}
- if (size > (1ULL << sz_log2) * nbanks) {
- error_setg(errp, "Memory size is too big for SDRAM, truncating");
- }
+ assert(size == (1ULL << sz_log2) * nbanks);
/* split to 2 banks if possible to avoid a bug in MIPS Malta firmware */
if (nbanks == 1 && sz_log2 > min_log2) {
diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
index 5040afd581..ef02d54b33 100644
--- a/hw/mips/mips_fulong2e.c
+++ b/hw/mips/mips_fulong2e.c
@@ -297,7 +297,6 @@ static void mips_fulong2e_init(MachineState *machine)
MemoryRegion *bios = g_new(MemoryRegion, 1);
long bios_size;
uint8_t *spd_data;
- Error *err = NULL;
int64_t kernel_entry;
PCIBus *pci_bus;
ISABus *isa_bus;
@@ -377,13 +376,8 @@ static void mips_fulong2e_init(MachineState *machine)
}
/* Populate SPD eeprom data */
- spd_data = spd_data_generate(DDR, machine->ram_size, &err);
- if (err) {
- warn_report_err(err);
- }
- if (spd_data) {
- smbus_eeprom_init_one(smbus, 0x50, spd_data);
- }
+ spd_data = spd_data_generate(DDR, machine->ram_size);
+ smbus_eeprom_init_one(smbus, 0x50, spd_data);
mc146818_rtc_init(isa_bus, 2000, NULL);
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 1e3eaac0db..42a8c9fb7f 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -292,7 +292,6 @@ static void sam460ex_init(MachineState *machine)
SysBusDevice *sbdev;
struct boot_info *boot_info;
uint8_t *spd_data;
- Error *err = NULL;
int success;
cpu = POWERPC_CPU(cpu_create(machine->cpu_type));
@@ -336,14 +335,9 @@ static void sam460ex_init(MachineState *machine)
i2c = PPC4xx_I2C(dev)->bus;
/* SPD EEPROM on RAM module */
spd_data = spd_data_generate(ram_sizes[0] < 128 * MiB ? DDR : DDR2,
- ram_sizes[0], &err);
- if (err) {
- warn_report_err(err);
- }
- if (spd_data) {
- spd_data[20] = 4; /* SO-DIMM module */
- smbus_eeprom_init_one(i2c, 0x50, spd_data);
- }
+ ram_sizes[0]);
+ spd_data[20] = 4; /* SO-DIMM module */
+ smbus_eeprom_init_one(i2c, 0x50, spd_data);
/* RTC */
i2c_create_slave(i2c, "m41t80", 0x68);
--
2.21.1
- [PULL 19/32] xen/pt: Fix flawed conversion to realize(), (continued)
- [PULL 19/32] xen/pt: Fix flawed conversion to realize(), Markus Armbruster, 2020/04/29
- [PULL 32/32] qemu-option: pass NULL rather than 0 to the id of qemu_opts_set(), Markus Armbruster, 2020/04/29
- [PULL 08/32] qemu-img: Factor out accumulate_options() helper, Markus Armbruster, 2020/04/29
- [PULL 24/32] qga: Fix qmp_guest_suspend_{disk, ram}() error handling, Markus Armbruster, 2020/04/29
- [PULL 25/32] sam460ex: Suppress useless warning on -m 32 and -m 64, Markus Armbruster, 2020/04/29
- [PULL 27/32] bamboo, sam460ex: Tidy up error message for unsupported RAM size, Markus Armbruster, 2020/04/29
- [PULL 16/32] fdc: Fix fallback=auto error handling, Markus Armbruster, 2020/04/29
- [PULL 28/32] smbus: Fix spd_data_generate() for number of banks > 2, Markus Armbruster, 2020/04/29
- [PULL 11/32] cryptodev: Fix cryptodev_builtin_cleanup() error API violation, Markus Armbruster, 2020/04/29
- [PULL 01/32] various: Remove suspicious '\' character outside of #define in C code, Markus Armbruster, 2020/04/29
- [PULL 26/32] smbus: Fix spd_data_generate() error API violation,
Markus Armbruster <=
- [PULL 17/32] bochs-display: Fix vgamem=SIZE error handling, Markus Armbruster, 2020/04/29
- [PULL 23/32] qga: Fix qmp_guest_get_memory_blocks() error handling, Markus Armbruster, 2020/04/29
- [PULL 30/32] fuzz: Simplify how we compute available machines and types, Markus Armbruster, 2020/04/29
- [PULL 15/32] arm/virt: Fix virt_machine_device_plug_cb() error API violation, Markus Armbruster, 2020/04/29
- [PULL 29/32] Makefile: Drop unused, broken target recurse-fuzz, Markus Armbruster, 2020/04/29
- [PULL 21/32] migration/colo: Fix qmp_xen_colo_do_checkpoint() error handling, Markus Armbruster, 2020/04/29
- [PULL 13/32] cpus: Fix configure_icount() error API violation, Markus Armbruster, 2020/04/29
- [PULL 12/32] block/file-posix: Fix check_cache_dropped() error handling, Markus Armbruster, 2020/04/29
- [PULL 14/32] cpus: Proper range-checking for -icount shift=N, Markus Armbruster, 2020/04/29