DSDT 패치 문의드립니다.(Statement is unreachable)
- asd
- 745
- 7
asd님의 기기정보
추가사양 및 설치(할)OS | 10.12.6 |
---|---|
공지숙지/증상설명 | 숙지 |
항상 감사드립니다.
집의 데탑의 커맥의 어느정도 궤도에 오름으로 해서
회사 데탑도 커맥을 시도 중입니다.
DSDT컴파일 중 다음 에러에 대해 문의 드립니다.
오류구문 : Statement is unreachable
아래 내용 중 If (LEqual (Arg0, ToUUID ("1730e71d-e5dd-4a34-be57-4d76b6a2fe37"))) 라인에서 오류가 발생합니다.
다른 팁글에서는 store 명령어를 쓰시던데, 이 경우는 다른 구문으로 보여집니다.
어떻게 처리해야 할지 조언 부탁드립니다.
=============================
Scope (_SB.PCI0)
{
Device (HECI)
{
Name (_ADR, 0x00160000) // _ADR: Address
Method (_DSM, 4, Serialized) // _DSM: Device-Specific Method
{
Name (_T_0, Zero) // _T_x: Emitted by ASL Compiler
If (PCIC (Arg0))
{
Return (PCID (Arg0, Arg1, Arg2, Arg3))
}
Return (Buffer (One)
{
0x00
})
If (LEqual (Arg0, ToUUID ("1730e71d-e5dd-4a34-be57-4d76b6a2fe37")))
{
If (LEqual (Arg2, Zero))
{
If (LEqual (Arg1, Zero))
{
Return (Buffer (One)
{
0x03
})
}
Else
{
Return (Zero)
}
}
If (LEqual (Arg2, One))
{
While (One)
{
Store (ToInteger (DerefOf (Index (Arg3, Zero))), _T_0)
If (LEqual (_T_0, Zero)) {}
ElseIf (LEqual (_T_0, One))
{
If (CondRefOf (\_SB.SLPB))
{
Notify (SLPB, 0x80)
P8XH (Zero, 0x5D)
}
}
ElseIf (LEqual (_T_0, 0x02)) {}
ElseIf (LEqual (_T_0, 0x03)) {}
Break
}
Return (Zero)
}
Else
{
Return (Zero)
}
}
Else
{
Return (Buffer (One)
{
0x00
})
}
}
}
}
==================
asd
댓글 7
먼저 감사의 말씀을 드립니다.
1번은 Device (HECI) 구문의 마지막 } 앞쪽에 넣었는데 안됐구요.
2번은 현재 위치가 어디를 말씀하시는 건지 모르겠습니다. 빨간 줄 부분이라면 마지막에 else로 끝나는것 같습니다만..
이렇게 해 보십시오..
{
Name (_ADR, 0x00160000) // _ADR: Address
Method (_DSM, 4, Serialized) // _DSM: Device-Specific Method
{
Name (_T_0, Zero) // _T_x: Emitted by ASL Compiler
If (PCIC (Arg0))
{
Return (PCID (Arg0, Arg1, Arg2, Arg3))
}
If (LEqual (Arg0, ToUUID ("1730e71d-e5dd-4a34-be57-4d76b6a2fe37")))
{
If (LEqual (Arg2, Zero))
{
If (LEqual (Arg1, Zero))
{
Return (Buffer (One)
{
0x03
})
}
Else
{
Return (Zero)
}
}
If (LEqual (Arg2, One))
{
While (One)
{
Store (ToInteger (DerefOf (Index (Arg3, Zero))), _T_0)
If (LEqual (_T_0, Zero)) {}
ElseIf (LEqual (_T_0, One))
{
If (CondRefOf (\_SB.SLPB))
{
Notify (SLPB, 0x80)
P8XH (Zero, 0x5D)
}
}
ElseIf (LEqual (_T_0, 0x02)) {}
ElseIf (LEqual (_T_0, 0x03)) {}
Break
}
Return (Zero)
}
Else
{
Return (Zero)
}
}
Else
{
Return (Buffer (One)
{
0x00
})
}
Return (Buffer (One)
{
0x00
})
}
}
두번째는 이렇게..
{
Name (_ADR, 0x00160000) // _ADR: Address
Method (_DSM, 4, Serialized) // _DSM: Device-Specific Method
{
Name (_T_0, Zero) // _T_x: Emitted by ASL Compiler
If (PCIC (Arg0))
{
Return (PCID (Arg0, Arg1, Arg2, Arg3))
}
else {
Return (Buffer (One)
{
0x00
})
}
If (LEqual (Arg0, ToUUID ("1730e71d-e5dd-4a34-be57-4d76b6a2fe37")))
{
If (LEqual (Arg2, Zero))
{
If (LEqual (Arg1, Zero))
{
Return (Buffer (One)
{
0x03
})
}
Else
{
Return (Zero)
}
}
If (LEqual (Arg2, One))
{
While (One)
{
Store (ToInteger (DerefOf (Index (Arg3, Zero))), _T_0)
If (LEqual (_T_0, Zero)) {}
ElseIf (LEqual (_T_0, One))
{
If (CondRefOf (\_SB.SLPB))
{
Notify (SLPB, 0x80)
P8XH (Zero, 0x5D)
}
}
ElseIf (LEqual (_T_0, 0x02)) {}
ElseIf (LEqual (_T_0, 0x03)) {}
Break
}
Return (Zero)
}
Else
{
Return (Zero)
}
}
Else
{
Return (Buffer (One)
{
0x00
})
}
}
}
감사합니다. 둘다 에러는 없어졌습니다.
첫번째 방법이 더 좋은 방법일까요?
수정하기는 두번째 것이 동일위치를 수정하는 것이라 더 간단해 지는것 같습니다.
Device (HECI)가 해당되는 디바이스가 무엇인지는 모르겟지만 제가 생각하기에는 첫번째가 나을듯 해 보입니다. 이유는 if 문에 해당 되는 경우가 없을경우 return되는 값이 생기는 거니까요.. _DSM이 argument가 4개인데 언급되어 있는경우는 arg0,arg1,arg2만 존재하고 각각에 해당되는 경우만 리턴값이 달라지고 있습니다. arg3가 보이기는 한데 index를 사용하는것을 보니 다른 argument들 처럼 직접 값을 access하지 않는것처럼 생각 됩니다. 해당되지 않는경우도 생각을 해보아야 할듯 하군요.. Notify (SLPB, 0x80)이 있는것을 보니 Device (EC) : Embedded Controller에 관계된 power management 처럼 보입니다.
정말 감사합니다.
단순히 아래처럼 첫번째 if문에서 최초에 있던 Return (Buffer (One) 구문만 삭제 했는데도 컴파일 에러는 없어졌습니다.
그래도 님께서 알려주신 방법대로 마지막에 리턴구문을 주는게 좋겠죠?
아래는 리턴 구문을 삭제만 한 경우
==================
Scope (_SB.PCI0)
{
Device (HECI)
{
Name (_ADR, 0x00160000) // _ADR: Address
Method (_DSM, 4, Serialized) // _DSM: Device-Specific Method
{
Name (_T_0, Zero) // _T_x: Emitted by ASL Compiler
If (PCIC (Arg0))
{
Return (PCID (Arg0, Arg1, Arg2, Arg3))
}
If (LEqual (Arg0, ToUUID ("1730e71d-e5dd-4a34-be57-4d76b6a2fe37")))
.....
마지막에 리턴구문 추가하지 않음.
에러를 없애는 방법은 여러가지가 있습니다. 삭제하고 사용하시는데 문제가 없다면 괜찮은 것이겠지요.. 정답은 없습니다. dsdt수정은 일단 문법에 따르는 것이니까요.. 도움이 되었다니 다행입니다.
두가지 방법이 있는것 처럼 보입니다.
1. Device (HECI) 의 코드 같아 보이는데 중간에 보이는 이코드를 Device (HECI)의 마지막 부분에 넣어 보십시오..
{
0x00
})
2. 위의 코드를 현재 있는 위치에서 if .. else 구문으로 하는것입니다.
Return (Buffer (One)
{
0x00
})
}
두가지 모두 워닝을 없앨수 있는데 첫번째것이 옳을것 같아 보입니다. 첫번째 if 문이 끝나고 return해 버리니 그 이후로는 있을필요가 없겠지요.