/root/src/xen/xen/include/xen/livepatch.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. |
3 | | * |
4 | | */ |
5 | | |
6 | | #ifndef __XEN_LIVEPATCH_H__ |
7 | | #define __XEN_LIVEPATCH_H__ |
8 | | |
9 | | struct livepatch_elf; |
10 | | struct livepatch_elf_sec; |
11 | | struct livepatch_elf_sym; |
12 | | struct xen_sysctl_livepatch_op; |
13 | | |
14 | | #include <xen/elfstructs.h> |
15 | | #include <xen/errno.h> /* For -ENOSYS or -EOVERFLOW */ |
16 | | #ifdef CONFIG_LIVEPATCH |
17 | | |
18 | | /* |
19 | | * We use alternative and exception table code - which by default are __init |
20 | | * only, however we need them during runtime. These macros allows us to build |
21 | | * the image with these functions built-in. (See the #else below). |
22 | | */ |
23 | | #define init_or_livepatch_const |
24 | | #define init_or_livepatch_constrel |
25 | | #define init_or_livepatch_data |
26 | | #define init_or_livepatch |
27 | | |
28 | | /* Convenience define for printk. */ |
29 | | #define LIVEPATCH "livepatch: " |
30 | | /* ELF payload special section names. */ |
31 | | #define ELF_LIVEPATCH_FUNC ".livepatch.funcs" |
32 | | #define ELF_LIVEPATCH_DEPENDS ".livepatch.depends" |
33 | | #define ELF_BUILD_ID_NOTE ".note.gnu.build-id" |
34 | | /* Arbitrary limit for payload size and .bss section size. */ |
35 | | #define LIVEPATCH_MAX_SIZE MB(2) |
36 | | |
37 | | struct livepatch_symbol { |
38 | | const char *name; |
39 | | unsigned long value; |
40 | | unsigned int size; |
41 | | bool_t new_symbol; |
42 | | }; |
43 | | |
44 | | int livepatch_op(struct xen_sysctl_livepatch_op *); |
45 | | void check_for_livepatch_work(void); |
46 | | unsigned long livepatch_symbols_lookup_by_name(const char *symname); |
47 | | bool_t is_patch(const void *addr); |
48 | | |
49 | | /* Arch hooks. */ |
50 | | int arch_livepatch_verify_elf(const struct livepatch_elf *elf); |
51 | | bool arch_livepatch_symbol_ok(const struct livepatch_elf *elf, |
52 | | const struct livepatch_elf_sym *sym); |
53 | | bool arch_livepatch_symbol_deny(const struct livepatch_elf *elf, |
54 | | const struct livepatch_elf_sym *sym); |
55 | | int arch_livepatch_perform_rel(struct livepatch_elf *elf, |
56 | | const struct livepatch_elf_sec *base, |
57 | | const struct livepatch_elf_sec *rela); |
58 | | int arch_livepatch_perform_rela(struct livepatch_elf *elf, |
59 | | const struct livepatch_elf_sec *base, |
60 | | const struct livepatch_elf_sec *rela); |
61 | | enum va_type { |
62 | | LIVEPATCH_VA_RX, /* .text */ |
63 | | LIVEPATCH_VA_RW, /* .data */ |
64 | | LIVEPATCH_VA_RO, /* .rodata */ |
65 | | }; |
66 | | |
67 | | /* |
68 | | * Function to secure the allocate pages (from arch_livepatch_alloc_payload) |
69 | | * with the right page permissions. |
70 | | */ |
71 | | int arch_livepatch_secure(const void *va, unsigned int pages, enum va_type types); |
72 | | |
73 | | void arch_livepatch_init(void); |
74 | | |
75 | | #include <public/sysctl.h> /* For struct livepatch_func. */ |
76 | | #include <asm/livepatch.h> |
77 | | int arch_livepatch_verify_func(const struct livepatch_func *func); |
78 | | |
79 | | static inline |
80 | | unsigned int livepatch_insn_len(const struct livepatch_func *func) |
81 | | { |
82 | | if ( !func->new_addr ) |
83 | | return func->new_size; |
84 | | |
85 | | return ARCH_PATCH_INSN_SIZE; |
86 | | } |
87 | | |
88 | | static inline int livepatch_verify_distance(const struct livepatch_func *func) |
89 | | { |
90 | | long offset; |
91 | | long range = ARCH_LIVEPATCH_RANGE; |
92 | | |
93 | | if ( !func->new_addr ) /* Ignore NOPs. */ |
94 | | return 0; |
95 | | |
96 | | offset = func->old_addr - func->new_addr; |
97 | | if ( offset < -range || offset >= range ) |
98 | | return -EOVERFLOW; |
99 | | |
100 | | return 0; |
101 | | } |
102 | | /* |
103 | | * These functions are called around the critical region patching live code, |
104 | | * for an architecture to take make appropratie global state adjustments. |
105 | | */ |
106 | | int arch_livepatch_quiesce(void); |
107 | | void arch_livepatch_revive(void); |
108 | | |
109 | | void arch_livepatch_apply(struct livepatch_func *func); |
110 | | void arch_livepatch_revert(const struct livepatch_func *func); |
111 | | void arch_livepatch_post_action(void); |
112 | | |
113 | | void arch_livepatch_mask(void); |
114 | | void arch_livepatch_unmask(void); |
115 | | #else |
116 | | |
117 | | /* |
118 | | * If not compiling with Live Patch certain functionality should stay as |
119 | | * __init. |
120 | | */ |
121 | | #define init_or_livepatch_const __initconst |
122 | | #define init_or_livepatch_constrel __initconstrel |
123 | | #define init_or_livepatch_data __initdata |
124 | | #define init_or_livepatch __init |
125 | | |
126 | | static inline int livepatch_op(struct xen_sysctl_livepatch_op *op) |
127 | 0 | { |
128 | 0 | return -ENOSYS; |
129 | 0 | } Unexecuted instantiation: sysctl.c:livepatch_op Unexecuted instantiation: vsprintf.c:livepatch_op Unexecuted instantiation: domain.c:livepatch_op Unexecuted instantiation: extable.c:livepatch_op Unexecuted instantiation: traps.c:livepatch_op |
130 | | |
131 | 1.80M | static inline void check_for_livepatch_work(void) { }; Unexecuted instantiation: traps.c:check_for_livepatch_work Unexecuted instantiation: sysctl.c:check_for_livepatch_work Unexecuted instantiation: extable.c:check_for_livepatch_work domain.c:check_for_livepatch_work Line | Count | Source | 131 | 1.80M | static inline void check_for_livepatch_work(void) { }; |
Unexecuted instantiation: vsprintf.c:check_for_livepatch_work |
132 | | static inline bool_t is_patch(const void *addr) |
133 | 0 | { |
134 | 0 | return 0; |
135 | 0 | } Unexecuted instantiation: vsprintf.c:is_patch Unexecuted instantiation: traps.c:is_patch Unexecuted instantiation: extable.c:is_patch Unexecuted instantiation: sysctl.c:is_patch Unexecuted instantiation: domain.c:is_patch |
136 | | #endif /* CONFIG_LIVEPATCH */ |
137 | | |
138 | | #endif /* __XEN_LIVEPATCH_H__ */ |
139 | | |
140 | | /* |
141 | | * Local variables: |
142 | | * mode: C |
143 | | * c-file-style: "BSD" |
144 | | * c-basic-offset: 4 |
145 | | * tab-width: 4 |
146 | | * indent-tabs-mode: nil |
147 | | * End: |
148 | | */ |