Jump to content

[Guida di base]Estrarre il DSDT e correggere gli errori


carbo178
 Share

763 posts in this topic

Recommended Posts

Salve a tutti,

lo scopo di questa guida è imparare a risolvere autonomamente le più frequenti anomalie di compilazione del DSDT, facilitando al contempo la comprensione dei codici e l'uso dei programmi di decompilazione-compilazione.

 

E' anche un'occasione per creare un "database" degli errori più o meno comuni che si riscontrano durante il processo di compilazione.

 

Ideale per chi si vuole cimentare nell'impresa di costruirsi il DSDT su misura per il proprio Hardware e per chi vuole approcciare l'argomento da neofita senza rischiare danni al PC (in effetti usare un DSDT "trovato su internet" è molto più pericoloso).

 

A chi serve?

A tutti gli utenti che hanno problemi col riconoscimento di alcune periferiche, che siano audio, schede di rete o wifi, schede video, USB3 etc..., velocizzare l'avvio del sistema, far funzionare in modo appropriato lo stop, il riavvio, lo spegnimento ed altro.

 

E' indispensabile avere un DSDT?

No, generalmente se ne può fare a meno e raggiungere lo scopo usando altre strade (ma non sempre è possibile).

 

Dove metto il DSDT?

Dipende dal bootloader:

  • Se usiamo Chameleon o Enoch lo mettiamo nella cartella Extra, che si trova nella root del disco.
  • Se usiamo Clover in modalità Legacy lo inseriamo in Clover/ACPI/Patched, nella root del disco.
  • Se Clover è in modalità UEFI troveremo la cartella nella partizione nascosta EFI (da montare da terminale o con EFI Mounter.app), in questo caso il percorso sarà EFI/Clover/ACPI/Patched

Nota: questa mini guida vi aiuterà ad avere un DSDT privo di errori, l'implementazione di periferiche e patches varie deve essere fatta in un secondo momento, in base alle esigenze di ciascun utente.

 

Cosa serve:

  1. DSDT Editor, oppure DSDT SE, oppure MacIASL (o qualsiasi altro software equivalente)
  2. Pazienza e voglia di imparare

Estrazione del DSDT

Procediamo con l'estrazione del DSDT "vergine" (se già usate un DSDT per il vostro Hack dovete avviare con DSDT=No oppure DSDT=/aaaaaaaaa per evitarne il caricamento).

Per fare questo potete avvalervi di uno dei programmi sopracitati oppure aprendo il terminale e fare un copia-incolla del seguente codice (solo per versioni di OS X fino alla 10.9):

 

 

perl -e 'open(CMD, "ioreg -lw0 \| grep DSDT|") or die; while()
{ chomp; if($_ =~ /\"DSDT\.?\d?\"=]*)>/) { $buff = $1; open(PIP,
"|xxd -r -p > ~/Desktop/dsdt.aml") or die; print PIP "$1"; } }'

 

 

In quest'ultimo caso vi troverete il file sul desktop, pronto per essere aperto col vostro compilatore preferito.

 

Per OS X 10.10 l'estrazione del dsdt vergine si può fare con MacIASL salvando SystemDSDT in formato .dsl oppure dalla schermata del boot di Clover installato nella ESP premendo il tasto F4 (con Clover troverete tutte le tabelle ACPI vergini nella cartella EFI/CLOVER/ACPI/origin)

 

Personalmente uso DSDT Editor, lo trovo di facile comprensione ed immediato nell'individuare le linee soggette ad errori, quindi quello che scriverò si baserà su questo software.

 

 

Compilazione del DSDT

  1. Aprite il file con DSDT Editor e compilatelo (IASL-Compile); sicuramente nella finestrella di compilazione appariranno degli errori, dei warnings e dei Remarks: il nostro scopo è eliminare tali anomalie in modo di avere 0 Errors, 0 Warnings, 0 Remarks,  XX Optimizations (XX è un numero variabile che dipende dall’hardware, non è influente sul risultato finale).
  2. In base agli errori, warnings e remarks che avremo dovremo man mano correggerli: la prima mossa è cliccare su “Fix Errors”, questo correggerà gli errori conosciuti e presenti nel database del programma, quindi molto probabilmente se alla prima compilazione avevate 2 Errors dopo questa operazione ne troverete 1 oppure 0; rimarranno comunque warnings e remarks, per procedere alla correzione cliccate sul testo dell’errore e il programma visualizzerà la linea interessata dal problema.
  3. Salvare il file compilato senza errori cliccando IASL-Save aml as

