Commit | Line | Data |
---|---|---|
b7cdc182 | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
da0f6c58 MD |
2 | #if !defined(LTTNG_TRACE_EXCEPTIONS_H) || defined(TRACE_HEADER_MULTI_READ) |
3 | #define LTTNG_TRACE_EXCEPTIONS_H | |
4 | ||
3b4aafcb | 5 | #include <lttng/tracepoint-event.h> |
5f4c791e | 6 | #include <lttng/kernel-version.h> |
da0f6c58 | 7 | |
5f4c791e | 8 | #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,15,0)) |
8c7f2a9f | 9 | #include <../arch/x86/include/asm/traps.h> |
5f4c791e | 10 | #else /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,15,0)) */ |
8c7f2a9f FD |
11 | |
12 | /* Only define this enum once. */ | |
13 | ||
14 | #ifndef ONCE_LTTNG_EXCEPTIONS_H | |
15 | #define ONCE_LTTNG_EXCEPTIONS_H | |
16 | ||
17 | enum { | |
18 | X86_PF_PROT = 1 << 0, | |
19 | X86_PF_WRITE = 1 << 1, | |
20 | X86_PF_USER = 1 << 2, | |
21 | X86_PF_RSVD = 1 << 3, | |
22 | X86_PF_INSTR = 1 << 4, | |
5f4c791e | 23 | #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,6,0)) |
8c7f2a9f | 24 | X86_PF_PK = 1 << 5, |
5f4c791e | 25 | #endif /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,6,0)) */ |
8c7f2a9f FD |
26 | }; |
27 | ||
28 | #endif /* ONCE_LTTNG_EXCEPTIONS_H */ | |
29 | ||
5f4c791e | 30 | #endif /* #else #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,15,0)) */ |
8c7f2a9f | 31 | |
da0f6c58 MD |
32 | #undef TRACE_SYSTEM |
33 | #define TRACE_SYSTEM x86_exceptions | |
34 | ||
8c7f2a9f FD |
35 | LTTNG_TRACEPOINT_ENUM(lttng_x86_pf_error_code, |
36 | TP_ENUM_VALUES( | |
37 | ctf_enum_value("PROTECTION_FAULT", X86_PF_PROT) | |
38 | ctf_enum_value("WRITE_ACCESS", X86_PF_WRITE) | |
39 | ctf_enum_value("USER_MODE", X86_PF_USER) | |
40 | ctf_enum_value("RESERVED_BIT", X86_PF_RSVD) | |
41 | ctf_enum_value("INSTRUCTION_FETCH", X86_PF_INSTR) | |
5f4c791e | 42 | #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,6,0)) |
8c7f2a9f | 43 | ctf_enum_value("PROTECTION_KEYS_BLOCK", X86_PF_PK) |
5f4c791e | 44 | #endif /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,6,0)) */ |
8c7f2a9f FD |
45 | ) |
46 | ) | |
47 | ||
da0f6c58 MD |
48 | LTTNG_TRACEPOINT_EVENT_CLASS(x86_exceptions_class, |
49 | ||
50 | TP_PROTO(unsigned long address, struct pt_regs *regs, | |
51 | unsigned long error_code), | |
52 | ||
53 | TP_ARGS(address, regs, error_code), | |
54 | ||
55 | TP_FIELDS( | |
56 | ctf_integer_hex(unsigned long, address, address) | |
57 | ctf_integer_hex(unsigned long, ip, regs->ip) | |
58 | /* | |
59 | * Note: we cast error_code from unsigned long | |
60 | * to unsigned char to save space in the trace. | |
61 | * Currently, only 5 low bits are used. Should be made | |
62 | * larger if error codes are added to the kernel. | |
63 | */ | |
8c7f2a9f | 64 | ctf_enum(lttng_x86_pf_error_code, unsigned char, error_code, error_code) |
da0f6c58 MD |
65 | ) |
66 | ) | |
67 | ||
68 | #define LTTNG_EXCEPTIONS_TRACEPOINT_EVENT_INSTANCE_MAP(name, map) \ | |
69 | LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(x86_exceptions_class, \ | |
70 | name, \ | |
71 | map, \ | |
72 | TP_PROTO(unsigned long address, struct pt_regs *regs, \ | |
73 | unsigned long error_code), \ | |
74 | TP_ARGS(address, regs, error_code) \ | |
75 | ) | |
76 | ||
77 | LTTNG_EXCEPTIONS_TRACEPOINT_EVENT_INSTANCE_MAP(page_fault_user, | |
78 | x86_exceptions_page_fault_user) | |
79 | LTTNG_EXCEPTIONS_TRACEPOINT_EVENT_INSTANCE_MAP(page_fault_kernel, | |
80 | x86_exceptions_page_fault_kernel) | |
81 | ||
82 | #endif /* LTTNG_TRACE_EXCEPTIONS_H */ | |
83 | ||
84 | #undef TRACE_INCLUDE_PATH | |
4f47ccf0 | 85 | #define TRACE_INCLUDE_PATH instrumentation/events/arch/x86 |
da0f6c58 MD |
86 | #undef TRACE_INCLUDE_FILE |
87 | #define TRACE_INCLUDE_FILE exceptions | |
88 | ||
89 | /* This part must be outside protection */ | |
3b4aafcb | 90 | #include <lttng/define_trace.h> |