ddi_i86_asm.s revision 1106:fc3a8d329831
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*/ 41uint8_t 42ddi_get8(ddi_acc_handle_t handle, uint8_t *addr) 43{ 44 return (0); 45} 46 47/*ARGSUSED*/ 48uint8_t 49ddi_mem_get8(ddi_acc_handle_t handle, uint8_t *addr) 50{ 51 return (0); 52} 53 54/*ARGSUSED*/ 55uint8_t 56ddi_io_get8(ddi_acc_handle_t handle, uint8_t *dev_addr) 57{ 58 return (0); 59} 60 61/*ARGSUSED*/ 62uint16_t 63ddi_get16(ddi_acc_handle_t handle, uint16_t *addr) 64{ 65 return (0); 66} 67 68/*ARGSUSED*/ 69uint16_t 70ddi_mem_get16(ddi_acc_handle_t handle, uint16_t *addr) 71{ 72 return (0); 73} 74 75/*ARGSUSED*/ 76uint16_t 77ddi_io_get16(ddi_acc_handle_t handle, uint16_t *dev_addr) 78{ 79 return (0); 80} 81 82/*ARGSUSED*/ 83uint32_t 84ddi_get32(ddi_acc_handle_t handle, uint32_t *addr) 85{ 86 return (0); 87} 88 89/*ARGSUSED*/ 90uint32_t 91ddi_mem_get32(ddi_acc_handle_t handle, uint32_t *addr) 92{ 93 return (0); 94} 95 96/*ARGSUSED*/ 97uint32_t 98ddi_io_get32(ddi_acc_handle_t handle, uint32_t *dev_addr) 99{ 100 return (0); 101} 102 103/*ARGSUSED*/ 104uint64_t 105ddi_get64(ddi_acc_handle_t handle, uint64_t *addr) 106{ 107 return (0); 108} 109 110/*ARGSUSED*/ 111uint64_t 112ddi_mem_get64(ddi_acc_handle_t handle, uint64_t *addr) 113{ 114 return (0); 115} 116 117/*ARGSUSED*/ 118void 119ddi_put8(ddi_acc_handle_t handle, uint8_t *addr, uint8_t value) 120{} 121 122/*ARGSUSED*/ 123void 124ddi_mem_put8(ddi_acc_handle_t handle, uint8_t *dev_addr, uint8_t value) 125{} 126 127/*ARGSUSED*/ 128void 129ddi_io_put8(ddi_acc_handle_t handle, uint8_t *dev_addr, uint8_t value) 130{} 131 132/*ARGSUSED*/ 133void 134ddi_put16(ddi_acc_handle_t handle, uint16_t *addr, uint16_t value) 135{} 136 137/*ARGSUSED*/ 138void 139ddi_mem_put16(ddi_acc_handle_t handle, uint16_t *dev_addr, uint16_t value) 140{} 141 142/*ARGSUSED*/ 143void 144ddi_io_put16(ddi_acc_handle_t handle, uint16_t *dev_addr, uint16_t value) 145{} 146 147/*ARGSUSED*/ 148void 149ddi_put32(ddi_acc_handle_t handle, uint32_t *addr, uint32_t value) 150{} 151 152/*ARGSUSED*/ 153void 154ddi_mem_put32(ddi_acc_handle_t handle, uint32_t *dev_addr, uint32_t value) 155{} 156 157/*ARGSUSED*/ 158void 159ddi_io_put32(ddi_acc_handle_t handle, uint32_t *dev_addr, uint32_t value) 160{} 161 162/*ARGSUSED*/ 163void 164ddi_put64(ddi_acc_handle_t handle, uint64_t *addr, uint64_t value) 165{} 166 167/*ARGSUSED*/ 168void 169ddi_mem_put64(ddi_acc_handle_t handle, uint64_t *dev_addr, uint64_t value) 170{} 171 172/*ARGSUSED*/ 173void 174ddi_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*/ 179void 180ddi_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*/ 185void 186ddi_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*/ 191void 192ddi_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*/ 197void 198ddi_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*/ 203void 204ddi_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*/ 209void 210ddi_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*/ 215void 216ddi_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*/ 221void 222ddi_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*/ 227void 228ddi_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*/ 233void 234ddi_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*/ 239void 240ddi_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*/ 245void 246ddi_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*/ 251void 252ddi_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*/ 257void 258ddi_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*/ 263void 264ddi_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 2861: 287 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %edx 288 jne 2f 289 movzbq (%rsi), %rax 290 ret 2912: 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 3161: 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 3222: 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 3483: 349 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %edx 350 jne 4f 351 movzwq (%rsi), %rax 352 ret 3534: 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 3783: 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 3844: 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 4095: 410 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %edx 411 jne 6f 412 movl (%rsi), %eax 413 ret 4146: 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 4385: 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 4446: 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 4977: 498 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx 499 jne 8f 500 movb %dl, (%rsi) 501 ret 5028: 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 5277: 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 5348: 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 5608: 561 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx 562 jne 9f 563 movw %dx, (%rsi) 564 ret 5659: 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 5908: 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 5979: 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 6238: 624 cmpl $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx 625 jne 9f 626 movl %edx, (%rsi) 627 ret 6289: 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 6538: 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 6609: 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*/ 919uint8_t 920i_ddi_vaddr_get8(ddi_acc_impl_t *hdlp, uint8_t *addr) 921{ 922 return (*addr); 923} 924 925/*ARGSUSED*/ 926uint16_t 927i_ddi_vaddr_get16(ddi_acc_impl_t *hdlp, uint16_t *addr) 928{ 929 return (*addr); 930} 931 932/*ARGSUSED*/ 933uint32_t 934i_ddi_vaddr_get32(ddi_acc_impl_t *hdlp, uint32_t *addr) 935{ 936 return (*addr); 937} 938 939/*ARGSUSED*/ 940uint64_t 941i_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*/ 1023uint8_t 1024i_ddi_io_get8(ddi_acc_impl_t *hdlp, uint8_t *addr) 1025{ 1026 return (0); 1027} 1028 1029/*ARGSUSED*/ 1030uint16_t 1031i_ddi_io_get16(ddi_acc_impl_t *hdlp, uint16_t *addr) 1032{ 1033 return (0); 1034} 1035 1036/*ARGSUSED*/ 1037uint32_t 1038i_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*/ 1108void 1109i_ddi_vaddr_put8(ddi_acc_impl_t *hdlp, uint8_t *addr, uint8_t value) 1110{ 1111 *addr = value; 1112} 1113 1114/*ARGSUSED*/ 1115void 1116i_ddi_vaddr_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value) 1117{ 1118 *addr = value; 1119} 1120 1121/*ARGSUSED*/ 1122void 1123i_ddi_vaddr_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value) 1124{ 1125 *(uint32_t *)addr = value; 1126} 1127 1128/*ARGSUSED*/ 1129void 1130i_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*/ 1216void 1217i_ddi_io_put8(ddi_acc_impl_t *hdlp, uint8_t *addr, uint8_t value) 1218{} 1219 1220/*ARGSUSED*/ 1221void 1222i_ddi_io_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value) 1223{} 1224 1225/*ARGSUSED*/ 1226void 1227i_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*/ 1297void 1298i_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*/ 1303void 1304i_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*/ 1309void 1310i_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 1338gb_ioadv: 1339 andq %rcx, %rcx 1340 jz gb_ioadv_done 1341gb_ioadv2: 1342 inb (%dx) 1343 movb %al, (%rsi) 1344 incq %rdx 1345 incq %rsi 1346 decq %rcx 1347 jg gb_ioadv2 1348 1349gb_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 1371gb_ioadv: 1372 andl %ecx, %ecx 1373 jz gb_ioadv_done 1374gb_ioadv2: 1375 inb (%dx) 1376 movb %al,(%edi) 1377 incl %edi 1378 incl %edx 1379 decl %ecx 1380 jg gb_ioadv2 1381 1382gb_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 1402gw_ioadv: 1403 andq %rcx, %rcx 1404 jz gw_ioadv_done 1405gw_ioadv2: 1406 inw (%dx) 1407 movw %ax,(%rsi) 1408 addq $2, %rsi 1409 addq $2, %rdx 1410 decq %rcx 1411 jg gw_ioadv2 1412 1413gw_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 1434gw_ioadv: 1435 andl %ecx, %ecx 1436 jz gw_ioadv_done 1437gw_ioadv2: 1438 inw (%dx) 1439 movw %ax,(%edi) 1440 addl $2, %edi 1441 addl $2, %edx 1442 decl %ecx 1443 jg gw_ioadv2 1444 1445gw_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 1464gl_ioadv: 1465 andq %rcx, %rcx 1466 jz gl_ioadv_done 1467gl_ioadv2: 1468 inl (%dx) 1469 movl %eax,(%rsi) 1470 addq $4, %rsi 1471 addq $4, %rdx 1472 decq %rcx 1473 jg gl_ioadv2 1474 1475gl_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 1498gl_ioadv: 1499 andl %ecx, %ecx 1500 jz gl_ioadv_done 1501gl_ioadv2: 1502 inl (%dx) 1503 movl %eax,(%edi) 1504 addl $4, %edi 1505 addl $4, %edx 1506 decl %ecx 1507 jg gl_ioadv2 1508 1509gl_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*/ 1522void 1523i_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*/ 1528void 1529i_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*/ 1534void 1535i_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 1564pb_ioadv: 1565 andq %rcx, %rcx 1566 jz pb_ioadv_done 1567pb_ioadv2: 1568 movb (%rsi), %al 1569 outb (%dx) 1570 incq %rsi 1571 incq %rdx 1572 decq %rcx 1573 jg pb_ioadv2 1574 1575pb_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 1596pb_ioadv: 1597 andl %ecx, %ecx 1598 jz pb_ioadv_done 1599pb_ioadv2: 1600 movb (%esi), %al 1601 outb (%dx) 1602 incl %esi 1603 incl %edx 1604 decl %ecx 1605 jg pb_ioadv2 1606 1607pb_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 1626pw_ioadv: 1627 andq %rcx, %rcx 1628 jz pw_ioadv_done 1629pw_ioadv2: 1630 movw (%rsi), %ax 1631 outw (%dx) 1632 addq $2, %rsi 1633 addq $2, %rdx 1634 decq %rcx 1635 jg pw_ioadv2 1636 1637pw_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 1658pw_ioadv: 1659 andl %ecx, %ecx 1660 jz pw_ioadv_done 1661pw_ioadv2: 1662 movw (%esi), %ax 1663 outw (%dx) 1664 addl $2, %esi 1665 addl $2, %edx 1666 decl %ecx 1667 jg pw_ioadv2 1668 1669pw_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 1688pl_ioadv: 1689 andq %rcx, %rcx 1690 jz pl_ioadv_done 1691pl_ioadv2: 1692 movl (%rsi), %eax 1693 outl (%dx) 1694 addq $4, %rsi 1695 addq $4, %rdx 1696 decq %rcx 1697 jg pl_ioadv2 1698 1699pl_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 1720pl_ioadv: 1721 andl %ecx, %ecx 1722 jz pl_ioadv_done 1723pl_ioadv2: 1724 movl (%esi), %eax 1725 outl (%dx) 1726 addl $4, %esi 1727 addl $4, %edx 1728 decl %ecx 1729 jg pl_ioadv2 1730 1731pl_ioadv_done: 1732 popl %esi 1733 ret 1734 SET_SIZE(i_ddi_io_rep_put32) 1735 1736#endif /* __i386 */ 1737 1738#endif /* lint */ 1739