Ora esaminiamo le anomalie più frequenti:

 

  • "Use of compiler reserved name (_T_0)"

 

 

In questo caso è sufficiente aprire ed applicare dal menu patch “_T_x rename” , scegliendo la patch dall'apposita cartella del programma.

Se volete farlo manualmente, dovete eliminare l'underscore prima di ogni "T" di "_T_0" / "_T_1" segnalati nelle linee di errore del compilatore (es. da "_T_0" a "T_0")

 

 

  • "Not all control paths return a value (_BCM)"

 

 

Originale:
Method (_BCM, 1, Serialized)
                {
                          bla bla bla bla bla...

                                                            Store (0x08, Local0)
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            Store (Local0, BRTV)
                            SECB (0x30, 0x60)
                        }
                    }
                }
Corretto:
Method (_BCM, 1, Serialized)
                {
                            bla bla bla bla bla...

                                                            Store (0x08, Local0)
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            Store (Local0, BRTV)
                            SECB (0x30, 0x60)
                        }
                    }
                     Return (Zero)
                }

 

 

Nota: questo rimedio è valido per la maggior parte delle anomalie “Not all control paths return a value”, tranne la seguente...

  • "Not all control paths return a value (_HID)"

 

 

Originale:
Method (_HID, 0, NotSerialized)
{
    If (TCMF) {}
    Else
    {
        Return (0x310CD041)
    }
}
Corretto:
Method (_HID, 0, NotSerialized)
{
    If (TCMF)
    {
        Return (Zero)
    }
    Else
    {
        Return (0x310CD041)
    }
}

 

Altro tipo di correzione: Eddy09 post#46

 

Da:

 

Method (_CRS, 0, NotSerialized)
                {
                    If (IGDS)
                    {
                        Return (CRS)
                    }
                }
            }
        }
    }

 

a:

 

Method (_CRS, 0, NotSerialized)
                {
                    If (IGDS)
                    {
                        Return (CRS)
                    }
                    Return (Buffer (One)
                    {
                      0x00
                    })
                }
            }
        }
    }

 

 

  • "Reserved method must return a value (Integer/String/Buffer/Package/Reference required for _DSM)"

 

 

Originale:

Method (_DSM, 4, Serialized)
            {
                Name (DRET, Buffer (0x04)
                {
                     0x00
                })
                If (LEqual (Arg0, Buffer (0x10)
                        {
                            /* 0000 */   0xE1, 0x75, 0x39, 0x6F, 0x82, 0x7A, 0x67, 0x4F,
                            /* 0008 */   0x8B, 0x97, 0x15, 0xBE, 0xE0, 0x60, 0xBE, 0xDF
                        }))
                {
                    If (LEqual (Arg2, Zero))
                    {
                        CreateWordField (DRET, Zero, F0SS)
                        Store (0x02, F0SS)
                        Return (DRET)
                    }
                    If (LEqual (Arg2, One))
                    {
                        If (LEqual (^^PEG0.PEGP.LNKV, 0x03))
                        {
                            Return (Zero)
                        }
                        Return (One)
                    }
                }
            }
        }
    }

Corretto:

Method (_DSM, 4, Serialized)
            {
                Name (DRET, Buffer (0x04)
                {
                     0x00
                })
                If (LEqual (Arg0, Buffer (0x10)
                        {
                            /* 0000 */   0xE1, 0x75, 0x39, 0x6F, 0x82, 0x7A, 0x67, 0x4F,
                            /* 0008 */   0x8B, 0x97, 0x15, 0xBE, 0xE0, 0x60, 0xBE, 0xDF
                        }))
                {
                    If (LEqual (Arg2, Zero))
                    {
                        CreateWordField (DRET, Zero, F0SS)
                        Store (0x02, F0SS)
                        Return (DRET)
                    }
                    If (LEqual (Arg2, One))
                    {
                        If (LEqual (^^PEG0.PEGP.LNKV, 0x03))
                        {
                            Return (Zero)
                        }
                        Return (One)
                    }
                }
                Return (Zero)             }
        }
    }

