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