LINUX.ORG.RU

DSDT, unexpected PARSEOP_IF

 ,


0

1

Доброго времени суток.

Пытаюсь исправить DSDT для своего ноута. В оригинальном виде оно не компилируется вообще, сотни ошибок. По старой привычке закомментировал всё и стал постепенно убирать комментарии, исправляя незначительные ошибки с помощью спецификации ACPI и гугла.

Но наткнулся на ошибку, которая ставит меня в тупик.

Если непосредственно в секции Device присутствует условие If, то компилятор ( iasl -tc dsdt.dsl ) выдаёт ошибку:

dsdt.dsl  4163:                 If (LEqual (STCL, 0x0101))
Error    4096 -                  ^ syntax error, unexpected PARSEOP_IF

В спецификации ACPI не нашёл ничего про область применения If.

Минимальный dsdt.dsl, в котором эта ошибка возникает:

DefinitionBlock ("dsdt.aml", "DSDT", 2, "SECCSD", "LH43STAR", 0x00000000)
{  

    Scope (_SB)
    {
            Device (SATA)
            {  
                If (LEqual (STCL, 0x0101))
                {

                }
            }

    }

}

Комментирую If - сразу собирается без ошибок. Но в оригинальном dsts было именно с if.

ЗЫ. Эта тема ближе хакинтошникам, но на applelife.ru зарегистрироваться не смог - у них сломана регистрация, не отображается капча

★★★★★

Последнее исправление: router (всего исправлений: 1)

Ответ на: комментарий от init_6
root@amalthea:dsdt# cat /sys/firmware/acpi/tables/DSDT > dsdt.dat
root@amalthea:dsdt# iasl -d dsdt.dat 

Intel ACPI Component Architecture
AML Disassembler version 20100528 [Jul  2 2010]
Copyright (c) 2000 - 2010 Intel Corporation
Supports ACPI Specification Revision 4.0a

Loading Acpi table from file dsdt.dat
Acpi table [DSDT] successfully installed and loaded
Pass 1 parse of [DSDT]
Pass 2 parse of [DSDT]
Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)
.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Parsing completed

Found 1 external control methods, reparsing with new information
Pass 1 parse of [DSDT]
Pass 2 parse of [DSDT]
Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)
.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Parsing completed
Disassembly completed, written to "dsdt.dsl"
router ★★★★★
() автор топика
Ответ на: комментарий от init_6

Как раз на то. Обращение к «необъявленным» переменным - багофича компилятора. Закомментируй if и сразу исчезнут ошибки. Я сначала думал скобка где незакрытая, но потом увидел что всё ок и проблема именно в device { if }.

router ★★★★★
() автор топика
Ответ на: комментарий от router
iasl -tc dsdt.dsl;

Intel ACPI Component Architecture
ASL Optimizing Compiler version 20111123-64 [Jan 12 2012]
Copyright (c) 2000 - 2011 Intel Corporation

dsdt.dsl     93:             \_SB.IRQC ()
Error    4084 -                      ^ Object does not exist (\_SB.IRQC)

dsdt.dsl    657:                 LNKA, 
Error    4084 -                     ^ Object does not exist (LNKA)

Первая же ошибка намекает на то что его \_SB.IRQC вообще никто не обьявлял.

init_6 ★★★★★
()
Ответ на: комментарий от router

или можно закомменнтировать закрывающую скобку у if, тогда тоже не будет ошибок про якобы необъявленные имена - останется ругань на PARSEOP_IF. Если закомментировать if вместе с обеими скобками - этой проблемы вообще не будет.

router ★★★★★
() автор топика
Ответ на: комментарий от init_6

Нет. Закомментируй стр. 4163, 4164, 4450 ( т.е. if с обеими скобками ) - и никаких якобы не объявленных имён не останется, только традиционно некорректные границы диапазонов

router ★★★★★
() автор топика
Ответ на: комментарий от router

Почему?

Хороший вопрос :) Наверное потому что обращение к тому чтего еще не объявленно это скажем так несколько… кхм… да

init_6 ★★★★★
()
Ответ на: комментарий от init_6

Раз компилятор не ругается - знатит всё в порядке. Ещё раз - зря ты прицепился к сообщениям о необъявленных именах, это особенность компилятора - наткнулся на ошибку и похоже инвалидировал весь блок. А реальная ошибка - именно PARSEOP_IF . Уверен на 100 %

router ★★★★★
() автор топика

может состав пакета девайс и правда нельзя менять в рантайме, т.е. этот if должен быть в методе или ещё где?

dimon555 ★★★★★
()
Ответ на: комментарий от router

Перенеси Scope (_PR) и Scope (_SB) оттуда куда их засунули сразу после Name (PICM, Zero) в DefinitionBlock

DefinitionBlock ("dsdt.aml", "DSDT", 2, "SECCSD", "LH43STAR", 0x00000000)
{
    External (ALIB, MethodObj)    // 2 Arguments

    Name (SP1O, 0x164E)
    Name (IO1B, 0x0600)
(cut)
    Name (SWCD, 0xB0)
    Name (PICM, Zero)

    Scope (_PR)
    {
        OperationRegion (SSDT, SystemMemory, 0xFFFF0000, 0xFFFF)
(cut)
    }

    Scope (_SB)
    {
        OperationRegion (PIRQ, SystemIO, 0x0C00, 0x02)
    }

Это тебе фикс на все ошибки «Object does not exist»

init_6 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.