Guida al computer - Lezione 71 - Il Sistema Operativo: L'Installazione dei pr...
Guida alla modifica del dsdt 1a parte - le basi
1. Finalità
Viste le tante domande che si stanno ponendo in quasi tutti i forum su questa nuova modalità di hacking, ci siamo decisi a creare una serie di guide il cui scopo è semplicemente quello di cercare
di spiegare in modo chiaro e semplice tutte le possibilità offerte da questo nuovo metodo.
1. Cos'è DSDT?.
2. Quale file di "boot" utilizzare per caricare il DSDT.
3. Caratteristiche del patcher.
4. Utilizzo del patcher.
5. Warnings ed errori.
6. Editing del codice di base.
7. Come verificare se il nostro DSDT funziona
Annex : Elenco dei dispositivi ACPI
1. Cos'è DSDT?
DSDT (dall'Inglese : Descrizione Tabella Differentiated System) è una serie di tabelle che forniscono informazioni sulla configurazione dei diversi dispositivi per il sistema operativo. Da queste
sono ad esempio definiti il tipo di chip audio, uscite video, gli step di ibernazione, riavvio, arresto, sospensione, il numero di processori, ecc ...
Tutto questo deve seguire le linee guida dello standard ACPI, ma come vedremo nel corso di questa breve guida queste tabelle non sono sempre scritte in un modo adeguato e questo può portare
a diversi problemi...
E' stata aggiunta a Chamaeleon bootloader la possibilità di leggere un DSDT modificato: in sostanza ciò che rende questo possibile è il precaricamento tramite bootloader, di un DSDT prestabilito
che si è prima modificato.
Lo scopo è dunque quello di estrarre il DSDT, editarlo e modificarlo per cercare di creare un sistema il più "compatibile" e stabile possibile.
Come primo esempio (ne vedremo di più man mano che procederemo) c'è il tipico caso di uno degli errori più comuni nei DSDT mal programmati (o incompatibili con OSX) il quale altro non è che
la voce che definisce il processore / processori.
In questa viene utilizzato del codice aggiuntivo per la definizione di un alias della CPU, che OSX (per l'esattezza il driver ACPIPlatform.kext) non può interpretare, e quindi ci rende il tipico errore:
using 10485 buffer headers and 4096 cluster IO buffer headers
….che fa arrestare il processo di boot.
Le righe di codice incriminate:
Scope (_PR) {
}
Processor (P001, 0x01, 0x00000810, 0x06) {}
Alias (P001, CPU1)
Le stesse righe corrette:
Scope (_PR) {
Processor (P001, 0x01, 0x00000810, 0x06) {}
}
2. Quale file di "boot" utilizzare per caricare il DSDT.
Partiamo dal presupposto che abbiamo installato il bootloader Chameleon.
Una volta che lo abbiamo installato dobbiamo sostituire il file di "boot" che è stato creato nella directory principale del nostro sistema con il file di avvio che permette il precaricamento del DSDT
modificato.
Esistono diversi tipi di file ma parleremo principalmente del file originariamente creato da Mackerintel e di quello sviluppato poi da netkas.
Caratteristiche del bootloader di Mackerintel
Supporta il caricamento del file DSDT.aml dalla root del disco
Non supporta il caricamento da /Extra
Non supporta il caricamento di Initrd.img da bootCD
Non supporta il boot da partizione di boot EFI
E' fondamentalmente la versione ufficiale di Chameleon patchata in modo tale da far caricare DSDT.aml dalla root del disco di avvio.
Caratteristiche del bootloader di Netkas
Supporta il caricamento del file DSDT.aml da root
Supporta il caricamento da /Extra
Non supporta il caricamento di initrd.img dal CD di boot
Non supporta il boot da partizione EFI
Supporta l'ibernazione.
Supporta 64-kernel bit (leo Snow)
3. Caratteristiche del patcher.
Fassl ha creato un patcher che corregge gli errori più comuni nella DSDT delle nostre macchine come segue:
# Aggiusta l'alias nel nome della CPU
Risolve perciò il problema per cui il sistema non si avvia con 2 CPU ma ci sono segnalazioni (nei casi di processori quad-core) di DSDT in cui bisogna eliminare manualmente alcuni alias ....
# Patcha l' HPET
Permette di caricare il file appleintelcpupowermanagement.kext, senza più kernel panic quando si aggiorna il sistema.
Se dopo aver provato il file DSDT sulla nostra macchina, ci sono degli errori con il file, è necessario eseguire il patcher passandogli il parametro
-newHPET
per forzare l'introduzione di codice nel nostro DSDT.
# Patcha l' RTC
Permette dunque di caricare il file AppleRTC.kext che a quanto pare rovina un sacco di Hackintosh durante l'aggiornamento da 10.5.5 a 10.5.6.
Il patcher include nella cartella Tools una utility di Intel (denominata IASL) per la compilazione e decompilazione del file DSDT, che può essere di grande utilità quando dobbiamo correggere
manualmente la DSDT (spiegheremo poi come eseguire i comandi).
4. Utilizzo del patcher.
Una volta scaricato e scompattato il patcher, apriamo un terminale, accediamo alla cartella in cui è contenuto ed eseguiamolo: ci verrà chiesto il tipo di emulazione OSI.
L' Emulazione OSI
2. Con questo termine si indicano poche righe di codice aggiunto sotto le voci del nostro processore, per renderlo più compatibile con diversi sistemi operativi (Linux, Windows 2000, Windows XP,
Vista).
Ci saranno sempre queste righe nel nostro DSDT (a seconda del modello e produttore).
Selezioniamo quindi una Emulazione OSI:
1-Darwin (non aggiunge nulla),
2-Windows XP (aggiunge tabelle per Windows XP),
3-Vista (aggiunge tabella per Windows Vista).
Come sapere quale selezionare?
Questo è facile, per prima cosa selezioniamo il Darwin, in modo che il codice non venga alterato.
Una volta che avremo terminato tutto, potremo dare un'occhiata al DSDT.dsl e cercare le voci iniziali circa il processore. Di seguito dovremmo vedere se le voci OSI per le righe di codice relative
ai diversi sistemi sono incluse, e, se non lo sono, potremo ri-patchare scegliendo l'opzione per XP o Vista a seconda del computer in uso.
Dopo aver scelto il tipo di emulazione, il programma creerà un dsdt.dat file, lo disassemblera', lo patchera', lo ri-assemblera' e lo depositera' nella root della cartella che ospita il patcher.
Se il patcher incontra degli errori, allora non creerà alcun file.
Se gli errori sono pochi è possibile forzare il patcher per la creare del file in questo modo:
- Aprire Terminale
- trascinare il patcher dentro al Terminale per fargli scrivere il path
- aggiungere il parametro -f
- dare Enter
Ciò richiederà al patcher la creazione di un file DSDT.aml, la qual cosa non è fortemente raccomandata, ma alle volte può funzionare.
La raccomandazione qui sarebbe quella di modificare il codice dentro al file (guardando la linea dove si verifica l'errore e cercando di risolvere il problema).
Questo sarà spiegato meglio nel capitolo 6.
Una volta creato il file, rinominiamo il file dsdt.aml in DSDT.aml e collochiamolo nella directory principale (root) del disco.
Se tutto va bene, potremo avviare il sistema e potremo anche aggiornarlo senza problemi con Apple Software Update.
Si consiglia comunque di testare prima il DSDT patchato (capitolo 7).
5. Warnings ed errori.
E' probabile che quando si esegue la patch, il programma non crei il file DSDT.aml a causa degli errori nel codice, la correzione dei quali si vedrà nel prossimo capitolo.
I Warnings non sono invece un problema per il corretto funzionamento della patch: sono solo un avviso da parte del compilatore Intel, che ha trovato del codice non troppo erroneo in vari punti e li
elenca, in un modo che non ci deve preoccupare troppo.
6. Editing del codice di base.
Se trova errori nel codice, il patcher non creerà' il file DSDT.aml nella cartella in cui si trova; il primo passo è quello di appuntare o copiare gli errori che ci mostra il terminale e tenerli in un file di
testo per un futuro riferimento.
In caso di errore, troveremo il file DSDT.dsl (pre-compilato) nella cartella debug, potremo quindi fare una copia di quella cartella al di fuori della cartella del patcher in modo da avere una copia di
backup.
Torniamo alla cartella di debug che si trova all'interno della cartella del patcher, e spostiamo il file DSDT.dsl in modo da metterlo accanto al file DSDT Patcher.
Apriamolo poi con un editor di testo (un buon editor di testo potrebbe essere" TextMate" in quanto questo rispetta il formato del codice, ma è anche possibile utilizzare TextEdit di OSX, anche se
questo non rispetta il formato del codice - entrambi comunque funzionano bene ai nostri fini).
Una volta terminata la revisione del codice, salviamo il file e facciamone una copia di backup, perché appena il programma cercherà di compilarlo di nuovo, non lo avremo più a disposizione.
Eseguire la patch come segue:
- aprire il Terminale
- trascinare dentro il Parcher DSDT
- lasciare uno spazio e trascinare il file DSDT.dsl rettificato
- premere invio e scegliere l'emulazione OSI desiderata
Se gli errori si verificano ancora, è anche probabile che il file DSDT.dsl sia scomparso, al che utilizzeremo la copia del DSDT.dsl fatta appena prima della compilazione: ricordiamoci sempre di
conservare una copia del file ogni volta che riproviamo.
Comuni esempi di errori nel codice che impediscono la compilazione e la loro soluzione:
# Righe di codice ridondante
./dsdt_fixed.txt
1: ACPI (Local2) Error 4095 -
^ syntax error, unexpected PARSEOP_NAMESEG, expecting PARSEOP_DEFINITIONBLOCK
Questo errore deriva dalla linea 1, è possibile utilizzare nel vostro editor di testo la funzione VAI ALLA LINEA (anche se in questo caso non è necessario) per passare rapidamente alle righe
contenenti gli errori.
Guardando il file DSDT.dsl, vedremo subito che il bug è qui:
ACPI Error (dmutils-0261): Argument count mismatch for method _SB_.VWAK 3 1 [20080926]
ACPI Error (dmutils-0261): Argument count mismatch for method _GPE.VBRE 2 1 [20080926]
/*
* Intel ACPI Component Architecture
* AML Disassembler version 20080926
Non ci dovrebbe essere alcun codice prima di:
/* * Intel ACPI Component Architecture
* AML Disassembler version 20080926
Cancellare semplicemente le prime due righe dovrebbe essere sufficiente per riprovare a compilare e vedere se insorgono nuovi bug.
# Variabili al posto di valori
./dsdt_fixed.txt 408: Store (Local0, Local0)
Error 4050 - ^ Method local variable is not initialized (Local0)
Se ci spostiamo tra il codice e guardare la linea 408, troviamo questo errore:
Scope (_SI)
{
3. Method (_MSG, 1, NotSerialized)
{
Store (Local0, Local0)
}
Method (_SST, 1, NotSerialized)
{
Store (Local0, Local0)
}
}
Come faccio a sapere ciò che il codice si aspetta di trovare?
Be ' se cerchiamo col menu Trova dell'editor la parola "Store" troveremo appena sotto l'errore che cerchiamo, visto che il codice è come questo:
Store (0xFF, RSR0)
Store (0x80, PMC0)
Il primo valore di Store e' un valore esadecimale mentre il secondo è una variabile.
Qui è l'errore: nel codice (Local0,local0) si presume che il primo valore sia esadecimale e non una variabile.
Potremmo quindi anche mettere 0x00 o pari a zero, lasciando il codice come segue:
Scope (_SI)
{
Method (_MSG, 1, NotSerialized)
{
Store (zero, Local0)
}
Method (_SST, 1, NotSerialized)
{
Store (zero, Local0)
}
}
Qui di seguito invece c'e' la soluzione usata da Gigabyte su questo tema:
Scope (_SI)
{
Method (_MSG, 1, NotSerialized)
{
Store ("Local0", Local0)
}
Method (_SST, 1, NotSerialized)
{
Store ("Local0", Local0)
}
}
Si noti come Gigabyte usi le virgolette sul valore Local0 per risolvere il problema.
# Errori di sintassi
Maximum error count (200) exceeded
./dsdt_fixed.txt 24: External (^CPU0._PPC)
Qui quello che accade è che ciò che trova il compilatore non è come segue:
External (^CPU0._PPC) <---- attenzione al simbolo di colore rosso.
Si risove utilizzando la sintassi corretta nel codice:
External (_PR.CPU0._PPC)
# Errori di sintassi
./dsdt_fixed.txt 233: If (LOr (_OSI ("Darwin"), _OSI ("Windows 2001")))
Error 4063 - Object does not exist ^ (LOR)
Soluzione:
If (LOr (_OSI ("Darwin"), _OSI ("Windows 2001")))
oppure
If (LOr (_OSI ("Darwin"), _OSI ("Windows 2001")))
# Errata inizializzazione delle variabili
./dsdt_fixed.txt 3964: Field (ECRM, AnyAcc, Lock, Preserve)
Error 4075 - ^ Host Operation Region requires ByteAcc access
./dsdt_fixed.txt 4192: Return (Local1)
Error 4050 - Method local variable is not initialized ^ (Local1)
Che succede qui?
OperationRegion (ECRM, EmbeddedControl, Zero, 0xFF)
Field (ECRM, AnyAcc, Lock, Preserve)
Il compilatore ci avverte che AnyAcc non è corretto in quanto si aspetta un ByteAcc e pertanto cambiamo:
OperationRegion (ECRM, EmbeddedControl, Zero, 0xFF)
Field (ECRM, ByteAcc, Lock, Preserve)
Il secondo errore:
./dsdt_fixed.txt 4192: Return (Local1)
Error 4050 - Method local variable is not initialized ^ (Local1)
….E' simile al precedente errore variabile non inizializzata, giusto?
Method (PKTW, 1, NotSerialized)
{
Store (Arg0, EPKT)
Return (Local1)
E quindi correggeremo così:
Method (PKTW, 1, NotSerialized)
{
Store (Arg0, EPKT)
Return (Zero)
4. 7. Come verificare se il nostro DSDT funziona
Aggiungere il driver Appleintelcpupowermanagement.kext per la nostra versione, rimuovere eventuali "disabler" che abbiamo nelle kext e riavviare il sistema.
Se all' avvio con -v troviamo:
localhost kernel [0]: AppleIntelCPUPowerManagement: inizialization complete
vuol dire che il driver viene caricato correttamente e siamo protetti contro gli aggiornamenti da Apple.
A questo punto, è possibile rimuovere il driver dal sistema una volta che questo si e' dimostrato funzionante.
Cosa fare se al caricamento del sistema si verifica l'errore HPET?
Avviamo con il DVD di installazione, dopo aver superato il benvenuto, consultare il menu in alto e cerchiamo "Utilities" nel menu.
Selezioniamo poi "Terminale".
Una volta nel Terminale scriviamo questo:
# mount -uw /VOLUMES/Nome del volume
# rm -R /VOLUMES/Nome del volume/System/Library/Extensions/AppleIntelCPUPowerManagement.kext
# exit
Questo comando cancellerà la kext.
Chiudere il programma di installazione e riavviare.
Questa volta quando riusiamo la patch, dobbiamo forzare il programma, per fare la qual cosa:
- Apriamo il Terminale
- trasciniamo il Parcher DSDT dentro al Terminale
- lasciare uno spazio e scriviamo:
# -newHPET
- Premiamo Invio
...e questo costringerà l'inserimento della patch nel vostro DSDT.
********Basato sulla versione del patcher 1.0.1e**************
Creatore della guida originale in lingua spagnola : EvOSX86 Team.
Traduzione ed adattamento in lingua italiana : th3f0ul
Annex : Elenco dei dispositivi ACPI