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