Come faccio a scrivere i registri x86 debug dallo spazio utente su OSX?
-
25-09-2019 - |
Domanda
Mi piacerebbe giocare con i MSR di debug definite nelle specifiche x86 (DR0-7) dal mio programma user-space OSX. Purtroppo, questi richiedono CPL == 0 (aka anello 0). Ho sfogliavo le chiamate di sistema OSX e con l'eccezione di kernel_debug
nulla salta davvero fuori come un modo per accedere a queste.
Può essere il caso che essi sono disponibili solo attraverso qualche interfaccia di livello superiore come kernel_debug
, ma non è chiaro a me se questo è il caso o no, se devo solo trovato l'invocazione magica per arrivare a loro.
Il mio obiettivo finale è l'accesso alla funzionalità di questi registri, non i registri stessi. Qualcuno ha una visione su come fare le cose come punti di interruzione set hardware?
Soluzione
Si scopre thread_get_state
/ thread_set_state
è la risposta.
#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);
Altri suggerimenti
Questo è più o meno il punto di anello 0 istruzioni. non sono accessibili dallo userspace .