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 */