busio.s revision 84615
1/* $FreeBSD: head/sys/pc98/pc98/busio.s 84615 2001-10-07 10:04:18Z nyan $ */ 2/* $NecBSD: busio.s,v 1.16.4.1 1999/08/16 09:06:08 kmatsuda Exp $ */ 3/* $NetBSD$ */ 4 5/* 6 * [NetBSD for NEC PC-98 series] 7 * Copyright (c) 1996, 1997, 1998 8 * NetBSD/pc98 porting staff. All rights reserved. 9 * 10 * [Ported for FreeBSD] 11 * Copyright (c) 2001 12 * TAKAHASHI Yoshihiro. All rights reserved. 13 * 14 * Redistribution and use in source and binary forms, with or without 15 * modification, are permitted provided that the following conditions 16 * are met: 17 * 1. Redistributions of source code must retain the above copyright 18 * notice, this list of conditions and the following disclaimer. 19 * 2. Redistributions in binary form must reproduce the above copyright 20 * notice, this list of conditions and the following disclaimer in the 21 * documentation and/or other materials provided with the distribution. 22 * 3. The name of the author may not be used to endorse or promote products 23 * derived from this software without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 26 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 27 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 28 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 29 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 30 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 33 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 34 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35 * POSSIBILITY OF SUCH DAMAGE. 36 */ 37 38/* 39 * Copyright (c) 1997, 1998 40 * Naofumi HONDA. All rights reserved. 41 */ 42 43#include <machine/asm.h> 44 45#include "assym.s" 46 47/*********************************************************** 48 * Bus IO access methods (Direct Access) 49 ***********************************************************/ 50#define BUS_ACCESS_ADDR(BSHREG,ADDRREG) \ 51 addl BUS_SPACE_HANDLE_BASE/**/(%/**/BSHREG/**/),%/**/ADDRREG 52 53/* 54 * read_N 55 * IN: edx port 56 * OUT: eax data 57 */ 58ENTRY(SBUS_DA_io_space_read_1) 59 BUS_ACCESS_ADDR(ebx,edx) 60 inb %dx,%al 61 ret 62 63ENTRY(SBUS_DA_io_space_read_2) 64 BUS_ACCESS_ADDR(ebx,edx) 65 inw %dx,%ax 66 ret 67 68ENTRY(SBUS_DA_io_space_read_4) 69 BUS_ACCESS_ADDR(ebx,edx) 70 inl %dx,%eax 71 ret 72 73/* 74 * write_N 75 * IN:eax DATA 76 * edx PORT 77 */ 78ENTRY(SBUS_DA_io_space_write_1) 79 BUS_ACCESS_ADDR(ebx,edx) 80 outb %al,%dx 81 ret 82 83ENTRY(SBUS_DA_io_space_write_2) 84 BUS_ACCESS_ADDR(ebx,edx) 85 outw %ax,%dx 86 ret 87 88ENTRY(SBUS_DA_io_space_write_4) 89 BUS_ACCESS_ADDR(ebx,edx) 90 outl %eax,%dx 91 ret 92 93/* 94 * read_multi_N 95 * IN: ecx COUNT 96 * edx PORT 97 * edi BUFP 98 */ 99ENTRY(SBUS_DA_io_space_read_multi_1) 100 BUS_ACCESS_ADDR(ebx,edx) 101 cld 102 rep 103 insb 104 ret 105 106ENTRY(SBUS_DA_io_space_read_multi_2) 107 BUS_ACCESS_ADDR(ebx,edx) 108 cld 109 rep 110 insw 111 ret 112 113ENTRY(SBUS_DA_io_space_read_multi_4) 114 BUS_ACCESS_ADDR(ebx,edx) 115 cld 116 rep 117 insl 118 ret 119 120/* 121 * write_multi_N 122 * IN: ecx COUNT 123 * edx PORT 124 * esi BUFP 125 */ 126ENTRY(SBUS_DA_io_space_write_multi_1) 127 BUS_ACCESS_ADDR(ebx,edx) 128 cld 129 rep 130 outsb 131 ret 132 133ENTRY(SBUS_DA_io_space_write_multi_2) 134 BUS_ACCESS_ADDR(ebx,edx) 135 cld 136 rep 137 outsw 138 ret 139 140ENTRY(SBUS_DA_io_space_write_multi_4) 141 BUS_ACCESS_ADDR(ebx,edx) 142 cld 143 rep 144 outsl 145 ret 146 147/* 148 * read_region_N 149 * IN: ecx COUNT 150 * edx PORT 151 * edi BUFP 152 */ 153ENTRY(SBUS_DA_io_space_read_region_1) 154 BUS_ACCESS_ADDR(ebx,edx) 155 cld 156 pushl %eax 157 orl %ecx,%ecx 158 jz 2f 1591: 160 inb %dx,%al 161 stosb 162 incl %edx 163 decl %ecx 164 jnz 1b 1652: 166 popl %eax 167 ret 168 169ENTRY(SBUS_DA_io_space_read_region_2) 170 BUS_ACCESS_ADDR(ebx,edx) 171 cld 172 pushl %eax 173 orl %ecx,%ecx 174 jz 2f 1751: 176 inw %dx,%ax 177 stosw 178 addl $2,%edx 179 decl %ecx 180 jnz 1b 1812: 182 popl %eax 183 ret 184 185ENTRY(SBUS_DA_io_space_read_region_4) 186 BUS_ACCESS_ADDR(ebx,edx) 187 cld 188 pushl %eax 189 orl %ecx,%ecx 190 jz 2f 1911: 192 inl %dx,%eax 193 stosl 194 addl $4,%edx 195 decl %ecx 196 jnz 1b 1972: 198 popl %eax 199 ret 200 201/* 202 * write_region_N 203 * IN: ecx COUNT 204 * edx PORT 205 * esi BUFP 206 */ 207ENTRY(SBUS_DA_io_space_write_region_1) 208 BUS_ACCESS_ADDR(ebx,edx) 209 cld 210 pushl %eax 211 orl %ecx,%ecx 212 jz 2f 2131: 214 lodsb 215 outb %al,%dx 216 incl %edx 217 decl %ecx 218 jnz 1b 2192: 220 popl %eax 221 ret 222 223ENTRY(SBUS_DA_io_space_write_region_2) 224 BUS_ACCESS_ADDR(ebx,edx) 225 cld 226 pushl %eax 227 orl %ecx,%ecx 228 jz 2f 2291: 230 lodsw 231 outw %ax,%dx 232 addl $2,%edx 233 decl %ecx 234 jnz 1b 2352: 236 popl %eax 237 ret 238 239ENTRY(SBUS_DA_io_space_write_region_4) 240 BUS_ACCESS_ADDR(ebx,edx) 241 cld 242 pushl %eax 243 orl %ecx,%ecx 244 jz 2f 2451: 246 lodsl 247 outl %eax,%dx 248 addl $4,%edx 249 decl %ecx 250 jnz 1b 2512: 252 popl %eax 253 ret 254 255/* 256 * set_multi_N 257 * IN: eax DATA 258 * ecx COUNT 259 * edx PORT 260 */ 261ENTRY(SBUS_DA_io_space_set_multi_1) 262 BUS_ACCESS_ADDR(ebx,edx) 263 orl %ecx,%ecx 264 jz 2f 2651: 266 outb %al,%dx 267 decl %ecx 268 jnz 1b 2692: 270 ret 271 272ENTRY(SBUS_DA_io_space_set_multi_2) 273 BUS_ACCESS_ADDR(ebx,edx) 274 orl %ecx,%ecx 275 jz 2f 2761: 277 outw %ax,%dx 278 decl %ecx 279 jnz 1b 2802: 281 ret 282 283ENTRY(SBUS_DA_io_space_set_multi_4) 284 BUS_ACCESS_ADDR(ebx,edx) 285 orl %ecx,%ecx 286 jz 2f 2871: 288 outl %eax,%dx 289 decl %ecx 290 jnz 1b 2912: 292 ret 293 294/* 295 * set_region_N 296 * IN: eax DATA 297 * ecx COUNT 298 * edx PORT 299 */ 300ENTRY(SBUS_DA_io_space_set_region_1) 301 BUS_ACCESS_ADDR(ebx,edx) 302 orl %ecx,%ecx 303 jz 2f 3041: 305 outb %al,%dx 306 incl %edx 307 decl %ecx 308 jnz 1b 3092: 310 ret 311 312ENTRY(SBUS_DA_io_space_set_region_2) 313 BUS_ACCESS_ADDR(ebx,edx) 314 orl %ecx,%ecx 315 jz 2f 3161: 317 outw %ax,%dx 318 addl $2,%edx 319 decl %ecx 320 jnz 1b 3212: 322 ret 323 324ENTRY(SBUS_DA_io_space_set_region_4) 325 BUS_ACCESS_ADDR(ebx,edx) 326 orl %ecx,%ecx 327 jz 2f 3281: 329 outl %eax,%dx 330 addl $4,%edx 331 decl %ecx 332 jnz 1b 3332: 334 ret 335 336/* 337 * copy_region_N 338 * IN: ecx COUNT 339 * esi SPORT 340 * edi DPORT 341 */ 342ENTRY(SBUS_DA_io_space_copy_region_1) 343 BUS_ACCESS_ADDR(eax,esi) 344 BUS_ACCESS_ADDR(ebx,edi) 345 pushl %eax 346 pushl %edx 347 orl %ecx,%ecx 348 jz 2f 3491: 350 movl %esi,%edx 351 inb %dx,%al 352 incl %esi 353 354 movl %edi,%edx 355 outb %al,%dx 356 incl %edi 357 358 decl %ecx 359 jnz 1b 3602: 361 popl %edx 362 popl %eax 363 ret 364 365ENTRY(SBUS_DA_io_space_copy_region_2) 366 BUS_ACCESS_ADDR(eax,esi) 367 BUS_ACCESS_ADDR(ebx,edi) 368 pushl %eax 369 pushl %edx 370 orl %ecx,%ecx 371 jz 2f 3721: 373 movl %esi,%edx 374 inw %dx,%ax 375 addl $2,%esi 376 377 movl %edi,%edx 378 outw %ax,%dx 379 addl $2,%edi 380 381 decl %ecx 382 jnz 1b 3832: 384 popl %edx 385 popl %eax 386 ret 387 388ENTRY(SBUS_DA_io_space_copy_region_4) 389 BUS_ACCESS_ADDR(eax,esi) 390 BUS_ACCESS_ADDR(ebx,edi) 391 pushl %eax 392 pushl %edx 393 orl %ecx,%ecx 394 jz 2f 3951: 396 movl %esi,%edx 397 inl %dx,%eax 398 addl $4,%esi 399 400 movl %edi,%edx 401 outl %eax,%dx 402 addl $4,%edi 403 404 decl %ecx 405 jnz 1b 4062: 407 popl %edx 408 popl %eax 409 ret 410 411/*********************************************************** 412 * Bus Memory access methods (Direct Access) 413 ***********************************************************/ 414/* 415 * read_N 416 */ 417ENTRY(SBUS_DA_mem_space_read_1) 418 BUS_ACCESS_ADDR(ebx,edx) 419 movb (%edx),%al 420 ret 421 422ENTRY(SBUS_DA_mem_space_read_2) 423 BUS_ACCESS_ADDR(ebx,edx) 424 movw (%edx),%ax 425 ret 426 427ENTRY(SBUS_DA_mem_space_read_4) 428 BUS_ACCESS_ADDR(ebx,edx) 429 movl (%edx),%eax 430 ret 431 432/* 433 * write_N 434 */ 435ENTRY(SBUS_DA_mem_space_write_1) 436 BUS_ACCESS_ADDR(ebx,edx) 437 movb %al,(%edx) 438 ret 439 440ENTRY(SBUS_DA_mem_space_write_2) 441 BUS_ACCESS_ADDR(ebx,edx) 442 movw %ax,(%edx) 443 ret 444 445ENTRY(SBUS_DA_mem_space_write_4) 446 BUS_ACCESS_ADDR(ebx,edx) 447 movl %eax,(%edx) 448 ret 449 450/* 451 * read_multi_N 452 */ 453ENTRY(SBUS_DA_mem_space_read_multi_1) 454 BUS_ACCESS_ADDR(ebx,edx) 455 cld 456 pushl %eax 457 orl %ecx,%ecx 458 jz 2f 4591: 460 movb (%edx),%al 461 stosb 462 decl %ecx 463 jnz 1b 4642: 465 popl %eax 466 ret 467 468ENTRY(SBUS_DA_mem_space_read_multi_2) 469 BUS_ACCESS_ADDR(ebx,edx) 470 cld 471 pushl %eax 472 orl %ecx,%ecx 473 jz 2f 4741: 475 movw (%edx),%ax 476 stosw 477 decl %ecx 478 jnz 1b 4792: 480 popl %eax 481 ret 482 483ENTRY(SBUS_DA_mem_space_read_multi_4) 484 BUS_ACCESS_ADDR(ebx,edx) 485 cld 486 pushl %eax 487 orl %ecx,%ecx 488 jz 2f 4891: 490 movl (%edx),%eax 491 stosl 492 decl %ecx 493 jnz 1b 4942: 495 popl %eax 496 ret 497 498/* 499 * write_multi_N 500 */ 501ENTRY(SBUS_DA_mem_space_write_multi_1) 502 BUS_ACCESS_ADDR(ebx,edx) 503 cld 504 pushl %eax 505 orl %ecx,%ecx 506 jz 2f 5071: 508 lodsb 509 movb %al,(%edx) 510 decl %ecx 511 jnz 1b 5122: 513 popl %eax 514 ret 515 516ENTRY(SBUS_DA_mem_space_write_multi_2) 517 BUS_ACCESS_ADDR(ebx,edx) 518 cld 519 pushl %eax 520 orl %ecx,%ecx 521 jz 2f 5221: 523 lodsw 524 movw %ax,(%edx) 525 decl %ecx 526 jnz 1b 5272: 528 popl %eax 529 ret 530 531ENTRY(SBUS_DA_mem_space_write_multi_4) 532 BUS_ACCESS_ADDR(ebx,edx) 533 cld 534 pushl %eax 535 orl %ecx,%ecx 536 jz 2f 5371: 538 lodsl 539 movl %eax,(%edx) 540 decl %ecx 541 jnz 1b 5422: 543 popl %eax 544 ret 545 546/* 547 * read_region_N 548 */ 549ENTRY(SBUS_DA_mem_space_read_region_1) 550 BUS_ACCESS_ADDR(ebx,edx) 551 cld 552 pushl %esi 553 movl %edx,%esi 554 rep 555 movsb 556 popl %esi 557 ret 558 559ENTRY(SBUS_DA_mem_space_read_region_2) 560 BUS_ACCESS_ADDR(ebx,edx) 561 cld 562 pushl %esi 563 movl %edx,%esi 564 rep 565 movsw 566 popl %esi 567 ret 568 569ENTRY(SBUS_DA_mem_space_read_region_4) 570 BUS_ACCESS_ADDR(ebx,edx) 571 cld 572 pushl %esi 573 movl %edx,%esi 574 rep 575 movsl 576 popl %esi 577 ret 578 579/* 580 * write_region_N 581 */ 582ENTRY(SBUS_DA_mem_space_write_region_1) 583 BUS_ACCESS_ADDR(ebx,edx) 584 cld 585 pushl %edi 586 movl %edx,%edi 587 rep 588 movsb 589 popl %edi 590 ret 591 592ENTRY(SBUS_DA_mem_space_write_region_2) 593 BUS_ACCESS_ADDR(ebx,edx) 594 cld 595 pushl %edi 596 movl %edx,%edi 597 rep 598 movsw 599 popl %edi 600 ret 601 602ENTRY(SBUS_DA_mem_space_write_region_4) 603 BUS_ACCESS_ADDR(ebx,edx) 604 cld 605 pushl %edi 606 movl %edx,%edi 607 rep 608 movsl 609 popl %edi 610 ret 611 612/* 613 * set_multi_N 614 */ 615ENTRY(SBUS_DA_mem_space_set_multi_1) 616 BUS_ACCESS_ADDR(ebx,edx) 617 orl %ecx,%ecx 618 jz 2f 6191: 620 movb %al,(%edx) 621 decl %ecx 622 jnz 1b 6232: 624 ret 625 626ENTRY(SBUS_DA_mem_space_set_multi_2) 627 BUS_ACCESS_ADDR(ebx,edx) 628 orl %ecx,%ecx 629 jz 2f 6301: 631 movw %ax,(%edx) 632 decl %ecx 633 jnz 1b 6342: 635 ret 636 637ENTRY(SBUS_DA_mem_space_set_multi_4) 638 BUS_ACCESS_ADDR(ebx,edx) 639 orl %ecx,%ecx 640 jz 2f 6411: 642 movl %eax,(%edx) 643 decl %ecx 644 jnz 1b 6452: 646 ret 647 648/* 649 * set_region_N 650 */ 651ENTRY(SBUS_DA_mem_space_set_region_1) 652 BUS_ACCESS_ADDR(ebx,edx) 653 cld 654 pushl %edi 655 movl %edx,%edi 656 rep 657 stosb 658 popl %edi 659 ret 660 661ENTRY(SBUS_DA_mem_space_set_region_2) 662 BUS_ACCESS_ADDR(ebx,edx) 663 cld 664 pushl %edi 665 movl %edx,%edi 666 rep 667 stosw 668 popl %edi 669 ret 670 671ENTRY(SBUS_DA_mem_space_set_region_4) 672 BUS_ACCESS_ADDR(ebx,edx) 673 cld 674 pushl %edi 675 movl %edx,%edi 676 rep 677 stosl 678 popl %edi 679 ret 680 681/* 682 * copy_region_N 683 */ 684ENTRY(SBUS_DA_mem_space_copy_region_1) 685 BUS_ACCESS_ADDR(eax,esi) 686 BUS_ACCESS_ADDR(ebx,edi) 687 cld 688 rep 689 movsb 690 ret 691 692ENTRY(SBUS_DA_mem_space_copy_region_2) 693 BUS_ACCESS_ADDR(eax,esi) 694 BUS_ACCESS_ADDR(ebx,edi) 695 cld 696 rep 697 movsw 698 ret 699 700ENTRY(SBUS_DA_mem_space_copy_region_4) 701 BUS_ACCESS_ADDR(eax,esi) 702 BUS_ACCESS_ADDR(ebx,edi) 703 cld 704 rep 705 movsl 706 ret 707 708#undef BUS_ACCESS_ADDR 709 710/*********************************************************** 711 * Bus IO access methods (Relocate Access) 712 ***********************************************************/ 713#define BUS_ACCESS_ADDR(BSHREG,ADDRREG) \ 714 movl BUS_SPACE_HANDLE_IAT/**/(%/**/BSHREG/**/, %/**/ADDRREG/**/, 4), \ 715 %/**/ADDRREG 716/* 717 * read_N 718 * IN: edx port 719 * OUT: eax data 720 */ 721ENTRY(SBUS_RA_io_space_read_1) 722 BUS_ACCESS_ADDR(ebx,edx) 723 inb %dx,%al 724 ret 725 726ENTRY(SBUS_RA_io_space_read_2) 727 BUS_ACCESS_ADDR(ebx,edx) 728 inw %dx,%ax 729 ret 730 731ENTRY(SBUS_RA_io_space_read_4) 732 BUS_ACCESS_ADDR(ebx,edx) 733 inl %dx,%eax 734 ret 735 736/* 737 * write_N 738 * IN:eax DATA 739 * edx PORT 740 */ 741ENTRY(SBUS_RA_io_space_write_1) 742 BUS_ACCESS_ADDR(ebx,edx) 743 outb %al,%dx 744 ret 745 746ENTRY(SBUS_RA_io_space_write_2) 747 BUS_ACCESS_ADDR(ebx,edx) 748 outw %ax,%dx 749 ret 750 751ENTRY(SBUS_RA_io_space_write_4) 752 BUS_ACCESS_ADDR(ebx,edx) 753 outl %eax,%dx 754 ret 755 756/* 757 * read_multi_N 758 * IN: ecx COUNT 759 * edx PORT 760 * edi BUFP 761 */ 762ENTRY(SBUS_RA_io_space_read_multi_1) 763 BUS_ACCESS_ADDR(ebx,edx) 764 cld 765 rep 766 insb 767 ret 768 769ENTRY(SBUS_RA_io_space_read_multi_2) 770 BUS_ACCESS_ADDR(ebx,edx) 771 cld 772 rep 773 insw 774 ret 775 776ENTRY(SBUS_RA_io_space_read_multi_4) 777 BUS_ACCESS_ADDR(ebx,edx) 778 cld 779 rep 780 insl 781 ret 782 783/* 784 * write_multi_N 785 * IN: ecx COUNT 786 * edx PORT 787 * esi BUFP 788 */ 789ENTRY(SBUS_RA_io_space_write_multi_1) 790 BUS_ACCESS_ADDR(ebx,edx) 791 cld 792 rep 793 outsb 794 ret 795 796ENTRY(SBUS_RA_io_space_write_multi_2) 797 BUS_ACCESS_ADDR(ebx,edx) 798 cld 799 rep 800 outsw 801 ret 802 803ENTRY(SBUS_RA_io_space_write_multi_4) 804 BUS_ACCESS_ADDR(ebx,edx) 805 cld 806 rep 807 outsl 808 ret 809 810/* 811 * read_region_N 812 * IN: ecx COUNT 813 * edx PORT 814 * edi BUFP 815 */ 816ENTRY(SBUS_RA_io_space_read_region_1) 817 BUS_ACCESS_ADDR(ebx,edx) 818 cld 819 pushl %eax 820 orl %ecx,%ecx 821 jz 2f 8221: 823 inb %dx,%al 824 stosb 825 incl %edx 826 decl %ecx 827 jnz 1b 8282: 829 popl %eax 830 ret 831 832ENTRY(SBUS_RA_io_space_read_region_2) 833 BUS_ACCESS_ADDR(ebx,edx) 834 cld 835 pushl %eax 836 orl %ecx,%ecx 837 jz 2f 8381: 839 inw %dx,%ax 840 stosw 841 addl $2,%edx 842 decl %ecx 843 jnz 1b 8442: 845 popl %eax 846 ret 847 848ENTRY(SBUS_RA_io_space_read_region_4) 849 BUS_ACCESS_ADDR(ebx,edx) 850 cld 851 pushl %eax 852 orl %ecx,%ecx 853 jz 2f 8541: 855 inl %dx,%eax 856 stosl 857 addl $4,%edx 858 decl %ecx 859 jnz 1b 8602: 861 popl %eax 862 ret 863 864/* 865 * write_region_N 866 * IN: ecx COUNT 867 * edx PORT 868 * esi BUFP 869 */ 870ENTRY(SBUS_RA_io_space_write_region_1) 871 BUS_ACCESS_ADDR(ebx,edx) 872 cld 873 pushl %eax 874 orl %ecx,%ecx 875 jz 2f 8761: 877 lodsb 878 outb %al,%dx 879 incl %edx 880 decl %ecx 881 jnz 1b 8822: 883 popl %eax 884 ret 885 886ENTRY(SBUS_RA_io_space_write_region_2) 887 BUS_ACCESS_ADDR(ebx,edx) 888 cld 889 pushl %eax 890 orl %ecx,%ecx 891 jz 2f 8921: 893 lodsw 894 outw %ax,%dx 895 addl $2,%edx 896 decl %ecx 897 jnz 1b 8982: 899 popl %eax 900 ret 901 902ENTRY(SBUS_RA_io_space_write_region_4) 903 BUS_ACCESS_ADDR(ebx,edx) 904 cld 905 pushl %eax 906 orl %ecx,%ecx 907 jz 2f 9081: 909 lodsl 910 outl %eax,%dx 911 addl $4,%edx 912 decl %ecx 913 jnz 1b 9142: 915 popl %eax 916 ret 917 918/* 919 * set_multi_N 920 * IN: eax DATA 921 * ecx COUNT 922 * edx PORT 923 */ 924ENTRY(SBUS_RA_io_space_set_multi_1) 925 BUS_ACCESS_ADDR(ebx,edx) 926 orl %ecx,%ecx 927 jz 2f 9281: 929 outb %al,%dx 930 decl %ecx 931 jnz 1b 9322: 933 ret 934 935ENTRY(SBUS_RA_io_space_set_multi_2) 936 BUS_ACCESS_ADDR(ebx,edx) 937 orl %ecx,%ecx 938 jz 2f 9391: 940 outw %ax,%dx 941 decl %ecx 942 jnz 1b 9432: 944 ret 945 946ENTRY(SBUS_RA_io_space_set_multi_4) 947 BUS_ACCESS_ADDR(ebx,edx) 948 orl %ecx,%ecx 949 jz 2f 9501: 951 outl %eax,%dx 952 decl %ecx 953 jnz 1b 9542: 955 ret 956 957/* 958 * set_region_N 959 * IN: eax DATA 960 * ecx COUNT 961 * edx PORT 962 */ 963ENTRY(SBUS_RA_io_space_set_region_1) 964 BUS_ACCESS_ADDR(ebx,edx) 965 orl %ecx,%ecx 966 jz 2f 9671: 968 outb %al,%dx 969 incl %edx 970 decl %ecx 971 jnz 1b 9722: 973 ret 974 975ENTRY(SBUS_RA_io_space_set_region_2) 976 BUS_ACCESS_ADDR(ebx,edx) 977 orl %ecx,%ecx 978 jz 2f 9791: 980 outw %ax,%dx 981 addl $2,%edx 982 decl %ecx 983 jnz 1b 9842: 985 ret 986 987ENTRY(SBUS_RA_io_space_set_region_4) 988 BUS_ACCESS_ADDR(ebx,edx) 989 orl %ecx,%ecx 990 jz 2f 9911: 992 outl %eax,%dx 993 addl $4,%edx 994 decl %ecx 995 jnz 1b 9962: 997 ret 998 999/* 1000 * copy_region_N 1001 * IN: ecx COUNT 1002 * esi SPORT 1003 * edi DPORT 1004 */ 1005ENTRY(SBUS_RA_io_space_copy_region_1) 1006 BUS_ACCESS_ADDR(eax,esi) 1007 BUS_ACCESS_ADDR(ebx,edi) 1008 pushl %eax 1009 pushl %edx 1010 orl %ecx,%ecx 1011 jz 2f 10121: 1013 movl %esi,%edx 1014 inb %dx,%al 1015 incl %esi 1016 1017 movl %edi,%edx 1018 outb %al,%dx 1019 incl %edi 1020 1021 decl %ecx 1022 jnz 1b 10232: 1024 popl %edx 1025 popl %eax 1026 ret 1027 1028ENTRY(SBUS_RA_io_space_copy_region_2) 1029 BUS_ACCESS_ADDR(eax,esi) 1030 BUS_ACCESS_ADDR(ebx,edi) 1031 pushl %eax 1032 pushl %edx 1033 orl %ecx,%ecx 1034 jz 2f 10351: 1036 movl %esi,%edx 1037 inw %dx,%ax 1038 addl $2,%esi 1039 1040 movl %edi,%edx 1041 outw %ax,%dx 1042 addl $2,%edi 1043 1044 decl %ecx 1045 jnz 1b 10462: 1047 popl %edx 1048 popl %eax 1049 ret 1050 1051ENTRY(SBUS_RA_io_space_copy_region_4) 1052 BUS_ACCESS_ADDR(eax,esi) 1053 BUS_ACCESS_ADDR(ebx,edi) 1054 pushl %eax 1055 pushl %edx 1056 orl %ecx,%ecx 1057 jz 2f 10581: 1059 movl %esi,%edx 1060 inl %dx,%eax 1061 addl $4,%esi 1062 1063 movl %edi,%edx 1064 outl %eax,%dx 1065 addl $4,%edi 1066 1067 decl %ecx 1068 jnz 1b 10692: 1070 popl %edx 1071 popl %eax 1072 ret 1073 1074/*********************************************************** 1075 * Bus Memory access methods 1076 ***********************************************************/ 1077/* 1078 * read_N 1079 */ 1080ENTRY(SBUS_RA_mem_space_read_1) 1081 BUS_ACCESS_ADDR(ebx,edx) 1082 movb (%edx),%al 1083 ret 1084 1085ENTRY(SBUS_RA_mem_space_read_2) 1086 BUS_ACCESS_ADDR(ebx,edx) 1087 movw (%edx),%ax 1088 ret 1089 1090ENTRY(SBUS_RA_mem_space_read_4) 1091 BUS_ACCESS_ADDR(ebx,edx) 1092 movl (%edx),%eax 1093 ret 1094 1095/* 1096 * write_N 1097 */ 1098ENTRY(SBUS_RA_mem_space_write_1) 1099 BUS_ACCESS_ADDR(ebx,edx) 1100 movb %al,(%edx) 1101 ret 1102 1103ENTRY(SBUS_RA_mem_space_write_2) 1104 BUS_ACCESS_ADDR(ebx,edx) 1105 movw %ax,(%edx) 1106 ret 1107 1108ENTRY(SBUS_RA_mem_space_write_4) 1109 BUS_ACCESS_ADDR(ebx,edx) 1110 movl %eax,(%edx) 1111 ret 1112 1113/* 1114 * read_multi_N 1115 */ 1116ENTRY(SBUS_RA_mem_space_read_multi_1) 1117 BUS_ACCESS_ADDR(ebx,edx) 1118 cld 1119 pushl %eax 1120 orl %ecx,%ecx 1121 jz 2f 11221: 1123 movb (%edx),%al 1124 stosb 1125 decl %ecx 1126 jnz 1b 11272: 1128 popl %eax 1129 ret 1130 1131ENTRY(SBUS_RA_mem_space_read_multi_2) 1132 BUS_ACCESS_ADDR(ebx,edx) 1133 cld 1134 pushl %eax 1135 orl %ecx,%ecx 1136 jz 2f 11371: 1138 movw (%edx),%ax 1139 stosw 1140 decl %ecx 1141 jnz 1b 11422: 1143 popl %eax 1144 ret 1145 1146ENTRY(SBUS_RA_mem_space_read_multi_4) 1147 BUS_ACCESS_ADDR(ebx,edx) 1148 cld 1149 pushl %eax 1150 orl %ecx,%ecx 1151 jz 2f 11521: 1153 movl (%edx),%eax 1154 stosl 1155 decl %ecx 1156 jnz 1b 11572: 1158 popl %eax 1159 ret 1160 1161/* 1162 * write_multi_N 1163 */ 1164ENTRY(SBUS_RA_mem_space_write_multi_1) 1165 BUS_ACCESS_ADDR(ebx,edx) 1166 cld 1167 pushl %eax 1168 orl %ecx,%ecx 1169 jz 2f 11701: 1171 lodsb 1172 movb %al,(%edx) 1173 decl %ecx 1174 jnz 1b 11752: 1176 popl %eax 1177 ret 1178 1179ENTRY(SBUS_RA_mem_space_write_multi_2) 1180 BUS_ACCESS_ADDR(ebx,edx) 1181 cld 1182 pushl %eax 1183 orl %ecx,%ecx 1184 jz 2f 11851: 1186 lodsw 1187 movw %ax,(%edx) 1188 decl %ecx 1189 jnz 1b 11902: 1191 popl %eax 1192 ret 1193 1194ENTRY(SBUS_RA_mem_space_write_multi_4) 1195 BUS_ACCESS_ADDR(ebx,edx) 1196 cld 1197 pushl %eax 1198 orl %ecx,%ecx 1199 jz 2f 12001: 1201 lodsl 1202 movl %eax,(%edx) 1203 decl %ecx 1204 jnz 1b 12052: 1206 popl %eax 1207 ret 1208 1209/* 1210 * read_region_N 1211 */ 1212ENTRY(SBUS_RA_mem_space_read_region_1) 1213 BUS_ACCESS_ADDR(ebx,edx) 1214 cld 1215 pushl %esi 1216 movl %edx,%esi 1217 rep 1218 movsb 1219 popl %esi 1220 ret 1221 1222ENTRY(SBUS_RA_mem_space_read_region_2) 1223 BUS_ACCESS_ADDR(ebx,edx) 1224 cld 1225 pushl %esi 1226 movl %edx,%esi 1227 rep 1228 movsw 1229 popl %esi 1230 ret 1231 1232ENTRY(SBUS_RA_mem_space_read_region_4) 1233 BUS_ACCESS_ADDR(ebx,edx) 1234 cld 1235 pushl %esi 1236 movl %edx,%esi 1237 rep 1238 movsl 1239 popl %esi 1240 ret 1241 1242/* 1243 * write_region_N 1244 */ 1245ENTRY(SBUS_RA_mem_space_write_region_1) 1246 BUS_ACCESS_ADDR(ebx,edx) 1247 cld 1248 pushl %edi 1249 movl %edx,%edi 1250 rep 1251 movsb 1252 popl %edi 1253 ret 1254 1255ENTRY(SBUS_RA_mem_space_write_region_2) 1256 BUS_ACCESS_ADDR(ebx,edx) 1257 cld 1258 pushl %edi 1259 movl %edx,%edi 1260 rep 1261 movsw 1262 popl %edi 1263 ret 1264 1265ENTRY(SBUS_RA_mem_space_write_region_4) 1266 BUS_ACCESS_ADDR(ebx,edx) 1267 cld 1268 pushl %edi 1269 movl %edx,%edi 1270 rep 1271 movsl 1272 popl %edi 1273 ret 1274 1275/* 1276 * set_multi_N 1277 */ 1278ENTRY(SBUS_RA_mem_space_set_multi_1) 1279 BUS_ACCESS_ADDR(ebx,edx) 1280 orl %ecx,%ecx 1281 jz 2f 12821: 1283 movb %al,(%edx) 1284 decl %ecx 1285 jnz 1b 12862: 1287 ret 1288 1289ENTRY(SBUS_RA_mem_space_set_multi_2) 1290 BUS_ACCESS_ADDR(ebx,edx) 1291 orl %ecx,%ecx 1292 jz 2f 12931: 1294 movw %ax,(%edx) 1295 decl %ecx 1296 jnz 1b 12972: 1298 ret 1299 1300ENTRY(SBUS_RA_mem_space_set_multi_4) 1301 BUS_ACCESS_ADDR(ebx,edx) 1302 orl %ecx,%ecx 1303 jz 2f 13041: 1305 movl %eax,(%edx) 1306 decl %ecx 1307 jnz 1b 13082: 1309 ret 1310 1311/* 1312 * set_region_N 1313 */ 1314ENTRY(SBUS_RA_mem_space_set_region_1) 1315 BUS_ACCESS_ADDR(ebx,edx) 1316 cld 1317 pushl %edi 1318 movl %edx,%edi 1319 rep 1320 stosb 1321 popl %edi 1322 ret 1323 1324ENTRY(SBUS_RA_mem_space_set_region_2) 1325 BUS_ACCESS_ADDR(ebx,edx) 1326 cld 1327 pushl %edi 1328 movl %edx,%edi 1329 rep 1330 stosw 1331 popl %edi 1332 ret 1333 1334ENTRY(SBUS_RA_mem_space_set_region_4) 1335 BUS_ACCESS_ADDR(ebx,edx) 1336 cld 1337 pushl %edi 1338 movl %edx,%edi 1339 rep 1340 stosl 1341 popl %edi 1342 ret 1343 1344/* 1345 * copy_region_N 1346 */ 1347ENTRY(SBUS_RA_mem_space_copy_region_1) 1348 BUS_ACCESS_ADDR(eax,esi) 1349 BUS_ACCESS_ADDR(ebx,edi) 1350 cld 1351 rep 1352 movsb 1353 ret 1354 1355ENTRY(SBUS_RA_mem_space_copy_region_2) 1356 BUS_ACCESS_ADDR(eax,esi) 1357 BUS_ACCESS_ADDR(ebx,edi) 1358 cld 1359 rep 1360 movsw 1361 ret 1362 1363ENTRY(SBUS_RA_mem_space_copy_region_4) 1364 BUS_ACCESS_ADDR(eax,esi) 1365 BUS_ACCESS_ADDR(ebx,edi) 1366 cld 1367 rep 1368 movsl 1369 ret 1370 1371#undef BUS_ACCESS_ADDR 1372 1373 1374#include "opt_mecia.h" 1375#ifdef DEV_MECIA 1376 1377/*********************************************************** 1378 * NEPC pcmcia 16 bits bus access 1379 ***********************************************************/ 1380#define NEPC_SWITCH_BUS16 \ 1381 pushl %ebp ;\ 1382 pushl %eax ;\ 1383 pushl %edx ;\ 1384 movl $0x2a8e,%edx ;\ 1385 inb %dx,%al ;\ 1386 movl %eax,%ebp ;\ 1387 andl $~0x20,%eax ;\ 1388 outb %al,%dx ;\ 1389 popl %edx ;\ 1390 popl %eax 1391 1392#define NEPC_BUS_RESTORE \ 1393 pushl %eax ;\ 1394 movl %ebp,%eax ;\ 1395 xchgl %edx,%ebp ;\ 1396 movl $0x2a8e,%edx ;\ 1397 outb %al,%dx ;\ 1398 xchgl %ebp,%edx ;\ 1399 popl %eax ;\ 1400 popl %ebp 1401 1402/*********************************************************** 1403 * NEPC pcmcia 16 bits bus acces (Direct Access) 1404 ***********************************************************/ 1405#define BUS_ACCESS_ADDR(BSHREG,ADDRREG) \ 1406 addl BUS_SPACE_HANDLE_BASE/**/(%/**/BSHREG/**/),%/**/ADDRREG 1407 1408ENTRY(NEPC_DA_io_space_read_2) 1409 BUS_ACCESS_ADDR(ebx,edx) 1410 NEPC_SWITCH_BUS16 1411 inw %dx,%ax 1412 NEPC_BUS_RESTORE 1413 ret 1414 1415 1416ENTRY(NEPC_DA_io_space_write_2) 1417 BUS_ACCESS_ADDR(ebx,edx) 1418 NEPC_SWITCH_BUS16 1419 outw %ax,%dx 1420 NEPC_BUS_RESTORE 1421 ret 1422 1423ENTRY(NEPC_DA_io_space_read_multi_2) 1424 BUS_ACCESS_ADDR(ebx,edx) 1425 NEPC_SWITCH_BUS16 1426 cld 1427 rep 1428 insw 1429 NEPC_BUS_RESTORE 1430 ret 1431 1432ENTRY(NEPC_DA_io_space_write_multi_2) 1433 BUS_ACCESS_ADDR(ebx,edx) 1434 NEPC_SWITCH_BUS16 1435 cld 1436 rep 1437 outsw 1438 NEPC_BUS_RESTORE 1439 ret 1440 1441ENTRY(NEPC_DA_io_space_read_region_2) 1442 NEPC_SWITCH_BUS16 1443 call SBUS_DA_io_space_read_region_2 1444 NEPC_BUS_RESTORE 1445 ret 1446 1447ENTRY(NEPC_DA_io_space_write_region_2) 1448 NEPC_SWITCH_BUS16 1449 call SBUS_DA_io_space_write_region_2 1450 NEPC_BUS_RESTORE 1451 ret 1452 1453ENTRY(NEPC_DA_io_space_set_multi_2) 1454 NEPC_SWITCH_BUS16 1455 call SBUS_DA_io_space_set_multi_2 1456 NEPC_BUS_RESTORE 1457 ret 1458 1459 1460ENTRY(NEPC_DA_io_space_set_region_2) 1461 NEPC_SWITCH_BUS16 1462 call SBUS_DA_io_space_set_region_2 1463 NEPC_BUS_RESTORE 1464 ret 1465 1466ENTRY(NEPC_DA_io_space_copy_region_2) 1467 NEPC_SWITCH_BUS16 1468 call SBUS_DA_io_space_copy_region_2 1469 NEPC_BUS_RESTORE 1470 ret 1471 1472ENTRY(NEPC_DA_io_space_read_4) 1473 BUS_ACCESS_ADDR(ebx,edx) 1474 NEPC_SWITCH_BUS16 1475 inl %dx,%eax 1476 NEPC_BUS_RESTORE 1477 ret 1478 1479ENTRY(NEPC_DA_io_space_write_4) 1480 BUS_ACCESS_ADDR(ebx,edx) 1481 NEPC_SWITCH_BUS16 1482 outl %eax,%dx 1483 NEPC_BUS_RESTORE 1484 ret 1485 1486ENTRY(NEPC_DA_io_space_read_multi_4) 1487 BUS_ACCESS_ADDR(ebx,edx) 1488 NEPC_SWITCH_BUS16 1489 cld 1490 rep 1491 insl 1492 NEPC_BUS_RESTORE 1493 ret 1494 1495ENTRY(NEPC_DA_io_space_write_multi_4) 1496 BUS_ACCESS_ADDR(ebx,edx) 1497 NEPC_SWITCH_BUS16 1498 cld 1499 rep 1500 outsl 1501 NEPC_BUS_RESTORE 1502 ret 1503 1504ENTRY(NEPC_DA_io_space_read_region_4) 1505 NEPC_SWITCH_BUS16 1506 call SBUS_DA_io_space_read_region_4 1507 NEPC_BUS_RESTORE 1508 ret 1509 1510ENTRY(NEPC_DA_io_space_write_region_4) 1511 NEPC_SWITCH_BUS16 1512 call SBUS_DA_io_space_write_region_4 1513 NEPC_BUS_RESTORE 1514 ret 1515 1516ENTRY(NEPC_DA_io_space_set_multi_4) 1517 NEPC_SWITCH_BUS16 1518 call SBUS_DA_io_space_set_multi_4 1519 NEPC_BUS_RESTORE 1520 ret 1521 1522 1523ENTRY(NEPC_DA_io_space_set_region_4) 1524 NEPC_SWITCH_BUS16 1525 call SBUS_DA_io_space_set_region_4 1526 NEPC_BUS_RESTORE 1527 ret 1528 1529ENTRY(NEPC_DA_io_space_copy_region_4) 1530 NEPC_SWITCH_BUS16 1531 call SBUS_DA_io_space_copy_region_4 1532 NEPC_BUS_RESTORE 1533 ret 1534 1535#undef BUS_ACCESS_ADDR 1536 1537/*********************************************************** 1538 * NEPC pcmcia 16 bits bus acces (Relocate Access) 1539 ***********************************************************/ 1540#define BUS_ACCESS_ADDR(BSHREG,ADDRREG) \ 1541 movl BUS_SPACE_HANDLE_IAT/**/(%/**/BSHREG/**/, %/**/ADDRREG/**/, 4), \ 1542 %/**/ADDRREG 1543 1544ENTRY(NEPC_RA_io_space_read_2) 1545 BUS_ACCESS_ADDR(ebx,edx) 1546 NEPC_SWITCH_BUS16 1547 inw %dx,%ax 1548 NEPC_BUS_RESTORE 1549 ret 1550 1551 1552ENTRY(NEPC_RA_io_space_write_2) 1553 BUS_ACCESS_ADDR(ebx,edx) 1554 NEPC_SWITCH_BUS16 1555 outw %ax,%dx 1556 NEPC_BUS_RESTORE 1557 ret 1558 1559ENTRY(NEPC_RA_io_space_read_multi_2) 1560 BUS_ACCESS_ADDR(ebx,edx) 1561 NEPC_SWITCH_BUS16 1562 cld 1563 rep 1564 insw 1565 NEPC_BUS_RESTORE 1566 ret 1567 1568ENTRY(NEPC_RA_io_space_write_multi_2) 1569 BUS_ACCESS_ADDR(ebx,edx) 1570 NEPC_SWITCH_BUS16 1571 cld 1572 rep 1573 outsw 1574 NEPC_BUS_RESTORE 1575 ret 1576 1577ENTRY(NEPC_RA_io_space_read_region_2) 1578 NEPC_SWITCH_BUS16 1579 call SBUS_RA_io_space_read_region_2 1580 NEPC_BUS_RESTORE 1581 ret 1582 1583ENTRY(NEPC_RA_io_space_write_region_2) 1584 NEPC_SWITCH_BUS16 1585 call SBUS_RA_io_space_write_region_2 1586 NEPC_BUS_RESTORE 1587 ret 1588 1589ENTRY(NEPC_RA_io_space_set_multi_2) 1590 NEPC_SWITCH_BUS16 1591 call SBUS_RA_io_space_set_multi_2 1592 NEPC_BUS_RESTORE 1593 ret 1594 1595 1596ENTRY(NEPC_RA_io_space_set_region_2) 1597 NEPC_SWITCH_BUS16 1598 call SBUS_RA_io_space_set_region_2 1599 NEPC_BUS_RESTORE 1600 ret 1601 1602ENTRY(NEPC_RA_io_space_copy_region_2) 1603 NEPC_SWITCH_BUS16 1604 call SBUS_RA_io_space_copy_region_2 1605 NEPC_BUS_RESTORE 1606 ret 1607 1608ENTRY(NEPC_RA_io_space_read_4) 1609 BUS_ACCESS_ADDR(ebx,edx) 1610 NEPC_SWITCH_BUS16 1611 inl %dx,%eax 1612 NEPC_BUS_RESTORE 1613 ret 1614 1615ENTRY(NEPC_RA_io_space_write_4) 1616 BUS_ACCESS_ADDR(ebx,edx) 1617 NEPC_SWITCH_BUS16 1618 outl %eax,%dx 1619 NEPC_BUS_RESTORE 1620 ret 1621 1622ENTRY(NEPC_RA_io_space_read_multi_4) 1623 BUS_ACCESS_ADDR(ebx,edx) 1624 NEPC_SWITCH_BUS16 1625 cld 1626 rep 1627 insl 1628 NEPC_BUS_RESTORE 1629 ret 1630 1631ENTRY(NEPC_RA_io_space_write_multi_4) 1632 BUS_ACCESS_ADDR(ebx,edx) 1633 NEPC_SWITCH_BUS16 1634 cld 1635 rep 1636 outsl 1637 NEPC_BUS_RESTORE 1638 ret 1639 1640ENTRY(NEPC_RA_io_space_read_region_4) 1641 NEPC_SWITCH_BUS16 1642 call SBUS_RA_io_space_read_region_4 1643 NEPC_BUS_RESTORE 1644 ret 1645 1646ENTRY(NEPC_RA_io_space_write_region_4) 1647 NEPC_SWITCH_BUS16 1648 call SBUS_RA_io_space_write_region_4 1649 NEPC_BUS_RESTORE 1650 ret 1651 1652ENTRY(NEPC_RA_io_space_set_multi_4) 1653 NEPC_SWITCH_BUS16 1654 call SBUS_RA_io_space_set_multi_4 1655 NEPC_BUS_RESTORE 1656 ret 1657 1658 1659ENTRY(NEPC_RA_io_space_set_region_4) 1660 NEPC_SWITCH_BUS16 1661 call SBUS_RA_io_space_set_region_4 1662 NEPC_BUS_RESTORE 1663 ret 1664 1665ENTRY(NEPC_RA_io_space_copy_region_4) 1666 NEPC_SWITCH_BUS16 1667 call SBUS_RA_io_space_copy_region_4 1668 NEPC_BUS_RESTORE 1669 ret 1670 1671#endif /* DEV_MECIA */ 1672