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