/** @addtogroup ia32
* @{
*/
/** @file
*/
#include <proc/thread.h>
#include <console/klog.h>
#include <arch/tdebug.h>
/* trap flag */
#define EFLAGS_TF 0x100
/**
* Called when the IAFTER event setting is (potentially) changed.
*
* On this arch the TRAP flag in userspace state is set
* according to the setting of TDEBUG_EVMASK_IAFTER
* in order to stop after the execution of each instruction.
*
* The calling thread must have already locked t.
*
* Returns 0 on success, non-zero on failure. (Mainly if IAFTER is set, but
* architecture does not support it.)
*/
int tdebug_iafter_update(thread_t *t)
{
uint32_t eflags;
if (t->tdebug.uspace_state == NULL) {
/* userspace state is not available */
/* FIXME: this should not happen when properly imlemented */
klog_printf("fail: uspace_state not available\n");
return -1;
}
eflags = t->tdebug.uspace_state->eflags;
if ((t->tdebug.event_mask & TDEBUG_EVMASK_IAFTER) != 0) {
eflags = eflags | EFLAGS_TF;
} else {
eflags = eflags & ~EFLAGS_TF;
}
t->tdebug.uspace_state->eflags = eflags;
return 0;
}
/** @}
*/