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