At this moment any migration with the RISC-V sifive_u machine
fails with the following error:
qemu-system-riscv64: ../hw/sd/sd.c:297: sd_ocr_powerup: Assertion
`!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP)' failed.
The assert was introduced by dd26eb43337a ("hw/sd: model a power-up
delay, as a workaround for an EDK2 bug"). It introduced a delayed timer
of 0.5ms to power up the card after the first ACMD41 command. The assert
prevents the card from being turned on twice.
When migrating a machine that uses a sd card, e.g. RISC-V sifive_u, the
card is turned on during machine_init() in both source and destination
hosts. When the migration stream finishes in the destination, the
pre_load() hook will attempt to turn on the card before loading its
vmstate. The assert() is always going to hit because the card was
already on.
Change sd_vmstate_pre_load() to check first if the sd card is turned on
before executing a sd_ocr_powerup() and triggering the assert.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
---
hw/sd/sd.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index bd88c1a8f0..4add719643 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -664,11 +664,19 @@ static int sd_vmstate_pre_load(void *opaque)
{
SDState *sd = opaque;
- /* If the OCR state is not included (prior versions, or not
+ /*
+ * If the OCR state is not included (prior versions, or not
* needed), then the OCR must be set as powered up. If the OCR state
* is included, this will be replaced by the state restore.
+ *
+ * However, there's a chance that the board will powerup the SD
+ * before reaching INMIGRATE state in the destination host.
+ * Powering up the SD again in this case will cause an assert
+ * inside sd_ocr_powerup(). Skip sd_ocr_powerup() in this case.
*/
- sd_ocr_powerup(sd);
+ if (!sd_card_powered_up(sd)) {
+ sd_ocr_powerup(sd);
+ }
return 0;
}
--
2.39.0
+David / Juan / Peter for migration and timers.
On 20/1/23 13:01, Daniel Henrique Barboza wrote:
> At this moment any migration with the RISC-V sifive_u machine
> fails with the following error:
>
> qemu-system-riscv64: ../hw/sd/sd.c:297: sd_ocr_powerup: Assertion
> `!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP)' failed.
>
> The assert was introduced by dd26eb43337a ("hw/sd: model a power-up
> delay, as a workaround for an EDK2 bug"). It introduced a delayed timer
> of 0.5ms to power up the card after the first ACMD41 command. The assert
> prevents the card from being turned on twice.
>
> When migrating a machine that uses a sd card, e.g. RISC-V sifive_u, the
> card is turned on during machine_init() in both source and destination
> hosts. When the migration stream finishes in the destination, the
> pre_load() hook will attempt to turn on the card before loading its
> vmstate. The assert() is always going to hit because the card was
> already on.
>
> Change sd_vmstate_pre_load() to check first if the sd card is turned on
> before executing a sd_ocr_powerup() and triggering the assert.
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> ---
> hw/sd/sd.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index bd88c1a8f0..4add719643 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -664,11 +664,19 @@ static int sd_vmstate_pre_load(void *opaque)
> {
> SDState *sd = opaque;
>
> - /* If the OCR state is not included (prior versions, or not
> + /*
> + * If the OCR state is not included (prior versions, or not
> * needed), then the OCR must be set as powered up. If the OCR state
> * is included, this will be replaced by the state restore.
> + *
> + * However, there's a chance that the board will powerup the SD
> + * before reaching INMIGRATE state in the destination host.
> + * Powering up the SD again in this case will cause an assert
> + * inside sd_ocr_powerup(). Skip sd_ocr_powerup() in this case.
> */
> - sd_ocr_powerup(sd);
> + if (!sd_card_powered_up(sd)) {
> + sd_ocr_powerup(sd);
> + }
>
> return 0;
> }
Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
> +David / Juan / Peter for migration and timers.
>
> On 20/1/23 13:01, Daniel Henrique Barboza wrote:
>> At this moment any migration with the RISC-V sifive_u machine
>> fails with the following error:
>> qemu-system-riscv64: ../hw/sd/sd.c:297: sd_ocr_powerup: Assertion
>> `!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP)' failed.
>> The assert was introduced by dd26eb43337a ("hw/sd: model a power-up
>> delay, as a workaround for an EDK2 bug"). It introduced a delayed timer
>> of 0.5ms to power up the card after the first ACMD41 command. The assert
>> prevents the card from being turned on twice.
>> When migrating a machine that uses a sd card, e.g. RISC-V sifive_u,
>> the
>> card is turned on during machine_init() in both source and destination
>> hosts. When the migration stream finishes in the destination, the
>> pre_load() hook will attempt to turn on the card before loading its
>> vmstate. The assert() is always going to hit because the card was
>> already on.
>> Change sd_vmstate_pre_load() to check first if the sd card is turned
>> on
>> before executing a sd_ocr_powerup() and triggering the assert.
>> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
I have no idea about sd or orc O:-)
>> ---
>> hw/sd/sd.c | 12 ++++++++++--
>> 1 file changed, 10 insertions(+), 2 deletions(-)
>> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
>> index bd88c1a8f0..4add719643 100644
>> --- a/hw/sd/sd.c
>> +++ b/hw/sd/sd.c
>> @@ -664,11 +664,19 @@ static int sd_vmstate_pre_load(void *opaque)
>> {
>> SDState *sd = opaque;
>> - /* If the OCR state is not included (prior versions, or not
>> + /*
>> + * If the OCR state is not included (prior versions, or not
>> * needed), then the OCR must be set as powered up. If the OCR state
>> * is included, this will be replaced by the state restore.
>> + *
>> + * However, there's a chance that the board will powerup the SD
>> + * before reaching INMIGRATE state in the destination host.
>> + * Powering up the SD again in this case will cause an assert
>> + * inside sd_ocr_powerup(). Skip sd_ocr_powerup() in this case.
>> */
>> - sd_ocr_powerup(sd);
>> + if (!sd_card_powered_up(sd)) {
>> + sd_ocr_powerup(sd);
>> + }
>> return 0;
>> }
But I agree with David.
You probably should not powerup the machine on the destination host.
But I don't know if that function touches any state of other devices or
if it don't matter at all.
* Philippe Mathieu-Daudé (philmd@linaro.org) wrote:
> +David / Juan / Peter for migration and timers.
>
> On 20/1/23 13:01, Daniel Henrique Barboza wrote:
> > At this moment any migration with the RISC-V sifive_u machine
> > fails with the following error:
> >
> > qemu-system-riscv64: ../hw/sd/sd.c:297: sd_ocr_powerup: Assertion
> > `!FIELD_EX32(sd->ocr, OCR, CARD_POWER_UP)' failed.
> >
> > The assert was introduced by dd26eb43337a ("hw/sd: model a power-up
> > delay, as a workaround for an EDK2 bug"). It introduced a delayed timer
> > of 0.5ms to power up the card after the first ACMD41 command. The assert
> > prevents the card from being turned on twice.
> >
> > When migrating a machine that uses a sd card, e.g. RISC-V sifive_u, the
> > card is turned on during machine_init() in both source and destination
> > hosts.
If that's a problem, then why don't you make that machine_init code
check whether we're INMIGRATE, and skip the power on?
> When the migration stream finishes in the destination, the
> > pre_load() hook will attempt to turn on the card before loading its
> > vmstate. The assert() is always going to hit because the card was
> > already on.
> >
> > Change sd_vmstate_pre_load() to check first if the sd card is turned on
> > before executing a sd_ocr_powerup() and triggering the assert.
Again, not knowing this device, but the other thought is a Post_load
that determines if the OCR state hasn't been loaded, and then turns it
on.
Dave
> > Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> > ---
> > hw/sd/sd.c | 12 ++++++++++--
> > 1 file changed, 10 insertions(+), 2 deletions(-)
> >
> > diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> > index bd88c1a8f0..4add719643 100644
> > --- a/hw/sd/sd.c
> > +++ b/hw/sd/sd.c
> > @@ -664,11 +664,19 @@ static int sd_vmstate_pre_load(void *opaque)
> > {
> > SDState *sd = opaque;
> > - /* If the OCR state is not included (prior versions, or not
> > + /*
> > + * If the OCR state is not included (prior versions, or not
> > * needed), then the OCR must be set as powered up. If the OCR state
> > * is included, this will be replaced by the state restore.
> > + *
> > + * However, there's a chance that the board will powerup the SD
> > + * before reaching INMIGRATE state in the destination host.
> > + * Powering up the SD again in this case will cause an assert
> > + * inside sd_ocr_powerup(). Skip sd_ocr_powerup() in this case.
> > */
> > - sd_ocr_powerup(sd);
> > + if (!sd_card_powered_up(sd)) {
> > + sd_ocr_powerup(sd);
> > + }
> > return 0;
> > }
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
© 2016 - 2026 Red Hat, Inc.