Error 4045 - ^ Length is larger than Min/Max window
Edytujemy dsdt.dsl i szukamy problematycznego fragmentu:
Kod:
DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
0x00000000, // Granularity
0x02000000, // Range Minimum
0xFFDFFFFF, // Range Maximum
0x00000000, // Translation Offset
0xFDFC0000, // Length
,, _Y06, AddressRangeMemory, TypeStatic)
Sprawdzamy czy Length jest odpowiedni stosując informację ze strony 13 podręcznika iASL:
Cytat:
Validation of values for Resource Descriptors is performed wherever possible.
Address Descriptors: Values for AddressMin, AddressMax, Length, and Granularity are validated:
AddressMax must be greater than or equal to AddressMin
Length must be less than or equal to (Max-Min+1)
If Granularity is non-zero, it must be a power-of-two minus one.
The IsMinFixed and IsMaxFixed parameters are validated against the values given for the
AddressMin, AddressMax, Length, and Granularity. This implements the rules given in Table 6-40
of the ACPI 4.0a specification.
czyli
Length <= Range Maximum- Range Minimum+1
Mi wygodnie pracuje się na Windowsowym kalkulatorze z widokiem dla programistów.
Zgodna wartość to 0xFDE00000 (0xFFDFFFFF-0x02000000+1), więc poprawiamy istniejącą i mamy jeden błąd mniej.
2.
Kod:
Warning 1121 - ResourceTag larger than Field ^ (Tag: 64 bits, Field: 32 bits)
Zaglądamy co linii kodu z błędem i widzimy, że został użyty operator CreateDWordField .Wskazówka z kompilatora wskazuje że Field powinien być 64bits, więc zamieniamy operator CreateDWordField na CreateQWordField.
Dodatkowe informacje na stronie 585 specyfikacji ACPI.
Pozbyliśmy się 6 ostrzeżeń, więc sprawdzamy dalej:
3.
Kod:
Error 4086 - ^ Min/Max/Length/Gran are all zero, but no resource tag
Zaglądamy do naszego pliku i mamy:
Kod:
Name (CRS, ResourceTemplate ()
{
IO (Decode16,
0x0000, // Range Minimum
0x0000, // Range Maximum
0x00, // Alignment
0x00, // Length
_Y16)
IO (Decode16,
0x0000, // Range Minimum
0x0000, // Range Maximum
0x00, // Alignment
0x00, // Length
_Y17)
IO (Decode16,
0x0000, // Range Minimum
0x0000, // Range Maximum
0x00, // Alignment
0x00, // Length
)
IO (Decode16,
0x0000, // Range Minimum
0x0000, // Range Maximum
0x00, // Alignment
0x00, // Length
_Y18)
})
Sprawdzamy w specyfikacji (str. 612) składnię operatora IO
W opisie argumentów znajdujemy, że pole DescriptorName jest opcjonalne, ale możemy także przeczytać w opisie zmian kompilatora, że tą nazwę przydałoby się mieć
Kod:
http://www.acpica.org/download/changes.txt
Cytat:
iASL: Allow certain "null" resource descriptors. Some BIOS code creates
descriptors that are mostly or all zeros, with the expectation that they will
be filled in at runtime. iASL now allows this as long as there is a "resource
tag" (name) associated with the descriptor, which gives the ASL a handle
needed to modify the descriptor. ACPICA BZ 873.
Sprawdzamy jakie nazwy nie były użyte – w omawianym DSDT kolejna wolna to _Y21, więc dopisujemy ją tak aby kod wygląd następująco:
Kod:
Name (CRS, ResourceTemplate ()
{
IO (Decode16,
0x0000, // Range Minimum
0x0000, // Range Maximum
0x00, // Alignment
0x00, // Length
_Y16)
IO (Decode16,
0x0000, // Range Minimum
0x0000, // Range Maximum
0x00, // Alignment
0x00, // Length
_Y17)
IO (Decode16,
0x0000, // Range Minimum
0x0000, // Range Maximum
0x00, // Alignment
0x00, // Length
_Y21)
IO (Decode16,
0x0000, // Range Minimum
0x0000, // Range Maximum
0x00, // Alignment
0x00, // Length
_Y18)
})
4.
Kod:
Warning 1123 - ^ Result is not used, possible operator timeout will be missed
Kod:
Mutex (MUT0, 0x00)
Method (ENFG, 1, NotSerialized)
{
Acquire (MUT0, 0x0FFF)
Store (IOCE, INDX)
Store (IOCE, INDX)
Store (Arg0, LDN)
}
Zaglądamy do specyfikacji -strona 579. Operator Acquire ma w parametrach Mutexa oraz podany w ms timeout. Ustawienie wartości na 0xFFFF powoduje, że operator ma czekać w nieskończoność na dostęp do Mutexa. Ostrzeżenie kompilatora wynika z tego, że nie jest sprawdzana zwracana wartość Asquire, czyli nie sprawdza się czy Aquire zadziałał prawidłowo, czy też nastąpił timeout… Ten drugi przypadek jest gorszy, bo jeśli był timeout, a nigdzie nie było to weryfikowane, to może dojść do równoległego dzielenia zasobu.
Dodatkowo można spojrzeć jak to jest rozwiązane u Apple, zaglądając do dumpów z ich maszyn i tak w przypadku iMaca12,2 w DSDT mamy:
Kod:
Acquire (MUTX, 0xFFFF)
Ok, nie jest to ładne rozwiązanie, ale skoro Apple sie tez nie przejmuje to ostatecznie zmieniamy naszą wartość na 0xFFFF i kolejny warning mniej.
5.
Kod:
Error 4100 - Invalid object type for reserved name ^ (found BUFFER, requires Package)
Ponownie zaglądamy z do specyfikacji ACPI w poszukiwaniu _PLD. Na stronie 203 znajdziemy po co to, a na stronie 362 znajdziemy ładny przykład
Zmieniamy, więc nasz kod na:
Brawo! Nie każdemu chciałoby się grzebać w specyfikacji ACPI, a Ty dokopałeś się do paru fajnych szczegółów. Gratuluję samozaparcia Podejrzewam, że temat przyda się nie tylko posiadaczom tej płyty, bo w/w błędy znaleść można w wielu DSDT MB/laptopów różnych firm.
_________________ Snow Leopard 10.6.8 Retail on Lenovo ThinkPad R61i 8932-FDG - This one is resting in peace now.
Lenovo ThinkPad Edge E420s 4401-6YG | Core i5-2430M | HM65 | Intel HD 3000 | Conexant CX20590 | Realtek RTL8111/8168B | Intel Centrino 1000 Nie licz na prywatne konsultacje via PW/GG! | Piszę poprawnie po polsku! | Precz z dystrybucjami na vanilliowym sprzęcie! ~Hack 'em all!~
iStig Pomógł: 2 razy Dołączył: 17 Sie 2011 Posty: 173
Wysłany: 2011-12-01, 12:17
dzięki lubię być świadomym tego co robię, więc stąd to grzebanie - i tak tego wszystkiego jest tak dużo, że człowiek cały czas jest w lesie
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Nie możesz ściągać załączników na tym forum
Forum użytkowników Mac OS X na PC. Co to jest Hackintosh. Instalacja Mac OS X na PC z płyty Retail. Instalacja i opisy dystrybucji iDeneb, iPC, Kalyway, Leo4ALL, iAtkos.