Jump to content

[EFI Strings]


22 posts in this topic

Recommended Posts

Introduzione

 

Questa guida è divisa in tre parti: Introduzione, Video, Audio.

La versione originale in inglese è stata creata da MoDs nel forum del sito di Netkas, a cui vanno tutti i ringraziamenti, e da me è stata rivista e tradotta, aggiungendo alcuni dati mancanti.

 

PC_EFI?

PC_ECI ha cambiato l'intera scena del mondo OSx86. Questo emulatore di EFI ci permette in determinati PC, di far funzionare le kexts e i kernel originali. Alcune periferiche (che non esistono nel mondo Mac) hanno bisogno di particolari fix per funzionare.

 

Come funzionano queste fix?

La maggiorparte sono kexts (estensioni del kernel) e sono situate in /System/Library/Extensions/.

Mac OS usa una mappa chiamata "Device Tree". Questa mappa indica al kernel, durante il boot, quali driver caricare. Le kexts non fanno altro che "passare" i dati necessari al "Device Tree" durante il boot.

 

NVinject, Titan, Natit (injectors) non fanno altro che determinare la sk video usata e passare i dati al "Device Tree".

ALCinject fa lo stesso per l'audio.

Naturalmente anche se i dati per il video o l'audio sono passati al "Device Tree" dagli injectors, ma non sono presenti i drivers (kexts) per quella periferica questa non funzionerà.

 

PC_EFI Strings

Attualmente PC_EFI supporta le cosidette "pluggable strings" usate per aggiungere o passare dati al "Device Tree" durante il boot.

Queste "strings" sono serie molto lunghe di caratteri inserite nel file "/Library/Preferences/SystemConfiguration/com.apple.Boot.plist".

 

a603000001000000010000009a0300001400000002010c00d041030a000000000101060
00010101060000007fff040014000000400032002c006e0061006d00650000001100000073656e73
f722d706172656e7436000000400032002c00680077006300740072006c002d00700061007200610
6d0073002d00760065007200730069006f006e00000008000000000000021c000000640065007600
900630065005f0074007900700065000000100000004e5644412c4765466f7263650e0000006e006
006d00650000000f0000004e5644412c506172656e7422000000400030002c006400650076006900
30065005f00740079007000650000000b000000646973706c6179100000006d006f00640065006c0
00001e0000004e5649444941204765466f7263652037363030204754204546492200000040003100
c006400650076006900630065005f00740079007000650000000b000000646973706c61791200000
400032002c007200650067000000080000000000000222000000400032002c006400650076006900
30065005f0074007900700065000000120000004e5644412c6770752d64696f64652000000040003
002c0063006f006d00700061007400690062006c0065000000160000004e5644412c73656e736f72
d706172656e7422000000400032002c002300730069007a0065002d00630065006c006c007300000
080000000000000020000000400031002c0063006f006d00700061007400690062006c0065000000
e0000004e5644412c4e564d616314000000400030002c006e0061006d0065000000120000004e564
412c446973706c61792d413a000000400032002c0068007700730065006e0073006f0072002d0070
06100720061006d0073002d00760065007200730069006f006e00000008000000000000022600000
400032002c0023006100640072006500730073002d00630065006c006c0073000000080000000000
00114000000400031002c006e0061006d0065000000120000004e5644412c446973706c61792d422
000000400030002c0063006f006d00700061007400690062006c00650000000e0000004e5644412c
e564d61631e00000072006f006d002d007200650076006900730069006f006e00000008000000333
3232100000004e00560043004100500000001800000004000000000003000c000000000000070000
0000e0000004e00560050004d0000002000000001000000000000000000000000000000000000000
00000000000000

 

Ad esempio ecco il file com.Apple.Boot.plist prima della modifica:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Kernel</key>
<string>mach_kernel</string>
<key>Kernel Flags</key>
<string></string>
</dict>
</plist>

 

Per aggiungere la stringa aggiungi una nuova key chiamate "device-properties" al file come nell'esempio seguente:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Kernel</key>
<string>mach_kernel</string>
<key>Kernel Flags</key>
<string></string>
<key>device-properties</key>
<string>c50400000100000002000000230100000700000002010c00d0...</string>
</dict>
</plist>

 

Nota: non si può editare il com.Apple.Boot.plist nella cartella in cui è situato se non via terminale. Se volete usare Textedit o altro, modificate il file nel dekstop e rimpiazzatelo.

 

Perche usare queste "strings"?

1) Non dipendere da injectors vari, ma solo dalle presenza o meno di driver.

2) Rendere il PC più simile ad un Mac.

3) Tutto l'hardware che vi interessa (sino a 4 periferiche) sarà caricato in un solo file (in caso di rispistino basta backapparlo)

 

Devo sapere altro?

Si possono inserire indicare sino a 4 periferiche al "Device Tree".

Ad esempio: Video, Audio, Ethernet, Controller SATA (ICH8R), IDE (JMicron) ecc...

Il file com.Apple.Boot.plist non può avere dimensioni superiori a 16384 Byte.

Prossimamente le "strings" saranno indicate anche come "HEX String" e avranno estensione .hex.

Scaricatevi questo programma (l'ultima versione) da link http://forum.netkas.org/index.php/topic,64.0.html, vi servirà per convertire i file plist in hex e viceversa.

Consiglio anche in installarvi Xcode 3.0 per avere maggiori strumenti anche visuali per effettuare le modifiche e leggere il "Device Tree".

 

Prosegue.

Link to comment
Share on other sites

EFI string per il video

 

Il metodo che vi consiglio è di non usare file hex già fatti ma di ricavarvi il vostro in modo da personalizzarvi il file plist che vi creerete, potendo aggiungere o eliminando periferiche ecc...

 

Per fare ciò installate un injector video (quello che ritenete migliore per la vostra sk video, es: vi da il dual monitor ecc...).

 

1) Create un file template.plist usando questo modello (è quello di una 7600GS ma il discorso non cambia):

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PciRoot(0x1)/Pci(0x1,0x0)/Pci(0x0,0x0)</key>
<dict>
	<key>@0,compatible</key>
	<string>NVDA,NVMac</string>
	<key>@0,device_type</key>
	<string>display</string>
	<key>@0,name</key>
	<string>NVDA,Display-A</string>
	<key>@1,compatible</key>
	<string>NVDA,NVMac</string>
	<key>@1,device_type</key>
	<string>display</string>
	<key>@1,name</key>
	<string>NVDA,Display-B</string>
	<key>@2,#adress-cells</key>
	<string>0x01000000</string>
	<key>@2,#size-cells</key>
	<string>0x00000000</string>
	<key>@2,compatible</key>
	<string>NVDA,sensor-parent</string>
	<key>@2,device_type</key>
	<string>NVDA,gpu-diode</string>
	<key>@2,hwctrl-params-version</key>
	<string>0x02000000</string>
	<key>@2,hwsensor-params-version</key>
	<string>0x02000000</string>
	<key>@2,name</key>
	<string>sensor-parent</string>
	<key>@2,reg</key>
	<string>0x02000000</string>
	<key>NVCAP</key>
	<data>
	BAAAAAAAAwAMAAAAAAAABwAAAAA=
	</data>
	<key>NVPM</key>
	<data>
	AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
	</data>
	<key>device_type</key>
	<string>NVDA,GeForce</string>
	<key>model</key>
	<string>NVIDIA GeForce 7600 GS</string>
	<key>name</key>
	<string>NVDA,Parent</string>
	<key>rom-revision</key>
	<string>0x32323033</string>
</dict>
</dict>
</plist>

 

2) Ora avete bisogno di trovare il devicepath della vostra sk video: usate il seguente comando

 

./gfxutil -f display

 

L'output sarà qualcosa di simile:

 

DevicePath = PciRoot(0x0)/Pci(0x1,0x0)Pci(0x0,0x0)

 

3) Inserite il vostro devicepath tra le due stringhe <key> nel file plist.

 

Avviate Console in Applicazioni > Utilities

 

Cliccate su mostra lista log evidenziando system.log

 

Nel campo cerca scrivete NVinject o ATIinject o Natit o Titan (dipende da quale injector usate) e modificate il file plist con i dati che vi appaiono (potete sia aggiungere voci che rimuoverne).

L'effetto del template sarà più simile a quello dell'injector quanto più i dati indicati saranno uguali.

 

4) Convertite il file template.plist in hex così:

 

./gfxutil -i xml -o hex template.plist template.hex

 

5) Aggiungete il contenuto del file template.hex al file com.Apple.Boot.plist come indicato nell'introduzione avendo cura di rimuovere qualsiasi ritorno a capo.

 

6) Rimuovete l'injector video utilizzato e pulite la cache

 

sudo rm -rf /System/Library/Extensions.mkext
sudo kextcache -k /System/Library/Extensions

 

7) Riavviate e buona fortuna

 

Se il risultato non fosse quello apprezzato con l'injector, assicuratevi di avere dati uguali tra quelli mostrati nel system.log con l'injector e quelli inseriti nel file plist.

Link to comment
Share on other sites

EFI per l'audio

 

Per tutti coloro che usano AppleAzalia in discorso è semplicissimo, basta effettuare le modifiche o aggiunte al file template plist e si può eliminare la kext AppleAzalia).

