1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 #pragma ident "%Z%%M% %I% %E% SMI"
28
29 #if defined(lint) || defined(__lint)
30 #include <sys/types.h>
31 #include <sys/sunddi.h>
32 #else
33 #include <sys/asm_linkage.h>
34 #include <sys/asm_misc.h>
35 #include "assym.h"
36 #endif
37
38 #if defined(lint) || defined(__lint)
39
40 /*ARGSUSED*/
41 uint8_t
42 ddi_get8(ddi_acc_handle_t handle, uint8_t *addr)
43 {
44 return (0);
45 }
46
47 /*ARGSUSED*/
48 uint8_t
49 ddi_mem_get8(ddi_acc_handle_t handle, uint8_t *addr)
50 {
51 return (0);
52 }
53
54 /*ARGSUSED*/
55 uint8_t
56 ddi_io_get8(ddi_acc_handle_t handle, uint8_t *dev_addr)
57 {
58 return (0);
59 }
60
61 /*ARGSUSED*/
62 uint16_t
63 ddi_get16(ddi_acc_handle_t handle, uint16_t *addr)
64 {
65 return (0);
66 }
67
68 /*ARGSUSED*/
69 uint16_t
70 ddi_mem_get16(ddi_acc_handle_t handle, uint16_t *addr)
71 {
72 return (0);
73 }
74
75 /*ARGSUSED*/
76 uint16_t
77 ddi_io_get16(ddi_acc_handle_t handle, uint16_t *dev_addr)
78 {
79 return (0);
80 }
81
82 /*ARGSUSED*/
83 uint32_t
84 ddi_get32(ddi_acc_handle_t handle, uint32_t *addr)
85 {
86 return (0);
87 }
88
89 /*ARGSUSED*/
90 uint32_t
91 ddi_mem_get32(ddi_acc_handle_t handle, uint32_t *addr)
92 {
93 return (0);
94 }
95
96 /*ARGSUSED*/
97 uint32_t
98 ddi_io_get32(ddi_acc_handle_t handle, uint32_t *dev_addr)
99 {
100 return (0);
101 }
102
103 /*ARGSUSED*/
104 uint64_t
105 ddi_get64(ddi_acc_handle_t handle, uint64_t *addr)
106 {
107 return (0);
108 }
109
110 /*ARGSUSED*/
111 uint64_t
112 ddi_mem_get64(ddi_acc_handle_t handle, uint64_t *addr)
113 {
114 return (0);
115 }
116
117 /*ARGSUSED*/
118 void
119 ddi_put8(ddi_acc_handle_t handle, uint8_t *addr, uint8_t value)
120 {}
121
122 /*ARGSUSED*/
123 void
124 ddi_mem_put8(ddi_acc_handle_t handle, uint8_t *dev_addr, uint8_t value)
125 {}
126
127 /*ARGSUSED*/
128 void
129 ddi_io_put8(ddi_acc_handle_t handle, uint8_t *dev_addr, uint8_t value)
130 {}
131
132 /*ARGSUSED*/
133 void
134 ddi_put16(ddi_acc_handle_t handle, uint16_t *addr, uint16_t value)
135 {}
136
137 /*ARGSUSED*/
138 void
139 ddi_mem_put16(ddi_acc_handle_t handle, uint16_t *dev_addr, uint16_t value)
140 {}
141
142 /*ARGSUSED*/
143 void
144 ddi_io_put16(ddi_acc_handle_t handle, uint16_t *dev_addr, uint16_t value)
145 {}
146
147 /*ARGSUSED*/
148 void
149 ddi_put32(ddi_acc_handle_t handle, uint32_t *addr, uint32_t value)
150 {}
151
152 /*ARGSUSED*/
153 void
154 ddi_mem_put32(ddi_acc_handle_t handle, uint32_t *dev_addr, uint32_t value)
155 {}
156
157 /*ARGSUSED*/
158 void
159 ddi_io_put32(ddi_acc_handle_t handle, uint32_t *dev_addr, uint32_t value)
160 {}
161
162 /*ARGSUSED*/
163 void
164 ddi_put64(ddi_acc_handle_t handle, uint64_t *addr, uint64_t value)
165 {}
166
167 /*ARGSUSED*/
168 void
169 ddi_mem_put64(ddi_acc_handle_t handle, uint64_t *dev_addr, uint64_t value)
170 {}
171
172 /*ARGSUSED*/
173 void
174 ddi_rep_get8(ddi_acc_handle_t handle, uint8_t *host_addr, uint8_t *dev_addr,
175 size_t repcount, uint_t flags)
176 {}
177
178 /*ARGSUSED*/
179 void
180 ddi_rep_get16(ddi_acc_handle_t handle, uint16_t *host_addr, uint16_t *dev_addr,
181 size_t repcount, uint_t flags)
182 {}
183
184 /*ARGSUSED*/
185 void
186 ddi_rep_get32(ddi_acc_handle_t handle, uint32_t *host_addr, uint32_t *dev_addr,
187 size_t repcount, uint_t flags)
188 {}
189
190 /*ARGSUSED*/
191 void
192 ddi_rep_get64(ddi_acc_handle_t handle, uint64_t *host_addr, uint64_t *dev_addr,
193 size_t repcount, uint_t flags)
194 {}
195
196 /*ARGSUSED*/
197 void
198 ddi_rep_put8(ddi_acc_handle_t handle, uint8_t *host_addr, uint8_t *dev_addr,
199 size_t repcount, uint_t flags)
200 {}
201
202 /*ARGSUSED*/
203 void
204 ddi_rep_put16(ddi_acc_handle_t handle, uint16_t *host_addr, uint16_t *dev_addr,
205 size_t repcount, uint_t flags)
206 {}
207
208 /*ARGSUSED*/
209 void
210 ddi_rep_put32(ddi_acc_handle_t handle, uint32_t *host_addr, uint32_t *dev_addr,
211 size_t repcount, uint_t flags)
212 {}
213
214 /*ARGSUSED*/
215 void
216 ddi_rep_put64(ddi_acc_handle_t handle, uint64_t *host_addr, uint64_t *dev_addr,
217 size_t repcount, uint_t flags)
218 {}
219
220 /*ARGSUSED*/
221 void
222 ddi_mem_rep_get8(ddi_acc_handle_t handle, uint8_t *host_addr,
223 uint8_t *dev_addr, size_t repcount, uint_t flags)
224 {}
225
226 /*ARGSUSED*/
227 void
228 ddi_mem_rep_get16(ddi_acc_handle_t handle, uint16_t *host_addr,
229 uint16_t *dev_addr, size_t repcount, uint_t flags)
230 {}
231
232 /*ARGSUSED*/
233 void
234 ddi_mem_rep_get32(ddi_acc_handle_t handle, uint32_t *host_addr,
235 uint32_t *dev_addr, size_t repcount, uint_t flags)
236 {}
237
238 /*ARGSUSED*/
239 void
240 ddi_mem_rep_get64(ddi_acc_handle_t handle, uint64_t *host_addr,
241 uint64_t *dev_addr, size_t repcount, uint_t flags)
242 {}
243
244 /*ARGSUSED*/
245 void
246 ddi_mem_rep_put8(ddi_acc_handle_t handle, uint8_t *host_addr,
247 uint8_t *dev_addr, size_t repcount, uint_t flags)
248 {}
249
250 /*ARGSUSED*/
251 void
252 ddi_mem_rep_put16(ddi_acc_handle_t handle, uint16_t *host_addr,
253 uint16_t *dev_addr, size_t repcount, uint_t flags)
254 {}
255
256 /*ARGSUSED*/
257 void
258 ddi_mem_rep_put32(ddi_acc_handle_t handle, uint32_t *host_addr,
259 uint32_t *dev_addr, size_t repcount, uint_t flags)
260 {}
261
262 /*ARGSUSED*/
263 void
264 ddi_mem_rep_put64(ddi_acc_handle_t handle, uint64_t *host_addr,
265 uint64_t *dev_addr, size_t repcount, uint_t flags)
266 {}
267
268 #else /* lint */
269
270
271 #if defined(__amd64)
272
273 ENTRY(ddi_get8)
274 ALTENTRY(ddi_getb)
275 ALTENTRY(ddi_mem_getb)
276 ALTENTRY(ddi_mem_get8)
277 ALTENTRY(ddi_io_getb)
278 ALTENTRY(ddi_io_get8)
279 movl ACC_ATTR(%rdi), %edx
280 cmpl $_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %edx
281 jne 1f
282 movq %rsi, %rdx
283 xorq %rax, %rax
284 inb (%dx)
285 ret
286 1:
287 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %edx
288 jne 2f
289 movzbq (%rsi), %rax
290 ret
291 2:
292 jmp *ACC_GETB(%rdi)
293 SET_SIZE(ddi_get8)
294 SET_SIZE(ddi_getb)
295 SET_SIZE(ddi_mem_getb)
296 SET_SIZE(ddi_mem_get8)
297 SET_SIZE(ddi_io_getb)
298 SET_SIZE(ddi_io_get8)
299
300 #elif defined(__i386)
301
302 ENTRY(ddi_get8)
303 ALTENTRY(ddi_getb)
304 ALTENTRY(ddi_mem_getb)
305 ALTENTRY(ddi_mem_get8)
306 ALTENTRY(ddi_io_getb)
307 ALTENTRY(ddi_io_get8)
308 movl 4(%esp), %eax
309 movl ACC_ATTR(%eax), %ecx
310 cmpl $_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
311 jne 1f
312 movl 8(%esp), %edx
313 xorl %eax, %eax
314 inb (%dx)
315 ret
316 1:
317 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
318 jne 2f
319 movl 8(%esp), %eax
320 movzbl (%eax), %eax
321 ret
322 2:
323 jmp *ACC_GETB(%eax)
324 SET_SIZE(ddi_get8)
325 SET_SIZE(ddi_getb)
326 SET_SIZE(ddi_mem_getb)
327 SET_SIZE(ddi_mem_get8)
328 SET_SIZE(ddi_io_getb)
329 SET_SIZE(ddi_io_get8)
330
331 #endif /* __i386 */
332
333 #if defined(__amd64)
334
335 ENTRY(ddi_get16)
336 ALTENTRY(ddi_getw)
337 ALTENTRY(ddi_mem_getw)
338 ALTENTRY(ddi_mem_get16)
339 ALTENTRY(ddi_io_getw)
340 ALTENTRY(ddi_io_get16)
341 movl ACC_ATTR(%rdi), %edx
342 cmpl $_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %edx
343 jne 3f
344 movq %rsi, %rdx
345 xorq %rax, %rax
346 inw (%dx)
347 ret
348 3:
349 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %edx
350 jne 4f
351 movzwq (%rsi), %rax
352 ret
353 4:
354 jmp *ACC_GETW(%rdi)
355 SET_SIZE(ddi_get16)
356 SET_SIZE(ddi_getw)
357 SET_SIZE(ddi_mem_getw)
358 SET_SIZE(ddi_mem_get16)
359 SET_SIZE(ddi_io_getw)
360 SET_SIZE(ddi_io_get16)
361
362 #elif defined(__i386)
363
364 ENTRY(ddi_get16)
365 ALTENTRY(ddi_getw)
366 ALTENTRY(ddi_mem_getw)
367 ALTENTRY(ddi_mem_get16)
368 ALTENTRY(ddi_io_getw)
369 ALTENTRY(ddi_io_get16)
370 movl 4(%esp), %eax
371 movl ACC_ATTR(%eax), %ecx
372 cmpl $_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
373 jne 3f
374 movl 8(%esp), %edx
375 xorl %eax, %eax
376 inw (%dx)
377 ret
378 3:
379 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
380 jne 4f
381 movl 8(%esp), %eax
382 movzwl (%eax), %eax
383 ret
384 4:
385 jmp *ACC_GETW(%eax)
386 SET_SIZE(ddi_get16)
387 SET_SIZE(ddi_getw)
388 SET_SIZE(ddi_mem_getw)
389 SET_SIZE(ddi_mem_get16)
390 SET_SIZE(ddi_io_getw)
391 SET_SIZE(ddi_io_get16)
392
393 #endif /* __i386 */
394
395 #if defined(__amd64)
396
397 ENTRY(ddi_get32)
398 ALTENTRY(ddi_getl)
399 ALTENTRY(ddi_mem_getl)
400 ALTENTRY(ddi_mem_get32)
401 ALTENTRY(ddi_io_getl)
402 ALTENTRY(ddi_io_get32)
403 movl ACC_ATTR(%rdi), %edx
404 cmpl $_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %edx
405 jne 5f
406 movq %rsi, %rdx
407 inl (%dx)
408 ret
409 5:
410 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %edx
411 jne 6f
412 movl (%rsi), %eax
413 ret
414 6:
415 jmp *ACC_GETL(%rdi)
416 SET_SIZE(ddi_get32)
417 SET_SIZE(ddi_getl)
418 SET_SIZE(ddi_mem_getl)
419 SET_SIZE(ddi_mem_get32)
420 SET_SIZE(ddi_io_getl)
421 SET_SIZE(ddi_io_get32)
422
423 #elif defined(__i386)
424
425 ENTRY(ddi_get32)
426 ALTENTRY(ddi_getl)
427 ALTENTRY(ddi_mem_getl)
428 ALTENTRY(ddi_mem_get32)
429 ALTENTRY(ddi_io_getl)
430 ALTENTRY(ddi_io_get32)
431 movl 4(%esp), %eax
432 movl ACC_ATTR(%eax), %ecx
433 cmpl $_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
434 jne 5f
435 movl 8(%esp), %edx
436 inl (%dx)
437 ret
438 5:
439 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
440 jne 6f
441 movl 8(%esp), %eax
442 movl (%eax), %eax
443 ret
444 6:
445 jmp *ACC_GETL(%eax)
446 SET_SIZE(ddi_get32)
447 SET_SIZE(ddi_getl)
448 SET_SIZE(ddi_mem_getl)
449 SET_SIZE(ddi_mem_get32)
450 SET_SIZE(ddi_io_getl)
451 SET_SIZE(ddi_io_get32)
452
453 #endif /* __i386 */
454
455 #if defined(__amd64)
456
457 ENTRY(ddi_get64)
458 ALTENTRY(ddi_getll)
459 ALTENTRY(ddi_mem_getll)
460 ALTENTRY(ddi_mem_get64)
461 jmp *ACC_GETLL(%rdi)
462 SET_SIZE(ddi_get64)
463 SET_SIZE(ddi_getll)
464 SET_SIZE(ddi_mem_getll)
465 SET_SIZE(ddi_mem_get64)
466
467 #elif defined(__i386)
468
469 ENTRY(ddi_get64)
470 ALTENTRY(ddi_getll)
471 ALTENTRY(ddi_mem_getll)
472 ALTENTRY(ddi_mem_get64)
473 movl 4(%esp), %eax
474 jmp *ACC_GETLL(%eax)
475 SET_SIZE(ddi_get64)
476 SET_SIZE(ddi_getll)
477 SET_SIZE(ddi_mem_getll)
478 SET_SIZE(ddi_mem_get64)
479
480 #endif /* __i386 */
481
482 #if defined(__amd64)
483
484 ENTRY(ddi_put8)
485 ALTENTRY(ddi_putb)
486 ALTENTRY(ddi_mem_putb)
487 ALTENTRY(ddi_mem_put8)
488 ALTENTRY(ddi_io_putb)
489 ALTENTRY(ddi_io_put8)
490 movl ACC_ATTR(%rdi), %ecx
491 cmpl $_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
492 jne 7f
493 movq %rdx, %rax
494 movq %rsi, %rdx
495 outb (%dx)
496 ret
497 7:
498 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
499 jne 8f
500 movb %dl, (%rsi)
501 ret
502 8:
503 jmp *ACC_PUTB(%rdi)
504 SET_SIZE(ddi_put8)
505 SET_SIZE(ddi_putb)
506 SET_SIZE(ddi_mem_putb)
507 SET_SIZE(ddi_mem_put8)
508 SET_SIZE(ddi_io_putb)
509 SET_SIZE(ddi_io_put8)
510
511 #elif defined(__i386)
512
513 ENTRY(ddi_put8)
514 ALTENTRY(ddi_putb)
515 ALTENTRY(ddi_mem_putb)
516 ALTENTRY(ddi_mem_put8)
517 ALTENTRY(ddi_io_putb)
518 ALTENTRY(ddi_io_put8)
519 movl 4(%esp), %eax
520 movl ACC_ATTR(%eax), %ecx
521 cmpl $_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
522 jne 7f
523 movl 12(%esp), %eax
524 movl 8(%esp), %edx
525 outb (%dx)
526 ret
527 7:
528 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
529 jne 8f
530 movl 8(%esp), %eax
531 movl 12(%esp), %ecx
532 movb %cl, (%eax)
533 ret
534 8:
535 jmp *ACC_PUTB(%eax)
536 SET_SIZE(ddi_put8)
537 SET_SIZE(ddi_putb)
538 SET_SIZE(ddi_mem_putb)
539 SET_SIZE(ddi_mem_put8)
540 SET_SIZE(ddi_io_putb)
541 SET_SIZE(ddi_io_put8)
542
543 #endif /* __i386 */
544
545 #if defined(__amd64)
546
547 ENTRY(ddi_put16)
548 ALTENTRY(ddi_putw)
549 ALTENTRY(ddi_mem_putw)
550 ALTENTRY(ddi_mem_put16)
551 ALTENTRY(ddi_io_putw)
552 ALTENTRY(ddi_io_put16)
553 movl ACC_ATTR(%rdi), %ecx
554 cmpl $_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
555 jne 8f
556 movq %rdx, %rax
557 movq %rsi, %rdx
558 outw (%dx)
559 ret
560 8:
561 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
562 jne 9f
563 movw %dx, (%rsi)
564 ret
565 9:
566 jmp *ACC_PUTW(%rdi)
567 SET_SIZE(ddi_put16)
568 SET_SIZE(ddi_putw)
569 SET_SIZE(ddi_mem_putw)
570 SET_SIZE(ddi_mem_put16)
571 SET_SIZE(ddi_io_putw)
572 SET_SIZE(ddi_io_put16)
573
574 #elif defined(__i386)
575
576 ENTRY(ddi_put16)
577 ALTENTRY(ddi_putw)
578 ALTENTRY(ddi_mem_putw)
579 ALTENTRY(ddi_mem_put16)
580 ALTENTRY(ddi_io_putw)
581 ALTENTRY(ddi_io_put16)
582 movl 4(%esp), %eax
583 movl ACC_ATTR(%eax), %ecx
584 cmpl $_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
585 jne 8f
586 movl 12(%esp), %eax
587 movl 8(%esp), %edx
588 outw (%dx)
589 ret
590 8:
591 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
592 jne 9f
593 movl 8(%esp), %eax
594 movl 12(%esp), %ecx
595 movw %cx, (%eax)
596 ret
597 9:
598 jmp *ACC_PUTW(%eax)
599 SET_SIZE(ddi_put16)
600 SET_SIZE(ddi_putw)
601 SET_SIZE(ddi_mem_putw)
602 SET_SIZE(ddi_mem_put16)
603 SET_SIZE(ddi_io_putw)
604 SET_SIZE(ddi_io_put16)
605
606 #endif /* __i386 */
607
608 #if defined(__amd64)
609
610 ENTRY(ddi_put32)
611 ALTENTRY(ddi_putl)
612 ALTENTRY(ddi_mem_putl)
613 ALTENTRY(ddi_mem_put32)
614 ALTENTRY(ddi_io_putl)
615 ALTENTRY(ddi_io_put32)
616 movl ACC_ATTR(%rdi), %ecx
617 cmpl $_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
618 jne 8f
619 movq %rdx, %rax
620 movq %rsi, %rdx
621 outl (%dx)
622 ret
623 8:
624 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
625 jne 9f
626 movl %edx, (%rsi)
627 ret
628 9:
629 jmp *ACC_PUTL(%rdi)
630 SET_SIZE(ddi_put32)
631 SET_SIZE(ddi_putl)
632 SET_SIZE(ddi_mem_putl)
633 SET_SIZE(ddi_mem_put32)
634 SET_SIZE(ddi_io_putl)
635 SET_SIZE(ddi_io_put32)
636
637 #elif defined(__i386)
638
639 ENTRY(ddi_put32)
640 ALTENTRY(ddi_putl)
641 ALTENTRY(ddi_mem_putl)
642 ALTENTRY(ddi_mem_put32)
643 ALTENTRY(ddi_io_putl)
644 ALTENTRY(ddi_io_put32)
645 movl 4(%esp), %eax
646 movl ACC_ATTR(%eax), %ecx
647 cmpl $_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
648 jne 8f
649 movl 12(%esp), %eax
650 movl 8(%esp), %edx
651 outl (%dx)
652 ret
653 8:
654 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
655 jne 9f
656 movl 8(%esp), %eax
657 movl 12(%esp), %ecx
658 movl %ecx, (%eax)
659 ret
660 9:
661 jmp *ACC_PUTL(%eax)
662 SET_SIZE(ddi_put32)
663 SET_SIZE(ddi_putl)
664 SET_SIZE(ddi_mem_putl)
665 SET_SIZE(ddi_mem_put32)
666 SET_SIZE(ddi_io_putl)
667 SET_SIZE(ddi_io_put32)
668
669 #endif /* __i386 */
670
671 #if defined(__amd64)
672
673 ENTRY(ddi_put64)
674 ALTENTRY(ddi_putll)
675 ALTENTRY(ddi_mem_putll)
676 ALTENTRY(ddi_mem_put64)
677 jmp *ACC_PUTLL(%rdi)
678 SET_SIZE(ddi_put64)
679 SET_SIZE(ddi_putll)
680 SET_SIZE(ddi_mem_putll)
681 SET_SIZE(ddi_mem_put64)
682
683 #elif defined(__i386)
684
685 ENTRY(ddi_put64)
686 ALTENTRY(ddi_putll)
687 ALTENTRY(ddi_mem_putll)
688 ALTENTRY(ddi_mem_put64)
689 movl 4(%esp), %eax
690 jmp *ACC_PUTLL(%eax)
691 SET_SIZE(ddi_put64)
692 SET_SIZE(ddi_putll)
693 SET_SIZE(ddi_mem_putll)
694 SET_SIZE(ddi_mem_put64)
695
696 #endif /* __i386 */
697
698 #if defined(__amd64)
699
700 ENTRY(ddi_rep_get8)
701 ALTENTRY(ddi_rep_getb)
702 ALTENTRY(ddi_mem_rep_getb)
703 ALTENTRY(ddi_mem_rep_get8)
704 jmp *ACC_REP_GETB(%rdi)
705 SET_SIZE(ddi_rep_get8)
706 SET_SIZE(ddi_rep_getb)
707 SET_SIZE(ddi_mem_rep_getb)
708 SET_SIZE(ddi_mem_rep_get8)
709
710 #elif defined(__i386)
711
712 ENTRY(ddi_rep_get8)
713 ALTENTRY(ddi_rep_getb)
714 ALTENTRY(ddi_mem_rep_getb)
715 ALTENTRY(ddi_mem_rep_get8)
716 movl 4(%esp), %eax
717 jmp *ACC_REP_GETB(%eax)
718 SET_SIZE(ddi_rep_get8)
719 SET_SIZE(ddi_rep_getb)
720 SET_SIZE(ddi_mem_rep_getb)
721 SET_SIZE(ddi_mem_rep_get8)
722
723 #endif /* __i386 */
724
725 #if defined(__amd64)
726
727 ENTRY(ddi_rep_get16)
728 ALTENTRY(ddi_rep_getw)
729 ALTENTRY(ddi_mem_rep_getw)
730 ALTENTRY(ddi_mem_rep_get16)
731 jmp *ACC_REP_GETW(%rdi)
732 SET_SIZE(ddi_rep_get16)
733 SET_SIZE(ddi_rep_getw)
734 SET_SIZE(ddi_mem_rep_getw)
735 SET_SIZE(ddi_mem_rep_get16)
736
737 #elif defined(__i386)
738
739 ENTRY(ddi_rep_get16)
740 ALTENTRY(ddi_rep_getw)
741 ALTENTRY(ddi_mem_rep_getw)
742 ALTENTRY(ddi_mem_rep_get16)
743 movl 4(%esp), %eax
744 jmp *ACC_REP_GETW(%eax)
745 SET_SIZE(ddi_rep_get16)
746 SET_SIZE(ddi_rep_getw)
747 SET_SIZE(ddi_mem_rep_getw)
748 SET_SIZE(ddi_mem_rep_get16)
749
750 #endif /* __i386 */
751
752 #if defined(__amd64)
753
754 ENTRY(ddi_rep_get32)
755 ALTENTRY(ddi_rep_getl)
756 ALTENTRY(ddi_mem_rep_getl)
757 ALTENTRY(ddi_mem_rep_get32)
758 jmp *ACC_REP_GETL(%rdi)
759 SET_SIZE(ddi_rep_get32)
760 SET_SIZE(ddi_rep_getl)
761 SET_SIZE(ddi_mem_rep_getl)
762 SET_SIZE(ddi_mem_rep_get32)
763
764 #elif defined(__i386)
765
766 ENTRY(ddi_rep_get32)
767 ALTENTRY(ddi_rep_getl)
768 ALTENTRY(ddi_mem_rep_getl)
769 ALTENTRY(ddi_mem_rep_get32)
770 movl 4(%esp), %eax
771 jmp *ACC_REP_GETL(%eax)
772 SET_SIZE(ddi_rep_get32)
773 SET_SIZE(ddi_rep_getl)
774 SET_SIZE(ddi_mem_rep_getl)
775 SET_SIZE(ddi_mem_rep_get32)
776
777 #endif /* __i386 */
778
779 #if defined(__amd64)
780
781 ENTRY(ddi_rep_get64)
782 ALTENTRY(ddi_rep_getll)
783 ALTENTRY(ddi_mem_rep_getll)
784 ALTENTRY(ddi_mem_rep_get64)
785 jmp *ACC_REP_GETLL(%rdi)
786 SET_SIZE(ddi_rep_get64)
787 SET_SIZE(ddi_rep_getll)
788 SET_SIZE(ddi_mem_rep_getll)
789 SET_SIZE(ddi_mem_rep_get64)
790
791 #elif defined(__i386)
792
793 ENTRY(ddi_rep_get64)
794 ALTENTRY(ddi_rep_getll)
795 ALTENTRY(ddi_mem_rep_getll)
796 ALTENTRY(ddi_mem_rep_get64)
797 movl 4(%esp), %eax
798 jmp *ACC_REP_GETLL(%eax)
799 SET_SIZE(ddi_rep_get64)
800 SET_SIZE(ddi_rep_getll)
801 SET_SIZE(ddi_mem_rep_getll)
802 SET_SIZE(ddi_mem_rep_get64)
803
804 #endif /* __i386 */
805
806 #if defined(__amd64)
807
808 ENTRY(ddi_rep_put8)
809 ALTENTRY(ddi_rep_putb)
810 ALTENTRY(ddi_mem_rep_putb)
811 ALTENTRY(ddi_mem_rep_put8)
812 jmp *ACC_REP_PUTB(%rdi)
813 SET_SIZE(ddi_rep_put8)
814 SET_SIZE(ddi_rep_putb)
815 SET_SIZE(ddi_mem_rep_putb)
816 SET_SIZE(ddi_mem_rep_put8)
817
818 #elif defined(__i386)
819
820 ENTRY(ddi_rep_put8)
821 ALTENTRY(ddi_rep_putb)
822 ALTENTRY(ddi_mem_rep_putb)
823 ALTENTRY(ddi_mem_rep_put8)
824 movl 4(%esp), %eax
825 jmp *ACC_REP_PUTB(%eax)
826 SET_SIZE(ddi_rep_put8)
827 SET_SIZE(ddi_rep_putb)
828 SET_SIZE(ddi_mem_rep_putb)
829 SET_SIZE(ddi_mem_rep_put8)
830
831 #endif /* __i386 */
832
833 #if defined(__amd64)
834
835 ENTRY(ddi_rep_put16)
836 ALTENTRY(ddi_rep_putw)
837 ALTENTRY(ddi_mem_rep_putw)
838 ALTENTRY(ddi_mem_rep_put16)
839 jmp *ACC_REP_PUTW(%rdi)
840 SET_SIZE(ddi_rep_put16)
841 SET_SIZE(ddi_rep_putw)
842 SET_SIZE(ddi_mem_rep_putw)
843 SET_SIZE(ddi_mem_rep_put16)
844
845 #elif defined(__i386)
846
847 ENTRY(ddi_rep_put16)
848 ALTENTRY(ddi_rep_putw)
849 ALTENTRY(ddi_mem_rep_putw)
850 ALTENTRY(ddi_mem_rep_put16)
851 movl 4(%esp), %eax
852 jmp *ACC_REP_PUTW(%eax)
853 SET_SIZE(ddi_rep_put16)
854 SET_SIZE(ddi_rep_putw)
855 SET_SIZE(ddi_mem_rep_putw)
856 SET_SIZE(ddi_mem_rep_put16)
857
858 #endif /* __i386 */
859
860 #if defined(__amd64)
861
862 ENTRY(ddi_rep_put32)
863 ALTENTRY(ddi_rep_putl)
864 ALTENTRY(ddi_mem_rep_putl)
865 ALTENTRY(ddi_mem_rep_put32)
866 jmp *ACC_REP_PUTL(%rdi)
867 SET_SIZE(ddi_rep_put32)
868 SET_SIZE(ddi_rep_putl)
869 SET_SIZE(ddi_mem_rep_putl)
870 SET_SIZE(ddi_mem_rep_put32)
871
872 #elif defined(__i386)
873
874 ENTRY(ddi_rep_put32)
875 ALTENTRY(ddi_rep_putl)
876 ALTENTRY(ddi_mem_rep_putl)
877 ALTENTRY(ddi_mem_rep_put32)
878 movl 4(%esp), %eax
879 jmp *ACC_REP_PUTL(%eax)
880 SET_SIZE(ddi_rep_put32)
881 SET_SIZE(ddi_rep_putl)
882 SET_SIZE(ddi_mem_rep_putl)
883 SET_SIZE(ddi_mem_rep_put32)
884
885 #endif /* __i386 */
886
887 #if defined(__amd64)
888
889 ENTRY(ddi_rep_put64)
890 ALTENTRY(ddi_rep_putll)
891 ALTENTRY(ddi_mem_rep_putll)
892 ALTENTRY(ddi_mem_rep_put64)
893 jmp *ACC_REP_PUTLL(%rdi)
894 SET_SIZE(ddi_rep_put64)
895 SET_SIZE(ddi_rep_putll)
896 SET_SIZE(ddi_mem_rep_putll)
897 SET_SIZE(ddi_mem_rep_put64)
898
899 #elif defined(__i386)
900
901 ENTRY(ddi_rep_put64)
902 ALTENTRY(ddi_rep_putll)
903 ALTENTRY(ddi_mem_rep_putll)
904 ALTENTRY(ddi_mem_rep_put64)
905 movl 4(%esp), %eax
906 jmp *ACC_REP_PUTLL(%eax)
907 SET_SIZE(ddi_rep_put64)
908 SET_SIZE(ddi_rep_putll)
909 SET_SIZE(ddi_mem_rep_putll)
910 SET_SIZE(ddi_mem_rep_put64)
911
912 #endif /* __i386 */
913
914 #endif /* lint */
915
916 #if defined(lint) || defined(__lint)
917
918 /*ARGSUSED*/
919 uint8_t
920 i_ddi_vaddr_get8(ddi_acc_impl_t *hdlp, uint8_t *addr)
921 {
922 return (*addr);
923 }
924
925 /*ARGSUSED*/
926 uint16_t
927 i_ddi_vaddr_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
928 {
929 return (*addr);
930 }
931
932 /*ARGSUSED*/
933 uint32_t
934 i_ddi_vaddr_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
935 {
936 return (*addr);
937 }
938
939 /*ARGSUSED*/
940 uint64_t
941 i_ddi_vaddr_get64(ddi_acc_impl_t *hdlp, uint64_t *addr)
942 {
943 return (*addr);
944 }
945
946 #else /* lint */
947
948 #if defined(__amd64)
949
950 ENTRY(i_ddi_vaddr_get8)
951 movzbq (%rsi), %rax
952 ret
953 SET_SIZE(i_ddi_vaddr_get8)
954
955 #elif defined(__i386)
956
957 ENTRY(i_ddi_vaddr_get8)
958 movl 8(%esp), %eax
959 movzbl (%eax), %eax
960 ret
961 SET_SIZE(i_ddi_vaddr_get8)
962
963 #endif /* __i386 */
964
965 #if defined(__amd64)
966
967 ENTRY(i_ddi_vaddr_get16)
968 movzwq (%rsi), %rax
969 ret
970 SET_SIZE(i_ddi_vaddr_get16)
971
972 #elif defined(__i386)
973
974 ENTRY(i_ddi_vaddr_get16)
975 movl 8(%esp), %eax
976 movzwl (%eax), %eax
977 ret
978 SET_SIZE(i_ddi_vaddr_get16)
979
980 #endif /* __i386 */
981
982 #if defined(__amd64)
983
984 ENTRY(i_ddi_vaddr_get32)
985 movl (%rsi), %eax
986 ret
987 SET_SIZE(i_ddi_vaddr_get32)
988
989 #elif defined(__i386)
990
991 ENTRY(i_ddi_vaddr_get32)
992 movl 8(%esp), %eax
993 movl (%eax), %eax
994 ret
995 SET_SIZE(i_ddi_vaddr_get32)
996
997 #endif /* __i386 */
998
999 #if defined(__amd64)
1000
1001 ENTRY(i_ddi_vaddr_get64)
1002 movq (%rsi), %rax
1003 ret
1004 SET_SIZE(i_ddi_vaddr_get64)
1005
1006 #elif defined(__i386)
1007
1008 ENTRY(i_ddi_vaddr_get64)
1009 movl 8(%esp), %ecx
1010 movl (%ecx), %eax
1011 movl 4(%ecx), %edx
1012 ret
1013 SET_SIZE(i_ddi_vaddr_get64)
1014
1015 #endif /* __i386 */
1016
1017 #endif /* lint */
1018
1019
1020 #if defined(lint) || defined(__lint)
1021
1022 /*ARGSUSED*/
1023 uint8_t
1024 i_ddi_io_get8(ddi_acc_impl_t *hdlp, uint8_t *addr)
1025 {
1026 return (0);
1027 }
1028
1029 /*ARGSUSED*/
1030 uint16_t
1031 i_ddi_io_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
1032 {
1033 return (0);
1034 }
1035
1036 /*ARGSUSED*/
1037 uint32_t
1038 i_ddi_io_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
1039 {
1040 return (0);
1041 }
1042
1043 #else /* lint */
1044
1045 #if defined(__amd64)
1046
1047 ENTRY(i_ddi_io_get8)
1048 movq %rsi, %rdx
1049 inb (%dx)
1050 movzbq %al, %rax
1051 ret
1052 SET_SIZE(i_ddi_io_get8)
1053
1054 #elif defined(__i386)
1055
1056 ENTRY(i_ddi_io_get8)
1057 movl 8(%esp), %edx
1058 inb (%dx)
1059 movzbl %al, %eax
1060 ret
1061 SET_SIZE(i_ddi_io_get8)
1062
1063 #endif /* __i386 */
1064
1065 #if defined(__amd64)
1066
1067 ENTRY(i_ddi_io_get16)
1068 movq %rsi, %rdx
1069 inw (%dx)
1070 movzwq %ax, %rax
1071 ret
1072 SET_SIZE(i_ddi_io_get16)
1073
1074 #elif defined(__i386)
1075
1076 ENTRY(i_ddi_io_get16)
1077 movl 8(%esp), %edx
1078 inw (%dx)
1079 movzwl %ax, %eax
1080 ret
1081 SET_SIZE(i_ddi_io_get16)
1082
1083 #endif /* __i386 */
1084
1085 #if defined(__amd64)
1086
1087 ENTRY(i_ddi_io_get32)
1088 movq %rsi, %rdx
1089 inl (%dx)
1090 ret
1091 SET_SIZE(i_ddi_io_get32)
1092
1093 #elif defined(__i386)
1094
1095 ENTRY(i_ddi_io_get32)
1096 movl 8(%esp), %edx
1097 inl (%dx)
1098 ret
1099 SET_SIZE(i_ddi_io_get32)
1100
1101 #endif /* __i386 */
1102
1103 #endif /* lint */
1104
1105 #if defined(lint) || defined(__lint)
1106
1107 /*ARGSUSED*/
1108 void
1109 i_ddi_vaddr_put8(ddi_acc_impl_t *hdlp, uint8_t *addr, uint8_t value)
1110 {
1111 *addr = value;
1112 }
1113
1114 /*ARGSUSED*/
1115 void
1116 i_ddi_vaddr_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
1117 {
1118 *addr = value;
1119 }
1120
1121 /*ARGSUSED*/
1122 void
1123 i_ddi_vaddr_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
1124 {
1125 *(uint32_t *)addr = value;
1126 }
1127
1128 /*ARGSUSED*/
1129 void
1130 i_ddi_vaddr_put64(ddi_acc_impl_t *hdlp, uint64_t *addr, uint64_t value)
1131 {
1132 *addr = value;
1133 }
1134
1135 #else /* lint */
1136
1137 #if defined(__amd64)
1138
1139 ENTRY(i_ddi_vaddr_put8)
1140 movb %dl, (%rsi)
1141 ret
1142 SET_SIZE(i_ddi_vaddr_put8)
1143
1144 #elif defined(__i386)
1145
1146 ENTRY(i_ddi_vaddr_put8)
1147 movl 8(%esp), %eax
1148 movb 12(%esp), %cl
1149 movb %cl, (%eax)
1150 ret
1151 SET_SIZE(i_ddi_vaddr_put8)
1152
1153 #endif /* __i386 */
1154
1155 #if defined(__amd64)
1156
1157 ENTRY(i_ddi_vaddr_put16)
1158 movw %dx, (%rsi)
1159 ret
1160 SET_SIZE(i_ddi_vaddr_put16)
1161
1162 #elif defined(__i386)
1163
1164 ENTRY(i_ddi_vaddr_put16)
1165 movl 8(%esp), %eax
1166 movl 12(%esp), %ecx
1167 movw %cx, (%eax)
1168 ret
1169 SET_SIZE(i_ddi_vaddr_put16)
1170
1171 #endif /* __i386 */
1172
1173 #if defined(__amd64)
1174
1175 ENTRY(i_ddi_vaddr_put32)
1176 movl %edx, (%rsi)
1177 ret
1178 SET_SIZE(i_ddi_vaddr_put32)
1179
1180 #elif defined(__i386)
1181
1182 ENTRY(i_ddi_vaddr_put32)
1183 movl 8(%esp), %eax
1184 movl 12(%esp), %ecx
1185 movl %ecx, (%eax)
1186 ret
1187 SET_SIZE(i_ddi_vaddr_put32)
1188
1189 #endif /* __i386 */
1190
1191 #if defined(__amd64)
1192
1193 ENTRY(i_ddi_vaddr_put64)
1194 movq %rdx, (%rsi)
1195 ret
1196 SET_SIZE(i_ddi_vaddr_put64)
1197
1198 #elif defined(__i386)
1199
1200 ENTRY(i_ddi_vaddr_put64)
1201 movl 8(%esp), %ecx
1202 movl 12(%esp), %edx
1203 movl 16(%esp), %eax
1204 movl %edx, (%ecx)
1205 movl %eax, 4(%ecx)
1206 ret
1207 SET_SIZE(i_ddi_vaddr_put64)
1208
1209 #endif /* __i386 */
1210
1211 #endif /* lint */
1212
1213 #if defined(lint) || defined(__lint)
1214
1215 /*ARGSUSED*/
1216 void
1217 i_ddi_io_put8(ddi_acc_impl_t *hdlp, uint8_t *addr, uint8_t value)
1218 {}
1219
1220 /*ARGSUSED*/
1221 void
1222 i_ddi_io_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
1223 {}
1224
1225 /*ARGSUSED*/
1226 void
1227 i_ddi_io_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
1228 {}
1229
1230 #else /* lint */
1231
1232 #if defined(__amd64)
1233
1234 ENTRY(i_ddi_io_put8)
1235 movq %rdx, %rax
1236 movq %rsi, %rdx
1237 outb (%dx)
1238 ret
1239 SET_SIZE(i_ddi_io_put8)
1240
1241 #elif defined(__i386)
1242
1243 ENTRY(i_ddi_io_put8)
1244 movl 12(%esp), %eax
1245 movl 8(%esp), %edx
1246 outb (%dx)
1247 ret
1248 SET_SIZE(i_ddi_io_put8)
1249
1250 #endif /* __i386 */
1251
1252 #if defined(__amd64)
1253
1254 ENTRY(i_ddi_io_put16)
1255 movq %rdx, %rax
1256 movq %rsi, %rdx
1257 outw (%dx)
1258 ret
1259 SET_SIZE(i_ddi_io_put16)
1260
1261 #elif defined(__i386)
1262
1263 ENTRY(i_ddi_io_put16)
1264 movl 12(%esp), %eax
1265 movl 8(%esp), %edx
1266 outw (%dx)
1267 ret
1268 SET_SIZE(i_ddi_io_put16)
1269
1270 #endif /* __i386 */
1271
1272 #if defined(__amd64)
1273
1274 ENTRY(i_ddi_io_put32)
1275 movq %rdx, %rax
1276 movq %rsi, %rdx
1277 outl (%dx)
1278 ret
1279 SET_SIZE(i_ddi_io_put32)
1280
1281 #elif defined(__i386)
1282
1283 ENTRY(i_ddi_io_put32)
1284 movl 12(%esp), %eax
1285 movl 8(%esp), %edx
1286 outl (%dx)
1287 ret
1288 SET_SIZE(i_ddi_io_put32)
1289
1290 #endif /* __i386 */
1291
1292 #endif /* lint */
1293
1294 #if defined(lint) || defined(__lint)
1295
1296 /*ARGSUSED*/
1297 void
1298 i_ddi_io_rep_get8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
1299 uint8_t *dev_addr, size_t repcount, uint_t flags)
1300 {}
1301
1302 /*ARGSUSED*/
1303 void
1304 i_ddi_io_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1305 uint16_t *dev_addr, size_t repcount, uint_t flags)
1306 {}
1307
1308 /*ARGSUSED*/
1309 void
1310 i_ddi_io_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1311 uint32_t *dev_addr, size_t repcount, uint_t flags)
1312 {}
1313
1314 #else /* lint */
1315
1316 #if defined(__amd64)
1317
1318 /*
1319 * Incoming arguments
1320 *
1321 * %rdi : hdlp
1322 * %rsi : host_addr
1323 * %rdx : dev_addr
1324 * %rcx : repcount
1325 * %r8 : flags
1326 *
1327 * This routine will destroy values in %rdx, %rsi, %rcx.
1328 */
1329 ENTRY(i_ddi_io_rep_get8)
1330
1331 cmpq $DDI_DEV_AUTOINCR, %r8
1332 je gb_ioadv
1333 movq %rsi, %rdi
1334 rep
1335 insb
1336 ret
1337
1338 gb_ioadv:
1339 andq %rcx, %rcx
1340 jz gb_ioadv_done
1341 gb_ioadv2:
1342 inb (%dx)
1343 movb %al, (%rsi)
1344 incq %rdx
1345 incq %rsi
1346 decq %rcx
1347 jg gb_ioadv2
1348
1349 gb_ioadv_done:
1350 rep; ret /* use 2 byte return instruction when branch target */
1351 /* AMD Software Optimization Guide - Section 6.2 */
1352
1353 SET_SIZE(i_ddi_io_rep_get8)
1354
1355 #elif defined(__i386)
1356
1357 ENTRY(i_ddi_io_rep_get8)
1358 pushl %edi
1359
1360 movl 12(%esp),%edi / get host_addr
1361 movl 16(%esp),%edx / get port
1362 movl 20(%esp),%ecx / get repcount
1363 cmpl $DDI_DEV_AUTOINCR, 24(%esp)
1364 je gb_ioadv
1365
1366 rep
1367 insb
1368 popl %edi
1369 ret
1370
1371 gb_ioadv:
1372 andl %ecx, %ecx
1373 jz gb_ioadv_done
1374 gb_ioadv2:
1375 inb (%dx)
1376 movb %al,(%edi)
1377 incl %edi
1378 incl %edx
1379 decl %ecx
1380 jg gb_ioadv2
1381
1382 gb_ioadv_done:
1383 popl %edi
1384 ret
1385
1386 SET_SIZE(i_ddi_io_rep_get8)
1387
1388 #endif /* __i386 */
1389
1390 #if defined(__amd64)
1391
1392 ENTRY(i_ddi_io_rep_get16)
1393
1394 cmpq $DDI_DEV_AUTOINCR, %r8
1395 je gw_ioadv
1396
1397 movq %rsi, %rdi
1398 rep
1399 insw
1400 ret
1401
1402 gw_ioadv:
1403 andq %rcx, %rcx
1404 jz gw_ioadv_done
1405 gw_ioadv2:
1406 inw (%dx)
1407 movw %ax,(%rsi)
1408 addq $2, %rsi
1409 addq $2, %rdx
1410 decq %rcx
1411 jg gw_ioadv2
1412
1413 gw_ioadv_done:
1414 rep; ret /* use 2 byte return instruction when branch target */
1415 /* AMD Software Optimization Guide - Section 6.2 */
1416 SET_SIZE(i_ddi_io_rep_get16)
1417
1418 #elif defined(__i386)
1419
1420 ENTRY(i_ddi_io_rep_get16)
1421 pushl %edi
1422
1423 movl 12(%esp),%edi / get host_addr
1424 movl 16(%esp),%edx / get port
1425 movl 20(%esp),%ecx / get repcount
1426 cmpl $DDI_DEV_AUTOINCR, 24(%esp)
1427 je gw_ioadv
1428
1429 rep
1430 insw
1431 popl %edi
1432 ret
1433
1434 gw_ioadv:
1435 andl %ecx, %ecx
1436 jz gw_ioadv_done
1437 gw_ioadv2:
1438 inw (%dx)
1439 movw %ax,(%edi)
1440 addl $2, %edi
1441 addl $2, %edx
1442 decl %ecx
1443 jg gw_ioadv2
1444
1445 gw_ioadv_done:
1446 popl %edi
1447 ret
1448 SET_SIZE(i_ddi_io_rep_get16)
1449
1450 #endif /* __i386 */
1451
1452 #if defined(__amd64)
1453
1454 ENTRY(i_ddi_io_rep_get32)
1455
1456 cmpq $DDI_DEV_AUTOINCR, %r8
1457 je gl_ioadv
1458
1459 movq %rsi, %rdi
1460 rep
1461 insl
1462 ret
1463
1464 gl_ioadv:
1465 andq %rcx, %rcx
1466 jz gl_ioadv_done
1467 gl_ioadv2:
1468 inl (%dx)
1469 movl %eax,(%rsi)
1470 addq $4, %rsi
1471 addq $4, %rdx
1472 decq %rcx
1473 jg gl_ioadv2
1474
1475 gl_ioadv_done:
1476 rep; ret /* use 2 byte return instruction when branch target */
1477 /* AMD Software Optimization Guide - Section 6.2 */
1478
1479 SET_SIZE(i_ddi_io_rep_get32)
1480
1481
1482 #elif defined(__i386)
1483
1484 ENTRY(i_ddi_io_rep_get32)
1485 pushl %edi
1486
1487 movl 12(%esp),%edi / get host_addr
1488 movl 16(%esp),%edx / get port
1489 movl 20(%esp),%ecx / get repcount
1490 cmpl $DDI_DEV_AUTOINCR, 24(%esp)
1491 je gl_ioadv
1492
1493 rep
1494 insl
1495 popl %edi
1496 ret
1497
1498 gl_ioadv:
1499 andl %ecx, %ecx
1500 jz gl_ioadv_done
1501 gl_ioadv2:
1502 inl (%dx)
1503 movl %eax,(%edi)
1504 addl $4, %edi
1505 addl $4, %edx
1506 decl %ecx
1507 jg gl_ioadv2
1508
1509 gl_ioadv_done:
1510 popl %edi
1511 ret
1512
1513 SET_SIZE(i_ddi_io_rep_get32)
1514
1515 #endif /* __i386 */
1516
1517 #endif /* lint */
1518
1519 #if defined(lint) || defined(__lint)
1520
1521 /*ARGSUSED*/
1522 void
1523 i_ddi_io_rep_put8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
1524 uint8_t *dev_addr, size_t repcount, uint_t flags)
1525 {}
1526
1527 /*ARGSUSED*/
1528 void
1529 i_ddi_io_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1530 uint16_t *dev_addr, size_t repcount, uint_t flags)
1531 {}
1532
1533 /*ARGSUSED*/
1534 void
1535 i_ddi_io_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1536 uint32_t *dev_addr, size_t repcount, uint_t flags)
1537 {}
1538
1539 #else /* lint */
1540
1541 #if defined(__amd64)
1542
1543 /*
1544 * Incoming arguments
1545 *
1546 * %rdi : hdlp
1547 * %rsi : host_addr
1548 * %rdx : dev_addr
1549 * %rcx : repcount
1550 * %r8 : flags
1551 *
1552 * This routine will destroy values in %rdx, %rsi, %rcx.
1553 */
1554 ENTRY(i_ddi_io_rep_put8)
1555
1556 cmpq $DDI_DEV_AUTOINCR, %r8
1557 je pb_ioadv
1558
1559 movq %rsi, %rdi
1560 rep
1561 outsb
1562 ret
1563
1564 pb_ioadv:
1565 andq %rcx, %rcx
1566 jz pb_ioadv_done
1567 pb_ioadv2:
1568 movb (%rsi), %al
1569 outb (%dx)
1570 incq %rsi
1571 incq %rdx
1572 decq %rcx
1573 jg pb_ioadv2
1574
1575 pb_ioadv_done:
1576 rep; ret /* use 2 byte return instruction when branch target */
1577 /* AMD Software Optimization Guide - Section 6.2 */
1578 SET_SIZE(i_ddi_io_rep_put8)
1579
1580 #elif defined(__i386)
1581
1582 ENTRY(i_ddi_io_rep_put8)
1583 pushl %esi
1584
1585 movl 12(%esp),%esi / get host_addr
1586 movl 16(%esp),%edx / get port
1587 movl 20(%esp),%ecx / get repcount
1588 cmpl $DDI_DEV_AUTOINCR, 24(%esp)
1589 je pb_ioadv
1590
1591 rep
1592 outsb
1593 popl %esi
1594 ret
1595
1596 pb_ioadv:
1597 andl %ecx, %ecx
1598 jz pb_ioadv_done
1599 pb_ioadv2:
1600 movb (%esi), %al
1601 outb (%dx)
1602 incl %esi
1603 incl %edx
1604 decl %ecx
1605 jg pb_ioadv2
1606
1607 pb_ioadv_done:
1608 popl %esi
1609 ret
1610 SET_SIZE(i_ddi_io_rep_put8)
1611
1612 #endif /* __i386 */
1613
1614 #if defined(__amd64)
1615
1616 ENTRY(i_ddi_io_rep_put16)
1617
1618 cmpq $DDI_DEV_AUTOINCR, %r8
1619 je pw_ioadv
1620
1621 movq %rsi, %rdi
1622 rep
1623 outsw
1624 ret
1625
1626 pw_ioadv:
1627 andq %rcx, %rcx
1628 jz pw_ioadv_done
1629 pw_ioadv2:
1630 movw (%rsi), %ax
1631 outw (%dx)
1632 addq $2, %rsi
1633 addq $2, %rdx
1634 decq %rcx
1635 jg pw_ioadv2
1636
1637 pw_ioadv_done:
1638 rep; ret /* use 2 byte return instruction when branch target */
1639 /* AMD Software Optimization Guide - Section 6.2 */
1640 SET_SIZE(i_ddi_io_rep_put16)
1641
1642 #elif defined(__i386)
1643
1644 ENTRY(i_ddi_io_rep_put16)
1645 pushl %esi
1646
1647 movl 12(%esp),%esi / get host_addr
1648 movl 16(%esp),%edx / get port
1649 movl 20(%esp),%ecx / get repcount
1650 cmpl $DDI_DEV_AUTOINCR, 24(%esp)
1651 je pw_ioadv
1652
1653 rep
1654 outsw
1655 popl %esi
1656 ret
1657
1658 pw_ioadv:
1659 andl %ecx, %ecx
1660 jz pw_ioadv_done
1661 pw_ioadv2:
1662 movw (%esi), %ax
1663 outw (%dx)
1664 addl $2, %esi
1665 addl $2, %edx
1666 decl %ecx
1667 jg pw_ioadv2
1668
1669 pw_ioadv_done:
1670 popl %esi
1671 ret
1672 SET_SIZE(i_ddi_io_rep_put16)
1673
1674 #endif /* __i386 */
1675
1676 #if defined(__amd64)
1677
1678 ENTRY(i_ddi_io_rep_put32)
1679
1680 cmpq $DDI_DEV_AUTOINCR, %r8
1681 je pl_ioadv
1682
1683 movq %rsi, %rdi
1684 rep
1685 outsl
1686 ret
1687
1688 pl_ioadv:
1689 andq %rcx, %rcx
1690 jz pl_ioadv_done
1691 pl_ioadv2:
1692 movl (%rsi), %eax
1693 outl (%dx)
1694 addq $4, %rsi
1695 addq $4, %rdx
1696 decq %rcx
1697 jg pl_ioadv2
1698
1699 pl_ioadv_done:
1700 rep; ret /* use 2 byte return instruction when branch target */
1701 /* AMD Software Optimization Guide - Section 6.2 */
1702 SET_SIZE(i_ddi_io_rep_put32)
1703
1704 #elif defined(__i386)
1705
1706 ENTRY(i_ddi_io_rep_put32)
1707 pushl %esi
1708
1709 movl 12(%esp),%esi / get host_addr
1710 movl 16(%esp),%edx / get port
1711 movl 20(%esp),%ecx / get repcount
1712 cmpl $DDI_DEV_AUTOINCR, 24(%esp)
1713 je pl_ioadv
1714
1715 rep
1716 outsl
1717 popl %esi
1718 ret
1719
1720 pl_ioadv:
1721 andl %ecx, %ecx
1722 jz pl_ioadv_done
1723 pl_ioadv2:
1724 movl (%esi), %eax
1725 outl (%dx)
1726 addl $4, %esi
1727 addl $4, %edx
1728 decl %ecx
1729 jg pl_ioadv2
1730
1731 pl_ioadv_done:
1732 popl %esi
1733 ret
1734 SET_SIZE(i_ddi_io_rep_put32)
1735
1736 #endif /* __i386 */
1737
1738 #endif /* lint */