VirtualBox

Changeset 108560 in vbox


Ignore:
Timestamp:
Mar 14, 2025 11:57:02 AM (5 weeks ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
167959
Message:

Main/SystemTableBuilder.cpp: Expose GPIO shutdown/suspend buttons to the guest using ACPI, make the second method work with newer Linux guests, bugref:10732

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-client/SystemTableBuilder.cpp

    r108558 r108560  
    12161216    AssertRCReturn(vrc, vrc);
    12171217
    1218 #if 1 /* Works fine with Linux, doesn't with Windows (talk about "standards"). */
     1218#if 0 /* Works fine with Linux (also older ones), doesn't with Windows (talk about "standards"). */
    12191219    /* Construct the _AEI containing the GPIO configuration. */
    12201220    RTAcpiTblNameAppend(m_hAcpiDsdt, "_AEI");
     
    12731273
    12741274    return RTAcpiTblDeviceFinalize(m_hAcpiDsdt);
    1275 #else /* Doesn't work currently, neither Linux nor Windows... */
     1275#else /* Works on new Linux guests but not Windows so far... */
    12761276    /* Use the approach from https://learn.microsoft.com/en-us/windows-hardware/drivers/hid/acpi-button-device . */
     1277
     1278        /* Device specific method. */
     1279        RTAcpiTblMethodStart(m_hAcpiDsdt, "_DSM", 4, RTACPI_METHOD_F_SERIALIZED, 0 /*uSyncLvl*/);
     1280
     1281        RTAcpiTblIfStart(m_hAcpiDsdt);
     1282
     1283        /* Predicate (LEqual(Arg0, ToUUID("4f248f40-d5e2-499f-834c-27758ea1cd3f")))*/
     1284        RTAcpiTblBinaryOpAppend(m_hAcpiDsdt, kAcpiBinaryOp_LEqual);
     1285        RTAcpiTblArgOpAppend(m_hAcpiDsdt, 0);
     1286        RTAcpiTblUuidAppendFromStr(m_hAcpiDsdt, "4f248f40-d5e2-499f-834c-27758ea1cd3f");
     1287
     1288            /* Standard _DSM query function. */
     1289            RTAcpiTblIfStart(m_hAcpiDsdt);
     1290
     1291                /* LEqual(Arg2, Zero). */
     1292                RTAcpiTblBinaryOpAppend(m_hAcpiDsdt, kAcpiBinaryOp_LEqual);
     1293                RTAcpiTblArgOpAppend(m_hAcpiDsdt, 2);
     1294                RTAcpiTblIntegerAppend(m_hAcpiDsdt, 0);
     1295
     1296                RTAcpiTblStmtSimpleAppend(m_hAcpiDsdt, kAcpiStmt_Return);
     1297                uint8_t bBuf = 0x03;
     1298                RTAcpiTblBufferAppend(m_hAcpiDsdt, &bBuf, sizeof(bBuf));
     1299
     1300            RTAcpiTblIfFinalize(m_hAcpiDsdt);
     1301
     1302            /* Mark the pin for the power button as ActiveHigh. */
     1303            RTAcpiTblIfStart(m_hAcpiDsdt);
     1304
     1305                /* LEqual(Arg2, One). */
     1306                RTAcpiTblBinaryOpAppend(m_hAcpiDsdt, kAcpiBinaryOp_LEqual);
     1307                RTAcpiTblArgOpAppend(m_hAcpiDsdt, 2);
     1308                RTAcpiTblIntegerAppend(m_hAcpiDsdt, 1);
     1309
     1310                RTAcpiTblStmtSimpleAppend(m_hAcpiDsdt, kAcpiStmt_Return);
     1311                RTAcpiTblPackageStart(m_hAcpiDsdt, 2 /*cElements*/);
     1312                    RTAcpiTblIntegerAppend(m_hAcpiDsdt, u16PinShutdown);
     1313                    RTAcpiTblIntegerAppend(m_hAcpiDsdt, u16PinSuspend);
     1314                RTAcpiTblPackageFinalize(m_hAcpiDsdt);
     1315
     1316            RTAcpiTblIfFinalize(m_hAcpiDsdt);
     1317
     1318            /* Return Unknown function. */
     1319            uint8_t bUnkFunc = 0x00;
     1320            RTAcpiTblStmtSimpleAppend(m_hAcpiDsdt, kAcpiStmt_Return);
     1321            RTAcpiTblBufferAppend(m_hAcpiDsdt, &bUnkFunc, sizeof(bUnkFunc));
     1322
     1323        RTAcpiTblIfFinalize(m_hAcpiDsdt);
     1324
     1325        /* Return Unknown function. */
     1326        bUnkFunc = 0x00;
     1327        RTAcpiTblStmtSimpleAppend(m_hAcpiDsdt, kAcpiStmt_Return);
     1328        RTAcpiTblBufferAppend(m_hAcpiDsdt, &bUnkFunc, sizeof(bUnkFunc));
     1329
     1330        RTAcpiTblMethodFinalize(m_hAcpiDsdt);
     1331
    12771332    RTAcpiTblDeviceFinalize(m_hAcpiDsdt); /* Finish the GPI0 GPIO device. */
    12781333
     
    12841339    RTAcpiTblNameAppend(m_hAcpiDsdt, "_UID");
    12851340    RTAcpiTblIntegerAppend(m_hAcpiDsdt, 0);
     1341
     1342    RTAcpiTblMethodStart(m_hAcpiDsdt, "_STA", 0, RTACPI_METHOD_F_NOT_SERIALIZED, 0 /*uSyncLvl*/);
     1343    RTAcpiTblStmtSimpleAppend(m_hAcpiDsdt, kAcpiStmt_Return);
     1344    RTAcpiTblIntegerAppend(m_hAcpiDsdt, 0x0f);
     1345    RTAcpiTblMethodFinalize(m_hAcpiDsdt);
    12861346
    12871347    /* Build the resource template. */
    12881348    RTAcpiTblNameAppend(m_hAcpiDsdt, "_CRS");
    12891349    RTAcpiResourceReset(m_hAcpiRes);
    1290     vrc = RTAcpiResourceAddGpioInt(m_hAcpiRes, kAcpiResGpioMod_Level, kAcpiResGpioPol_ActiveBoth, kAcpiResGpioShr_Exclusive,
    1291                                    kAcpiResGpioPpi_PullDown, 0 /*u16DebounceWait*/, "GPI0",
     1350    vrc = RTAcpiResourceAddGpioInt(m_hAcpiRes, kAcpiResGpioMod_Edge, kAcpiResGpioPol_ActiveBoth, kAcpiResGpioShr_Exclusive,
     1351                                   kAcpiResGpioPpi_PullDown, 0 /*u16DebounceWait*/, "\\_SB.GPI0",
    12921352                                   &u16PinShutdown, 1 /* cPins */);
    12931353    if (RT_SUCCESS(vrc))
    1294         vrc = RTAcpiResourceAddGpioInt(m_hAcpiRes, kAcpiResGpioMod_Level, kAcpiResGpioPol_ActiveBoth, kAcpiResGpioShr_Exclusive,
    1295                                        kAcpiResGpioPpi_PullDown, 0 /*u16DebounceWait*/, "GPI0",
     1354        vrc = RTAcpiResourceAddGpioInt(m_hAcpiRes, kAcpiResGpioMod_Edge, kAcpiResGpioPol_ActiveBoth, kAcpiResGpioShr_Exclusive,
     1355                                       kAcpiResGpioPpi_PullDown, 0 /*u16DebounceWait*/, "\\_SB.GPI0",
    12961356                                       &u16PinSuspend, 1 /* cPins */);
    12971357    if (RT_SUCCESS(vrc))
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette