Failed to run BIOS UEFI service StartupAllAPs()

Options
swei
swei New Member Posts: 10
edited August 2019 in UP Squared BIOS & FPGA

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

  • ApeiChen
    ApeiChen New Member, Moderator, AAEON Posts: 23 admin
    edited August 2019
    Options

    Hi @swei ,

    Could you kindly help to provide details for duplication?
    Did you use the build in UEFI Shell on UP2?

    Thank you.

  • swei
    swei New Member Posts: 10
    Options

    I prepare a image to reproduce the issue.
    Step:
    1) unzip BOOT.zip to a USB disk.
    2) run command in Build-in EFI Shell

    fs1:
    cd BOOT
    boot.efi

    Expected 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.

  • swei
    swei New Member Posts: 10
    Options

    I still meet this issue on my broad. Is it possible to reproduce the issue on your side ?

  • swei
    swei New Member Posts: 10
    Options

    I will prepare a uefi binary to reproduce the issue.

  • swei
    swei New Member Posts: 10
    Options

    I will prepare a uefi binary to reproduce the issue.

  • swei
    swei New Member Posts: 10
    Options

    I will prepare a uefi binary to reproduce the issue.

  • swei
    swei New Member Posts: 10
    Options

    I prepare a image to reproduce the issue.
    Step:
    1) unzip BOOT.zip to a USB disk.
    2) run command in Build-in EFI Shell

    fs1:
    cd BOOT
    boot.efi

    Expected 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.

  • swei
    swei New Member Posts: 10
    Options

    I prepare a image to reproduce the issue.
    Step:
    1) unzip BOOT.zip to a USB disk.
    2) run command in Build-in EFI Shell

    fs1:
    cd BOOT
    boot.efi

    Expected 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.

  • swei
    swei New Member Posts: 10
    Options

    I prepare a image to reproduce the issue.
    Step:
    1) unzip BOOT.zip to a USB disk.
    2) run command in Build-in EFI Shell

    fs1:
    cd BOOT
    boot.efi

    Expected 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.

  • swei
    swei New Member Posts: 10
    Options

    I prepare a image to reproduce the issue.
    Step:
    1) unzip BOOT.zip to a USB disk.
    2) run command in Build-in EFI Shell

    fs1:
    cd BOOT
    boot.efi

    Expected 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.