Jump to content

Compiling ACPI v2.0 driver for Windows XP SP3 and Windows 2003 SP2 (x32/x64)


Mov AX, 0xDEAD

Recommended Posts


@Damnation

Unmodded ssdt2.dsl has Processor definitions for 32 CPUs

Full acpi log example:

Quote

f6d4515f: Method(_STA,0x0)
f6d45175: }
f6d45175: }
f6d45175: Scope(_PR_)
f6d4517c: {
f6d4517c: Processor(PR00,0x1,0x1810,0x6)

OSNotifyCreateProcessor: Processor Object #1: 85129efc
851222B8 GenuineIntel - x86 Family 6 Model 167- 0 ACPIBuildProcessorExtension: = 00000000
OSNotifyCreate: 85129EFC (PR00) = 00000103

Short log example::

Quote

OSNotifyCreateProcessor: Processor Object #1: 97f1de74
97F6F3E0 GenuineIntel - x86 Family 6 Model 158- 0 ACPIBuildProcessorExtension: = 00000000
OSNotifyCreate: 97F1DE74 (PR00) = 00000103
OSNotifyCreateProcessor: Processor Object #2: 97f1deb8
97F6F260 GenuineIntel - x86 Family 6 Model 158- 1 ACPIBuildProcessorExtension: = 00000000
OSNotifyCreate: 97F1DEB8 (PR01) = 00000103
OSNotifyCreateProcessor: Processor Object #3: 97f1defc
97F6E008 GenuineIntel - x86 Family 6 Model 158- 2 ACPIBuildProcessorExtension: = 00000000
OSNotifyCreate: 97F1DEFC (PR02) = 00000103

CPU Name "GenuineIntel - x86 Family 6 Model 158"  generated by acpi.sys itself and reported to Windows to show this way at DevManager

Link to comment
Share on other sites

@Mov AX, 0xDEAD

They do show up in Device Manager with ACPI0007 for their HWIDs.

I did try brute forcing them to install in Device Manager by installing the cpu.inf driver, they install, they just get the name "Processor" and they can not be started. I could only get them to start after I did the table mod.

I know @daniel_k thinks I faked it but that's why they just had the name "Processor" in the earlier screenshot, it was because of the earlier brute force install attempt before I did the mod.

Link to comment
Share on other sites

OK,

classic declaration

Quote

    Scope (_SB)
    {
        Processor (PR00, 0x01, 0x00001810, 0x06) {}
        Processor (PR01, 0x02, 0x00001810, 0x06) {}
        Processor (PR02, 0x03, 0x00001810, 0x06) {}
        Processor (PR03, 0x04, 0x00001810, 0x06) {}
        Processor (PR04, 0x05, 0x00001810, 0x06) {}
        Processor (PR05, 0x06, 0x00001810, 0x06) {}
        Processor (PR06, 0x07, 0x00001810, 0x06) {}
        Processor (PR07, 0x08, 0x00001810, 0x06) {}
        Processor (PR08, 0x09, 0x00001810, 0x06) {}
        Processor (PR09, 0x0A, 0x00001810, 0x06) {}
        Processor (PR10, 0x0B, 0x00001810, 0x06) {}
        Processor (PR11, 0x0C, 0x00001810, 0x06) {}
        Processor (PR12, 0x0D, 0x00001810, 0x06) {}
        Processor (PR13, 0x0E, 0x00001810, 0x06) {}
        Processor (PR14, 0x0F, 0x00001810, 0x06) {}
        Processor (PR15, 0x10, 0x00001810, 0x06) {}
    }

    Scope (_SB.PR00)
    {
        Name (CPC2, Package (0x15)
        {
            0x15,
            0x02,
            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x08,               // Bit Width
                    0x00,               // Bit Offset
                    0x0000000000000771, // Address
                    0x04,               // Access Size
                    )
            },

AMD way:

Quote

 

    Scope (\_SB)
    {
        Device (PLTF)
        {
            Name (_HID, "ACPI0010" /* Processor Container Device */)  // _HID: Hardware ID
            Name (_CID, EisaId ("PNP0A05") /* Generic Container Device */)  // _CID: Compatible ID
            Name (_UID, One)  // _UID: Unique ID
            Device (C000)
            {
                Name (_HID, "ACPI0007" /* Processor Device */)  // _HID: Hardware ID
                Name (_UID, Zero)  // _UID: Unique ID
            }

            Device (C001)
            {
                Name (_HID, "ACPI0007" /* Processor Device */)  // _HID: Hardware ID
                Name (_UID, One)  // _UID: Unique ID
            }

  Scope (\_SB.PLTF.C000)
    {
        Name (_PCT, Package (0x02)  // _PCT: Performance Control
        {
            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x40,               // Bit Width
                    0x00,               // Bit Offset
                    0x00000000C0010062, // Address
                    ,)
            },

 

with XP acpi.sys "Processor" opcode never called, Processor() sets important thing - OBJTYPE_PROCESSOR

later, this type trigger to call OSNotifyCreateProcessor()

Quote

NTSTATUS LOCAL Processor(PCTXT pctxt, PTERM pterm)
{
    TRACENAME("PROCESSOR")
    NTSTATUS rc = STATUS_SUCCESS;

    ENTER(2, ("Processor(pctxt=%x,pbOp=%x,pterm=%x)\n",
              pctxt, pctxt->pbOp, pterm));

    if ((rc = CreateNameSpaceObject(pctxt->pheapCurrent,
                                    (PSZ)pterm->pdataArgs[0].pbDataBuff,
                                    pctxt->pnsScope, pctxt->powner,
                                    &pterm->pnsObj, 0)) == STATUS_SUCCESS)
    {

        pterm->pnsObj->ObjData.dwDataType = OBJTYPE_PROCESSOR;
        pterm->pnsObj->ObjData.dwDataLen = sizeof(PROCESSOROBJ);

        if ((pterm->pnsObj->ObjData.pbDataBuff =
             NEWPCOBJ(pctxt->pheapCurrent, pterm->pnsObj->ObjData.dwDataLen))
            == NULL)
        {
            rc = AMLI_LOGERR(AMLIERR_OUT_OF_MEM,
                             ("Processor: failed to allocate processor object"));
        }
        else
        {
            PPROCESSOROBJ pproc;

            MEMZERO(pterm->pnsObj->ObjData.pbDataBuff,
                    pterm->pnsObj->ObjData.dwDataLen);
            pproc = (PPROCESSOROBJ)pterm->pnsObj->ObjData.pbDataBuff;
            pproc->bApicID = (UCHAR)pterm->pdataArgs[1].uipDataValue;
            pproc->dwPBlk = (ULONG)pterm->pdataArgs[2].uipDataValue;
            pproc->dwPBlkLen = (ULONG)pterm->pdataArgs[3].uipDataValue;
            if (ghCreate.pfnHandler != NULL)
            {
                ((PFNOO)ghCreate.pfnHandler)(OBJTYPE_PROCESSOR, pterm->pnsObj);
            }
            rc = PushScope(pctxt, pctxt->pbOp, pterm->pbOpEnd, NULL,
                           pterm->pnsObj, pctxt->powner, pctxt->pheapCurrent,
                           pterm->pdataResult);
        }
    }

    EXIT(2, ("Processor=%x (pnsObj=%x)\n", rc, pterm->pnsObj));
    return rc;
}       //Processor

also "Processor (PR00, 0x01, 0x00001810, 0x06)" definition has additional arguments: 0x01, 0x00001810, 0x06

i dont know what these numebr means, acpi specification can give answer if you care
 

Link to comment
Share on other sites

@Mov AX, 0xDEAD

The Classic Definition way worked, I borrowed the ASL code from one of my other systems that is working properly in XP. I suppose I should learn what the arguments mean. I'm happy that I've got a known good ACPI table mod now at least, even if I have to apply it at boot each time.

Any ideas on why Processor() is not called? Could my theory that the Processor Container Device as the cause be correct? or do you think it's something else?

Link to comment
Share on other sites

5 hours ago, Damnation said:

@Mov AX, 0xDEAD

Any ideas on why Processor() is not called? Could my theory that the Processor Container Device as the cause be correct? or do you think it's something else?

This ssdt out of acpi 1.x/2.x specification, no Processor opcode,  now cpu core is just device with "new" special name _HID=ACPI0007 and unique _UID

Hard to fix, need hook creating device, check for keyword ACPI0007, manually call to Processor(), there is mismatch arguments, so need patch this part too.

Link to comment
Share on other sites

On 8/2/2022 at 7:08 AM, Damnation said:

@Mov AX, 0xDEAD

Is there anything in the Windows 10 ACPI driver or in the Linux ACPI driver source code that gives hints for how to deal with this change to the ACPI specification?

disasm win10 driver, see how ACPI0007 detected and related to old Processor(), if it same as xp repeat in sourrces

Link to comment
Share on other sites

@Mov AX, 0xDEAD

ACPI0007 makes use of AcpiProcessorIrpDispatch the same as Processor in Windows 10 acpi.sys

https://ibb.co/s97TwCW

spacer.png

AcpiProcessorIrpDispatch does not seem to have been altered since XP and remains the same.

10 AcpiProcessorIrpDispatch

https://ibb.co/Kb6tpVp

spacer.png

XP AcpiProcessorIrpDispatch

https://ibb.co/hK8xRwY

spacer.png

I did try to add ACPI0007 in to XP acpi.sys - but my lack of good programming skills meant I was not able to do this successfully.

edit: In \driver\nt\dat.c

	//
	// Any device in this table is considered to be 'special'
	//
	INTERNAL_DEVICE_TABLE AcpiInternalDeviceTable[] = {
	"ACPI0006", &AcpiGenericBusIrpDispatch,
	"FixedButton", &AcpiFixedButtonIrpDispatch,
	"PNP0000", &AcpiRawDeviceIrpDispatch,
	...
	"DockDevice", &AcpiDockPdoIrpDispatch,
	"ThermalZone", &AcpiThermalZoneIrpDispatch,
	"Processor", &AcpiProcessorIrpDispatch,
	NULL, NULL
	} ;
	

Edited by Damnation
Link to comment
Share on other sites

@Mov AX, 0xDEAD

Could we try telling the XP acpi.sys to treat the CompatibleID  "ACPI\ACPI0007" the same as it treats "ACPI\Processor" ?

I don't think the driver does anything with that ACPI0007 ID currently.

I'm not entirely sure how to do this in source code though.

Link to comment
Share on other sites

On 8/6/2022 at 11:08 AM, Damnation said:

@Mov AX, 0xDEAD

Could we try telling the XP acpi.sys to treat the CompatibleID  "ACPI\ACPI0007" the same as it treats "ACPI\Processor" ?

I don't think the driver does anything with that ACPI0007 ID currently.

I'm not entirely sure how to do this in source code though.

@Damnation

1) extended AcpiInternalDeviceFlagTable[] to set DEV_CAP_PROCESSOR flag to special HID name:

Quote

INTERNAL_DEVICE_FLAG_TABLE   AcpiInternalDeviceFlagTable[] = {

...

ACPI0007, DEV_CAP_NO_FILTER | DEV_CAP_NO_STOP | DEV_CAP_PROCESSOR,  //0x10 0030 0000

...

}

2) extended AcpiInternalDeviceTable[] to enable processor dispatch routines:

Quote

"Processor",        &AcpiProcessorIrpDispatch,

"ACPI0007",        &AcpiProcessorIrpDispatch,

There can be different DEV_CAP_PROCESSOR processing in Win10 code to proper handle CPU device without Processor opcode

First extend two tables and see is it enough or not

Link to comment
Share on other sites

@Mov AX, 0xDEAD

OK,

Adding this code
 

Quote

 

INTERNAL_DEVICE_FLAG_TABLE   AcpiInternalDeviceFlagTable[] = {

...

ACPI0007, DEV_CAP_NO_FILTER | DEV_CAP_NO_STOP | DEV_CAP_PROCESSOR,  //0x10 0030 0000

...

}

 

this caused all of the ACPI0007 devices to completely disappear from the ACPI0010 container.

this line
 

Quote

 

"Processor",        &AcpiProcessorIrpDispatch,

"ACPI0007",        &AcpiProcessorIrpDispatch,

 

this at first seemed like it did nothing, except now when I manually brute force install the processor it now freezes my system. With the older acpi.sys it simply says "Device cannot Start (code 10)" after a brute force install and does not freeze.

any more ideas I could try?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...