HackMan85 post#7

 

 

  • "_HID suffix must be all hex digits (GH)"

 

 

Originale:
            (_HID, "ABCDEFGH")
Corretto:
            (_HID, "ABCDEF0")
Oppure:
            (_HID, "PNP0C15")

 

 

  • "Resource Tag larger than Field (Tag: 64 bits, Field: 32 bits)"

 

 

Originale:

            CreateDWordField (BUF0, \_SB.PCI0._Y0F._LEN, MSLN)

Corretto:

            CreateQWordField (BUF0, \_SB.PCI0._Y0F._LEN, MSLN)

 

 

 

  • "Result is not used, possible operator timeout will be missed"

 


Originale:
             Acquire (MUTE, 0x0FFF)

Oppure:

             Acquire (MUTE, 0x03E8)

Corretto:
             Acquire (MUTE, 0xFFFF)

 

 

 

  • "Effective AML package length is zero"

 

 

Originale:

Method (_PRT, 0, NotSerialized)
                

                   {
                   

                       If (GPIC)
                   

                       {
                       

                            Return (Package (0x00) {})
                   

                       }
                   

                       Else
                   

                       {

                            Return (Package (0x10)

Corretto:

Method (_PRT, 0, NotSerialized)
               
                   {
                   
                       If (GPIC)
                  
                       {
                       
                            Return (Package (0x01) {})
                  
                       }
                  
                       Else
                  
                       {
                            Return (Package (0x10)

 

 

 

  • "Effective AML buffer length is zero"

 


Originale:
Name (XMPT, Buffer (0x0000) {}) 
Corretto:
Name (XMPT, Buffer (Zero) {})

 

 

  • "syntax error, unexpected '}', expecting '('"

 


Originale:
If (CondRefOf (\_SB.PCI0.XHC.PS0X))
                {
                    PS0X
                }
Corretto:
If (CondRefOf (\_SB.PCI0.XHC.PS0X))
                {
                    Store (Zero, PS0X)
                }

 

 

Al termine di ogni modifica è necessario cliccare "Fix Errors" per verificare l'efficacia dell'azione.

 

 

 

IN CONTINUO AGGIORNAMENTO

Questa è una guida "aperta", chiunque può contribuire postando le soluzioni ad altre anomalie, o postando il proprio DSDT che presenta errori non compresi nella lista

  • Like 10
Link to comment
Share on other sites

Buona idea, infatti tempo fà per capire come fixare alcuni errori ho buttato il sangue, anche se a me per esempio anche se applico i fix per (_T_0), (_HID), Tag: 64 bits, Field: 32 bits), operator timeout will be missed,

non mi cambia assolutamente nulla. Si possono postare i propri dsdt corretti senza errori?

Link to comment
Share on other sites

Buona idea, infatti tempo fà per capire come fixare alcuni errori ho buttato il sangue, anche se a me per esempio anche se applico i fix per (_T_0), (_HID), Tag: 64 bits, Field: 32 bits), operator timeout will be missed,

non mi cambia assolutamente nulla. Si possono postare i propri dsdt corretti senza errori?

Meglio il dsdt con gli errori, anche perchè il dsdt è meglio averlo personalizzato per il proprio sistema, a volte stesa mobo ma con bios di versione diversa può causare KP.

Se hai un dsdt da correggere e non riesci postalo, vedo se riesco e metto il risultato nelle soluzioni

Link to comment
Share on other sites

Aggiungo il fix all'errore "Reserved method must return a value (Integer/String/Buffer/Package/Reference required for _DSM)

Method (_DSM, 4, Serialized)
            {
                Name (DRET, Buffer (0x04)
                {
                     0x00
                })
                If (LEqual (Arg0, Buffer (0x10)
                        {
                            /* 0000 */   0xE1, 0x75, 0x39, 0x6F, 0x82, 0x7A, 0x67, 0x4F,
                            /* 0008 */   0x8B, 0x97, 0x15, 0xBE, 0xE0, 0x60, 0xBE, 0xDF
                        }))
                {
                    If (LEqual (Arg2, Zero))
                    {
                        CreateWordField (DRET, Zero, F0SS)
                        Store (0x02, F0SS)
                        Return (DRET)
                    }
                    If (LEqual (Arg2, One))
                    {
                        If (LEqual (^^PEG0.PEGP.LNKV, 0x03))
                        {
                            Return (Zero)
                        }
                        Return (One)
                    }
                }
            }
        }
    }

Alla fine sotto la seconda parentesi Graffa si deve aggiungere un Return (Zero) Quindi,

Method (_DSM, 4, Serialized)
            {
                Name (DRET, Buffer (0x04)
                {
                     0x00
                })
                If (LEqual (Arg0, Buffer (0x10)
                        {
                            /* 0000 */   0xE1, 0x75, 0x39, 0x6F, 0x82, 0x7A, 0x67, 0x4F,
                            /* 0008 */   0x8B, 0x97, 0x15, 0xBE, 0xE0, 0x60, 0xBE, 0xDF
                        }))
                {
                    If (LEqual (Arg2, Zero))
                    {
                        CreateWordField (DRET, Zero, F0SS)
                        Store (0x02, F0SS)
                        Return (DRET)
                    }
                    If (LEqual (Arg2, One))
                    {
                        If (LEqual (^^PEG0.PEGP.LNKV, 0x03))
                        {
                            Return (Zero)
                        }
                        Return (One)
                    }
                }
                Return (Zero) <-------Ecco dove aggiungere. 
            }
        }
    }
  • Like 1
