질문 SSDT 패치 작업중
- 윈맥크로
- 2336
- 23
윈맥크로님의 기기정보
질문용 시스템 사양 | 1번 |
---|---|
추가사양 및 설치(할)OS | 소노마 |
공지숙지/증상설명 | 숙지 |
기존에 DSDT로 베터리 패치했던 것을 SSDT로 옮기는 작업을 하는중 컴파일을 돌려보니 이런 애러가 뜨는데
178, 6126, syntax error
185, 6126, syntax error and premature End-Of-File
해당 부분을 보면
아무 문제 없어 보입니다.
작업도중이라 External은 안한상태입니다.
현재 적용중인 DSDT도 같이 올립니다..
윈맥크로
댓글 23
Scope 는 범위라는 뜻이며, Scope 의 소괄호 ( ) 안에는 특정 Object 의 이름 및 경로가 들어갑니다.
Scope 는 주로 해당 Scope 의 경로에 내용을 추가할 때 사용하며, 새로 만드는(정의하는) 기능이 아닙니다.
즉, Scope 구문의 소괄호 ( ) 안에 들어간 Object 는 외부에서 참조하는 경우 반드시 External References 가 선언되어 있어야 합니다.
macOS 가 부팅될 때 DSDT 와 SSDT 를 모두 로드하는데 최종적으로 DSDT 와 여러 SSDT 의 내용들이 합쳐집니다.
그러면, 예를 들어 DSDT 에는 \_SB.PCI0 경로에 LPCB Device 가 정의되어 있고
다른 SSDT 에서는 Scope (_SB.PCI0.LPCB) 구문이 있으면 그 구문의 중괄호 { } 안의 내용은
실질적으로 LPCB Device 가 정의되어 있는 DSDT 의 LPCB Device 하위로 내용이 추가됩니다.
즉, Scope 는 추가하려는 Device, Method, 그 외 나머지 일반적인 연산자를 사용한 코드 구문 등을
어느 경로 또는 어느 경로의 Object 에 추가할지 명시해주는 역할을 합니다.
그리고, Scope 를 명시하지 않고 새로 Method 를 정의하여 만들면 최상단 \ (Root) Scope 에 정의되는 것으로 알고 있습니다.
Offset 주소값을 계산하는 방법은 질문자님의 DSDT 를 예로 들면
Offset (0x9C),
SCAI, 8, // 0x9C
CSMF, 8, // 0x9D
CSST, 8, // 0x9E
EPTS, 8, // 0x9F
B1RR, 32, // 0xA0
위의 코드에서 B1RR 을 8 Bit 로 세분화하고 SSDT 로 가져오면 아래와 같습니다.
Offset (0xA0),
BRR0, 8,
BRR1, 8,
BRR2, 8,
BRR3, 8,
8 Bit = 1 Byte 이며, Offset 값은 16진수(Hex)이고 8 Bit 당 하나씩 세면 됩니다.
만약, EPTS 변수가 8 Bit 가 아닌 16 Bit 였다면 B1RR 의 Offset 주소값은 0xA1 이 됩니다.
아래의 글을 참고해보세요.
삼성 노트북이라서 배터리 관련 변수가 거의 비슷할 것입니다.
단, 배터리 패치 내용이 완전히 동일하다고 보장할 수는 없습니다.
다행히도 거의 모든 부분이 똑같고 QPTS메소드가 제 DSDT에선 PPTS로 사용되는것을 보고 이부분만 바꾸었습니다.
그런데 문제가 발생했네요 큐
문제의 원인이 혹시 이거일까요? 아마도 제 생각엔 현재 DSDT에 오류가 많은것을 보아 Rename 패치가 제대로 적용이 안된듯 싶습니다...SSDT-BATT.aml.zip config.plist.zip
원본 DSDT상에 있던 오류와 GPRW가 들어간 모든 구문이 에러가 새로 뜹니다... 보니까 SSDT-FNBL는 잘 작동되던데 베터리 패치된 DSDT와 비교해보니 ECR도 변경안되있었습니다. _Q66 to _X66 패치는 dsdt에서 변경되었지만 다른 부분은 패치가 안되있는것을 확인했습니다. 이런 경우 무엇이 문제일까요..?
ACPI Rename 패치를 적용할 때 기존의 OEM DSDT 에서 Method 원형 정의 구문의 이름만 바뀌도록 패치해야 합니다.
그래야, 그 Method 를 Call(호출)하는 부분의 코드가 SSDT 에 패치하여 넣은 Method 의 내용을 수행합니다.
물론, _Q66 Method 등의 경우에는 EC Query 이므로 다른 부분에서 _Q66 Method 를 직접 호출하는 부분이 없기 때문에 뒤에 추가적인 Hex 값을 지정하지 않아도 됩니다.
하지만, SBIX, PPTS, PWAK Method 는 이를 다른 부분에서 Call(호출)하는 부분이 있습니다.
_BIF & _BIX Method 에서 SBIX Method 를 Call(호출)하는 부분이 있습니다.
위의 사진에 있는 SBIX () 는 XBIX () 로 이름이 바뀌면 안 됩니다.
아래의 사진에 있는 SBIX Method 를 정의하는 구문의 SBIX 이름만 XBIX 로 바뀌어야 합니다.
그래야, _BIF & _BIX Method 에서 SBIX () 와 같이 SBIX Method 를 Call(호출)하면
DSDT 에 있는 이름이 바뀐 XBIX Method 가 아닌 SSDT 에 배터리 패치한 SBIX Method 가 Call(호출)되는 것입니다.
이러한 방식이 Hot Patch 방식의 ACPI 패치입니다.
아래의 3개의 ACPI Rename 패치를 Method 원형 정의 구문의 이름만 바뀌도록 뒤에 더 값을 추가해주세요.
- Rename method SBIX to XBIX
- Rename method PPTS to XPTS
- Rename method PWAK to XWAK
SBIX to XBIX 패치를 예로 들면
Find : 53424958
Replace : 58424958
이 아니라
Find : 53424958 08
Replace : 58424958 08
로 수정해야 한다는 의미입니다.
그래야, _BIF & _BIX Method 에서 SBIX () 는 이름이 바뀌지 않고 DSDT 에 있는 SBIX Method 원형 정의 구문의 이름만 바뀝니다.
뒤에 입력하는 값이 08 인지 어떻게 아는지는 DSDT.aml 을 iasl 바이너리 파일로
터미널에서 -l 옵션을 사용하여 Byte Code Listing 으로 디컴파일하고 열면 확인할 수 있습니다.
이 내용도 위의 댓글에서 제가 드린 ACPI Hot Patch 강좌글에 설명되어 있습니다.
근데 궁금증이 있습니다.
Method (PWAK, 1, NotSerialized)
{
If (_OSI ("Darwin"))
{
If ((Arg0 == 0x03))
{
If ((\RELT == 0xBA))
{
Notify (\_SB.PWRB, 0x02) // Device Wake
}
}
If ((Arg0 == 0x04))
{
Notify (\_SB.PWRB, 0x02) // Device Wake
}
If ((\_SB.PCI0.LPCB.H_EC.ACEX != \PWRS))
{
\PWRS = \_SB.PCI0.LPCB.H_EC.ACEX /* External reference */
\CCRN ()
}
If (((Arg0 == 0x03) || (Arg0 == 0x04)))
{
Local0 = One
}
If ((Local0 != \LIDS))
{
\LIDS = Local0
If (\IGDS)
{
If ((\LIDS == Zero))
{
\_SB.PCI0.GFX0.CLID = 0x80000000
}
If ((\LIDS == One))
{
\_SB.PCI0.GFX0.CLID = 0x80000003
}
}
Notify (\_SB.LID0, 0x80) // Status Change
}
Local0 = B1B4 (\_SB.PCI0.LPCB.H_EC.BAF0, \_SB.PCI0.LPCB.H_EC.BAF1, \_SB.PCI0.LPCB.H_EC.BAF2, \_SB.PCI0.LPCB.H_EC.BAF3)
Local0 >>= 0x10
Local0 &= 0xFFFF
If ((Local0 != \BFCC))
{
Notify (\_SB.PCI0.LPCB.H_EC.BAT1, One) // Device Check
Notify (\_SB.PCI0.LPCB.H_EC.BAT1, 0x81) // Information Change
}
If ((\SDCK != \_SB.PCI0.LPCB.H_EC.DCBE))
{
\SDCK = \_SB.PCI0.LPCB.H_EC.DCBE /* External reference */
}
\_SB.PCI0.LPCB.H_EC.TUBI = Zero
\_SB.PCI0.LPCB.H_EC.TZCH (\_SB.PCI0.LPCB.H_EC.TIST)
Local0 = \_SB.GPC0 (0x04010004)
Local1 = (Local0 & 0xFFFFFEFE)
\_SB.SPC0 (0x04010004, Local1)
Sleep (0x32)
\_SB.SPC0 (0x04010004, Local0)
\D8XH (Zero, 0xAC)
}
Else
{
\_SB.XPTS (Arg0)
}
}
}
이 구문에서 PWAK 를 왜 XPTS 로 바꿔야 하나요? 다른 부분은 PPTS 는 XPTS 이런데 그러면 저 부분도 PWAK 를 XWAK로 해야하는거 아닌가요?
DSDT상에서 ECR이 바뀌지 않는게 정상인가요?
rename ppts xpts, pwak xwak 패치가 적용안되있고 결정적으로 B1B2, B1B4메소드가 추가가 안되어 있습니다..
PWAK Method 에서 하단의 Else 문 부분을 말씀하시는 것이라면 \_SB.XWAK (Arg0) 가 맞습니다.
또한, B1B2, B1B4 Method 는 SSDT 에 넣어져 있긴 하지만,
macOS 가 부팅되는 과정에서 합쳐져서 로드 및 인식만 되고
원래, 부팅 후에 MaciASL 로 DSDT 를 열어서 볼 때에는 합쳐져 있지 않습니다.
macOS 로 부팅한 경우에는 SSDT 에 배터리 패치된 XCR EmbeddedControl Region 을 사용하고
Windows 등의 다른 OS 로 부팅한 경우에는 기존의 DSDT 에 있는 ECR EmbeddedControl Region 이 사용됩니다.
여기에서는 68을 패치할때 붙여야 해야하는 건가요?
50505453 68이거를 text로 변환하면 PPTSh 이렇게 되던데,,
50505453 68 이 아닌
50505453 01 입니다.
50505453 바로 오른쪽에 있는 01 을 붙여야합니다.
Method (PPTS, 오른쪽에 숫자 1 보이시나요?
이 숫자 1은 PPTS Method 를 Call(호출) 할 때 필요한 매개 변수(인수)의 개수를 의미합니다.
이 숫자 1이 댓글의 사진에서는 50505453 바로 오른쪽에 있는 01 이고
01 까지 포함시켜서 ACPI Rename 패치를 해야 PPTS Method 원형 정의 구문의 이름만 바뀝니다.
컴파일하여 저장한 확장자가 .aml 인 파일은 ACPI 코드가 일대일로 특정 Hex 값과 순서대로 매칭되어 있습니다.
마치, 약간 어셈블리어랑 비슷한 느낌입니다.
하지만, 디컴파일해서 보면 또 어셈블리어와 같은 저급 언어보다는 C언어와 비슷한 프로그래밍 언어처럼 보이기도 합니다.
그런거였군요.. 01을 적용하고 재부팅하니 배터리 표시 되네요. 정말 감사해욤.
(XWAK은 01로 얻어 걸렸걸렸었네요ㅋㅋ)
DSDT 에러는 딱히 안잡아도 되나요?
SSDT패치하면서 문제가 생긴건지
오픈코어 부트로더로 윈도우 부팅하면 블루스크린이 나타나네요. SSDT-OSYS.aml 사용중인데,,
MaciASL 자체의 버그로 인한 Error 는 수정하지 않아도 되며
Error 가 아닌 Warning 도 수정하지 않아도 되고
macOS 를 부팅하는 데에 문제가 없다면 굳이 수정하지 않아도 됩니다.
If (_OSI ("Darwin")) 구문의 Else 구문에서 패치가 잘못된 것이 있는지 확인해주세요.
또한, 다른 SSDT 에서도 ACPI 에서 macOS 와 Windows 에서 수행할 내용이 STA Method 와 If (_OSI ("Darwin")) 구문 등으로 분리되어 있는지 확인해주세요.
이와 관련된 질문글입니다.
ACPI.zip config.plist.zip SSDT 다 확인을 해봤는데 If _OSI("Darwin")구문이 들어가있었습니다. 아마도 이번 베터리 패치하면서 생긴 문제가 아닐까 싶긴합니다만.. 문제점을 찾지는 못했습니다..
syntax error and premature End-Of-File 오류는
어딘가에 여는 중괄호와 닫는 중괄호 { } 의 짝이 안 맞아서 발생하는 것입니다.
1. Scope (_SB.PCI0.LPCB) 에 _DSM Method 가 정의되어 있는데 배터리 패치 SSDT 에는 필요하지 않습니다.
2. Scope (_SB.PCI0.LPCB) 에 Device (H_EC) 를 가져올 필요도 없습니다.
또한, Device (H_EC) 를 그대로 가져온다면 배터리 패치 SSDT 와
기존의 OEM DSDT 에 존재하는 H_EC Device 가 중복되며 ACPI Error 가 발생할 수도 있습니다.
3. ECR 이라는 이름을 가진 EmbeddedControl Region 과 그 하위의 ECR Field 는
배터리 관련 부분에 사용되어 8 Bit 세분화하거나 RECB/WECB 등으로 패치가 필요한 변수만 가져오면 됩니다.
그리고, 패치가 필요한 변수만 가져온 후에는 해당 변수에 맞게 Offset 의 중괄호 ( ) 안의 주소 값을 직접 계산하여 수정해야 하며,
EmbeddedControl Region 과 그 하위의 Field 의 이름을 ECR 이 아닌 XECR 또는 XCR 등의 다른 이름으로 변경해야 합니다.
추가로, 배터리 패치를 하지 않은 원본 상태의 DSDT 와 배터리 패치가 완료된 DSDT 를
DiffMerge 등의 앱으로 비교하여 배터리 패치를 진행하면서 내용이 수정된 Method 등을
그대로 SSDT 에 ACPI Source Language 문법과 중괄호 Scope 범위에 맞게 주의하여 잘 가져옵니다.
그리고, OEM DSDT 의 기존 Method 에 대하여 ACPI Rename 패치를 적용하고
배터리 패치 SSDT 에서는 ACPI Rename 패치를 적용한 Method 를
Else 문에서 Return 하거나 Call(호출)하도록 합니다.
아래의 글을 참고해보세요.
https://x86.co.kr/info/3629426