/root/src/xen/xen/include/asm/uaccess.h
Line | Count | Source (jump to first uncovered line) |
1 | | |
2 | | #ifndef __X86_UACCESS_H__ |
3 | | #define __X86_UACCESS_H__ |
4 | | |
5 | | #include <xen/compiler.h> |
6 | | #include <xen/errno.h> |
7 | | #include <xen/prefetch.h> |
8 | | #include <asm/asm_defns.h> |
9 | | #include <asm/page.h> |
10 | | |
11 | | #include <asm/x86_64/uaccess.h> |
12 | | |
13 | | unsigned copy_to_user(void *to, const void *from, unsigned len); |
14 | | unsigned clear_user(void *to, unsigned len); |
15 | | unsigned copy_from_user(void *to, const void *from, unsigned len); |
16 | | /* Handles exceptions in both to and from, but doesn't do access_ok */ |
17 | | unsigned __copy_to_user_ll(void __user*to, const void *from, unsigned n); |
18 | | unsigned __copy_from_user_ll(void *to, const void __user *from, unsigned n); |
19 | | |
20 | | extern long __get_user_bad(void); |
21 | | extern void __put_user_bad(void); |
22 | | |
23 | | /** |
24 | | * get_user: - Get a simple variable from user space. |
25 | | * @x: Variable to store result. |
26 | | * @ptr: Source address, in user space. |
27 | | * |
28 | | * Context: User context only. This function may sleep. |
29 | | * |
30 | | * This macro copies a single simple variable from user space to kernel |
31 | | * space. It supports simple types like char and int, but not larger |
32 | | * data types like structures or arrays. |
33 | | * |
34 | | * @ptr must have pointer-to-simple-variable type, and the result of |
35 | | * dereferencing @ptr must be assignable to @x without a cast. |
36 | | * |
37 | | * Returns zero on success, or -EFAULT on error. |
38 | | * On error, the variable @x is set to zero. |
39 | | */ |
40 | | #define get_user(x,ptr) \ |
41 | | __get_user_check((x),(ptr),sizeof(*(ptr))) |
42 | | |
43 | | /** |
44 | | * put_user: - Write a simple value into user space. |
45 | | * @x: Value to copy to user space. |
46 | | * @ptr: Destination address, in user space. |
47 | | * |
48 | | * Context: User context only. This function may sleep. |
49 | | * |
50 | | * This macro copies a single simple value from kernel space to user |
51 | | * space. It supports simple types like char and int, but not larger |
52 | | * data types like structures or arrays. |
53 | | * |
54 | | * @ptr must have pointer-to-simple-variable type, and @x must be assignable |
55 | | * to the result of dereferencing @ptr. |
56 | | * |
57 | | * Returns zero on success, or -EFAULT on error. |
58 | | */ |
59 | | #define put_user(x,ptr) \ |
60 | 0 | __put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr))) |
61 | | |
62 | | /** |
63 | | * __get_user: - Get a simple variable from user space, with less checking. |
64 | | * @x: Variable to store result. |
65 | | * @ptr: Source address, in user space. |
66 | | * |
67 | | * Context: User context only. This function may sleep. |
68 | | * |
69 | | * This macro copies a single simple variable from user space to kernel |
70 | | * space. It supports simple types like char and int, but not larger |
71 | | * data types like structures or arrays. |
72 | | * |
73 | | * @ptr must have pointer-to-simple-variable type, and the result of |
74 | | * dereferencing @ptr must be assignable to @x without a cast. |
75 | | * |
76 | | * Caller must check the pointer with access_ok() before calling this |
77 | | * function. |
78 | | * |
79 | | * Returns zero on success, or -EFAULT on error. |
80 | | * On error, the variable @x is set to zero. |
81 | | */ |
82 | | #define __get_user(x,ptr) \ |
83 | 0 | __get_user_nocheck((x),(ptr),sizeof(*(ptr))) |
84 | | |
85 | | /** |
86 | | * __put_user: - Write a simple value into user space, with less checking. |
87 | | * @x: Value to copy to user space. |
88 | | * @ptr: Destination address, in user space. |
89 | | * |
90 | | * Context: User context only. This function may sleep. |
91 | | * |
92 | | * This macro copies a single simple value from kernel space to user |
93 | | * space. It supports simple types like char and int, but not larger |
94 | | * data types like structures or arrays. |
95 | | * |
96 | | * @ptr must have pointer-to-simple-variable type, and @x must be assignable |
97 | | * to the result of dereferencing @ptr. |
98 | | * |
99 | | * Caller must check the pointer with access_ok() before calling this |
100 | | * function. |
101 | | * |
102 | | * Returns zero on success, or -EFAULT on error. |
103 | | */ |
104 | | #define __put_user(x,ptr) \ |
105 | 0 | __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr))) |
106 | | |
107 | 0 | #define __put_user_nocheck(x, ptr, size) \ |
108 | 0 | ({ \ |
109 | 0 | int err_; \ |
110 | 0 | __put_user_size(x, ptr, size, err_, -EFAULT); \ |
111 | 0 | err_; \ |
112 | 0 | }) |
113 | | |
114 | 0 | #define __put_user_check(x, ptr, size) \ |
115 | 0 | ({ \ |
116 | 0 | __typeof__(*(ptr)) __user *ptr_ = (ptr); \ |
117 | 0 | __typeof__(size) size_ = (size); \ |
118 | 0 | access_ok(ptr_, size_) ? __put_user_nocheck(x, ptr_, size_) \ |
119 | 0 | : -EFAULT; \ |
120 | 0 | }) |
121 | | |
122 | 0 | #define __get_user_nocheck(x, ptr, size) \ |
123 | 0 | ({ \ |
124 | 0 | int err_; \ |
125 | 0 | __get_user_size(x, ptr, size, err_, -EFAULT); \ |
126 | 0 | err_; \ |
127 | 0 | }) |
128 | | |
129 | | #define __get_user_check(x, ptr, size) \ |
130 | | ({ \ |
131 | | __typeof__(*(ptr)) __user *ptr_ = (ptr); \ |
132 | | __typeof__(size) size_ = (size); \ |
133 | | access_ok(ptr_, size_) ? __get_user_nocheck(x, ptr_, size_) \ |
134 | | : -EFAULT; \ |
135 | | }) |
136 | | |
137 | | struct __large_struct { unsigned long buf[100]; }; |
138 | 0 | #define __m(x) (*(const struct __large_struct *)(x)) |
139 | | |
140 | | /* |
141 | | * Tell gcc we read from memory instead of writing: this is because |
142 | | * we do not write to any memory gcc knows about, so there are no |
143 | | * aliasing issues. |
144 | | */ |
145 | | #define __put_user_asm(x, addr, err, itype, rtype, ltype, errret) \ |
146 | 0 | stac(); \ |
147 | 0 | __asm__ __volatile__( \ |
148 | 0 | "1: mov"itype" %"rtype"1,%2\n" \ |
149 | 0 | "2:\n" \ |
150 | 0 | ".section .fixup,\"ax\"\n" \ |
151 | 0 | "3: mov %3,%0\n" \ |
152 | 0 | " jmp 2b\n" \ |
153 | 0 | ".previous\n" \ |
154 | 0 | _ASM_EXTABLE(1b, 3b) \ |
155 | 0 | : "=r"(err) \ |
156 | 0 | : ltype (x), "m"(__m(addr)), "i"(errret), "0"(err)); \ |
157 | 0 | clac() |
158 | | |
159 | | #define __get_user_asm(x, addr, err, itype, rtype, ltype, errret) \ |
160 | 0 | stac(); \ |
161 | 0 | __asm__ __volatile__( \ |
162 | 0 | "1: mov"itype" %2,%"rtype"1\n" \ |
163 | 0 | "2:\n" \ |
164 | 0 | ".section .fixup,\"ax\"\n" \ |
165 | 0 | "3: mov %3,%0\n" \ |
166 | 0 | " xor"itype" %"rtype"1,%"rtype"1\n" \ |
167 | 0 | " jmp 2b\n" \ |
168 | 0 | ".previous\n" \ |
169 | 0 | _ASM_EXTABLE(1b, 3b) \ |
170 | 0 | : "=r"(err), ltype (x) \ |
171 | 0 | : "m"(__m(addr)), "i"(errret), "0"(err)); \ |
172 | 0 | clac() |
173 | | |
174 | | /** |
175 | | * __copy_to_user: - Copy a block of data into user space, with less checking |
176 | | * @to: Destination address, in user space. |
177 | | * @from: Source address, in kernel space. |
178 | | * @n: Number of bytes to copy. |
179 | | * |
180 | | * Context: User context only. This function may sleep. |
181 | | * |
182 | | * Copy data from kernel space to user space. Caller must check |
183 | | * the specified block with access_ok() before calling this function. |
184 | | * |
185 | | * Returns number of bytes that could not be copied. |
186 | | * On success, this will be zero. |
187 | | */ |
188 | | static always_inline unsigned long |
189 | | __copy_to_user(void __user *to, const void *from, unsigned long n) |
190 | 0 | { |
191 | 0 | if (__builtin_constant_p(n)) { |
192 | 0 | unsigned long ret; |
193 | 0 |
|
194 | 0 | switch (n) { |
195 | 0 | case 1: |
196 | 0 | __put_user_size(*(const u8 *)from, (u8 __user *)to, 1, ret, 1); |
197 | 0 | return ret; |
198 | 0 | case 2: |
199 | 0 | __put_user_size(*(const u16 *)from, (u16 __user *)to, 2, ret, 2); |
200 | 0 | return ret; |
201 | 0 | case 4: |
202 | 0 | __put_user_size(*(const u32 *)from, (u32 __user *)to, 4, ret, 4); |
203 | 0 | return ret; |
204 | 0 | case 8: |
205 | 0 | __put_user_size(*(const u64 *)from, (u64 __user *)to, 8, ret, 8); |
206 | 0 | return ret; |
207 | 0 | } |
208 | 0 | } |
209 | 0 | return __copy_to_user_ll(to, from, n); |
210 | 0 | } Unexecuted instantiation: cpu.c:__copy_to_user Unexecuted instantiation: mmconfig_64.c:__copy_to_user Unexecuted instantiation: mmconf-fam10h.c:__copy_to_user Unexecuted instantiation: acpi_mmcfg.c:__copy_to_user Unexecuted instantiation: ro-page-fault.c:__copy_to_user Unexecuted instantiation: misc-hypercalls.c:__copy_to_user Unexecuted instantiation: iret.c:__copy_to_user Unexecuted instantiation: emul-priv-op.c:__copy_to_user Unexecuted instantiation: emul-inv-op.c:__copy_to_user Unexecuted instantiation: emul-gate-op.c:__copy_to_user Unexecuted instantiation: descriptor-tables.c:__copy_to_user Unexecuted instantiation: callback.c:__copy_to_user Unexecuted instantiation: backtrace.c:__copy_to_user Unexecuted instantiation: op_model_athlon.c:__copy_to_user Unexecuted instantiation: op_model_ppro.c:__copy_to_user Unexecuted instantiation: op_model_p4.c:__copy_to_user Unexecuted instantiation: nmi_int.c:__copy_to_user Unexecuted instantiation: nested_ept.c:__copy_to_user Unexecuted instantiation: nested_hap.c:__copy_to_user Unexecuted instantiation: hap.c:__copy_to_user Unexecuted instantiation: multi.c:__copy_to_user Unexecuted instantiation: mem_sharing.c:__copy_to_user Unexecuted instantiation: mem_paging.c:__copy_to_user Unexecuted instantiation: guest_walk.c:__copy_to_user Unexecuted instantiation: altp2m.c:__copy_to_user Unexecuted instantiation: p2m-pod.c:__copy_to_user Unexecuted instantiation: p2m-ept.c:__copy_to_user Unexecuted instantiation: p2m-pt.c:__copy_to_user Unexecuted instantiation: p2m.c:__copy_to_user Unexecuted instantiation: paging.c:__copy_to_user Unexecuted instantiation: vvmx.c:__copy_to_user Unexecuted instantiation: vmx.c:__copy_to_user Unexecuted instantiation: vmcs.c:__copy_to_user Unexecuted instantiation: realmode.c:__copy_to_user Unexecuted instantiation: vmcb.c:__copy_to_user Unexecuted instantiation: svmdebug.c:__copy_to_user Unexecuted instantiation: svm.c:__copy_to_user Unexecuted instantiation: nestedsvm.c:__copy_to_user Unexecuted instantiation: intr.c:__copy_to_user Unexecuted instantiation: vpt.c:__copy_to_user Unexecuted instantiation: vpic.c:__copy_to_user Unexecuted instantiation: vmsi.c:__copy_to_user Unexecuted instantiation: vlapic.c:__copy_to_user Unexecuted instantiation: viridian.c:__copy_to_user Unexecuted instantiation: vioapic.c:__copy_to_user Unexecuted instantiation: stdvga.c:__copy_to_user Unexecuted instantiation: save.c:__copy_to_user Unexecuted instantiation: rtc.c:__copy_to_user Unexecuted instantiation: pmtimer.c:__copy_to_user Unexecuted instantiation: nestedhvm.c:__copy_to_user Unexecuted instantiation: mtrr.c:__copy_to_user Unexecuted instantiation: ioreq.c:__copy_to_user Unexecuted instantiation: intercept.c:__copy_to_user Unexecuted instantiation: i8254.c:__copy_to_user Unexecuted instantiation: hvm.c:__copy_to_user Unexecuted instantiation: emulate.c:__copy_to_user Unexecuted instantiation: dm.c:__copy_to_user Unexecuted instantiation: asid.c:__copy_to_user Unexecuted instantiation: probe.c:__copy_to_user Unexecuted instantiation: delivery.c:__copy_to_user Unexecuted instantiation: default.c:__copy_to_user Unexecuted instantiation: x2apic.c:__copy_to_user Unexecuted instantiation: bigsmp.c:__copy_to_user Unexecuted instantiation: main.c:__copy_to_user Unexecuted instantiation: generic.c:__copy_to_user Unexecuted instantiation: vmce.c:__copy_to_user Unexecuted instantiation: util.c:__copy_to_user Unexecuted instantiation: non-fatal.c:__copy_to_user Unexecuted instantiation: mce_intel.c:__copy_to_user Unexecuted instantiation: mce-apei.c:__copy_to_user Unexecuted instantiation: mce.c:__copy_to_user Unexecuted instantiation: mctelem.c:__copy_to_user Unexecuted instantiation: barrier.c:__copy_to_user Unexecuted instantiation: mcaction.c:__copy_to_user Unexecuted instantiation: mce_amd.c:__copy_to_user Unexecuted instantiation: amd_nonfatal.c:__copy_to_user Unexecuted instantiation: vpmu_intel.c:__copy_to_user Unexecuted instantiation: vpmu_amd.c:__copy_to_user Unexecuted instantiation: vpmu.c:__copy_to_user Unexecuted instantiation: mwait-idle.c:__copy_to_user Unexecuted instantiation: intel.c:__copy_to_user Unexecuted instantiation: common.c:__copy_to_user Unexecuted instantiation: amd.c:__copy_to_user Unexecuted instantiation: powernow.c:__copy_to_user Unexecuted instantiation: cpuidle_menu.c:__copy_to_user Unexecuted instantiation: cpu_idle.c:__copy_to_user Unexecuted instantiation: suspend.c:__copy_to_user Unexecuted instantiation: power.c:__copy_to_user Unexecuted instantiation: lib.c:__copy_to_user Unexecuted instantiation: xstate.c:__copy_to_user Unexecuted instantiation: hpet.c:__copy_to_user Unexecuted instantiation: tboot.c:__copy_to_user Unexecuted instantiation: x86_emulate.c:__copy_to_user Unexecuted instantiation: usercopy.c:__copy_to_user Unexecuted instantiation: traps.c:__copy_to_user Unexecuted instantiation: srat.c:__copy_to_user Unexecuted instantiation: smpboot.c:__copy_to_user Unexecuted instantiation: smp.c:__copy_to_user Unexecuted instantiation: setup.c:__copy_to_user Unexecuted instantiation: psr.c:__copy_to_user Unexecuted instantiation: platform_hypercall.c:__copy_to_user Unexecuted instantiation: physdev.c:__copy_to_user Unexecuted instantiation: percpu.c:__copy_to_user Unexecuted instantiation: numa.c:__copy_to_user Unexecuted instantiation: nmi.c:__copy_to_user Unexecuted instantiation: mpparse.c:__copy_to_user Unexecuted instantiation: mm.c:__copy_to_user Unexecuted instantiation: microcode.c:__copy_to_user Unexecuted instantiation: microcode_intel.c:__copy_to_user Unexecuted instantiation: microcode_amd.c:__copy_to_user Unexecuted instantiation: machine_kexec.c:__copy_to_user Unexecuted instantiation: ioport_emulate.c:__copy_to_user Unexecuted instantiation: msr.c:__copy_to_user Unexecuted instantiation: io_apic.c:__copy_to_user Unexecuted instantiation: i8259.c:__copy_to_user Unexecuted instantiation: i387.c:__copy_to_user Unexecuted instantiation: hypercall.c:__copy_to_user Unexecuted instantiation: flushtlb.c:__copy_to_user Unexecuted instantiation: extable.c:__copy_to_user Unexecuted instantiation: e820.c:__copy_to_user Unexecuted instantiation: domain_page.c:__copy_to_user Unexecuted instantiation: debug.c:__copy_to_user Unexecuted instantiation: crash.c:__copy_to_user Unexecuted instantiation: compat.c:__copy_to_user Unexecuted instantiation: cpuid.c:__copy_to_user Unexecuted instantiation: apic.c:__copy_to_user Unexecuted instantiation: xsm_core.c:__copy_to_user Unexecuted instantiation: vesa.c:__copy_to_user Unexecuted instantiation: vga.c:__copy_to_user Unexecuted instantiation: apei-io.c:__copy_to_user Unexecuted instantiation: apei-base.c:__copy_to_user Unexecuted instantiation: hest.c:__copy_to_user Unexecuted instantiation: erst.c:__copy_to_user Unexecuted instantiation: reboot.c:__copy_to_user Unexecuted instantiation: hwregs.c:__copy_to_user Unexecuted instantiation: pmstat.c:__copy_to_user Unexecuted instantiation: osl.c:__copy_to_user Unexecuted instantiation: iommu_guest.c:__copy_to_user Unexecuted instantiation: iommu_cmd.c:__copy_to_user Unexecuted instantiation: iommu_intr.c:__copy_to_user Unexecuted instantiation: pci_amd_iommu.c:__copy_to_user Unexecuted instantiation: iommu_map.c:__copy_to_user Unexecuted instantiation: iommu_init.c:__copy_to_user Unexecuted instantiation: ats.c:__copy_to_user Unexecuted instantiation: vtd.c:__copy_to_user Unexecuted instantiation: quirks.c:__copy_to_user Unexecuted instantiation: intremap.c:__copy_to_user Unexecuted instantiation: qinval.c:__copy_to_user Unexecuted instantiation: utils.c:__copy_to_user Unexecuted instantiation: dmar.c:__copy_to_user Unexecuted instantiation: io.c:__copy_to_user Unexecuted instantiation: iommu.c:__copy_to_user Unexecuted instantiation: msix.c:__copy_to_user Unexecuted instantiation: msi.c:__copy_to_user Unexecuted instantiation: header.c:__copy_to_user Unexecuted instantiation: vpci.c:__copy_to_user Unexecuted instantiation: pci.c:__copy_to_user Unexecuted instantiation: utility.c:__copy_to_user Unexecuted instantiation: cpufreq_misc_governors.c:__copy_to_user Unexecuted instantiation: cpufreq_ondemand.c:__copy_to_user Unexecuted instantiation: cpufreq.c:__copy_to_user Unexecuted instantiation: serial.c:__copy_to_user Unexecuted instantiation: ehci-dbgp.c:__copy_to_user Unexecuted instantiation: ns16550.c:__copy_to_user Unexecuted instantiation: console.c:__copy_to_user Unexecuted instantiation: libelf-loader.c:__copy_to_user Unexecuted instantiation: llvm.c:__copy_to_user Unexecuted instantiation: tmem_control.c:__copy_to_user Unexecuted instantiation: tmem_xen.c:__copy_to_user Unexecuted instantiation: tmem.c:__copy_to_user Unexecuted instantiation: xmalloc_tlsf.c:__copy_to_user Unexecuted instantiation: xenoprof.c:__copy_to_user Unexecuted instantiation: wait.c:__copy_to_user Unexecuted instantiation: vsprintf.c:__copy_to_user Unexecuted instantiation: vmap.c:__copy_to_user Unexecuted instantiation: vm_event.c:__copy_to_user Unexecuted instantiation: trace.c:__copy_to_user Unexecuted instantiation: timer.c:__copy_to_user Unexecuted instantiation: time.c:__copy_to_user Unexecuted instantiation: tasklet.c:__copy_to_user Unexecuted instantiation: sysctl.c:__copy_to_user Unexecuted instantiation: symbols.c:__copy_to_user Unexecuted instantiation: stop_machine.c:__copy_to_user Unexecuted instantiation: spinlock.c:__copy_to_user Unexecuted instantiation: softirq.c:__copy_to_user Unexecuted instantiation: shutdown.c:__copy_to_user Unexecuted instantiation: schedule.c:__copy_to_user Unexecuted instantiation: sched_null.c:__copy_to_user Unexecuted instantiation: sched_rt.c:__copy_to_user Unexecuted instantiation: sched_credit2.c:__copy_to_user Unexecuted instantiation: sched_credit.c:__copy_to_user Unexecuted instantiation: sched_arinc653.c:__copy_to_user Unexecuted instantiation: rwlock.c:__copy_to_user Unexecuted instantiation: rcupdate.c:__copy_to_user Unexecuted instantiation: rangeset.c:__copy_to_user Unexecuted instantiation: preempt.c:__copy_to_user Unexecuted instantiation: pdx.c:__copy_to_user Unexecuted instantiation: page_alloc.c:__copy_to_user Unexecuted instantiation: multicall.c:__copy_to_user Unexecuted instantiation: monitor.c:__copy_to_user Unexecuted instantiation: memory.c:__copy_to_user Unexecuted instantiation: mem_access.c:__copy_to_user Unexecuted instantiation: kimage.c:__copy_to_user Unexecuted instantiation: kexec.c:__copy_to_user Unexecuted instantiation: keyhandler.c:__copy_to_user Unexecuted instantiation: kernel.c:__copy_to_user Unexecuted instantiation: irq.c:__copy_to_user Unexecuted instantiation: guestcopy.c:__copy_to_user Unexecuted instantiation: grant_table.c:__copy_to_user Unexecuted instantiation: event_fifo.c:__copy_to_user Unexecuted instantiation: event_channel.c:__copy_to_user Unexecuted instantiation: event_2l.c:__copy_to_user Unexecuted instantiation: domain.c:__copy_to_user Unexecuted instantiation: domctl.c:__copy_to_user Unexecuted instantiation: cpupool.c:__copy_to_user Unexecuted instantiation: mmconfig-shared.c:__copy_to_user |
211 | | |
212 | | /** |
213 | | * __copy_from_user: - Copy a block of data from user space, with less checking |
214 | | * @to: Destination address, in kernel space. |
215 | | * @from: Source address, in user space. |
216 | | * @n: Number of bytes to copy. |
217 | | * |
218 | | * Context: User context only. This function may sleep. |
219 | | * |
220 | | * Copy data from user space to kernel space. Caller must check |
221 | | * the specified block with access_ok() before calling this function. |
222 | | * |
223 | | * Returns number of bytes that could not be copied. |
224 | | * On success, this will be zero. |
225 | | * |
226 | | * If some data could not be copied, this function will pad the copied |
227 | | * data to the requested size using zero bytes. |
228 | | */ |
229 | | static always_inline unsigned long |
230 | | __copy_from_user(void *to, const void __user *from, unsigned long n) |
231 | 1 | { |
232 | 1 | if (__builtin_constant_p(n)) { |
233 | 0 | unsigned long ret; |
234 | 0 |
|
235 | 0 | switch (n) { |
236 | 0 | case 1: |
237 | 0 | __get_user_size(*(u8 *)to, from, 1, ret, 1); |
238 | 0 | return ret; |
239 | 0 | case 2: |
240 | 0 | __get_user_size(*(u16 *)to, from, 2, ret, 2); |
241 | 0 | return ret; |
242 | 0 | case 4: |
243 | 0 | __get_user_size(*(u32 *)to, from, 4, ret, 4); |
244 | 0 | return ret; |
245 | 0 | case 8: |
246 | 0 | __get_user_size(*(u64*)to, from, 8, ret, 8); |
247 | 0 | return ret; |
248 | 0 | } |
249 | 0 | } |
250 | 1 | return __copy_from_user_ll(to, from, n); |
251 | 1 | } Unexecuted instantiation: mmconfig-shared.c:__copy_from_user Unexecuted instantiation: mmconfig_64.c:__copy_from_user Unexecuted instantiation: mmconf-fam10h.c:__copy_from_user Unexecuted instantiation: acpi_mmcfg.c:__copy_from_user Unexecuted instantiation: ro-page-fault.c:__copy_from_user Unexecuted instantiation: misc-hypercalls.c:__copy_from_user Unexecuted instantiation: iret.c:__copy_from_user Unexecuted instantiation: emul-priv-op.c:__copy_from_user Unexecuted instantiation: emul-inv-op.c:__copy_from_user Unexecuted instantiation: emul-gate-op.c:__copy_from_user Unexecuted instantiation: descriptor-tables.c:__copy_from_user Unexecuted instantiation: callback.c:__copy_from_user Unexecuted instantiation: backtrace.c:__copy_from_user Unexecuted instantiation: op_model_athlon.c:__copy_from_user Unexecuted instantiation: op_model_ppro.c:__copy_from_user Unexecuted instantiation: op_model_p4.c:__copy_from_user Unexecuted instantiation: nmi_int.c:__copy_from_user Unexecuted instantiation: nested_ept.c:__copy_from_user Unexecuted instantiation: nested_hap.c:__copy_from_user Unexecuted instantiation: hap.c:__copy_from_user Unexecuted instantiation: multi.c:__copy_from_user Unexecuted instantiation: mem_sharing.c:__copy_from_user Unexecuted instantiation: mem_paging.c:__copy_from_user Unexecuted instantiation: guest_walk.c:__copy_from_user Unexecuted instantiation: altp2m.c:__copy_from_user Unexecuted instantiation: p2m-pod.c:__copy_from_user Unexecuted instantiation: p2m-ept.c:__copy_from_user Unexecuted instantiation: p2m-pt.c:__copy_from_user Unexecuted instantiation: p2m.c:__copy_from_user Unexecuted instantiation: paging.c:__copy_from_user Unexecuted instantiation: vvmx.c:__copy_from_user Unexecuted instantiation: vmx.c:__copy_from_user Unexecuted instantiation: vmcs.c:__copy_from_user Unexecuted instantiation: realmode.c:__copy_from_user Unexecuted instantiation: vmcb.c:__copy_from_user Unexecuted instantiation: svmdebug.c:__copy_from_user Unexecuted instantiation: svm.c:__copy_from_user Unexecuted instantiation: nestedsvm.c:__copy_from_user Unexecuted instantiation: intr.c:__copy_from_user Unexecuted instantiation: vpt.c:__copy_from_user Unexecuted instantiation: vpic.c:__copy_from_user Unexecuted instantiation: vmsi.c:__copy_from_user Unexecuted instantiation: vlapic.c:__copy_from_user Unexecuted instantiation: viridian.c:__copy_from_user Unexecuted instantiation: vioapic.c:__copy_from_user Unexecuted instantiation: stdvga.c:__copy_from_user Unexecuted instantiation: save.c:__copy_from_user Unexecuted instantiation: rtc.c:__copy_from_user Unexecuted instantiation: pmtimer.c:__copy_from_user Unexecuted instantiation: nestedhvm.c:__copy_from_user Unexecuted instantiation: mtrr.c:__copy_from_user Unexecuted instantiation: ioreq.c:__copy_from_user Unexecuted instantiation: intercept.c:__copy_from_user Unexecuted instantiation: i8254.c:__copy_from_user Unexecuted instantiation: hvm.c:__copy_from_user Unexecuted instantiation: emulate.c:__copy_from_user Unexecuted instantiation: dm.c:__copy_from_user Unexecuted instantiation: asid.c:__copy_from_user Unexecuted instantiation: probe.c:__copy_from_user Unexecuted instantiation: delivery.c:__copy_from_user Unexecuted instantiation: default.c:__copy_from_user Unexecuted instantiation: x2apic.c:__copy_from_user Unexecuted instantiation: bigsmp.c:__copy_from_user Unexecuted instantiation: main.c:__copy_from_user Unexecuted instantiation: generic.c:__copy_from_user Unexecuted instantiation: vmce.c:__copy_from_user Unexecuted instantiation: util.c:__copy_from_user Unexecuted instantiation: non-fatal.c:__copy_from_user Unexecuted instantiation: mce_intel.c:__copy_from_user Unexecuted instantiation: mce-apei.c:__copy_from_user Unexecuted instantiation: mce.c:__copy_from_user Unexecuted instantiation: mctelem.c:__copy_from_user Unexecuted instantiation: barrier.c:__copy_from_user Unexecuted instantiation: mcaction.c:__copy_from_user Unexecuted instantiation: mce_amd.c:__copy_from_user Unexecuted instantiation: amd_nonfatal.c:__copy_from_user Unexecuted instantiation: vpmu_intel.c:__copy_from_user Unexecuted instantiation: vpmu_amd.c:__copy_from_user Unexecuted instantiation: vpmu.c:__copy_from_user Unexecuted instantiation: mwait-idle.c:__copy_from_user Unexecuted instantiation: intel.c:__copy_from_user Unexecuted instantiation: common.c:__copy_from_user Unexecuted instantiation: amd.c:__copy_from_user Unexecuted instantiation: powernow.c:__copy_from_user Unexecuted instantiation: cpuidle_menu.c:__copy_from_user Unexecuted instantiation: cpu_idle.c:__copy_from_user Unexecuted instantiation: suspend.c:__copy_from_user Unexecuted instantiation: power.c:__copy_from_user Unexecuted instantiation: lib.c:__copy_from_user Unexecuted instantiation: xstate.c:__copy_from_user Unexecuted instantiation: hpet.c:__copy_from_user Unexecuted instantiation: tboot.c:__copy_from_user Unexecuted instantiation: x86_emulate.c:__copy_from_user Unexecuted instantiation: usercopy.c:__copy_from_user Line | Count | Source | 231 | 1 | { | 232 | 1 | if (__builtin_constant_p(n)) { | 233 | 0 | unsigned long ret; | 234 | 0 |
| 235 | 0 | switch (n) { | 236 | 0 | case 1: | 237 | 0 | __get_user_size(*(u8 *)to, from, 1, ret, 1); | 238 | 0 | return ret; | 239 | 0 | case 2: | 240 | 0 | __get_user_size(*(u16 *)to, from, 2, ret, 2); | 241 | 0 | return ret; | 242 | 0 | case 4: | 243 | 0 | __get_user_size(*(u32 *)to, from, 4, ret, 4); | 244 | 0 | return ret; | 245 | 0 | case 8: | 246 | 0 | __get_user_size(*(u64*)to, from, 8, ret, 8); | 247 | 0 | return ret; | 248 | 0 | } | 249 | 0 | } | 250 | 1 | return __copy_from_user_ll(to, from, n); | 251 | 1 | } |
Unexecuted instantiation: srat.c:__copy_from_user Unexecuted instantiation: smpboot.c:__copy_from_user Unexecuted instantiation: smp.c:__copy_from_user Unexecuted instantiation: setup.c:__copy_from_user Unexecuted instantiation: psr.c:__copy_from_user Unexecuted instantiation: platform_hypercall.c:__copy_from_user Unexecuted instantiation: physdev.c:__copy_from_user Unexecuted instantiation: percpu.c:__copy_from_user Unexecuted instantiation: numa.c:__copy_from_user Unexecuted instantiation: nmi.c:__copy_from_user Unexecuted instantiation: mpparse.c:__copy_from_user Unexecuted instantiation: mm.c:__copy_from_user Unexecuted instantiation: microcode.c:__copy_from_user Unexecuted instantiation: microcode_intel.c:__copy_from_user Unexecuted instantiation: microcode_amd.c:__copy_from_user Unexecuted instantiation: machine_kexec.c:__copy_from_user Unexecuted instantiation: ioport_emulate.c:__copy_from_user Unexecuted instantiation: msr.c:__copy_from_user Unexecuted instantiation: io_apic.c:__copy_from_user Unexecuted instantiation: i8259.c:__copy_from_user Unexecuted instantiation: i387.c:__copy_from_user Unexecuted instantiation: hypercall.c:__copy_from_user Unexecuted instantiation: flushtlb.c:__copy_from_user Unexecuted instantiation: extable.c:__copy_from_user Unexecuted instantiation: e820.c:__copy_from_user Unexecuted instantiation: domain_page.c:__copy_from_user Unexecuted instantiation: debug.c:__copy_from_user Unexecuted instantiation: crash.c:__copy_from_user Unexecuted instantiation: compat.c:__copy_from_user Unexecuted instantiation: cpuid.c:__copy_from_user Unexecuted instantiation: apic.c:__copy_from_user Unexecuted instantiation: xsm_core.c:__copy_from_user Unexecuted instantiation: vesa.c:__copy_from_user Unexecuted instantiation: vga.c:__copy_from_user Unexecuted instantiation: apei-io.c:__copy_from_user Unexecuted instantiation: apei-base.c:__copy_from_user Unexecuted instantiation: hest.c:__copy_from_user Unexecuted instantiation: erst.c:__copy_from_user Unexecuted instantiation: reboot.c:__copy_from_user Unexecuted instantiation: hwregs.c:__copy_from_user Unexecuted instantiation: pmstat.c:__copy_from_user Unexecuted instantiation: osl.c:__copy_from_user Unexecuted instantiation: iommu_guest.c:__copy_from_user Unexecuted instantiation: iommu_cmd.c:__copy_from_user Unexecuted instantiation: iommu_intr.c:__copy_from_user Unexecuted instantiation: pci_amd_iommu.c:__copy_from_user Unexecuted instantiation: iommu_map.c:__copy_from_user Unexecuted instantiation: iommu_init.c:__copy_from_user Unexecuted instantiation: ats.c:__copy_from_user Unexecuted instantiation: vtd.c:__copy_from_user Unexecuted instantiation: quirks.c:__copy_from_user Unexecuted instantiation: intremap.c:__copy_from_user Unexecuted instantiation: qinval.c:__copy_from_user Unexecuted instantiation: utils.c:__copy_from_user Unexecuted instantiation: dmar.c:__copy_from_user Unexecuted instantiation: io.c:__copy_from_user Unexecuted instantiation: iommu.c:__copy_from_user Unexecuted instantiation: msix.c:__copy_from_user Unexecuted instantiation: msi.c:__copy_from_user Unexecuted instantiation: header.c:__copy_from_user Unexecuted instantiation: vpci.c:__copy_from_user Unexecuted instantiation: pci.c:__copy_from_user Unexecuted instantiation: utility.c:__copy_from_user Unexecuted instantiation: cpufreq_misc_governors.c:__copy_from_user Unexecuted instantiation: cpufreq_ondemand.c:__copy_from_user Unexecuted instantiation: cpufreq.c:__copy_from_user Unexecuted instantiation: serial.c:__copy_from_user Unexecuted instantiation: ehci-dbgp.c:__copy_from_user Unexecuted instantiation: ns16550.c:__copy_from_user Unexecuted instantiation: console.c:__copy_from_user Unexecuted instantiation: libelf-loader.c:__copy_from_user Unexecuted instantiation: llvm.c:__copy_from_user Unexecuted instantiation: tmem_control.c:__copy_from_user Unexecuted instantiation: tmem_xen.c:__copy_from_user Unexecuted instantiation: tmem.c:__copy_from_user Unexecuted instantiation: xmalloc_tlsf.c:__copy_from_user Unexecuted instantiation: xenoprof.c:__copy_from_user Unexecuted instantiation: wait.c:__copy_from_user Unexecuted instantiation: vsprintf.c:__copy_from_user Unexecuted instantiation: vmap.c:__copy_from_user Unexecuted instantiation: vm_event.c:__copy_from_user Unexecuted instantiation: trace.c:__copy_from_user Unexecuted instantiation: timer.c:__copy_from_user Unexecuted instantiation: time.c:__copy_from_user Unexecuted instantiation: tasklet.c:__copy_from_user Unexecuted instantiation: sysctl.c:__copy_from_user Unexecuted instantiation: symbols.c:__copy_from_user Unexecuted instantiation: stop_machine.c:__copy_from_user Unexecuted instantiation: spinlock.c:__copy_from_user Unexecuted instantiation: softirq.c:__copy_from_user Unexecuted instantiation: shutdown.c:__copy_from_user Unexecuted instantiation: schedule.c:__copy_from_user Unexecuted instantiation: sched_null.c:__copy_from_user Unexecuted instantiation: sched_rt.c:__copy_from_user Unexecuted instantiation: sched_credit2.c:__copy_from_user Unexecuted instantiation: sched_credit.c:__copy_from_user Unexecuted instantiation: sched_arinc653.c:__copy_from_user Unexecuted instantiation: rwlock.c:__copy_from_user Unexecuted instantiation: rcupdate.c:__copy_from_user Unexecuted instantiation: rangeset.c:__copy_from_user Unexecuted instantiation: preempt.c:__copy_from_user Unexecuted instantiation: pdx.c:__copy_from_user Unexecuted instantiation: page_alloc.c:__copy_from_user Unexecuted instantiation: multicall.c:__copy_from_user Unexecuted instantiation: monitor.c:__copy_from_user Unexecuted instantiation: memory.c:__copy_from_user Unexecuted instantiation: mem_access.c:__copy_from_user Unexecuted instantiation: kimage.c:__copy_from_user Unexecuted instantiation: kexec.c:__copy_from_user Unexecuted instantiation: keyhandler.c:__copy_from_user Unexecuted instantiation: kernel.c:__copy_from_user Unexecuted instantiation: irq.c:__copy_from_user Unexecuted instantiation: guestcopy.c:__copy_from_user Unexecuted instantiation: grant_table.c:__copy_from_user Unexecuted instantiation: event_fifo.c:__copy_from_user Unexecuted instantiation: event_channel.c:__copy_from_user Unexecuted instantiation: event_2l.c:__copy_from_user Unexecuted instantiation: domain.c:__copy_from_user Unexecuted instantiation: domctl.c:__copy_from_user Unexecuted instantiation: cpupool.c:__copy_from_user Unexecuted instantiation: cpu.c:__copy_from_user |
252 | | |
253 | | /* |
254 | | * The exception table consists of pairs of addresses: the first is the |
255 | | * address of an instruction that is allowed to fault, and the second is |
256 | | * the address at which the program should continue. No registers are |
257 | | * modified, so it is entirely up to the continuation code to figure out |
258 | | * what to do. |
259 | | * |
260 | | * All the routines below use bits of fixup code that are out of line |
261 | | * with the main instruction path. This means when everything is well, |
262 | | * we don't even have to jump over them. Further, they do not intrude |
263 | | * on our cache or tlb entries. |
264 | | */ |
265 | | |
266 | | struct exception_table_entry |
267 | | { |
268 | | s32 addr, cont; |
269 | | }; |
270 | | extern struct exception_table_entry __start___ex_table[]; |
271 | | extern struct exception_table_entry __stop___ex_table[]; |
272 | | extern struct exception_table_entry __start___pre_ex_table[]; |
273 | | extern struct exception_table_entry __stop___pre_ex_table[]; |
274 | | |
275 | | union stub_exception_token { |
276 | | struct { |
277 | | uint16_t ec; |
278 | | uint8_t trapnr; |
279 | | } fields; |
280 | | unsigned long raw; |
281 | | }; |
282 | | |
283 | | extern unsigned long search_exception_table(const struct cpu_user_regs *regs); |
284 | | extern void sort_exception_tables(void); |
285 | | extern void sort_exception_table(struct exception_table_entry *start, |
286 | | const struct exception_table_entry *stop); |
287 | | |
288 | | #endif /* __X86_UACCESS_H__ */ |