Per chi usa un AppleHDA patchata da Taruga deve mantenere almeno per ora la kext patchata, dato che non si sa come inserire i dati di configurazione nel file template, ma si può eliminare l'injector ALCinject.

 

Per chi ha già una stringa per il video

 

aprite il template.plist ed aggiungete

 

...
...
     <key>rom-revision</key>
     <string>0x32323033</string>
  </dict>

<key>PciRoot(0x1)/Pci(0x1b,0x0)</key>
  <dict>
     <key>PinConfigurations</key>
     <string></string>
     <key>built-in</key>
     <string>0x00</string>
     <key>layout-id</key>
     <string>0x0000000c</string>
     <key>revision-id</key>
     <string>0x00000001</string>
     <key>subsystem-id</key>
     <string>0x0000a002</string>
     <key>subsystem-vendor-id</key>
     <string>0x00001458</string>
     <key>vendor-id</key>
     <string>0x00008086</string>
  </dict>

</dict>
</plist>

 

Per chi non ha una stringa video createvi il seguente file:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PciRoot(0x1)/Pci(0x1b,0x0)</key>
  <dict>
     <key>PinConfigurations</key>
     <string></string>
     <key>built-in</key>
     <string>[b]0x00[/b]</string>
     <key>layout-id</key>
     <string>[b]0x0000000c[/b]</string>
     <key>revision-id</key>
     <string>[b]0x00000001[/b]</string>
     <key>subsystem-id</key>
     <string>[b]0x0000a002[/b]</string>
     <key>subsystem-vendor-id</key>
     <string>[b]0x00001458[/b]</string>
     <key>vendor-id</key>
     <string>[b]0x00008086[/b]</string>
  </dict>
</dict>
</plist>

 

Per tutti e due i casi continuate così:

 

1) Ottenete il devicepath della vostra sk audio così:

 

./gfxutil -f AZAL

 

2) Avviate IORegistryExplorer (xcode tools) e navigate sino al nodo AZAL.

 

Modificate il template modificando i valori in grassetto con quello mostrati nel lato destro del IORegistryExplorer.

Nota bene: i dati del tipo <d8 27 00 00> vanno convertiti in 0x000027d8, ciò si ottione aggiungendo 0x all'inizio e leggendo i dati da destra a sinistra.

 

3) Salvate e create il file hex.

 

4) Inserite i file hex nel com.Apple.Boot.plist.

 

5) Cancellate gli injector AppleAzaliaAudio.kext, ALCinject.kext, ...

 

6) Cancellate e ricreate la cache e riavviate.

 

Se non avate Azalia (AZAL) cercate la vostra sk audio con IORegistryExplorer.

In questo caso una volta individuate date il seguente comando per trovare il devicepath:

 

./gfxutil -f <name>

 

dove <name> stà per la vostra sk audio.

 

Se la sk audio ha questo formato qualcosa@xxxx rimuovete la chiocciola e tutto quello che segue, ad esempio la mi sk audio è AZAL@1b, il comando che darò sarà

./gfxutil -f AZAL

.

 

Spero di essere stato utile e chiaro.

 

Continuerò con i controller SATA E Jmicron dopo che li avro testai ampiamente.

Link to comment
Share on other sites

scusa la domanda, ma a che servono di preciso?? cioè mi spiego, avendo gli injector, i driver li carica comunque... quando "mettiamo gli injector" nel com.apple.boot.plist e li eliminiamo, che privilegi abbiamo?? certo, teoricamente potremmo fare andare anche la (per esempio) intel 3945 wireless, ma non avendo gli injectors da dove copiare le stringe esadecimali, non possiamo fare comunque niente...

E' giusto quello che dico??

Link to comment
Share on other sites

Piccola nota.

Forse mi sbaglio , ma il limite a 4 periferiche non mi torna molto, in realtà , il limite è dato dalla dimensione del file in questione che so di essere di 64kb , quindi in teoria riguarda la lunghezza di stringa , alcuni potranno avere strighe piu corte e inserire piu devices..

Link to comment
Share on other sites

scusa la domanda, ma a che servono di preciso?? cioè mi spiego, avendo gli injector, i driver li carica comunque... quando "mettiamo gli injector" nel com.apple.boot.plist e li eliminiamo, che privilegi abbiamo?? certo, teoricamente potremmo fare andare anche la (per esempio) intel 3945 wireless, ma non avendo gli injectors da dove copiare le stringe esadecimali, non possiamo fare comunque niente...

E' giusto quello che dico??

 

 

c'è nessuno che mi sa dire se è giusto e l'utilita delle strighe efi?

Link to comment
Share on other sites