Link to comment
Share on other sites

  • 3 weeks later...

Ottima guida, ma mi manca un pezzo, anzi piu' di uno :D 

perche' dovrei avere un dsdt pulito? 

Come faccio a farmi il dsdt specifico per il mio hardware? 

faccio queste domande perche' mi mancano dei pezzi e anche perche' sto cercando di capire tutto il giro per modificare il bios della mia macchina in modo che possa effettuare una installazione liscia di oszx senza passare da clover, chemeleon o atri bootloader, cio' e' possibile usando un bootloader da caricare direttamente nel bios, ma questo prevede che nello stesso bios siano presenti sia il dsdt corretto e privo di errori, sia le eventuali kext, questa e' la ragione per cui chiedo come fare a farsi il dsdt specifico per il proprio hardware.

Link to comment
Share on other sites

Il dsdt viene estratto dal bios della mobo e presenta tutte le informazioni sulle periferiche della mobo stessa; tali informazioni sono a volte mancanti, altre volte incomplete, ma spesso fanno riferimento ad altre informazioni non presenti, e qui si generano gli errori.

Pulirlo dagli errori lo rende performante per il sistema, mentre l'aggiunta di patches a volte evita l'installazione di kext superflui (ad esempio la patch per shutdown sostituisce il kext Evoreboot, la patch per i dischi arancio sostituisce IOAHCIBlockStorageInjector.kext, etc..).

Personalizzare il dsdt per il proprio Hardware non è impossibile, bisogna conoscere le caratteristiche delle periferiche ed applicare le patches necessarie in base a ciò che non funziona come dovrebbe, ad esempio per riuscire a far funzionare lo stop o l'audio.

Il progetto che hai in mente tu non so se sarà mai fattibile, certo sarebbe il massimo avviare il PC come se fosse un Mac "vero", non preoccuparsi di malfunzionamenti e della reinstallazione di kext e quant'altro dopo l'aggiornamento...

Link to comment
Share on other sites

Ti ringrazio delle informazioni, diciamo che non e' semplicissimo ma ho beccato un thread dove pare sia possibile fare cio' proprio su questo forum, mi accingo a fare qualche prova, fortunatamente ho una piastra che ha il doppio bios, quindi anche facessi danni, posso sempre tornare indietro.

