Какие процессоры ARM64 поддерживают инструкцию PACIB?

Я пытаюсь провести несколько тестов с инструкцией PACIB, но похоже, что мой процессор M1 ее не поддерживает (пробую в Windows 11 с Parallels)

У меня есть старый компьютер Snapdragon (Samsumg Galaxy Book S) с Windows, но он тоже его не поддерживает.

Знаете ли вы какой-нибудь современный процессор под управлением Windows 11 ARM64, который может выполнять эту инструкцию, а не просто выполнять ее NOP?

Насколько я обнаружил, инструкция PACIB присутствует в наборе инструкций ARMv8.3. Не уверен, какие процессоры используют этот набор инструкций.

1 ответ

Все ARMv8-совместимые процессоры, реализующие ARMv8.3 или выше, должны поддерживать PAC (например,).

Сюда входят основные прикладные процессоры всех компьютеров Apple Silicon Mac, когда-либо выпущенных для широкой публики (даже Developer Transition Kit), а также все мобильные чипы Apple, начиная с A12.

Однако операционные системы могут настраивать довольно много аспектов PAC во время выполнения. Из пяти ключей (IA, IB, DA, DB и GA) все, кроме одного (GA), можно отключить с помощью битов в , что превращает некоторые инструкции, использующие их, в NOP (pacia, autia, ...) и другие в версии самих себя «без PAC» (ldraa -> ldr, retaa -> ret). Кроме того, как EL3, так и EL2 могут перехватывать использование всех инструкций, которые будут использовать ключи PAC, а также прямой доступ к регистрам, содержащим эти ключи.

В операционных системах Apple A12 и более поздних версиях все системные библиотеки созданы с поддержкой PAC, но от нескольких факторов зависит, будет ли PAC полностью включен для данного процесса или нет. Обычно только двоичные файлы, поставляемые с ОС, включают все ключи, а остальные получают только ключи IB (и GA). (Есть определенные исключения, но ABI Apple «arm64e» до сих пор не объявлен стабильным, поэтому третьи стороны пока не могут на него полагаться.)

Теперь: я не знаю, какие тесты вы проводили и каков был их точный результат. Если вы запустили настоящийинструкции на процессоре, который не поддерживает PAC, это вызовет исключение. Если вы можетеОднако тогда это будет просто NOP на старом оборудовании. Но, конечно, операционная система также может перехватывать недопустимые инструкции, проверять, связаны ли они с PAC, и вручную обходить их.

Я знаю, что Apple M1 поддерживает PAC. Глядя на поддержку гипервизора XNU, кажется, что программное обеспечение пользовательского гипервизора должно иметь возможность контролировать, будут ли перехватываться инструкции PAC и ключевые регистры (биты 40 и 41). Я понятия не имею, что с этим делает Parallels, и не знаю, поддерживает ли Windows вообще PAC. А если посмотреть, какой процессор у вашего Galaxy Book S, то окажется, что его архитектура — ARMv8.2. Хотя разработчикам, очевидно, разрешено выбирать функции из одной второстепенной версии выше, чем базовая версия, которую они поддерживают, я понятия не имею, справедливо ли это для этого процессора Snapdragon.

Если у вас есть возможность запустить на чипе собственную прошивку, вы можете изучитьи посмотрите, заявлена ​​ли и какая поддержка PAC процессором. Но если вы просто хотите узнать, поддерживает ли оборудование вообще PAC, вы можете проверить это с помощью EL0:

      #include <stdbool.h>
#include <stdio.h>

#ifdef __USER_LABEL_PREFIX__
#   define INDIRECT(token) #token
#   define STRINGIFY(token) INDIRECT(token)
#   define ASM_PREFIX(sym) STRINGIFY(__USER_LABEL_PREFIX__) sym
#else
#   define ASM_PREFIX(sym) sym
#endif

extern bool is_pac_supported(void);

__asm__
(
    ".p2align 2\n"
    ".globl " ASM_PREFIX("is_pac_supported") "\n"
    ASM_PREFIX("is_pac_supported") ":\n"
    "    mov x8, x30\n"
    "    mov x0, 0x80000000000000\n"
    "    mov x30, x0\n"
    "    .4byte 0xd50320ff\n" // xpaclri
    "    cmp x30, x0\n"
    "    cset w0, ne\n"
    "    ret x8\n"
);

int main(void)
{
    printf("CPU supports PAC: %s\n", is_pac_supported() ? "yes" : "no");
    return 0;
}

Это работает за счет использования двух интересных свойств: он закодирован в пространстве инструкций, которое ранее было NOP, поэтому на старом оборудовании это просто NOP, и поскольку он просто удаляет биты PAC из целевого регистра (), ему не требуется доступ к ключам PAC, и, следовательно, ни один из них не отключается битами в, и не попадает в ловушку EL2 или EL3.

Указатели с PAC используют бит 55, чтобы определить, принадлежат ли они нижней или верхней половине адресного пространства, поэтому подача значенияк функции удаления PAC превратит ее во что-то вродена аппаратном уровне поддерживается PAC (в противном случае он останется неизменным).

Инструкция закодирована как необработанная 4-байтовая константа, поскольку компиляторы обычно отказываются выполнять ассемблирование.если не нацелен на ARMv8.3 или новее.

Другие вопросы по тегам