scusa la domanda, ma a che servono di preciso?? cioè mi spiego, avendo gli injector, i driver li carica comunque... quando "mettiamo gli injector" nel com.apple.boot.plist e li eliminiamo, che privilegi abbiamo?? certo, teoricamente potremmo fare andare anche la (per esempio) intel 3945 wireless, ma non avendo gli injectors da dove copiare le stringe esadecimali, non possiamo fare comunque niente...

E' giusto quello che dico??

 

Il non avere gli injectors non è un qualcosa di inutile, ma nel mio caso ad esempio (HP dv9585el) qualsiasi injector non vedeva la 8600gs (M???) e se la vedeva no QE ne CI. Con la gfx string io ho risolto editandola a manima, e inserendo gli approppriati ven e dev id nei kext necessari. Quindi come in Mac.

Ciao.

Link to comment
Share on other sites

conosco quel portatile, lo volevo anche io, solo che alla fine ho preso quello che ho in firma perchè è un 15" (io volevo il 17", ma mi hanno dovuto deconvincere perchè per l'università non andava bene...)

gli nvinject non te la vedevano la 8600M GS? da me funziona alla grande la 8400M GS, anche se non mi dice system information il tipo di scheda... per il resto c'ho tutto abilitato... e poi, scusa, non bastava che inserivi il tuo ven id e dev id negli nvinject? non sarebbe funzionato lo stesso?

 

PS: a mia mi parino inutili 'sti strighne (cu è sicilianu un ci pienza chiu assai ri ru vote...)

Link to comment
Share on other sites

  • 1 month later...

scusate io sono profano, da quello che ho capito, emulare l'efi da la possibilità di far funzionare le periferiche che abbiamo, non nserendo nuove estenzioni del kernel apposite per le nostre periferiche, ma andando a modificare dei dati in un preciso file, in cui fino ad un certo limite, sarà lui (stò file) a garantire il funzionamento delle periferiche.

 

Ma oltre a questo, stringhe delle periferiche a parte, quali altri vantaggi ci sono ad emulare questo benedetto efi?

Link to comment
Share on other sites

che gira il kernel originale su sistema originale (o quasi...), anche se gli aggiornamenti non li puoi fare direttamente poichè crea alcuni file di default ed altri che bloccano il pc per la cpu (se la cpu non è hpet...)

 

ciao!

Link to comment
Share on other sites

babyporch, perdonami ma sto uscendo pazzo, ho un toshiba u300 con x3100, con efi e kets base funziona qe/qi ma solo se tengo collegato il monitor esterno, se lo stacco scompare lo schermo fino a che non reinserisco la vga. Se installo i kext di paulicat parte leo e rimane schermata blu sui due monitor, parte solo in -x.

 

secondo me leo vede con la porta vga il mio philips lcd come primario, infatti se vado sul informazioni mac e su grafica monitor mi dice monitor philips e collegamento esterno assente.

 

c'e' il modo o una stringa da modificare per rendere il monitor interno principale?

 

ciao e grazie.

Link to comment
Share on other sites

  • 2 weeks later...
  • 10 months later...

Ragazzi c'è qualcuno che mi consiglia su come installare la stringa ethernet per far funzionare time machine?

Vi spiego il problema:l'unico modo per far funzionare time machine è quello di inserire tramite efi studio la stringa ethernet.

Il problema è che quando lo faccio mi si cancella dal boot.plist la stringa video e così mi funziona time machine ma non la scheda video.

Non c'è un modo per mettere sia la stringa video e sia la stringa ethernet nel boot.plist?

Grazie.

Link to comment
Share on other sites

Ragazzi c'� qualcuno che mi consiglia su come installare la stringa ethernet per far funzionare time machine?

Vi spiego il problema:l'unico modo per far funzionare time machine � quello di inserire tramite efi studio la stringa ethernet.

Il problema � che quando lo faccio mi si cancella dal boot.plist la stringa video e cos� mi funziona time machine ma non la scheda video.

Non c'� un modo per mettere sia la stringa video e sia la stringa ethernet nel boot.plist?

Grazie.

 

Con osx86tools c'è una funzione per le efi strings. Una volta dentro questa scheda c'è un pannello "merge" dove importando le due stringhe, le unisce in un'unica EFI string. Non l'ho provato e non so se servono le pist o i file hex già convertiti in ogni caso fai tutto con pochi click.

Link to comment
Share on other sites

  • 2 weeks later...

ho riletto mille volte questa guida, e complimenti veramente.

 

una domanda di cui intuisco appena la risposta, ma per FARE CHIAREZZA anche a chi come me è incerto.

 

edit

 

Non capisco quale limitazione ha questo metodo... posso farmi una hex string di una scheda che non c'è per esempio nel wiki ?

Link to comment
Share on other sites

  • 3 months later...
 Share

×
×
  • Create New...