Какие процессоры 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» до сих пор не объявлен стабильным, поэтому третьи стороны пока не могут на него полагаться.)
Теперь: я не знаю, какие тесты вы проводили и каков был их точный результат. Если вы запустили настоящий
Я знаю, что Apple M1 поддерживает PAC. Глядя на поддержку гипервизора XNU, кажется, что программное обеспечение пользовательского гипервизора должно иметь возможность контролировать, будут ли перехватываться инструкции PAC и ключевые регистры (
Если у вас есть возможность запустить на чипе собственную прошивку, вы можете изучить
#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;
}
Это работает за счет использования двух интересных свойств
Указатели с PAC используют бит 55, чтобы определить, принадлежат ли они нижней или верхней половине адресного пространства, поэтому подача значения
Инструкция закодирована как необработанная 4-байтовая константа, поскольку компиляторы обычно отказываются выполнять ассемблирование.