Failed to run BIOS UEFI service StartupAllAPs()
We invoked an UEFI service (MP_SERVICE) to bring up the multicore (APs) and found that the EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() failed to execute in Non-Blocking mode. We followed the “PI Spec(1.6) Vol2. Chapter 13.4 MP Services Protocol” to startup our APs in Non-Blocking mode. While on UP2 board, it failed to execute in Non-Blocking mode, BSP is always waiting for APs to complete their work (like a blocking mode instead). It seems a bug of the BIOS. The latest BIOS version also has the issue.
Comments
-
Hi @swei ,
Could you kindly help to provide details for duplication?
Did you use the build in UEFI Shell on UP2?Thank you.
-
I prepare a image to reproduce the issue.
Step:
1) unzip BOOT.zip to a USB disk.
2) run command in Build-in EFI Shellfs1:
cd BOOT
boot.efiExpected Result:
API startup_all_aps() should return immediately, because it is using Non-Blocking mode.Actual Result:
It blocked in API startup_all_aps()Reference code:
printf("EVMM: call before startup_all_aps()"); /* Signal APs to startup */ ret = mp->startup_all_aps(mp, ap_start, FALSE, empty_event, 0, NULL, NULL); printf("EVMM: call after startup_all_aps() ret = %d", ret); if (ret != EFI_SUCCESS) { return 0; }
The last log form serial port is "EVMM: call before startup_all_aps()"
Could you help to have a look, why it blocks in API startup_all_aps()?
Thank you.
-
I still meet this issue on my broad. Is it possible to reproduce the issue on your side ?
-
I will prepare a uefi binary to reproduce the issue.
-
I will prepare a uefi binary to reproduce the issue.
-
I will prepare a uefi binary to reproduce the issue.
-
I prepare a image to reproduce the issue.
Step:
1) unzip BOOT.zip to a USB disk.
2) run command in Build-in EFI Shellfs1:
cd BOOT
boot.efiExpected Result:
API startup_all_aps() should return immediately, because it is using Non-Blocking mode.Actual Result:
It blocked in API startup_all_aps()Reference code:
printf("EVMM: call before startup_all_aps()");
/* Signal APs to startup */
ret = mp->startup_all_aps(mp, ap_start, FALSE, empty_event, 0, NULL, NULL);
printf("EVMM: call after startup_all_aps() ret = %d", ret);
if (ret != EFI_SUCCESS) {
return 0;
}
The last log form serial port is "EVMM: call before startup_all_aps()"Could you help to have a look, why it blocks in API startup_all_aps()?
Thank you.
-
I prepare a image to reproduce the issue.
Step:
1) unzip BOOT.zip to a USB disk.
2) run command in Build-in EFI Shellfs1:
cd BOOT
boot.efiExpected Result:
API startup_all_aps() should return immediately, because it is using Non-Blocking mode.Actual Result:
It blocked in API startup_all_aps()Reference code:
printf("EVMM: call before startup_all_aps()");
/* Signal APs to startup */
ret = mp->startup_all_aps(mp, ap_start, FALSE, empty_event, 0, NULL, NULL);
printf("EVMM: call after startup_all_aps() ret = %d", ret);
if (ret != EFI_SUCCESS) {
return 0;
}
The last log form serial port is "EVMM: call before startup_all_aps()"Could you help to have a look, why it blocks in API startup_all_aps()?
Thank you.
-
I prepare a image to reproduce the issue.
Step:
1) unzip BOOT.zip to a USB disk.
2) run command in Build-in EFI Shellfs1:
cd BOOT
boot.efiExpected Result:
API startup_all_aps() should return immediately, because it is using Non-Blocking mode.Actual Result:
It blocked in API startup_all_aps()Reference code:
printf("EVMM: call before startup_all_aps()"); /* Signal APs to startup */ ret = mp->startup_all_aps(mp, ap_start, FALSE, empty_event, 0, NULL, NULL); printf("EVMM: call after startup_all_aps() ret = %d", ret); if (ret != EFI_SUCCESS) { return 0; }
The last log form serial port is "EVMM: call before startup_all_aps()"
Could you help to have a look, why it blocks in API startup_all_aps()?
Thank you.
-
I prepare a image to reproduce the issue.
Step:
1) unzip BOOT.zip to a USB disk.
2) run command in Build-in EFI Shellfs1:
cd BOOT
boot.efiExpected Result:
API startup_all_aps() should return immediately, because it is using Non-Blocking mode.Actual Result:
It blocked in API startup_all_aps()Reference code:
printf("EVMM: call before startup_all_aps()"); /* Signal APs to startup */ ret = mp->startup_all_aps(mp, ap_start, FALSE, empty_event, 0, NULL, NULL); printf("EVMM: call after startup_all_aps() ret = %d", ret); if (ret != EFI_SUCCESS) { return 0; }
The last log form serial port is "EVMM: call before startup_all_aps()"
Could you help to have a look, why it blocks in API startup_all_aps()?
Thank you.