]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/i386/i386/copyout_fast.s
Include the psind in data returned by mincore(2).
[FreeBSD/FreeBSD.git] / sys / i386 / i386 / copyout_fast.s
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2018 The FreeBSD Foundation
5  * All rights reserved.
6  *
7  * This software was developed by Konstantin Belousov <kib@FreeBSD.org>
8  * under sponsorship from the FreeBSD Foundation.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  * $FreeBSD$
32  */
33
34 #include <machine/asmacros.h>
35 #include <machine/cputypes.h>
36 #include <machine/pmap.h>
37 #include <machine/specialreg.h>
38
39 #include "assym.inc"
40
41         .text
42
43 ENTRY(copyout_fast)
44         pushl   %ebp
45         movl    %esp, %ebp
46         pushl   %esi
47         pushl   %edi
48         pushl   %ebx
49
50         movl    $copyout_fault,%edx
51         movl    20(%ebp),%ebx   /* KCR3 */
52
53         movl    PCPU(CURPCB),%eax
54         movl    PCB_CR3(%eax),%edi
55
56         cli
57         movl    PCPU(TRAMPSTK),%esi
58         movl    PCPU(COPYOUT_BUF),%eax
59         subl    $4,%esi
60         movl    %eax,(%esi)
61         movl    12(%ebp),%eax   /* udaddr */
62         subl    $4,%esi
63         movl    %eax,(%esi)
64         movl    16(%ebp),%eax   /* len */
65         subl    $4,%esi
66         movl    %eax,(%esi)
67
68         subl    $4, %esi
69         movl    %edi, (%esi)
70
71         movl    8(%ebp),%eax    /* kaddr */
72         subl    $4,%esi
73         movl    %eax,(%esi)
74         movl    PCPU(COPYOUT_BUF),%eax
75         subl    $4,%esi
76         movl    %eax,(%esi)
77         movl    16(%ebp),%eax   /* len */
78         subl    $4,%esi
79         movl    %eax,(%esi)
80
81         movl    %esp,%eax
82         movl    %esi,%esp
83
84         /* bcopy(%esi = kaddr, %edi = PCPU(copyout_buf), %ecx = len) */
85         popl    %ecx
86         popl    %edi
87         popl    %esi
88         rep; movsb
89
90         popl    %edi
91         movl    %edi,%cr3
92
93         /* bcopy(%esi = PCPU(copyout_buf), %edi = udaddr, %ecx = len) */
94         popl    %ecx
95         popl    %edi
96         popl    %esi
97         rep; movsb
98
99         movl    %ebx,%cr3
100         movl    %eax,%esp
101         sti
102
103         xorl    %eax,%eax
104         popl    %ebx
105         popl    %edi
106         popl    %esi
107         leave
108         ret
109 END(copyout_fast)
110
111 ENTRY(copyin_fast)
112         pushl   %ebp
113         movl    %esp, %ebp
114         pushl   %esi
115         pushl   %edi
116         pushl   %ebx
117
118         movl    $copyout_fault,%edx
119         movl    20(%ebp),%ebx   /* KCR3 */
120
121         movl    PCPU(CURPCB),%eax
122         movl    PCB_CR3(%eax),%edi
123
124         cli
125         movl    PCPU(TRAMPSTK),%esi
126         movl    PCPU(COPYOUT_BUF),%eax
127         subl    $4,%esi
128         movl    %eax,(%esi)
129         movl    12(%ebp),%eax   /* kaddr */
130         subl    $4,%esi
131         movl    %eax,(%esi)
132         movl    16(%ebp),%eax   /* len */
133         subl    $4,%esi
134         movl    %eax,(%esi)
135
136         movl    8(%ebp),%eax    /* udaddr */
137         subl    $4,%esi
138         movl    %eax,(%esi)
139         movl    PCPU(COPYOUT_BUF),%eax
140         subl    $4,%esi
141         movl    %eax,(%esi)
142         movl    16(%ebp),%eax   /* len */
143         subl    $4,%esi
144         movl    %eax,(%esi)
145
146         movl    %esp,%eax
147         movl    %esi,%esp
148         movl    %edi,%cr3
149
150         /* bcopy(%esi = udaddr, %edi = PCPU(copyout_buf), %ecx = len) */
151         popl    %ecx
152         popl    %edi
153         popl    %esi
154         rep; movsb
155
156         movl    %ebx,%cr3
157
158         /* bcopy(%esi = PCPU(copyout_buf), %edi = kaddr, %ecx = len) */
159         popl    %ecx
160         popl    %edi
161         popl    %esi
162         rep; movsb
163
164         movl    %eax,%esp
165         sti
166
167         xorl    %eax,%eax
168         popl    %ebx
169         popl    %edi
170         popl    %esi
171         leave
172         ret
173 END(copyin_fast)
174
175         ALIGN_TEXT
176 copyout_fault:
177         movl    %eax,%esp
178         sti
179         movl    $EFAULT,%eax
180         popl    %ebx
181         popl    %edi
182         popl    %esi
183         leave
184         ret
185
186 ENTRY(fueword_fast)
187         pushl   %ebp
188         movl    %esp,%ebp
189         pushl   %ebx
190         pushl   %esi
191         pushl   %edi
192         movl    8(%ebp),%ecx                    /* from */
193         movl    PCPU(CURPCB),%eax
194         movl    PCB_CR3(%eax),%eax
195         movl    $fusufault,%edx
196         movl    16(%ebp),%ebx
197         movl    %esp,%esi
198         cli
199         movl    PCPU(TRAMPSTK),%esp
200         movl    %eax,%cr3
201         movl    (%ecx),%eax
202         movl    %ebx,%cr3
203         movl    %esi,%esp
204         sti
205         movl    12(%ebp),%edx
206         movl    %eax,(%edx)
207         xorl    %eax,%eax
208         popl    %edi
209         popl    %esi
210         popl    %ebx
211         leave
212         ret
213 END(fueword_fast)
214
215 ENTRY(fuword16_fast)
216         pushl   %ebp
217         movl    %esp,%ebp
218         pushl   %ebx
219         pushl   %esi
220         pushl   %edi
221         movl    8(%ebp),%ecx                    /* from */
222         movl    PCPU(CURPCB),%eax
223         movl    PCB_CR3(%eax),%eax
224         movl    $fusufault,%edx
225         movl    12(%ebp),%ebx
226         movl    %esp,%esi
227         cli
228         movl    PCPU(TRAMPSTK),%esp
229         movl    %eax,%cr3
230         movzwl  (%ecx),%eax
231         movl    %ebx,%cr3
232         movl    %esi,%esp
233         sti
234         popl    %edi
235         popl    %esi
236         popl    %ebx
237         leave
238         ret
239 END(fuword16_fast)
240
241 ENTRY(fubyte_fast)
242         pushl   %ebp
243         movl    %esp,%ebp
244         pushl   %ebx
245         pushl   %esi
246         pushl   %edi
247         movl    8(%ebp),%ecx                    /* from */
248         movl    PCPU(CURPCB),%eax
249         movl    PCB_CR3(%eax),%eax
250         movl    $fusufault,%edx
251         movl    12(%ebp),%ebx
252         movl    %esp,%esi
253         cli
254         movl    PCPU(TRAMPSTK),%esp
255         movl    %eax,%cr3
256         movzbl  (%ecx),%eax
257         movl    %ebx,%cr3
258         movl    %esi,%esp
259         sti
260         popl    %edi
261         popl    %esi
262         popl    %ebx
263         leave
264         ret
265 END(fubyte_fast)
266
267         ALIGN_TEXT
268 fusufault:
269         movl    %esi,%esp
270         sti
271         xorl    %eax,%eax
272         decl    %eax
273         popl    %edi
274         popl    %esi
275         popl    %ebx
276         leave
277         ret
278
279 ENTRY(suword_fast)
280         pushl   %ebp
281         movl    %esp,%ebp
282         pushl   %ebx
283         pushl   %esi
284         pushl   %edi
285         movl    PCPU(CURPCB),%eax
286         movl    PCB_CR3(%eax),%eax
287         movl    $fusufault,%edx
288         movl    8(%ebp),%ecx                    /* to */
289         movl    12(%ebp),%edi                   /* val */
290         movl    16(%ebp),%ebx
291         movl    %esp,%esi
292         cli
293         movl    PCPU(TRAMPSTK),%esp
294         movl    %eax,%cr3
295         movl    %edi,(%ecx)
296         movl    %ebx,%cr3
297         movl    %esi,%esp
298         sti
299         xorl    %eax,%eax
300         popl    %edi
301         popl    %esi
302         popl    %ebx
303         leave
304         ret
305 END(suword_fast)
306
307 ENTRY(suword16_fast)
308         pushl   %ebp
309         movl    %esp,%ebp
310         pushl   %ebx
311         pushl   %esi
312         pushl   %edi
313         movl    PCPU(CURPCB),%eax
314         movl    PCB_CR3(%eax),%eax
315         movl    $fusufault,%edx
316         movl    8(%ebp),%ecx                    /* to */
317         movl    12(%ebp),%edi                   /* val */
318         movl    16(%ebp),%ebx
319         movl    %esp,%esi
320         cli
321         movl    PCPU(TRAMPSTK),%esp
322         movl    %eax,%cr3
323         movw    %di,(%ecx)
324         movl    %ebx,%cr3
325         movl    %esi,%esp
326         sti
327         xorl    %eax,%eax
328         popl    %edi
329         popl    %esi
330         popl    %ebx
331         leave
332         ret
333 END(suword16_fast)
334
335 ENTRY(subyte_fast)
336         pushl   %ebp
337         movl    %esp,%ebp
338         pushl   %ebx
339         pushl   %esi
340         pushl   %edi
341         movl    PCPU(CURPCB),%eax
342         movl    PCB_CR3(%eax),%eax
343         movl    $fusufault,%edx
344         movl    8(%ebp),%ecx                    /* to */
345         movl    12(%ebp),%edi                   /* val */
346         movl    16(%ebp),%ebx
347         movl    %esp,%esi
348         cli
349         movl    PCPU(TRAMPSTK),%esp
350         movl    %eax,%cr3
351         movl    %edi,%eax
352         movb    %al,(%ecx)
353         movl    %ebx,%cr3
354         movl    %esi,%esp
355         sti
356         xorl    %eax,%eax
357         popl    %edi
358         popl    %esi
359         popl    %ebx
360         leave
361         ret
362 END(subyte_fast)