Link to comment
Share on other sites

Ancora io, ho scaricato maciasl e ho provato a caricare il dsdt facendoglielo leggere direttamente dall hardware senza caricaste alcunché' ( DSDT=No)  ho visto diversi syntax error e altri warning, ma cambiando linguaggio in acpi 5 scompare quasi tutto e rimangono dei syntax error che non capisco, lamentano las mancanza di un ")" ma questa c'e' 

la mia mb e' una gigabyte z87n-wifi

Link to comment
Share on other sites

Questa guida arriva come il pane per me che voglio approfondire la conoscenza dell'hackintosh. Qualche domanda per Carbo:

ma le patches sono indipendenti dal sistema operativo? A che serve ogni specifica patch? Mi spiego meglio.

L'utente giofrida mi ha corretto e patchato il DSDT del portatile in firma che ora è perfetto. Mi ha messo le seguenti patches:

 

_T_x rename / DTGP / EHCI / FN KEYS / FPED / IRQs / New HPET / RTC / SHUTDOWN / SMBUS / UHCI

 

Ora, a parte quelle a cui ci si arriva intuitivamente come le FN KEYS, che abilitano i tasti funzione del portatile e la SHUTDOWN che spegne e riavvia, le altre cosa sono e a che servono? Ho provato a cercare in google e non c'è niente, al massimo mi escono post in cui qualcuno consiglia di mettere la patch da me cercata nel dsdt, ma guide non ce ne sono. Il pandora team è così gentile da inserire, per chi installa OSX col metodo pandora, una cartella con le patches in /Applicazioni/Utility e già sfogliando si capisce che alcune sono divise per processori, altre per marca di mobo, altre servono per desktop, per notebook ecc., ma se uno vuole cercare una guida in cui si spiega cos'è una patch, a che serve e dove si inserisce non c'è niente. Anche maciasl, che è il programma più facile, si limita a farti selezionare online il repository con le patches interessate divise per mobo e ad applicarle, ma pur essendo facilissimo questo metodo non spiega niente su come e dove le patches vengono applicate. Mi è capitato di chiedere ad utenti esperti e o non ricevo risposta o mi si dice di cercare in rete "che ci sono tantissime guide". L'impressione che ho ricevuto (ma mi sbaglierò) è che ci sia una certa ritrosia a parlarne, anche se non riesco a capirne il motivo. Oppure può darsi che ci si metta molto più tempo a spiegare che ad agire, così chi è più esperto preferisce farsi mandare il DSDT e rimandarlo corretto e patchato, piuttosto che mettersi a spiegarne il metodo.

 

Quindi spero che il buon Carbo, dopo aver spiegato cos'è il DSDT, come si compila e come si correggono gli errori più comuni, guida utilissima, prosegua con la spiegazione e applicazione delle patch, che è quello che alla fine rende un hackintosh meno problematico e più compatibile possibile. :)

Link to comment
Share on other sites

@marco.pisellonio80

Le patches sono indipendenti dal sistema operativo, le tabelle ACPI si basano sull'hardware, non sul software che poi le farà funzionare (tranne l'HPET che in base all'anzianità del SO può essere più o meno utilizzata).

Le patches possono essere usate per correggere degli errori (_T_x rename, Possible operator... etc...) oppure per aggiungere periferiche (in molti casi manca l'HDEF per l'audio, oppure è incompleta) e migliorare (nonostante non siano segnalati errori) il supporto ad altre periferiche come le USB, o l'smbus, ottimizzare gli interrupt o l'rtc.

 

Nel tuo caso l'unica patch di correzione vera e propria è il _T_X rename, il DTGP serve per implementare le patches aggiunte in seguito (ad esempio l'audio o le FN keys), EHCI e UHCI sono per le USB e firewire, IRQ sono gli interrupt di sistema, RTC è il Real Time Clock, in alcuni casi se non si procede alla patch via DSDT o dell'apposito kext si verifica il reset del bios ad ogni riavvio; HPET e SMBUS sono delle ottimizzazioni, la prima riguarda la parte relativa al Power Management e l'altra è il Bus di Sistema ed ovviamente Shutdown è una correzione per evitare che il PC faccia un riavvio invece dello spegnimento.

 

