ddi_i86_asm.s revision 545:5aee29e2128c
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, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
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#ifdef _LP64
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	/* _ILP32 */
271
272uint8_t
273ddi_io_getb(ddi_acc_handle_t handle, uint8_t *addr)
274{
275	return ((((ddi_acc_impl_t *)handle)->ahi_get8)
276		((ddi_acc_impl_t *)handle, addr));
277}
278
279uint16_t
280ddi_getw(ddi_acc_handle_t handle, uint16_t *addr)
281{
282	return ((((ddi_acc_impl_t *)handle)->ahi_get16)
283		((ddi_acc_impl_t *)handle, addr));
284}
285
286uint16_t
287ddi_mem_getw(ddi_acc_handle_t handle, uint16_t *addr)
288{
289	return ((((ddi_acc_impl_t *)handle)->ahi_get16)
290		((ddi_acc_impl_t *)handle, addr));
291}
292
293uint16_t
294ddi_io_getw(ddi_acc_handle_t handle, uint16_t *addr)
295{
296	return ((((ddi_acc_impl_t *)handle)->ahi_get16)
297		((ddi_acc_impl_t *)handle, addr));
298}
299
300uint32_t
301ddi_getl(ddi_acc_handle_t handle, uint32_t *addr)
302{
303	return ((((ddi_acc_impl_t *)handle)->ahi_get32)
304		((ddi_acc_impl_t *)handle, addr));
305}
306
307uint32_t
308ddi_mem_getl(ddi_acc_handle_t handle, uint32_t *addr)
309{
310	return ((((ddi_acc_impl_t *)handle)->ahi_get32)
311		((ddi_acc_impl_t *)handle, addr));
312}
313
314uint32_t
315ddi_io_getl(ddi_acc_handle_t handle, uint32_t *addr)
316{
317	return ((((ddi_acc_impl_t *)handle)->ahi_get32)
318		((ddi_acc_impl_t *)handle, addr));
319}
320
321uint64_t
322ddi_getll(ddi_acc_handle_t handle, uint64_t *addr)
323{
324	return ((((ddi_acc_impl_t *)handle)->ahi_get64)
325		((ddi_acc_impl_t *)handle, addr));
326}
327
328uint64_t
329ddi_mem_getll(ddi_acc_handle_t handle, uint64_t *addr)
330{
331	return ((((ddi_acc_impl_t *)handle)->ahi_get64)
332		((ddi_acc_impl_t *)handle, addr));
333}
334
335void
336ddi_putb(ddi_acc_handle_t handle, uint8_t *addr, uint8_t value)
337{
338	(((ddi_acc_impl_t *)handle)->ahi_put8)
339		((ddi_acc_impl_t *)handle, addr, value);
340}
341
342void
343ddi_mem_putb(ddi_acc_handle_t handle, uint8_t *addr, uint8_t value)
344{
345	(((ddi_acc_impl_t *)handle)->ahi_put8)
346		((ddi_acc_impl_t *)handle, addr, value);
347}
348
349void
350ddi_io_putb(ddi_acc_handle_t handle, uint8_t *addr, uint8_t value)
351{
352	(((ddi_acc_impl_t *)handle)->ahi_put8)
353		((ddi_acc_impl_t *)handle, addr, value);
354}
355
356void
357ddi_put16(ddi_acc_handle_t handle, uint16_t *addr, uint16_t value)
358{
359	(((ddi_acc_impl_t *)handle)->ahi_put16)
360		((ddi_acc_impl_t *)handle, addr, value);
361}
362
363void
364ddi_mem_putw(ddi_acc_handle_t handle, uint16_t *addr, uint16_t value)
365{
366	(((ddi_acc_impl_t *)handle)->ahi_put16)
367		((ddi_acc_impl_t *)handle, addr, value);
368}
369
370void
371ddi_io_putw(ddi_acc_handle_t handle, uint16_t *addr, uint16_t value)
372{
373	(((ddi_acc_impl_t *)handle)->ahi_put16)
374		((ddi_acc_impl_t *)handle, addr, value);
375}
376
377void
378ddi_putl(ddi_acc_handle_t handle, uint32_t *addr, uint32_t value)
379{
380	(((ddi_acc_impl_t *)handle)->ahi_put32)
381		((ddi_acc_impl_t *)handle, addr, value);
382}
383
384void
385ddi_mem_putl(ddi_acc_handle_t handle, uint32_t *addr, uint32_t value)
386{
387	(((ddi_acc_impl_t *)handle)->ahi_put32)
388		((ddi_acc_impl_t *)handle, addr, value);
389}
390
391void
392ddi_io_putl(ddi_acc_handle_t handle, uint32_t *addr, uint32_t value)
393{
394	(((ddi_acc_impl_t *)handle)->ahi_put32)
395		((ddi_acc_impl_t *)handle, addr, value);
396}
397
398void
399ddi_putll(ddi_acc_handle_t handle, uint64_t *addr, uint64_t value)
400{
401	(((ddi_acc_impl_t *)handle)->ahi_put64)
402		((ddi_acc_impl_t *)handle, addr, value);
403}
404
405void
406ddi_mem_putll(ddi_acc_handle_t handle, uint64_t *addr, uint64_t value)
407{
408	(((ddi_acc_impl_t *)handle)->ahi_put64)
409		((ddi_acc_impl_t *)handle, addr, value);
410}
411
412/*ARGSUSED*/
413void
414ddi_rep_getb(ddi_acc_handle_t handle, uint8_t *host_addr, uint8_t *dev_addr,
415    size_t repcount, uint_t flags)
416{}
417
418/*ARGSUSED*/
419void
420ddi_rep_getw(ddi_acc_handle_t handle, uint16_t *host_addr, uint16_t *dev_addr,
421    size_t repcount, uint_t flags)
422{}
423
424/*ARGSUSED*/
425void
426ddi_rep_getl(ddi_acc_handle_t handle, uint32_t *host_addr, uint32_t *dev_addr,
427    size_t repcount, uint_t flags)
428{}
429
430/*ARGSUSED*/
431void
432ddi_rep_getll(ddi_acc_handle_t handle, uint64_t *host_addr, uint64_t *dev_addr,
433    size_t repcount, uint_t flags)
434{}
435
436/*ARGSUSED*/
437void
438ddi_rep_putb(ddi_acc_handle_t handle, uint8_t *host_addr, uint8_t *dev_addr,
439    size_t repcount, uint_t flags)
440{}
441
442/*ARGSUSED*/
443void
444ddi_rep_putw(ddi_acc_handle_t handle, uint16_t *host_addr, uint16_t *dev_addr,
445    size_t repcount, uint_t flags)
446{}
447
448/*ARGSUSED*/
449void
450ddi_rep_putl(ddi_acc_handle_t handle, uint32_t *host_addr, uint32_t *dev_addr,
451    size_t repcount, uint_t flags)
452{}
453
454/*ARGSUSED*/
455void
456ddi_rep_putll(ddi_acc_handle_t handle, uint64_t *host_addr, uint64_t *dev_addr,
457    size_t repcount, uint_t flags)
458{}
459
460/*ARGSUSED*/
461void
462ddi_mem_rep_getb(ddi_acc_handle_t handle, uint8_t *host_addr,
463    uint8_t *dev_addr, size_t repcount, uint_t flags)
464{}
465
466/*ARGSUSED*/
467void
468ddi_mem_rep_getw(ddi_acc_handle_t handle, uint16_t *host_addr,
469    uint16_t *dev_addr, size_t repcount, uint_t flags)
470{}
471
472/*ARGSUSED*/
473void
474ddi_mem_rep_getl(ddi_acc_handle_t handle, uint32_t *host_addr,
475    uint32_t *dev_addr, size_t repcount, uint_t flags)
476{}
477
478/*ARGSUSED*/
479void
480ddi_mem_rep_getll(ddi_acc_handle_t handle, uint64_t *host_addr,
481    uint64_t *dev_addr, size_t repcount, uint_t flags)
482{}
483
484/*ARGSUSED*/
485void
486ddi_mem_rep_putb(ddi_acc_handle_t handle, uint8_t *host_addr,
487    uint8_t *dev_addr, size_t repcount, uint_t flags)
488{}
489
490/*ARGSUSED*/
491void
492ddi_mem_rep_putw(ddi_acc_handle_t handle, uint16_t *host_addr,
493    uint16_t *dev_addr, size_t repcount, uint_t flags)
494{}
495
496/*ARGSUSED*/
497void
498ddi_mem_rep_putl(ddi_acc_handle_t handle, uint32_t *host_addr,
499    uint32_t *dev_addr, size_t repcount, uint_t flags)
500{}
501
502/*ARGSUSED*/
503void
504ddi_mem_rep_putll(ddi_acc_handle_t handle, uint64_t *host_addr,
505    uint64_t *dev_addr, size_t repcount, uint_t flags)
506{}
507
508#endif /* _LP64 */
509
510#else	/* lint */
511
512
513#if defined(__amd64)
514
515	ENTRY(ddi_getb)
516	ALTENTRY(ddi_get8)
517	ALTENTRY(ddi_mem_getb)
518	ALTENTRY(ddi_mem_get8)
519	ALTENTRY(ddi_io_getb)
520	ALTENTRY(ddi_io_get8)
521	movl	ACC_ATTR(%rdi), %edx
522	cmpl	$_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %edx
523	jne	1f
524	movq	%rsi, %rdx
525	xorq	%rax, %rax
526	inb	(%dx)
527	ret
5281:
529	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %edx
530	jne	2f
531	movzbq	(%rsi), %rax
532	ret
5332:
534	jmp	*ACC_GETB(%rdi)
535	SET_SIZE(ddi_getb)
536	SET_SIZE(ddi_get8)
537	SET_SIZE(ddi_mem_getb)
538	SET_SIZE(ddi_mem_get8)
539	SET_SIZE(ddi_io_getb)
540	SET_SIZE(ddi_io_get8)
541
542#elif defined(__i386)
543
544	ENTRY(ddi_getb)
545	ALTENTRY(ddi_get8)
546	ALTENTRY(ddi_mem_getb)
547	ALTENTRY(ddi_mem_get8)
548	ALTENTRY(ddi_io_getb)
549	ALTENTRY(ddi_io_get8)
550	movl	4(%esp), %eax
551	movl	ACC_ATTR(%eax), %ecx
552	cmpl	$_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
553	jne	1f
554	movl	8(%esp), %edx
555	xorl	%eax, %eax
556	inb	(%dx)
557	ret
5581:
559	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
560	jne	2f
561	movl	8(%esp), %eax
562	movzbl	(%eax), %eax
563	ret
5642:
565	jmp	*ACC_GETB(%eax)
566	SET_SIZE(ddi_getb)
567	SET_SIZE(ddi_get8)
568	SET_SIZE(ddi_mem_getb)
569	SET_SIZE(ddi_mem_get8)
570	SET_SIZE(ddi_io_getb)
571	SET_SIZE(ddi_io_get8)
572
573#endif	/* __i386 */
574
575#if defined(__amd64)
576
577	ENTRY(ddi_getw)
578	ALTENTRY(ddi_get16)
579	ALTENTRY(ddi_mem_getw)
580	ALTENTRY(ddi_mem_get16)
581	ALTENTRY(ddi_io_getw)
582	ALTENTRY(ddi_io_get16)
583	movl	ACC_ATTR(%rdi), %edx
584	cmpl	$_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %edx
585	jne	3f
586	movq	%rsi, %rdx
587	xorq	%rax, %rax
588	inw	(%dx)
589	ret
5903:
591	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %edx
592	jne	4f
593	movzwq	(%rsi), %rax
594	ret
5954:
596	jmp	*ACC_GETW(%rdi)
597	SET_SIZE(ddi_getw)
598	SET_SIZE(ddi_get16)
599	SET_SIZE(ddi_mem_getw)
600	SET_SIZE(ddi_mem_get16)
601	SET_SIZE(ddi_io_getw)
602	SET_SIZE(ddi_io_get16)
603
604#elif defined(__i386)
605
606	ENTRY(ddi_getw)
607	ALTENTRY(ddi_get16)
608	ALTENTRY(ddi_mem_getw)
609	ALTENTRY(ddi_mem_get16)
610	ALTENTRY(ddi_io_getw)
611	ALTENTRY(ddi_io_get16)
612	movl	4(%esp), %eax
613	movl	ACC_ATTR(%eax), %ecx
614	cmpl	$_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
615	jne	3f
616	movl	8(%esp), %edx
617	xorl	%eax, %eax
618	inw	(%dx)
619	ret
6203:
621	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
622	jne	4f
623	movl	8(%esp), %eax
624	movzwl	(%eax), %eax
625	ret
6264:
627	jmp	*ACC_GETW(%eax)
628	SET_SIZE(ddi_getw)
629	SET_SIZE(ddi_get16)
630	SET_SIZE(ddi_mem_getw)
631	SET_SIZE(ddi_mem_get16)
632	SET_SIZE(ddi_io_getw)
633	SET_SIZE(ddi_io_get16)
634
635#endif	/* __i386 */
636
637#if defined(__amd64)
638
639	ENTRY(ddi_getl)
640	ALTENTRY(ddi_get32)
641	ALTENTRY(ddi_mem_getl)
642	ALTENTRY(ddi_mem_get32)
643	ALTENTRY(ddi_io_getl)
644	ALTENTRY(ddi_io_get32)
645	movl	ACC_ATTR(%rdi), %edx
646	cmpl	$_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %edx
647	jne	5f
648	movq	%rsi, %rdx
649	inl	(%dx)
650	ret
6515:
652	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %edx
653	jne	6f
654	movl	(%rsi), %eax
655	ret
6566:
657	jmp	*ACC_GETL(%rdi)
658	SET_SIZE(ddi_getl)
659	SET_SIZE(ddi_get32)
660	SET_SIZE(ddi_mem_getl)
661	SET_SIZE(ddi_mem_get32)
662	SET_SIZE(ddi_io_getl)
663	SET_SIZE(ddi_io_get32)
664
665#elif defined(__i386)
666
667	ENTRY(ddi_getl)
668	ALTENTRY(ddi_get32)
669	ALTENTRY(ddi_mem_getl)
670	ALTENTRY(ddi_mem_get32)
671	ALTENTRY(ddi_io_getl)
672	ALTENTRY(ddi_io_get32)
673	movl	4(%esp), %eax
674	movl	ACC_ATTR(%eax), %ecx
675	cmpl	$_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
676	jne	5f
677	movl	8(%esp), %edx
678	inl	(%dx)
679	ret
6805:
681	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
682	jne	6f
683	movl	8(%esp), %eax
684	movl	(%eax), %eax
685	ret
6866:
687	jmp	*ACC_GETL(%eax)
688	SET_SIZE(ddi_getl)
689	SET_SIZE(ddi_get32)
690	SET_SIZE(ddi_mem_getl)
691	SET_SIZE(ddi_mem_get32)
692	SET_SIZE(ddi_io_getl)
693	SET_SIZE(ddi_io_get32)
694
695#endif	/* __i386 */
696
697#if defined(__amd64)
698
699	ENTRY(ddi_getll)
700	ALTENTRY(ddi_get64)
701	ALTENTRY(ddi_mem_getll)
702	ALTENTRY(ddi_mem_get64)
703	jmp	*ACC_GETLL(%rdi)
704	SET_SIZE(ddi_getll)
705	SET_SIZE(ddi_get64)
706	SET_SIZE(ddi_mem_getll)
707	SET_SIZE(ddi_mem_get64)
708
709#elif defined(__i386)
710
711	ENTRY(ddi_getll)
712	ALTENTRY(ddi_get64)
713	ALTENTRY(ddi_mem_getll)
714	ALTENTRY(ddi_mem_get64)
715	movl	4(%esp), %eax
716	jmp	*ACC_GETLL(%eax)
717	SET_SIZE(ddi_getll)
718	SET_SIZE(ddi_get64)
719	SET_SIZE(ddi_mem_getll)
720	SET_SIZE(ddi_mem_get64)
721
722#endif	/* __i386 */
723
724#if defined(__amd64)
725
726	ENTRY(ddi_putb)
727	ALTENTRY(ddi_put8)
728	ALTENTRY(ddi_mem_putb)
729	ALTENTRY(ddi_mem_put8)
730	ALTENTRY(ddi_io_putb)
731	ALTENTRY(ddi_io_put8)
732	movl	ACC_ATTR(%rdi), %ecx
733	cmpl	$_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
734	jne	7f
735	movq	%rdx, %rax
736	movq	%rsi, %rdx
737	outb	(%dx)
738	ret
7397:
740	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
741	jne	8f
742	movb	%dl, (%rsi)
743	ret
7448:
745	jmp	*ACC_PUTB(%rdi)
746	SET_SIZE(ddi_putb)
747	SET_SIZE(ddi_put8)
748	SET_SIZE(ddi_mem_putb)
749	SET_SIZE(ddi_mem_put8)
750	SET_SIZE(ddi_io_putb)
751	SET_SIZE(ddi_io_put8)
752
753#elif defined(__i386)
754
755	ENTRY(ddi_putb)
756	ALTENTRY(ddi_put8)
757	ALTENTRY(ddi_mem_putb)
758	ALTENTRY(ddi_mem_put8)
759	ALTENTRY(ddi_io_putb)
760	ALTENTRY(ddi_io_put8)
761	movl	4(%esp), %eax
762	movl	ACC_ATTR(%eax), %ecx
763	cmpl	$_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
764	jne	7f
765	movl	12(%esp), %eax
766	movl	8(%esp), %edx
767	outb	(%dx)
768	ret
7697:
770	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
771	jne	8f
772	movl	8(%esp), %eax
773	movl	12(%esp), %ecx
774	movb	%cl, (%eax)
775	ret
7768:
777	jmp	*ACC_PUTB(%eax)
778	SET_SIZE(ddi_putb)
779	SET_SIZE(ddi_put8)
780	SET_SIZE(ddi_mem_putb)
781	SET_SIZE(ddi_mem_put8)
782	SET_SIZE(ddi_io_putb)
783	SET_SIZE(ddi_io_put8)
784
785#endif	/* __i386 */
786
787#if defined(__amd64)
788
789	ENTRY(ddi_putw)
790	ALTENTRY(ddi_put16)
791	ALTENTRY(ddi_mem_putw)
792	ALTENTRY(ddi_mem_put16)
793	ALTENTRY(ddi_io_putw)
794	ALTENTRY(ddi_io_put16)
795	movl	ACC_ATTR(%rdi), %ecx
796	cmpl	$_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
797	jne	8f
798	movq	%rdx, %rax
799	movq	%rsi, %rdx
800	outw	(%dx)
801	ret
8028:
803	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
804	jne	9f
805	movw	%dx, (%rsi)
806	ret
8079:
808	jmp	*ACC_PUTW(%rdi)
809	SET_SIZE(ddi_putw)
810	SET_SIZE(ddi_put16)
811	SET_SIZE(ddi_mem_putw)
812	SET_SIZE(ddi_mem_put16)
813	SET_SIZE(ddi_io_putw)
814	SET_SIZE(ddi_io_put16)
815
816#elif defined(__i386)
817
818	ENTRY(ddi_putw)
819	ALTENTRY(ddi_put16)
820	ALTENTRY(ddi_mem_putw)
821	ALTENTRY(ddi_mem_put16)
822	ALTENTRY(ddi_io_putw)
823	ALTENTRY(ddi_io_put16)
824	movl	4(%esp), %eax
825	movl	ACC_ATTR(%eax), %ecx
826	cmpl	$_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
827	jne	8f
828	movl	12(%esp), %eax
829	movl	8(%esp), %edx
830	outw	(%dx)
831	ret
8328:
833	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
834	jne	9f
835	movl	8(%esp), %eax
836	movl	12(%esp), %ecx
837	movw	%cx, (%eax)
838	ret
8399:
840	jmp	*ACC_PUTW(%eax)
841	SET_SIZE(ddi_putw)
842	SET_SIZE(ddi_put16)
843	SET_SIZE(ddi_mem_putw)
844	SET_SIZE(ddi_mem_put16)
845	SET_SIZE(ddi_io_putw)
846	SET_SIZE(ddi_io_put16)
847
848#endif	/* __i386 */
849
850#if defined(__amd64)
851
852	ENTRY(ddi_putl)
853	ALTENTRY(ddi_put32)
854	ALTENTRY(ddi_mem_putl)
855	ALTENTRY(ddi_mem_put32)
856	ALTENTRY(ddi_io_putl)
857	ALTENTRY(ddi_io_put32)
858	movl	ACC_ATTR(%rdi), %ecx
859	cmpl	$_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
860	jne	8f
861	movq	%rdx, %rax
862	movq	%rsi, %rdx
863	outl	(%dx)
864	ret
8658:
866	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
867	jne	9f
868	movl	%edx, (%rsi)
869	ret
8709:
871	jmp	*ACC_PUTL(%rdi)
872	SET_SIZE(ddi_putl)
873	SET_SIZE(ddi_put32)
874	SET_SIZE(ddi_mem_putl)
875	SET_SIZE(ddi_mem_put32)
876	SET_SIZE(ddi_io_putl)
877	SET_SIZE(ddi_io_put32)
878
879#elif defined(__i386)
880
881	ENTRY(ddi_putl)
882	ALTENTRY(ddi_put32)
883	ALTENTRY(ddi_mem_putl)
884	ALTENTRY(ddi_mem_put32)
885	ALTENTRY(ddi_io_putl)
886	ALTENTRY(ddi_io_put32)
887	movl	4(%esp), %eax
888	movl	ACC_ATTR(%eax), %ecx
889	cmpl	$_CONST(DDI_ACCATTR_IO_SPACE|DDI_ACCATTR_DIRECT), %ecx
890	jne	8f
891	movl	12(%esp), %eax
892	movl	8(%esp), %edx
893	outl	(%dx)
894	ret
8958:
896	cmpl	$_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
897	jne	9f
898	movl	8(%esp), %eax
899	movl	12(%esp), %ecx
900	movl	%ecx, (%eax)
901	ret
9029:
903	jmp	*ACC_PUTL(%eax)
904	SET_SIZE(ddi_putl)
905	SET_SIZE(ddi_put32)
906	SET_SIZE(ddi_mem_putl)
907	SET_SIZE(ddi_mem_put32)
908	SET_SIZE(ddi_io_putl)
909	SET_SIZE(ddi_io_put32)
910
911#endif	/* __i386 */
912
913#if defined(__amd64)
914
915	ENTRY(ddi_putll)
916	ALTENTRY(ddi_put64)
917	ALTENTRY(ddi_mem_putll)
918	ALTENTRY(ddi_mem_put64)
919	jmp	*ACC_PUTLL(%rdi)
920	SET_SIZE(ddi_putll)
921	SET_SIZE(ddi_put64)
922	SET_SIZE(ddi_mem_putll)
923	SET_SIZE(ddi_mem_put64)
924
925#elif defined(__i386)
926
927	ENTRY(ddi_putll)
928	ALTENTRY(ddi_put64)
929	ALTENTRY(ddi_mem_putll)
930	ALTENTRY(ddi_mem_put64)
931	movl	4(%esp), %eax
932	jmp	*ACC_PUTLL(%eax)
933	SET_SIZE(ddi_putll)
934	SET_SIZE(ddi_put64)
935	SET_SIZE(ddi_mem_putll)
936	SET_SIZE(ddi_mem_put64)
937
938#endif	/* __i386 */
939
940#if defined(__amd64)
941
942	ENTRY(ddi_rep_getb)
943	ALTENTRY(ddi_rep_get8)
944	ALTENTRY(ddi_mem_rep_getb)
945	ALTENTRY(ddi_mem_rep_get8)
946	jmp	*ACC_REP_GETB(%rdi)
947	SET_SIZE(ddi_rep_getb)
948	SET_SIZE(ddi_rep_get8)
949	SET_SIZE(ddi_mem_rep_getb)
950	SET_SIZE(ddi_mem_rep_get8)
951
952#elif defined(__i386)
953
954	ENTRY(ddi_rep_getb)
955	ALTENTRY(ddi_rep_get8)
956	ALTENTRY(ddi_mem_rep_getb)
957	ALTENTRY(ddi_mem_rep_get8)
958	movl	4(%esp), %eax
959	jmp	*ACC_REP_GETB(%eax)
960	SET_SIZE(ddi_rep_getb)
961	SET_SIZE(ddi_rep_get8)
962	SET_SIZE(ddi_mem_rep_getb)
963	SET_SIZE(ddi_mem_rep_get8)
964
965#endif	/* __i386 */
966
967#if defined(__amd64)
968
969	ENTRY(ddi_rep_getw)
970	ALTENTRY(ddi_rep_get16)
971	ALTENTRY(ddi_mem_rep_getw)
972	ALTENTRY(ddi_mem_rep_get16)
973	jmp	*ACC_REP_GETW(%rdi)
974	SET_SIZE(ddi_rep_getw)
975	SET_SIZE(ddi_rep_get16)
976	SET_SIZE(ddi_mem_rep_getw)
977	SET_SIZE(ddi_mem_rep_get16)
978
979#elif defined(__i386)
980
981	ENTRY(ddi_rep_getw)
982	ALTENTRY(ddi_rep_get16)
983	ALTENTRY(ddi_mem_rep_getw)
984	ALTENTRY(ddi_mem_rep_get16)
985	movl	4(%esp), %eax
986	jmp	*ACC_REP_GETW(%eax)
987	SET_SIZE(ddi_rep_getw)
988	SET_SIZE(ddi_rep_get16)
989	SET_SIZE(ddi_mem_rep_getw)
990	SET_SIZE(ddi_mem_rep_get16)
991
992#endif	/* __i386 */
993
994#if defined(__amd64)
995
996	ENTRY(ddi_rep_getl)
997	ALTENTRY(ddi_rep_get32)
998	ALTENTRY(ddi_mem_rep_getl)
999	ALTENTRY(ddi_mem_rep_get32)
1000	jmp	*ACC_REP_GETL(%rdi)
1001	SET_SIZE(ddi_rep_getl)
1002	SET_SIZE(ddi_rep_get32)
1003	SET_SIZE(ddi_mem_rep_getl)
1004	SET_SIZE(ddi_mem_rep_get32)
1005
1006#elif defined(__i386)
1007
1008	ENTRY(ddi_rep_getl)
1009	ALTENTRY(ddi_rep_get32)
1010	ALTENTRY(ddi_mem_rep_getl)
1011	ALTENTRY(ddi_mem_rep_get32)
1012	movl	4(%esp), %eax
1013	jmp	*ACC_REP_GETL(%eax)
1014	SET_SIZE(ddi_rep_getl)
1015	SET_SIZE(ddi_rep_get32)
1016	SET_SIZE(ddi_mem_rep_getl)
1017	SET_SIZE(ddi_mem_rep_get32)
1018
1019#endif	/* __i386 */
1020
1021#if defined(__amd64)
1022
1023	ENTRY(ddi_rep_getll)
1024	ALTENTRY(ddi_rep_get64)
1025	ALTENTRY(ddi_mem_rep_getll)
1026	ALTENTRY(ddi_mem_rep_get64)
1027	jmp	*ACC_REP_GETLL(%rdi)
1028	SET_SIZE(ddi_rep_getll)
1029	SET_SIZE(ddi_rep_get64)
1030	SET_SIZE(ddi_mem_rep_getll)
1031	SET_SIZE(ddi_mem_rep_get64)
1032
1033#elif defined(__i386)
1034
1035	ENTRY(ddi_rep_getll)
1036	ALTENTRY(ddi_rep_get64)
1037	ALTENTRY(ddi_mem_rep_getll)
1038	ALTENTRY(ddi_mem_rep_get64)
1039	movl	4(%esp), %eax
1040	jmp	*ACC_REP_GETLL(%eax)
1041	SET_SIZE(ddi_rep_getll)
1042	SET_SIZE(ddi_rep_get64)
1043	SET_SIZE(ddi_mem_rep_getll)
1044	SET_SIZE(ddi_mem_rep_get64)
1045
1046#endif	/* __i386 */
1047
1048#if defined(__amd64)
1049
1050	ENTRY(ddi_rep_putb)
1051	ALTENTRY(ddi_rep_put8)
1052	ALTENTRY(ddi_mem_rep_putb)
1053	ALTENTRY(ddi_mem_rep_put8)
1054	jmp	*ACC_REP_PUTB(%rdi)
1055	SET_SIZE(ddi_rep_putb)
1056	SET_SIZE(ddi_rep_put8)
1057	SET_SIZE(ddi_mem_rep_putb)
1058	SET_SIZE(ddi_mem_rep_put8)
1059
1060#elif defined(__i386)
1061
1062	ENTRY(ddi_rep_putb)
1063	ALTENTRY(ddi_rep_put8)
1064	ALTENTRY(ddi_mem_rep_putb)
1065	ALTENTRY(ddi_mem_rep_put8)
1066	movl	4(%esp), %eax
1067	jmp	*ACC_REP_PUTB(%eax)
1068	SET_SIZE(ddi_rep_putb)
1069	SET_SIZE(ddi_rep_put8)
1070	SET_SIZE(ddi_mem_rep_putb)
1071	SET_SIZE(ddi_mem_rep_put8)
1072
1073#endif	/* __i386 */
1074
1075#if defined(__amd64)
1076
1077	ENTRY(ddi_rep_putw)
1078	ALTENTRY(ddi_rep_put16)
1079	ALTENTRY(ddi_mem_rep_putw)
1080	ALTENTRY(ddi_mem_rep_put16)
1081	jmp	*ACC_REP_PUTW(%rdi)
1082	SET_SIZE(ddi_rep_putw)
1083	SET_SIZE(ddi_rep_put16)
1084	SET_SIZE(ddi_mem_rep_putw)
1085	SET_SIZE(ddi_mem_rep_put16)
1086
1087#elif defined(__i386)
1088
1089	ENTRY(ddi_rep_putw)
1090	ALTENTRY(ddi_rep_put16)
1091	ALTENTRY(ddi_mem_rep_putw)
1092	ALTENTRY(ddi_mem_rep_put16)
1093	movl	4(%esp), %eax
1094	jmp	*ACC_REP_PUTW(%eax)
1095	SET_SIZE(ddi_rep_putw)
1096	SET_SIZE(ddi_rep_put16)
1097	SET_SIZE(ddi_mem_rep_putw)
1098	SET_SIZE(ddi_mem_rep_put16)
1099
1100#endif	/* __i386 */
1101
1102#if defined(__amd64)
1103
1104	ENTRY(ddi_rep_putl)
1105	ALTENTRY(ddi_rep_put32)
1106	ALTENTRY(ddi_mem_rep_putl)
1107	ALTENTRY(ddi_mem_rep_put32)
1108	jmp	*ACC_REP_PUTL(%rdi)
1109	SET_SIZE(ddi_rep_putl)
1110	SET_SIZE(ddi_rep_put32)
1111	SET_SIZE(ddi_mem_rep_putl)
1112	SET_SIZE(ddi_mem_rep_put32)
1113
1114#elif defined(__i386)
1115
1116	ENTRY(ddi_rep_putl)
1117	ALTENTRY(ddi_rep_put32)
1118	ALTENTRY(ddi_mem_rep_putl)
1119	ALTENTRY(ddi_mem_rep_put32)
1120	movl	4(%esp), %eax
1121	jmp	*ACC_REP_PUTL(%eax)
1122	SET_SIZE(ddi_rep_putl)
1123	SET_SIZE(ddi_rep_put32)
1124	SET_SIZE(ddi_mem_rep_putl)
1125	SET_SIZE(ddi_mem_rep_put32)
1126
1127#endif	/* __i386 */
1128
1129#if defined(__amd64)
1130
1131	ENTRY(ddi_rep_putll)
1132	ALTENTRY(ddi_rep_put64)
1133	ALTENTRY(ddi_mem_rep_putll)
1134	ALTENTRY(ddi_mem_rep_put64)
1135	jmp	*ACC_REP_PUTLL(%rdi)
1136	SET_SIZE(ddi_rep_putll)
1137	SET_SIZE(ddi_rep_put64)
1138	SET_SIZE(ddi_mem_rep_putll)
1139	SET_SIZE(ddi_mem_rep_put64)
1140
1141#elif defined(__i386)
1142
1143	ENTRY(ddi_rep_putll)
1144	ALTENTRY(ddi_rep_put64)
1145	ALTENTRY(ddi_mem_rep_putll)
1146	ALTENTRY(ddi_mem_rep_put64)
1147	movl	4(%esp), %eax
1148	jmp	*ACC_REP_PUTLL(%eax)
1149	SET_SIZE(ddi_rep_putll)
1150	SET_SIZE(ddi_rep_put64)
1151	SET_SIZE(ddi_mem_rep_putll)
1152	SET_SIZE(ddi_mem_rep_put64)
1153
1154#endif	/* __i386 */
1155
1156#endif /* lint */
1157
1158#if defined(lint) || defined(__lint)
1159
1160/*ARGSUSED*/
1161uint8_t
1162i_ddi_vaddr_get8(ddi_acc_impl_t *hdlp, uint8_t *addr)
1163{
1164	return (*addr);
1165}
1166
1167/*ARGSUSED*/
1168uint16_t
1169i_ddi_vaddr_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
1170{
1171	return (*addr);
1172}
1173
1174/*ARGSUSED*/
1175uint32_t
1176i_ddi_vaddr_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
1177{
1178	return (*addr);
1179}
1180
1181/*ARGSUSED*/
1182uint64_t
1183i_ddi_vaddr_get64(ddi_acc_impl_t *hdlp, uint64_t *addr)
1184{
1185	return (*addr);
1186}
1187
1188#else	/* lint */
1189
1190#if defined(__amd64)
1191
1192	ENTRY(i_ddi_vaddr_get8)
1193	movzbq	(%rsi), %rax
1194	ret
1195	SET_SIZE(i_ddi_vaddr_get8)
1196
1197#elif defined(__i386)
1198
1199	ENTRY(i_ddi_vaddr_get8)
1200	movl	8(%esp), %eax
1201	movzbl	(%eax), %eax
1202	ret
1203	SET_SIZE(i_ddi_vaddr_get8)
1204
1205#endif	/* __i386 */
1206
1207#if defined(__amd64)
1208
1209	ENTRY(i_ddi_vaddr_get16)
1210	movzwq	(%rsi), %rax
1211	ret
1212	SET_SIZE(i_ddi_vaddr_get16)
1213
1214#elif defined(__i386)
1215
1216	ENTRY(i_ddi_vaddr_get16)
1217	movl	8(%esp), %eax
1218	movzwl	(%eax), %eax
1219	ret
1220	SET_SIZE(i_ddi_vaddr_get16)
1221
1222#endif	/* __i386 */
1223
1224#if defined(__amd64)
1225
1226	ENTRY(i_ddi_vaddr_get32)
1227	movl	(%rsi), %eax
1228	ret
1229	SET_SIZE(i_ddi_vaddr_get32)
1230
1231#elif defined(__i386)
1232
1233	ENTRY(i_ddi_vaddr_get32)
1234	movl	8(%esp), %eax
1235	movl	(%eax), %eax
1236	ret
1237	SET_SIZE(i_ddi_vaddr_get32)
1238
1239#endif	/* __i386 */
1240
1241#if defined(__amd64)
1242
1243	ENTRY(i_ddi_vaddr_get64)
1244	movq	(%rsi), %rax
1245	ret
1246	SET_SIZE(i_ddi_vaddr_get64)
1247
1248#elif defined(__i386)
1249
1250	ENTRY(i_ddi_vaddr_get64)
1251	movl	8(%esp), %ecx
1252	movl	(%ecx), %eax
1253	movl	4(%ecx), %edx
1254	ret
1255	SET_SIZE(i_ddi_vaddr_get64)
1256
1257#endif	/* __i386 */
1258
1259#endif /* lint */
1260
1261
1262#if defined(lint) || defined(__lint)
1263
1264/*ARGSUSED*/
1265uint8_t
1266i_ddi_io_get8(ddi_acc_impl_t *hdlp, uint8_t *addr)
1267{
1268	return (0);
1269}
1270
1271/*ARGSUSED*/
1272uint16_t
1273i_ddi_io_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
1274{
1275	return (0);
1276}
1277
1278/*ARGSUSED*/
1279uint32_t
1280i_ddi_io_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
1281{
1282	return (0);
1283}
1284
1285#else	/* lint */
1286
1287#if defined(__amd64)
1288
1289	ENTRY(i_ddi_io_get8)
1290	movq	%rsi, %rdx
1291	inb	(%dx)
1292	movzbq	%al, %rax
1293	ret
1294	SET_SIZE(i_ddi_io_get8)
1295
1296#elif defined(__i386)
1297
1298	ENTRY(i_ddi_io_get8)
1299	movl	8(%esp), %edx
1300	inb	(%dx)
1301	movzbl	%al, %eax
1302	ret
1303	SET_SIZE(i_ddi_io_get8)
1304
1305#endif	/* __i386 */
1306
1307#if defined(__amd64)
1308
1309	ENTRY(i_ddi_io_get16)
1310	movq	%rsi, %rdx
1311	inw	(%dx)
1312	movzwq	%ax, %rax
1313	ret
1314	SET_SIZE(i_ddi_io_get16)
1315
1316#elif defined(__i386)
1317
1318	ENTRY(i_ddi_io_get16)
1319	movl	8(%esp), %edx
1320	inw	(%dx)
1321	movzwl	%ax, %eax
1322	ret
1323	SET_SIZE(i_ddi_io_get16)
1324
1325#endif	/* __i386 */
1326
1327#if defined(__amd64)
1328
1329	ENTRY(i_ddi_io_get32)
1330	movq	%rsi, %rdx
1331	inl	(%dx)
1332	ret
1333	SET_SIZE(i_ddi_io_get32)
1334
1335#elif defined(__i386)
1336
1337	ENTRY(i_ddi_io_get32)
1338	movl	8(%esp), %edx
1339	inl	(%dx)
1340	ret
1341	SET_SIZE(i_ddi_io_get32)
1342
1343#endif	/* __i386 */
1344
1345#endif /* lint */
1346
1347#if defined(lint) || defined(__lint)
1348
1349/*ARGSUSED*/
1350void
1351i_ddi_vaddr_put8(ddi_acc_impl_t *hdlp, uint8_t *addr, uint8_t value)
1352{
1353	*addr = value;
1354}
1355
1356/*ARGSUSED*/
1357void
1358i_ddi_vaddr_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
1359{
1360	*addr = value;
1361}
1362
1363/*ARGSUSED*/
1364void
1365i_ddi_vaddr_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
1366{
1367	*(uint32_t *)addr = value;
1368}
1369
1370/*ARGSUSED*/
1371void
1372i_ddi_vaddr_put64(ddi_acc_impl_t *hdlp, uint64_t *addr, uint64_t value)
1373{
1374	*addr = value;
1375}
1376
1377#else	/* lint */
1378
1379#if defined(__amd64)
1380
1381	ENTRY(i_ddi_vaddr_put8)
1382	movb	%dl, (%rsi)
1383	ret
1384	SET_SIZE(i_ddi_vaddr_put8)
1385
1386#elif defined(__i386)
1387
1388	ENTRY(i_ddi_vaddr_put8)
1389	movl	8(%esp), %eax
1390	movb	12(%esp), %cl
1391	movb	%cl, (%eax)
1392	ret
1393	SET_SIZE(i_ddi_vaddr_put8)
1394
1395#endif	/* __i386 */
1396
1397#if defined(__amd64)
1398
1399	ENTRY(i_ddi_vaddr_put16)
1400	movw	%dx, (%rsi)
1401	ret
1402	SET_SIZE(i_ddi_vaddr_put16)
1403
1404#elif defined(__i386)
1405
1406	ENTRY(i_ddi_vaddr_put16)
1407	movl	8(%esp), %eax
1408	movl	12(%esp), %ecx
1409	movw	%cx, (%eax)
1410	ret
1411	SET_SIZE(i_ddi_vaddr_put16)
1412
1413#endif	/* __i386 */
1414
1415#if defined(__amd64)
1416
1417	ENTRY(i_ddi_vaddr_put32)
1418	movl	%edx, (%rsi)
1419	ret
1420	SET_SIZE(i_ddi_vaddr_put32)
1421
1422#elif defined(__i386)
1423
1424	ENTRY(i_ddi_vaddr_put32)
1425	movl	8(%esp), %eax
1426	movl	12(%esp), %ecx
1427	movl	%ecx, (%eax)
1428	ret
1429	SET_SIZE(i_ddi_vaddr_put32)
1430
1431#endif	/* __i386 */
1432
1433#if defined(__amd64)
1434
1435	ENTRY(i_ddi_vaddr_put64)
1436	movq	%rdx, (%rsi)
1437	ret
1438	SET_SIZE(i_ddi_vaddr_put64)
1439
1440#elif defined(__i386)
1441
1442	ENTRY(i_ddi_vaddr_put64)
1443	movl	8(%esp), %ecx
1444	movl	12(%esp), %edx
1445	movl	16(%esp), %eax
1446	movl	%edx, (%ecx)
1447	movl	%eax, 4(%ecx)
1448	ret
1449	SET_SIZE(i_ddi_vaddr_put64)
1450
1451#endif	/* __i386 */
1452
1453#endif /* lint */
1454
1455#if defined(lint) || defined(__lint)
1456
1457/*ARGSUSED*/
1458void
1459i_ddi_io_put8(ddi_acc_impl_t *hdlp, uint8_t *addr, uint8_t value)
1460{}
1461
1462/*ARGSUSED*/
1463void
1464i_ddi_io_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
1465{}
1466
1467/*ARGSUSED*/
1468void
1469i_ddi_io_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
1470{}
1471
1472#else	/* lint */
1473
1474#if defined(__amd64)
1475
1476	ENTRY(i_ddi_io_put8)
1477	movq	%rdx, %rax
1478	movq	%rsi, %rdx
1479	outb	(%dx)
1480	ret
1481	SET_SIZE(i_ddi_io_put8)
1482
1483#elif defined(__i386)
1484
1485	ENTRY(i_ddi_io_put8)
1486	movl	12(%esp), %eax
1487	movl	8(%esp), %edx
1488	outb	(%dx)
1489	ret
1490	SET_SIZE(i_ddi_io_put8)
1491
1492#endif	/* __i386 */
1493
1494#if defined(__amd64)
1495
1496	ENTRY(i_ddi_io_put16)
1497	movq	%rdx, %rax
1498	movq	%rsi, %rdx
1499	outw	(%dx)
1500	ret
1501	SET_SIZE(i_ddi_io_put16)
1502
1503#elif defined(__i386)
1504
1505	ENTRY(i_ddi_io_put16)
1506	movl	12(%esp), %eax
1507	movl	8(%esp), %edx
1508	outw	(%dx)
1509	ret
1510	SET_SIZE(i_ddi_io_put16)
1511
1512#endif	/* __i386 */
1513
1514#if defined(__amd64)
1515
1516	ENTRY(i_ddi_io_put32)
1517	movq	%rdx, %rax
1518	movq	%rsi, %rdx
1519	outl	(%dx)
1520	ret
1521	SET_SIZE(i_ddi_io_put32)
1522
1523#elif defined(__i386)
1524
1525	ENTRY(i_ddi_io_put32)
1526	movl	12(%esp), %eax
1527	movl	8(%esp), %edx
1528	outl	(%dx)
1529	ret
1530	SET_SIZE(i_ddi_io_put32)
1531
1532#endif	/* __i386 */
1533
1534#endif /* lint */
1535
1536#if defined(lint) || defined(__lint)
1537
1538/*ARGSUSED*/
1539void
1540i_ddi_io_rep_get8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
1541	uint8_t *dev_addr, size_t repcount, uint_t flags)
1542{}
1543
1544/*ARGSUSED*/
1545void
1546i_ddi_io_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1547	uint16_t *dev_addr, size_t repcount, uint_t flags)
1548{}
1549
1550/*ARGSUSED*/
1551void
1552i_ddi_io_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1553	uint32_t *dev_addr, size_t repcount, uint_t flags)
1554{}
1555
1556#else	/* lint */
1557
1558#if defined(__amd64)
1559
1560	/*
1561	 * Incoming arguments
1562	 *
1563	 * %rdi	: hdlp
1564	 * %rsi	: host_addr
1565	 * %rdx	: dev_addr
1566	 * %rcx	: repcount
1567	 * %r8	: flags
1568	 *
1569	 * This routine will destroy values in %rdx, %rsi, %rcx.
1570	 */
1571	ENTRY(i_ddi_io_rep_get8)
1572
1573	cmpq	$DDI_DEV_AUTOINCR, %r8
1574	je	gb_ioadv
1575	movq	%rsi, %rdi
1576	rep
1577	insb
1578	ret
1579
1580gb_ioadv:
1581	andq	%rcx, %rcx
1582	jz	gb_ioadv_done
1583gb_ioadv2:
1584	inb	(%dx)
1585	movb	%al, (%rsi)
1586	incq	%rdx
1587	incq	%rsi
1588	decq	%rcx
1589	jg	gb_ioadv2
1590
1591gb_ioadv_done:
1592	rep;	ret	/* use 2 byte return instruction when branch target */
1593			/* AMD Software Optimization Guide - Section 6.2 */
1594
1595	SET_SIZE(i_ddi_io_rep_get8)
1596
1597#elif defined(__i386)
1598
1599	ENTRY(i_ddi_io_rep_get8)
1600	pushl	%edi
1601
1602	movl	12(%esp),%edi			/ get host_addr
1603	movl	16(%esp),%edx			/ get port
1604	movl	20(%esp),%ecx			/ get repcount
1605	cmpl	$DDI_DEV_AUTOINCR, 24(%esp)
1606	je	gb_ioadv
1607
1608	rep
1609	insb
1610	popl	%edi
1611	ret
1612
1613gb_ioadv:
1614	andl	%ecx, %ecx
1615	jz	gb_ioadv_done
1616gb_ioadv2:
1617	inb	(%dx)
1618	movb	%al,(%edi)
1619	incl	%edi
1620	incl	%edx
1621	decl	%ecx
1622	jg	gb_ioadv2
1623
1624gb_ioadv_done:
1625	popl	%edi
1626	ret
1627
1628	SET_SIZE(i_ddi_io_rep_get8)
1629
1630#endif	/* __i386 */
1631
1632#if defined(__amd64)
1633
1634	ENTRY(i_ddi_io_rep_get16)
1635
1636	cmpq	$DDI_DEV_AUTOINCR, %r8
1637	je	gw_ioadv
1638
1639	movq	%rsi, %rdi
1640	rep
1641	insw
1642	ret
1643
1644gw_ioadv:
1645	andq	%rcx, %rcx
1646	jz	gw_ioadv_done
1647gw_ioadv2:
1648	inw	(%dx)
1649	movw	%ax,(%rsi)
1650	addq	$2, %rsi
1651	addq	$2, %rdx
1652	decq	%rcx
1653	jg	gw_ioadv2
1654
1655gw_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_get16)
1659
1660#elif defined(__i386)
1661
1662	ENTRY(i_ddi_io_rep_get16)
1663	pushl	%edi
1664
1665	movl	12(%esp),%edi			/ 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	gw_ioadv
1670
1671	rep
1672	insw
1673	popl	%edi
1674	ret
1675
1676gw_ioadv:
1677	andl	%ecx, %ecx
1678	jz	gw_ioadv_done
1679gw_ioadv2:
1680	inw	(%dx)
1681	movw	%ax,(%edi)
1682	addl	$2, %edi
1683	addl	$2, %edx
1684	decl	%ecx
1685	jg	gw_ioadv2
1686
1687gw_ioadv_done:
1688	popl	%edi
1689	ret
1690	SET_SIZE(i_ddi_io_rep_get16)
1691
1692#endif	/* __i386 */
1693
1694#if defined(__amd64)
1695
1696	ENTRY(i_ddi_io_rep_get32)
1697
1698	cmpq	$DDI_DEV_AUTOINCR, %r8
1699	je	gl_ioadv
1700
1701	movq	%rsi, %rdi
1702	rep
1703	insl
1704	ret
1705
1706gl_ioadv:
1707	andq	%rcx, %rcx
1708	jz	gl_ioadv_done
1709gl_ioadv2:
1710	inl	(%dx)
1711	movl	%eax,(%rsi)
1712	addq	$4, %rsi
1713	addq	$4, %rdx
1714	decq	%rcx
1715	jg	gl_ioadv2
1716
1717gl_ioadv_done:
1718	rep;	ret	/* use 2 byte return instruction when branch target */
1719			/* AMD Software Optimization Guide - Section 6.2 */
1720
1721	SET_SIZE(i_ddi_io_rep_get32)
1722
1723
1724#elif defined(__i386)
1725
1726	ENTRY(i_ddi_io_rep_get32)
1727	pushl	%edi
1728
1729	movl	12(%esp),%edi			/ get host_addr
1730	movl	16(%esp),%edx			/ get port
1731	movl	20(%esp),%ecx			/ get repcount
1732	cmpl	$DDI_DEV_AUTOINCR, 24(%esp)
1733	je	gl_ioadv
1734
1735	rep
1736	insl
1737	popl	%edi
1738	ret
1739
1740gl_ioadv:
1741	andl	%ecx, %ecx
1742	jz	gl_ioadv_done
1743gl_ioadv2:
1744	inl	(%dx)
1745	movl	%eax,(%edi)
1746	addl	$4, %edi
1747	addl	$4, %edx
1748	decl	%ecx
1749	jg	gl_ioadv2
1750
1751gl_ioadv_done:
1752	popl	%edi
1753	ret
1754
1755	SET_SIZE(i_ddi_io_rep_get32)
1756
1757#endif	/* __i386 */
1758
1759#endif /* lint */
1760
1761#if defined(lint) || defined(__lint)
1762
1763/*ARGSUSED*/
1764void
1765i_ddi_io_rep_put8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
1766	uint8_t *dev_addr, size_t repcount, uint_t flags)
1767{}
1768
1769/*ARGSUSED*/
1770void
1771i_ddi_io_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1772	uint16_t *dev_addr, size_t repcount, uint_t flags)
1773{}
1774
1775/*ARGSUSED*/
1776void
1777i_ddi_io_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1778	uint32_t *dev_addr, size_t repcount, uint_t flags)
1779{}
1780
1781#else	/* lint */
1782
1783#if defined(__amd64)
1784
1785	/*
1786	 * Incoming arguments
1787	 *
1788	 * %rdi	: hdlp
1789	 * %rsi	: host_addr
1790	 * %rdx	: dev_addr
1791	 * %rcx	: repcount
1792	 * %r8	: flags
1793	 *
1794	 * This routine will destroy values in %rdx, %rsi, %rcx.
1795	 */
1796	ENTRY(i_ddi_io_rep_put8)
1797
1798	cmpq	$DDI_DEV_AUTOINCR, %r8
1799	je	pb_ioadv
1800
1801	movq	%rsi, %rdi
1802	rep
1803	outsb
1804	ret
1805
1806pb_ioadv:
1807	andq	%rcx, %rcx
1808	jz	pb_ioadv_done
1809pb_ioadv2:
1810	movb	(%rsi), %al
1811	outb	(%dx)
1812	incq	%rsi
1813	incq	%rdx
1814	decq	%rcx
1815	jg	pb_ioadv2
1816
1817pb_ioadv_done:
1818	rep;	ret	/* use 2 byte return instruction when branch target */
1819			/* AMD Software Optimization Guide - Section 6.2 */
1820	SET_SIZE(i_ddi_io_rep_put8)
1821
1822#elif defined(__i386)
1823
1824	ENTRY(i_ddi_io_rep_put8)
1825	pushl	%esi
1826
1827	movl	12(%esp),%esi			/ get host_addr
1828	movl	16(%esp),%edx			/ get port
1829	movl	20(%esp),%ecx			/ get repcount
1830	cmpl	$DDI_DEV_AUTOINCR, 24(%esp)
1831	je	pb_ioadv
1832
1833	rep
1834	outsb
1835	popl	%esi
1836	ret
1837
1838pb_ioadv:
1839	andl	%ecx, %ecx
1840	jz	pb_ioadv_done
1841pb_ioadv2:
1842	movb	(%esi), %al
1843	outb	(%dx)
1844	incl	%esi
1845	incl	%edx
1846	decl	%ecx
1847	jg	pb_ioadv2
1848
1849pb_ioadv_done:
1850	popl	%esi
1851	ret
1852	SET_SIZE(i_ddi_io_rep_put8)
1853
1854#endif	/* __i386 */
1855
1856#if defined(__amd64)
1857
1858	ENTRY(i_ddi_io_rep_put16)
1859
1860	cmpq	$DDI_DEV_AUTOINCR, %r8
1861	je	pw_ioadv
1862
1863	movq	%rsi, %rdi
1864	rep
1865	outsw
1866	ret
1867
1868pw_ioadv:
1869	andq	%rcx, %rcx
1870	jz	pw_ioadv_done
1871pw_ioadv2:
1872	movw	(%rsi), %ax
1873	outw	(%dx)
1874	addq	$2, %rsi
1875	addq	$2, %rdx
1876	decq	%rcx
1877	jg	pw_ioadv2
1878
1879pw_ioadv_done:
1880	rep;	ret	/* use 2 byte return instruction when branch target */
1881			/* AMD Software Optimization Guide - Section 6.2 */
1882	SET_SIZE(i_ddi_io_rep_put16)
1883
1884#elif defined(__i386)
1885
1886	ENTRY(i_ddi_io_rep_put16)
1887	pushl	%esi
1888
1889	movl	12(%esp),%esi			/ get host_addr
1890	movl	16(%esp),%edx			/ get port
1891	movl	20(%esp),%ecx			/ get repcount
1892	cmpl	$DDI_DEV_AUTOINCR, 24(%esp)
1893	je	pw_ioadv
1894
1895	rep
1896	outsw
1897	popl	%esi
1898	ret
1899
1900pw_ioadv:
1901	andl	%ecx, %ecx
1902	jz	pw_ioadv_done
1903pw_ioadv2:
1904	movw	(%esi), %ax
1905	outw	(%dx)
1906	addl	$2, %esi
1907	addl	$2, %edx
1908	decl	%ecx
1909	jg	pw_ioadv2
1910
1911pw_ioadv_done:
1912	popl	%esi
1913	ret
1914	SET_SIZE(i_ddi_io_rep_put16)
1915
1916#endif	/* __i386 */
1917
1918#if defined(__amd64)
1919
1920	ENTRY(i_ddi_io_rep_put32)
1921
1922	cmpq	$DDI_DEV_AUTOINCR, %r8
1923	je	pl_ioadv
1924
1925	movq	%rsi, %rdi
1926	rep
1927	outsl
1928	ret
1929
1930pl_ioadv:
1931	andq	%rcx, %rcx
1932	jz	pl_ioadv_done
1933pl_ioadv2:
1934	movl	(%rsi), %eax
1935	outl	(%dx)
1936	addq	$4, %rsi
1937	addq	$4, %rdx
1938	decq	%rcx
1939	jg	pl_ioadv2
1940
1941pl_ioadv_done:
1942	rep;	ret	/* use 2 byte return instruction when branch target */
1943			/* AMD Software Optimization Guide - Section 6.2 */
1944	SET_SIZE(i_ddi_io_rep_put32)
1945
1946#elif defined(__i386)
1947
1948	ENTRY(i_ddi_io_rep_put32)
1949	pushl	%esi
1950
1951	movl	12(%esp),%esi			/ get host_addr
1952	movl	16(%esp),%edx			/ get port
1953	movl	20(%esp),%ecx			/ get repcount
1954	cmpl	$DDI_DEV_AUTOINCR, 24(%esp)
1955	je	pl_ioadv
1956
1957	rep
1958	outsl
1959	popl	%esi
1960	ret
1961
1962pl_ioadv:
1963	andl	%ecx, %ecx
1964	jz	pl_ioadv_done
1965pl_ioadv2:
1966	movl	(%esi), %eax
1967	outl	(%dx)
1968	addl	$4, %esi
1969	addl	$4, %edx
1970	decl	%ecx
1971	jg	pl_ioadv2
1972
1973pl_ioadv_done:
1974	popl	%esi
1975	ret
1976	SET_SIZE(i_ddi_io_rep_put32)
1977
1978#endif	/* __i386 */
1979
1980#endif /* lint */
1981