¿Cómo se escribe x 86 registros de depuración desde el espacio de usuario en OSX?
-
25-09-2019 - |
Pregunta
Me gustaría jugar con las MSR depuración definidos en la especificación X 86 (DR0-7) de mi programa de espacio de usuario OSX. Por desgracia, estos requieren CPL == 0 (también conocido como el anillo 0). He hojeé las llamadas al sistema OSX y con la excepción de kernel_debug
nada realmente salta a la vista como una forma de acceder a estos.
Puede ser el caso de que sólo están disponibles a través de alguna de las interfaces de alto nivel como kernel_debug
, pero no está claro para mí si ese es el caso o no, si me acaba de encontrar la invocación mágica para llegar a ellos.
Mi objetivo final accede a la funcionalidad de estos registros, no los propios registros. ¿Alguien tiene idea de cómo hacer cosas como puntos de interrupción de hardware set?
Solución
Resulta thread_get_state
/ thread_set_state
es la respuesta.
#include <mach/mach_types.h>
thread_t target = get_target_thread();
struct x86_debug_state dr;
mach_msg_type_number_t dr_count = x86_DEBUG_STATE_COUNT;
kern_return_t rc = thread_get_state(target, x86_DEBUG_STATE, &dr, &dr_count);
printf("DR0: 0x%08x\n", dr.uds.ds32.__dr0);
printf("DR1: 0x%08x\n", dr.uds.ds32.__dr1);
printf("DR2: 0x%08x\n", dr.uds.ds32.__dr2);
printf("DR3: 0x%08x\n", dr.uds.ds32.__dr3);
printf("DR4: 0x%08x\n", dr.uds.ds32.__dr4);
printf("DR5: 0x%08x\n", dr.uds.ds32.__dr5);
printf("DR6: 0x%08x\n", dr.uds.ds32.__dr6);
printf("DR7: 0x%08x\n", dr.uds.ds32.__dr7);
Otros consejos
Eso es más o menos el punto de anillo 0 instrucciones. No son accesibles desde el espacio de usuario .