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*/
41uint8_t
42ddi_get8(ddi_acc_handle_t handle, uint8_t *addr)
43{
44	return (0);
45}
46
47/*ARGSUSED*/
48uint8_t
49ddi_mem_get8(ddi_acc_handle_t handle, uint8_t *addr)
50{
51	return (0);
52}
53
54/*ARGSUSED*/
55uint8_t
56ddi_io_get8(ddi_acc_handle_t handle, uint8_t *dev_addr)
57{
58	return (0);
59}
60
61/*ARGSUSED*/
62uint16_t
63ddi_get16(ddi_acc_handle_t handle, uint16_t *addr)
64{
65	return (0);
66}
67
68/*ARGSUSED*/
69uint16_t
70ddi_mem_get16(ddi_acc_handle_t handle, uint16_t *addr)
71{
72	return (0);
73}
74
75/*ARGSUSED*/
76uint16_t
77ddi_io_get16(ddi_acc_handle_t handle, uint16_t *dev_addr)
78{
79	return (0);
80}
81
82/*ARGSUSED*/
83uint32_t
84ddi_get32(ddi_acc_handle_t handle, uint32_t *addr)
85{
86	return (0);
87}
88
89/*ARGSUSED*/
90uint32_t
91ddi_mem_get32(ddi_acc_handle_t handle, uint32_t *addr)
92{
93	return (0);
94}
95
96/*ARGSUSED*/
97uint32_t
98ddi_io_get32(ddi_acc_handle_t handle, uint32_t *dev_addr)
99{
100	return (0);
101}
102
103/*ARGSUSED*/
104uint64_t
105ddi_get64(ddi_acc_handle_t handle, uint64_t *addr)
106{
107	return (0);
108}
109
110/*ARGSUSED*/
111uint64_t
112ddi_mem_get64(ddi_acc_handle_t handle, uint64_t *addr)
113{
114	return (0);
115}
116
117/*ARGSUSED*/
118void
119ddi_put8(ddi_acc_handle_t handle, uint8_t *addr, uint8_t value)
120{}
121
122/*ARGSUSED*/
123void
124ddi_mem_put8(ddi_acc_handle_t handle, uint8_t *dev_addr, uint8_t value)
125{}
126
127/*ARGSUSED*/
128void
129ddi_io_put8(ddi_acc_handle_t handle, uint8_t *dev_addr, uint8_t value)
130{}
131
132/*ARGSUSED*/
133void
134ddi_put16(ddi_acc_handle_t handle, uint16_t *addr, uint16_t value)
135{}
136
137/*ARGSUSED*/
138void
139ddi_mem_put16(ddi_acc_handle_t handle, uint16_t *dev_addr, uint16_t value)
140{}
141
142/*ARGSUSED*/
143void
144ddi_io_put16(ddi_acc_handle_t handle, uint16_t *dev_addr, uint16_t value)
145{}
146
147/*ARGSUSED*/
148void
149ddi_put32(ddi_acc_handle_t handle, uint32_t *addr, uint32_t value)
150{}
151
152/*ARGSUSED*/
153void
154ddi_mem_put32(ddi_acc_handle_t handle, uint32_t *dev_addr, uint32_t value)
155{}
156
157/*ARGSUSED*/
158void
159ddi_io_put32(ddi_acc_handle_t handle, uint32_t *dev_addr, uint32_t value)
160{}
161
162/*ARGSUSED*/
163void
164ddi_put64(ddi_acc_handle_t handle, uint64_t *addr, uint64_t value)
165{}
166
167/*ARGSUSED*/
168void
169ddi_mem_put64(ddi_acc_handle_t handle, uint64_t *dev_addr, uint64_t value)
170{}
171
172/*ARGSUSED*/
173void
174ddi_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*/
179void
180ddi_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*/
185void
186ddi_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*/
191void
192ddi_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*/
197void
198ddi_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*/
203void
204ddi_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*/
209void
210ddi_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*/
215void
216ddi_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*/
221void
222ddi_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*/
227void
228ddi_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*/
233void
234ddi_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*/
239void
240ddi_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*/
245void
246ddi_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*/
251void
252ddi_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*/
257void
258ddi_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*/
263void
264ddi_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
2861:
287	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %edx
288	jne	2f
289	movzbq	(%rsi), %rax
290	ret
2912:
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
3161:
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
3222:
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
3483:
349	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %edx
350	jne	4f
351	movzwq	(%rsi), %rax
352	ret
3534:
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
3783:
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
3844:
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
4095:
410	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %edx
411	jne	6f
412	movl	(%rsi), %eax
413	ret
4146:
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
4385:
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
4446:
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
4977:
498	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
499	jne	8f
500	movb	%dl, (%rsi)
501	ret
5028:
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
5277:
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
5348:
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
5608:
561	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
562	jne	9f
563	movw	%dx, (%rsi)
564	ret
5659:
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
5908:
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
5979:
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
6238:
624	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
625	jne	9f
626	movl	%edx, (%rsi)
627	ret
6289:
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
6538:
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
6609:
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*/
919uint8_t
920i_ddi_vaddr_get8(ddi_acc_impl_t *hdlp, uint8_t *addr)
921{
922	return (*addr);
923}
924
925/*ARGSUSED*/
926uint16_t
927i_ddi_vaddr_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
928{
929	return (*addr);
930}
931
932/*ARGSUSED*/
933uint32_t
934i_ddi_vaddr_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
935{
936	return (*addr);
937}
938
939/*ARGSUSED*/
940uint64_t
941i_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*/
1023uint8_t
1024i_ddi_io_get8(ddi_acc_impl_t *hdlp, uint8_t *addr)
1025{
1026	return (0);
1027}
1028
1029/*ARGSUSED*/
1030uint16_t
1031i_ddi_io_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
1032{
1033	return (0);
1034}
1035
1036/*ARGSUSED*/
1037uint32_t
1038i_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*/
1108void
1109i_ddi_vaddr_put8(ddi_acc_impl_t *hdlp, uint8_t *addr, uint8_t value)
1110{
1111	*addr = value;
1112}
1113
1114/*ARGSUSED*/
1115void
1116i_ddi_vaddr_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
1117{
1118	*addr = value;
1119}
1120
1121/*ARGSUSED*/
1122void
1123i_ddi_vaddr_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
1124{
1125	*(uint32_t *)addr = value;
1126}
1127
1128/*ARGSUSED*/
1129void
1130i_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*/
1216void
1217i_ddi_io_put8(ddi_acc_impl_t *hdlp, uint8_t *addr, uint8_t value)
1218{}
1219
1220/*ARGSUSED*/
1221void
1222i_ddi_io_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
1223{}
1224
1225/*ARGSUSED*/
1226void
1227i_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*/
1297void
1298i_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*/
1303void
1304i_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*/
1309void
1310i_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
1338gb_ioadv:
1339	andq	%rcx, %rcx
1340	jz	gb_ioadv_done
1341gb_ioadv2:
1342	inb	(%dx)
1343	movb	%al, (%rsi)
1344	incq	%rdx
1345	incq	%rsi
1346	decq	%rcx
1347	jg	gb_ioadv2
1348
1349gb_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
1371gb_ioadv:
1372	andl	%ecx, %ecx
1373	jz	gb_ioadv_done
1374gb_ioadv2:
1375	inb	(%dx)
1376	movb	%al,(%edi)
1377	incl	%edi
1378	incl	%edx
1379	decl	%ecx
1380	jg	gb_ioadv2
1381
1382gb_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
1402gw_ioadv:
1403	andq	%rcx, %rcx
1404	jz	gw_ioadv_done
1405gw_ioadv2:
1406	inw	(%dx)
1407	movw	%ax,(%rsi)
1408	addq	$2, %rsi
1409	addq	$2, %rdx
1410	decq	%rcx
1411	jg	gw_ioadv2
1412
1413gw_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
1434gw_ioadv:
1435	andl	%ecx, %ecx
1436	jz	gw_ioadv_done
1437gw_ioadv2:
1438	inw	(%dx)
1439	movw	%ax,(%edi)
1440	addl	$2, %edi
1441	addl	$2, %edx
1442	decl	%ecx
1443	jg	gw_ioadv2
1444
1445gw_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
1464gl_ioadv:
1465	andq	%rcx, %rcx
1466	jz	gl_ioadv_done
1467gl_ioadv2:
1468	inl	(%dx)
1469	movl	%eax,(%rsi)
1470	addq	$4, %rsi
1471	addq	$4, %rdx
1472	decq	%rcx
1473	jg	gl_ioadv2
1474
1475gl_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
1498gl_ioadv:
1499	andl	%ecx, %ecx
1500	jz	gl_ioadv_done
1501gl_ioadv2:
1502	inl	(%dx)
1503	movl	%eax,(%edi)
1504	addl	$4, %edi
1505	addl	$4, %edx
1506	decl	%ecx
1507	jg	gl_ioadv2
1508
1509gl_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*/
1522void
1523i_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*/
1528void
1529i_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*/
1534void
1535i_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
1564pb_ioadv:
1565	andq	%rcx, %rcx
1566	jz	pb_ioadv_done
1567pb_ioadv2:
1568	movb	(%rsi), %al
1569	outb	(%dx)
1570	incq	%rsi
1571	incq	%rdx
1572	decq	%rcx
1573	jg	pb_ioadv2
1574
1575pb_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
1596pb_ioadv:
1597	andl	%ecx, %ecx
1598	jz	pb_ioadv_done
1599pb_ioadv2:
1600	movb	(%esi), %al
1601	outb	(%dx)
1602	incl	%esi
1603	incl	%edx
1604	decl	%ecx
1605	jg	pb_ioadv2
1606
1607pb_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
1626pw_ioadv:
1627	andq	%rcx, %rcx
1628	jz	pw_ioadv_done
1629pw_ioadv2:
1630	movw	(%rsi), %ax
1631	outw	(%dx)
1632	addq	$2, %rsi
1633	addq	$2, %rdx
1634	decq	%rcx
1635	jg	pw_ioadv2
1636
1637pw_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
1658pw_ioadv:
1659	andl	%ecx, %ecx
1660	jz	pw_ioadv_done
1661pw_ioadv2:
1662	movw	(%esi), %ax
1663	outw	(%dx)
1664	addl	$2, %esi
1665	addl	$2, %edx
1666	decl	%ecx
1667	jg	pw_ioadv2
1668
1669pw_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
1688pl_ioadv:
1689	andq	%rcx, %rcx
1690	jz	pl_ioadv_done
1691pl_ioadv2:
1692	movl	(%rsi), %eax
1693	outl	(%dx)
1694	addq	$4, %rsi
1695	addq	$4, %rdx
1696	decq	%rcx
1697	jg	pl_ioadv2
1698
1699pl_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
1720pl_ioadv:
1721	andl	%ecx, %ecx
1722	jz	pl_ioadv_done
1723pl_ioadv2:
1724	movl	(%esi), %eax
1725	outl	(%dx)
1726	addl	$4, %esi
1727	addl	$4, %edx
1728	decl	%ecx
1729	jg	pl_ioadv2
1730
1731pl_ioadv_done:
1732	popl	%esi
1733	ret
1734	SET_SIZE(i_ddi_io_rep_put32)
1735
1736#endif	/* __i386 */
1737
1738#endif /* lint */
1739