Comment puis-je écrire x86 registres de débogage à partir de l'espace utilisateur sur Mac OS X?

StackOverflow https://stackoverflow.com/questions/2604439

Question

Je voudrais jouer avec les MSRs de débogage définies dans la spécification x86 (DR0-7) de mon programme de l'espace utilisateur OSX. Malheureusement, ceux-ci exigent CPL == 0 (anneau aka 0). Je l'ai feuilleté les syscalls OSX et à l'exception de rien kernel_debug saute vraiment comme un moyen d'y accéder.

Il peut être le cas qu'ils ne sont disponibles que via une interface de niveau supérieur comme kernel_debug, mais on ne sait pas à moi si tel est le cas ou si je viens pas trouvé l'invocation magique pour arriver à eux.

Mon objectif final est d'accéder à la fonctionnalité de ces registres, et non les registres eux-mêmes. Quelqu'un at-il aperçu sur la façon de faire des choses comme des points d'arrêt de matériel de jeu?

Était-ce utile?

La solution

Il se trouve thread_get_state / thread_set_state est la réponse.

#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);

Autres conseils

C'est à peu près le point de l'anneau 0 instructions. Ils ne sont pas accessibles depuis l'espace utilisateur .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top