This commit implements the body of SELFOUR-499. The API exposes the x86 DR0-7
and ARM coprocessor 14 features to userspace by virtualizing them as context-
switched registers in the TCB. Implemented as TCB invocations. This feature is
only built when CONFIG_HARDWARE_DEBUG_API is selected.
* Add low-level support routines for setting, unsetting, getting, enabling
and disabling breakpoints.
* Add support for single-stepping as well.
^ Single-stepping is not supported on ARMv6 since the hardware
doesn't have support.
^ ARM implements single-stepping as instruction breakpoints
configured to fault on every instruction -- this is achieved through
the "mismatch" mode, which is only supported from ARMv7 onwards.
* Also support explicit software break requests, a la "BKPT" and "INT $3".
* New invocations:
* seL4_TCB_SetBreakpoint().
* seL4_TCB_GetBreakpoint().
* seL4_TCB_UnsetBreakpoint().
* seL4_TCB_ConfigureSingleStepping().
* New constants:
^ Event types:
^ seL4_InstructionBreakpoint.
^ seL4_DataBreakpoint.
^ seL4_SoftwareBreakRequest.
^ Access types:
^ seL4_BreakOnRead.
^ seL4_BreakOnWrite.
^ seL4_BreakOnReadWrite.
^ Exports:
^ seL4_NumHWBreakpoints.
^ seL4_NumExclusiveBreakpoints.
^ seL4_NumExclusiveWatchpoints.
^ seL4_NumDualFunctionMonitors.
^ seL4_FirstBreakpoint.
^ seL4_FirstWatchpoint.
^ seL4_FirstDualFunctionMonitor.
See documentation in the seL4 API manual.
60 lines
1.8 KiB
C
60 lines
1.8 KiB
C
/*
|
|
* Copyright 2014, General Dynamics C4 Systems
|
|
*
|
|
* This software may be distributed and modified according to the terms of
|
|
* the GNU General Public License version 2. Note that NO WARRANTY is provided.
|
|
* See "LICENSE_GPLv2.txt" for details.
|
|
*
|
|
* @TAG(GD_GPL)
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
#ifdef CONFIG_DEBUG_BUILD
|
|
#ifndef __API_DEBUG_H
|
|
#define __API_DEBUG_H
|
|
|
|
#include <benchmark_track.h>
|
|
#include <arch/api/syscall.h>
|
|
#include <model/statedata.h>
|
|
|
|
extern kernel_entry_t ksKernelEntry;
|
|
|
|
#ifdef CONFIG_PRINTING
|
|
|
|
static inline void
|
|
debug_printKernelEntryReason(void)
|
|
{
|
|
switch (ksKernelEntry.path) {
|
|
case Entry_Interrupt:
|
|
printf("Interrupt, irq %lu\n", (unsigned long) ksKernelEntry.word);
|
|
break;
|
|
case Entry_UnknownSyscall:
|
|
printf("Unknown syscall, word: %lu", (unsigned long) ksKernelEntry.word);
|
|
break;
|
|
case Entry_VMFault:
|
|
printf("VM Fault, fault type: %lu\n", (unsigned long) ksKernelEntry.word);
|
|
break;
|
|
case Entry_UserLevelFault:
|
|
printf("User level fault, number: %lu", (unsigned long) ksKernelEntry.word);
|
|
break;
|
|
#ifdef CONFIG_HARDWARE_DEBUG_API
|
|
case Entry_DebugFault:
|
|
printf("Debug fault. Fault Vaddr: 0x%lx", (unsigned long) ksKernelEntry.word);
|
|
break;
|
|
#endif
|
|
case Entry_Syscall:
|
|
printf("Syscall, number: %ld\n", (long) ksKernelEntry.syscall_no);
|
|
if (ksKernelEntry.syscall_no == SysSend ||
|
|
ksKernelEntry.syscall_no == SysNBSend ||
|
|
ksKernelEntry.syscall_no == SysCall) {
|
|
|
|
printf("Cap type: %lu, Invocation tag: %lu\n", (unsigned long) ksKernelEntry.cap_type,
|
|
(unsigned long) ksKernelEntry.invocation_tag);
|
|
}
|
|
}
|
|
}
|
|
#endif /* CONFIG_PRINTING */
|
|
#endif /* __API_DEBUG_H */
|
|
#endif /* CONFIG_DEBUG_BUILD */
|
|
|