Как интерпретировать вызовы SMC от ARM?

Я читал ядро ​​Android, чтобы увидеть, как осуществляется динамическое управление питанием ядер ЦП (также известное как DVFS, DCVS). Код, который я нашел здесь делает несколько вызовов следующей функции (определено здесь), который, в свою очередь, вызывает инструкцию сборки SMC.

У ARM есть документ, объясняющий соглашение о вызовах SMC, но я не смог использовать его, чтобы понять следующую функцию. Как я могу отследить инструкцию SMC, чтобы увидеть, что она на самом деле делает на основе своих входных операндов?

s32 scm_call_atomic4_3(u32 svc, u32 cmd, u32 arg1, u32 arg2,
        u32 arg3, u32 arg4, u32 *ret1, u32 *ret2)
{
    int ret;
    int context_id;
    register u32 r0 asm("r0") = SCM_ATOMIC(svc, cmd, 4);
    register u32 r1 asm("r1") = (u32)&context_id;
    register u32 r2 asm("r2") = arg1;
    register u32 r3 asm("r3") = arg2;
    register u32 r4 asm("r4") = arg3;
    register u32 r5 asm("r5") = arg4;
    asm volatile(
        __asmeq("%0", "r0")
        __asmeq("%1", "r1")
        __asmeq("%2", "r2")
        __asmeq("%3", "r0")
        __asmeq("%4", "r1")
        __asmeq("%5", "r2")
        __asmeq("%6", "r3")
#ifdef REQUIRES_SEC
            ".arch_extension sec\n"
#endif
        "smc    #0  @ switch to secure world\n"
        : "=r" (r0), "=r" (r1), "=r" (r2)
        : "r" (r0), "r" (r1), "r" (r2), "r" (r3), "r" (r4), "r" (r5));
    ret = r0;
    if (ret1)
        *ret1 = r1;
    if (ret2)
        *ret2 = r2;
    return r0;
}
EXPORT_SYMBOL(scm_call_atomic4_3);

person Matt    schedule 18.10.2017    source источник
comment
Что-то вроде это ?   -  person David Wohlferd    schedule 19.10.2017
comment
@DavidWohlferd ссылка объясняет безопасную модель. Меня больше интересует код, который запускается после вызова SMC.   -  person Matt    schedule 19.10.2017
comment
Дело в том, что вызов SMC идет в безопасный мир. Это может иметь совершенно другую карту физической памяти, и существуют разные модели работы программного обеспечения в безопасном мире. Это определенно не обязательно должен быть (и, вероятно, не является) Linux. Обычно это программное обеспечение с закрытым исходным кодом, с которым вы можете получить доступ к двоичному образу, или даже это может быть сложно. Вам, вероятно, придется перепроектировать или поговорить с поставщиком, который создал программное обеспечение для безопасного мира.   -  person artless noise    schedule 20.10.2017


Ответы (1)


соглашения о вызовах SMC предложены ARM о том, как реализовать межмировой API, чтобы несколько поставщиков могли писать код в любом мире и сосуществовать с минимальной несовместимостью. По крайней мере, таково намерение. Поставщик (Android/Linux в вашем случае) не обязан этого делать и, возможно, не сможет этого сделать, если безопасный мир не следует этому.

но я не смог использовать его, чтобы понять следующую функцию

Инструкция SMC представляет собой управляемый переход от обычного мира к защищенному монитору. Монитор имеет собственную таблицу векторов, а запись для svc является вызовом SMC. Регистры — это «общая» информация между мирами. Обычно при переключении мира монитор может выгрузить все регистры в какое-то хранилище контекста. В случае SMC регистр может передавать параметры и возвращать результаты. Это все, что делает эта функция.

register u32 r0 asm("r0") = SCM_ATOMIC(svc, cmd, 4);

Это битовое поле, подобное таблице 2-1 в документе Соглашения о вызовах SMC. Это от обычного мира Linux до безопасного монитора, чтобы сказать, какая функция (и количество аргументов для маршала / сохранения из четырех).

register u32 r2 asm("r2") = arg1;
register u32 r3 asm("r3") = arg2;
register u32 r4 asm("r4") = arg3;
register u32 r5 asm("r5") = arg4;

Если ARM ABI случайно, параметры arg1-arg4 уже будут в этом регистре, поэтому код не будет сгенерирован. Также передается глобальный context_id (в ядро ​​Linux/Android).

Как я могу отследить инструкцию SMC, чтобы увидеть, что она на самом деле делает на основе своих входных операндов?

Для этого вам нужен код в безопасный мир. Я предполагаю, что это какой-то сотовый телефон, базовый диапазон и т. Д., Которые находятся в безопасном мире, и код недоступен. Если у вас есть безопасный мировой код, в таблице векторов монитора будет запись SMC. Это будет иметь переключатель (или если/то), основанный на значении r0 или 'cmd', который выбирает конкретную функцию smc. Общий обработчик smc может восстановить безопасные мировые регистры/контекст, но сохранить четыре аргумента, как указано в r0 битовом поле.

Так что, вероятно, ответ таков: вы не можете отследить, что он делает. Вы должны полагаться на документы поставщика или быть достаточно удачливым, чтобы иметь код для безопасного мира.

person artless noise    schedule 20.10.2017
comment
Возможно, вам повезет, и документ PSCI может быть применимым. Ознакомьтесь с надежной прошивкой ARM с открытым исходным кодом. Я не видел MSM SOC, но, возможно, они используют его на некоторых процессорах (для чтения другими). - person artless noise; 20.10.2017
comment
Спасибо, я посмотрю. Предполагая, что реализация имеет закрытый исходный код, знаете ли вы, где я могу найти двоичный файл в этом дереве исходного кода? android.googlesource.com/ ядро/msm/+/android-5.1.0_r0.6/arch/ - person Matt; 20.10.2017
comment
Его нет даже в исходном дереве. Он будет запрограммирован в устройстве (как чип BIOS). - person artless noise; 20.10.2017