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