Non sono un esperto, questo è quanto ho "capito" da autodidatta, quindi posso sbagliare; se qualcuno più esperto vuole integrare è il benvenuto.

 

@ Aigors

puoi postare il tuo dsdt vergine?

  • Like 2
Link to comment
Share on other sites

Come si fa a capire se il proprio sistema possiede un dsdt?

Tutti i sistemi hanno un bios, il dsdt è una tabella estratta dal bios, successivamente corretta e messa in una posizione dalla quale il bootloader può caricarla in avvio

Link to comment
Share on other sites

rambo77

 

Non è che estrai la tabella, estrai un file dove essa è descritta, così come estraendo le informazioni sul tuo hardware e salvando in un file non vuol dire che rimuovi materialmente l'hardware dal tuo pc.

 

Windows all'avvio "legge" la tabella DSDT che c'è nel bios e parte. Le tabelle DSDT sono fatte per windows, ma il mac "dialoga" in modo diverso, per cui installando un hackintosh senza il file DSDT.aml in /Extra, viene caricato il DSDT del bios che è fatto per windows e nascono i problemi. Estraendo il DSDT e mettendo il file corretto e patchato per mac in /Extra accade che il bootloader all'avvio caricherà non la tabella DSDT del bios, ma quella in /Extra - che è ottimizzata per mac, e così la compatibilità sarà massima.

 

Come puoi vedere dai primi post, le tabelle DSDT dei bios, pur essendo fatte per windows, sono piene di errori e mancate ottimizzazioni, forse è anche per questo che in termini di prestazioni windows è una mezza ciofeca. Chissà se c'è il modo di estrarre il DSDT dal bios, correggerlo e ottimizzarlo senza patch e farlo caricare dal bootloader di windows. Penso che ne beneficerebbe.

  • Like 1
Link to comment
Share on other sites

 

 

Come puoi vedere dai primi post, le tabelle DSDT dei bios, pur essendo fatte per windows, sono piene di errori e mancate ottimizzazioni, forse è anche per questo che in termini di prestazioni windows è una mezza ciofeca. Chissà se c'è il modo di estrarre il DSDT dal bios, correggerlo e ottimizzarlo senza patch e farlo caricare dal bootloader di windows. Penso che ne beneficerebbe.

Diciamo che e' possibile editando il file amibios.info all interno del bios tramite dei tool, in questo modo non ci sarebbe bisogno ne di un dsdt da far caricare a mavericks, ne di un bootloader che lo carichi per windows, se entrambi lo leggono dal bios e questo e' sintatticamente corretto e contiene tutti i pezzetti che servono, entrambi i sistemi ne beneficerebbero, comunque credo esuli dal topic del thread se vuoi, se ne puo' discuter

Off Topic la guida la sto facendo per benino, :D mi ci vuole solo un po' di tempo per farla a modo, se sei curioso, in sezione bootloaders c'e' un thread di nome ozmosis le mie info le ho pescate da li.

Link to comment
Share on other sites

Scusa, ma come fa una tabella DSDT sintatticamente corretta a essere letta correttamente sia da Windows sia da OSX se, ad esempio, le istruzioni per lo spegnimento e il riavvio sono diverse, tanto che per OSX c'è bisogno della patch SHUTDOWN?

 

Scusa per l'OT.

Link to comment
Share on other sites

da quello che ho potuto leggere in questo thread http://forums.mydigitallife.info/threads/47032-Ami-Aptio-firmware-(UEFI)-dsdt-firmware-mod sembra sia possibile inserire una specie di controllo che ritorna che sistema operativo si sta usando, almeno cosi' mi e' parso di capire, quindi, se il bios dialoga con un osx gli dira' che lo spegni si fa' cosi', e cosi' via, almeno mi e' parso di capire questo.

Link to comment
Share on other sites

 Share

×
×
  • Create New...