Точки останова PPC

Как точка останова реализована на PPC (точнее, на OS X)?

Например, на x86 это обычно делается с помощью инструкции INT 3 (0xCC) - есть ли инструкция, сопоставимая с этой для ppc? Или есть какой-то другой способ их установки / реализации?

Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
3 784
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Надежный (но в настоящее время пьяный, так что воспринимайте это с недоверием) мне сообщил надежный источник, что это нулевая инструкция, которая является незаконной и вызывает своего рода системную ловушку.

Обновлено: Сделано в вики сообщества на случай, если мой друг настолько пьян, что говорит полную чушь :-)

Ответы, предоставленные нетрезвыми источниками, должны быть помечены как вино сообщества.

Vinko Vrsalovic 29.11.2008 12:34

Хотя нулевая инструкция гарантированно является незаконной, это не единственная возможная недопустимая инструкция (и не то, что делает мой GDB). Я подозреваю, что выполнение нулей приведет к SIGILL, а точки останова IME как правило сделают что-то, что приведет к SIGTRAP.

tc. 23.04.2012 23:16

Лучшее предположение - это инструкция «tw» или «twi».

Вы можете покопаться в исходном коде PPC gdb, OS X, вероятно, использует те же функции, что и его корни FreeBSD.

Помимо программных точек останова, PPC также поддерживает аппаратные точки останова, реализованные через регистры IABR (и, возможно, IABR2, в зависимости от версии ядра). Это точки останова для инструкций, но есть также точки останова на данных (реализованные с помощью DABR и, возможно, DABR2). Если ваше ядро ​​поддерживает два набора аппаратных регистров точки останова (т.е. присутствуют IABR2 и DABR2), вы можете делать больше, чем просто запускать по определенному адресу: вы можете указать целый непрерывный диапазон адресов в качестве цели точки останова. Для точек останова по данным вы также можете указать, должны ли они запускаться при записи, чтении или любом доступе.

С помощью gdb и функции, которая сама выполняет hexdump, я получаю 0x7fe00008. Похоже, это инструкция tw:

0b01111111111000000000000000001000
  011111                           31
        11111                      condition flags: lt, gt, ge, logical lt, logical gt
             00000                 rA
                  00000            rB
                       0000000100  constant 4
                                 0 reserved

т.е. сравнить r0 с r0 и поймать любой результат.

Дизассемблирование GDB - это просто расширенная мнемоника trap

Обновлено: Я использую «GNU gdb 6.3.50-20050815 (версия Apple gdb-696) (сб, 20 октября, 18:20:28 по Гринвичу, 2007 г.)»

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

Точки останова инструкции обычно реализуются с помощью инструкции TRAP или с помощью аппаратного регистра отладки IABR.

Примеры реализации: ArchLinux, яблоко, Wii и Wii U.

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