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 2006 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/* 30 * Hypervisor calls 31 */ 32 33#include <sys/asm_linkage.h> 34#include <sys/machasi.h> 35#include <sys/machparam.h> 36#include <sys/hypervisor_api.h> 37 38#if defined(lint) || defined(__lint) 39 40/*ARGSUSED*/ 41uint64_t 42hv_mach_exit(uint64_t exit_code) 43{ return (0); } 44 45uint64_t 46hv_mach_sir(void) 47{ return (0); } 48 49/*ARGSUSED*/ 50uint64_t 51hv_cpu_start(uint64_t cpuid, uint64_t pc, uint64_t rtba, uint64_t arg) 52{ return (0); } 53 54/*ARGSUSED*/ 55uint64_t 56hv_cpu_stop(uint64_t cpuid) 57{ return (0); } 58 59/*ARGSUSED*/ 60uint64_t 61hv_cpu_set_rtba(uint64_t *rtba) 62{ return (0); } 63 64/*ARGSUSED*/ 65int64_t 66hv_cnputchar(uint8_t ch) 67{ return (0); } 68 69/*ARGSUSED*/ 70int64_t 71hv_cngetchar(uint8_t *ch) 72{ return (0); } 73 74/*ARGSUSED*/ 75uint64_t 76hv_tod_get(uint64_t *seconds) 77{ return (0); } 78 79/*ARGSUSED*/ 80uint64_t 81hv_tod_set(uint64_t seconds) 82{ return (0);} 83 84/*ARGSUSED*/ 85uint64_t 86hv_mmu_map_perm_addr(void *vaddr, int ctx, uint64_t tte, int flags) 87{ return (0); } 88 89/*ARGSUSED */ 90uint64_t 91hv_mmu_fault_area_conf(void *raddr) 92{ return (0); } 93 94/*ARGSUSED*/ 95uint64_t 96hv_mmu_unmap_perm_addr(void *vaddr, int ctx, int flags) 97{ return (0); } 98 99/*ARGSUSED*/ 100uint64_t 101hv_set_ctx0(uint64_t ntsb_descriptor, uint64_t desc_ra) 102{ return (0); } 103 104/*ARGSUSED*/ 105uint64_t 106hv_set_ctxnon0(uint64_t ntsb_descriptor, uint64_t desc_ra) 107{ return (0); } 108 109#ifdef SET_MMU_STATS 110/*ARGSUSED*/ 111uint64_t 112hv_mmu_set_stat_area(uint64_t rstatarea, uint64_t size) 113{ return (0); } 114#endif /* SET_MMU_STATS */ 115 116/*ARGSUSED*/ 117uint64_t 118hv_cpu_qconf(int queue, uint64_t paddr, int size) 119{ return (0); } 120 121/*ARGSUSED*/ 122uint64_t 123hvio_intr_devino_to_sysino(uint64_t dev_hdl, uint32_t devino, uint64_t *sysino) 124{ return (0); } 125 126/*ARGSUSED*/ 127uint64_t 128hvio_intr_getvalid(uint64_t sysino, int *intr_valid_state) 129{ return (0); } 130 131/*ARGSUSED*/ 132uint64_t 133hvio_intr_setvalid(uint64_t sysino, int intr_valid_state) 134{ return (0); } 135 136/*ARGSUSED*/ 137uint64_t 138hvio_intr_getstate(uint64_t sysino, int *intr_state) 139{ return (0); } 140 141/*ARGSUSED*/ 142uint64_t 143hvio_intr_setstate(uint64_t sysino, int intr_state) 144{ return (0); } 145 146/*ARGSUSED*/ 147uint64_t 148hvio_intr_gettarget(uint64_t sysino, uint32_t *cpuid) 149{ return (0); } 150 151/*ARGSUSED*/ 152uint64_t 153hvio_intr_settarget(uint64_t sysino, uint32_t cpuid) 154{ return (0); } 155 156uint64_t 157hv_cpu_yield(void) 158{ return (0); } 159 160/*ARGSUSED*/ 161uint64_t 162hv_cpu_state(uint64_t cpuid, uint64_t *cpu_state) 163{ return (0); } 164 165/*ARGSUSED*/ 166uint64_t 167hv_dump_buf_update(uint64_t paddr, uint64_t size, uint64_t *minsize) 168{ return (0); } 169 170/*ARGSUSED*/ 171uint64_t 172hv_mem_scrub(uint64_t real_addr, uint64_t length, uint64_t *scrubbed_len) 173{ return (0); } 174 175/*ARGSUSED*/ 176uint64_t 177hv_mem_sync(uint64_t real_addr, uint64_t length, uint64_t *flushed_len) 178{ return (0); } 179 180/*ARGSUSED*/ 181uint64_t 182hv_ttrace_buf_conf(uint64_t paddr, uint64_t size, uint64_t *size1) 183{ return (0); } 184 185/*ARGSUSED*/ 186uint64_t 187hv_ttrace_buf_info(uint64_t *paddr, uint64_t *size) 188{ return (0); } 189 190/*ARGSUSED*/ 191uint64_t 192hv_ttrace_enable(uint64_t enable, uint64_t *prev_enable) 193{ return (0); } 194 195/*ARGSUSED*/ 196uint64_t 197hv_ttrace_freeze(uint64_t freeze, uint64_t *prev_freeze) 198{ return (0); } 199 200/*ARGSUSED*/ 201uint64_t 202hv_mach_desc(uint64_t buffer_ra, uint64_t *buffer_sizep) 203{ return (0); } 204 205/*ARGSUSED*/ 206uint64_t 207hv_ra2pa(uint64_t ra) 208{ return (0); } 209 210/*ARGSUSED*/ 211uint64_t 212hv_hpriv(void *func, uint64_t arg1, uint64_t arg2, uint64_t arg3) 213{ return (0); } 214 215/*ARGSUSED*/ 216uint64_t 217hv_ldc_tx_qconf(uint64_t channel, uint64_t ra_base, uint64_t nentries) 218{ return (0); } 219 220/*ARGSUSED*/ 221uint64_t 222hv_ldc_tx_qinfo(uint64_t channel, uint64_t *ra_base, uint64_t *nentries) 223{ return (0); } 224 225/*ARGSUSED*/ 226uint64_t 227hv_ldc_tx_get_state(uint64_t channel, 228 uint64_t *headp, uint64_t *tailp, uint64_t *state) 229{ return (0); } 230 231/*ARGSUSED*/ 232uint64_t 233hv_ldc_tx_set_qtail(uint64_t channel, uint64_t tail) 234{ return (0); } 235 236/*ARGSUSED*/ 237uint64_t 238hv_ldc_rx_qconf(uint64_t channel, uint64_t ra_base, uint64_t nentries) 239{ return (0); } 240 241/*ARGSUSED*/ 242uint64_t 243hv_ldc_rx_qinfo(uint64_t channel, uint64_t *ra_base, uint64_t *nentries) 244{ return (0); } 245 246/*ARGSUSED*/ 247uint64_t 248hv_ldc_rx_get_state(uint64_t channel, 249 uint64_t *headp, uint64_t *tailp, uint64_t *state) 250{ return (0); } 251 252/*ARGSUSED*/ 253uint64_t 254hv_ldc_rx_set_qhead(uint64_t channel, uint64_t head) 255{ return (0); } 256 257/*ARGSUSED*/ 258uint64_t 259hv_ldc_send_msg(uint64_t channel, uint64_t msg_ra) 260{ return (0); } 261 262/*ARGSUSED*/ 263uint64_t 264hv_ldc_set_map_table(uint64_t channel, uint64_t tbl_ra, uint64_t tbl_entries) 265{ return (0); } 266 267/*ARGSUSED*/ 268uint64_t 269hv_ldc_copy(uint64_t channel, uint64_t request, uint64_t cookie, 270 uint64_t raddr, uint64_t length, uint64_t *lengthp) 271{ return (0); } 272 273/*ARGSUSED*/ 274uint64_t 275hvldc_intr_getcookie(uint64_t dev_hdl, uint32_t devino, uint64_t *cookie) 276{ return (0); } 277 278/*ARGSUSED*/ 279uint64_t 280hvldc_intr_setcookie(uint64_t dev_hdl, uint32_t devino, uint64_t cookie) 281{ return (0); } 282 283/*ARGSUSED*/ 284uint64_t 285hvldc_intr_getvalid(uint64_t dev_hdl, uint32_t devino, int *intr_valid_state) 286{ return (0); } 287 288/*ARGSUSED*/ 289uint64_t 290hvldc_intr_setvalid(uint64_t dev_hdl, uint32_t devino, int intr_valid_state) 291{ return (0); } 292 293/*ARGSUSED*/ 294uint64_t 295hvldc_intr_getstate(uint64_t dev_hdl, uint32_t devino, int *intr_state) 296{ return (0); } 297 298/*ARGSUSED*/ 299uint64_t 300hvldc_intr_setstate(uint64_t dev_hdl, uint32_t devino, int intr_state) 301{ return (0); } 302 303/*ARGSUSED*/ 304uint64_t 305hvldc_intr_gettarget(uint64_t dev_hdl, uint32_t devino, uint32_t *cpuid) 306{ return (0); } 307 308/*ARGSUSED*/ 309uint64_t 310hvldc_intr_settarget(uint64_t dev_hdl, uint32_t devino, uint32_t cpuid) 311{ return (0); } 312 313/*ARGSUSED*/ 314uint64_t 315hv_api_get_version(uint64_t api_group, uint64_t *majorp, uint64_t *minorp) 316{ return (0); } 317 318/*ARGSUSED*/ 319uint64_t 320hv_api_set_version(uint64_t api_group, uint64_t major, uint64_t minor, 321 uint64_t *supported_minor) 322{ return (0); } 323 324/*ARGSUSED*/ 325uint64_t 326hv_mach_set_watchdog(uint64_t timeout, uint64_t *time_remaining) 327{ return (0); } 328 329/*ARGSUSED*/ 330int64_t 331hv_cnwrite(uint64_t buf_ra, uint64_t count, uint64_t *retcount) 332{ return (0); } 333 334/*ARGSUSED*/ 335int64_t 336hv_cnread(uint64_t buf_ra, uint64_t count, int64_t *retcount) 337{ return (0); } 338 339#else /* lint || __lint */ 340 341 /* 342 * int hv_mach_exit(uint64_t exit_code) 343 */ 344 ENTRY(hv_mach_exit) 345 mov HV_MACH_EXIT, %o5 346 ta FAST_TRAP 347 retl 348 nop 349 SET_SIZE(hv_mach_exit) 350 351 /* 352 * uint64_t hv_mach_sir(void) 353 */ 354 ENTRY(hv_mach_sir) 355 mov HV_MACH_SIR, %o5 356 ta FAST_TRAP 357 retl 358 nop 359 SET_SIZE(hv_mach_sir) 360 361 /* 362 * hv_cpu_start(uint64_t cpuid, uint64_t pc, ui64_t rtba, 363 * uint64_t arg) 364 */ 365 ENTRY(hv_cpu_start) 366 mov HV_CPU_START, %o5 367 ta FAST_TRAP 368 retl 369 nop 370 SET_SIZE(hv_cpu_start) 371 372 /* 373 * hv_cpu_stop(uint64_t cpuid) 374 */ 375 ENTRY(hv_cpu_stop) 376 mov HV_CPU_STOP, %o5 377 ta FAST_TRAP 378 retl 379 nop 380 SET_SIZE(hv_cpu_stop) 381 382 /* 383 * hv_cpu_set_rtba(uint64_t *rtba) 384 */ 385 ENTRY(hv_cpu_set_rtba) 386 mov %o0, %o2 387 ldx [%o2], %o0 388 mov HV_CPU_SET_RTBA, %o5 389 ta FAST_TRAP 390 stx %o1, [%o2] 391 retl 392 nop 393 SET_SIZE(hv_cpu_set_rtba) 394 395 /* 396 * int64_t hv_cnputchar(uint8_t ch) 397 */ 398 ENTRY(hv_cnputchar) 399 mov CONS_PUTCHAR, %o5 400 ta FAST_TRAP 401 retl 402 nop 403 SET_SIZE(hv_cnputchar) 404 405 /* 406 * int64_t hv_cngetchar(uint8_t *ch) 407 */ 408 ENTRY(hv_cngetchar) 409 mov %o0, %o2 410 mov CONS_GETCHAR, %o5 411 ta FAST_TRAP 412 brnz,a %o0, 1f ! failure, just return error 413 nop 414 415 cmp %o1, H_BREAK 416 be 1f 417 mov %o1, %o0 418 419 cmp %o1, H_HUP 420 be 1f 421 mov %o1, %o0 422 423 stb %o1, [%o2] ! success, save character and return 0 424 mov 0, %o0 4251: 426 retl 427 nop 428 SET_SIZE(hv_cngetchar) 429 430 ENTRY(hv_tod_get) 431 mov %o0, %o4 432 mov TOD_GET, %o5 433 ta FAST_TRAP 434 retl 435 stx %o1, [%o4] 436 SET_SIZE(hv_tod_get) 437 438 ENTRY(hv_tod_set) 439 mov TOD_SET, %o5 440 ta FAST_TRAP 441 retl 442 nop 443 SET_SIZE(hv_tod_set) 444 445 /* 446 * Map permanent address 447 * arg0 vaddr (%o0) 448 * arg1 context (%o1) 449 * arg2 tte (%o2) 450 * arg3 flags (%o3) 0x1=d 0x2=i 451 */ 452 ENTRY(hv_mmu_map_perm_addr) 453 mov MAP_PERM_ADDR, %o5 454 ta FAST_TRAP 455 retl 456 nop 457 SET_SIZE(hv_mmu_map_perm_addr) 458 459 /* 460 * hv_mmu_fault_area_conf(void *raddr) 461 */ 462 ENTRY(hv_mmu_fault_area_conf) 463 mov %o0, %o2 464 ldx [%o2], %o0 465 mov MMU_SET_INFOPTR, %o5 466 ta FAST_TRAP 467 stx %o1, [%o2] 468 retl 469 nop 470 SET_SIZE(hv_mmu_fault_area_conf) 471 472 /* 473 * Unmap permanent address 474 * arg0 vaddr (%o0) 475 * arg1 context (%o1) 476 * arg2 flags (%o2) 0x1=d 0x2=i 477 */ 478 ENTRY(hv_mmu_unmap_perm_addr) 479 mov UNMAP_PERM_ADDR, %o5 480 ta FAST_TRAP 481 retl 482 nop 483 SET_SIZE(hv_mmu_unmap_perm_addr) 484 485 /* 486 * Set TSB for context 0 487 * arg0 ntsb_descriptor (%o0) 488 * arg1 desc_ra (%o1) 489 */ 490 ENTRY(hv_set_ctx0) 491 mov MMU_TSB_CTX0, %o5 492 ta FAST_TRAP 493 retl 494 nop 495 SET_SIZE(hv_set_ctx0) 496 497 /* 498 * Set TSB for context non0 499 * arg0 ntsb_descriptor (%o0) 500 * arg1 desc_ra (%o1) 501 */ 502 ENTRY(hv_set_ctxnon0) 503 mov MMU_TSB_CTXNON0, %o5 504 ta FAST_TRAP 505 retl 506 nop 507 SET_SIZE(hv_set_ctxnon0) 508 509#ifdef SET_MMU_STATS 510 /* 511 * Returns old stat area on success 512 */ 513 ENTRY(hv_mmu_set_stat_area) 514 mov MMU_STAT_AREA, %o5 515 ta FAST_TRAP 516 retl 517 nop 518 SET_SIZE(hv_mmu_set_stat_area) 519#endif /* SET_MMU_STATS */ 520 521 /* 522 * CPU Q Configure 523 * arg0 queue (%o0) 524 * arg1 Base address RA (%o1) 525 * arg2 Size (%o2) 526 */ 527 ENTRY(hv_cpu_qconf) 528 mov HV_CPU_QCONF, %o5 529 ta FAST_TRAP 530 retl 531 nop 532 SET_SIZE(hv_cpu_qconf) 533 534 /* 535 * arg0 - devhandle 536 * arg1 - devino 537 * 538 * ret0 - status 539 * ret1 - sysino 540 */ 541 ENTRY(hvio_intr_devino_to_sysino) 542 mov HVIO_INTR_DEVINO2SYSINO, %o5 543 ta FAST_TRAP 544 brz,a %o0, 1f 545 stx %o1, [%o2] 5461: retl 547 nop 548 SET_SIZE(hvio_intr_devino_to_sysino) 549 550 /* 551 * arg0 - sysino 552 * 553 * ret0 - status 554 * ret1 - intr_valid_state 555 */ 556 ENTRY(hvio_intr_getvalid) 557 mov %o1, %o2 558 mov HVIO_INTR_GETVALID, %o5 559 ta FAST_TRAP 560 brz,a %o0, 1f 561 stuw %o1, [%o2] 5621: retl 563 nop 564 SET_SIZE(hvio_intr_getvalid) 565 566 /* 567 * arg0 - sysino 568 * arg1 - intr_valid_state 569 * 570 * ret0 - status 571 */ 572 ENTRY(hvio_intr_setvalid) 573 mov HVIO_INTR_SETVALID, %o5 574 ta FAST_TRAP 575 retl 576 nop 577 SET_SIZE(hvio_intr_setvalid) 578 579 /* 580 * arg0 - sysino 581 * 582 * ret0 - status 583 * ret1 - intr_state 584 */ 585 ENTRY(hvio_intr_getstate) 586 mov %o1, %o2 587 mov HVIO_INTR_GETSTATE, %o5 588 ta FAST_TRAP 589 brz,a %o0, 1f 590 stuw %o1, [%o2] 5911: retl 592 nop 593 SET_SIZE(hvio_intr_getstate) 594 595 /* 596 * arg0 - sysino 597 * arg1 - intr_state 598 * 599 * ret0 - status 600 */ 601 ENTRY(hvio_intr_setstate) 602 mov HVIO_INTR_SETSTATE, %o5 603 ta FAST_TRAP 604 retl 605 nop 606 SET_SIZE(hvio_intr_setstate) 607 608 /* 609 * arg0 - sysino 610 * 611 * ret0 - status 612 * ret1 - cpu_id 613 */ 614 ENTRY(hvio_intr_gettarget) 615 mov %o1, %o2 616 mov HVIO_INTR_GETTARGET, %o5 617 ta FAST_TRAP 618 brz,a %o0, 1f 619 stuw %o1, [%o2] 6201: retl 621 nop 622 SET_SIZE(hvio_intr_gettarget) 623 624 /* 625 * arg0 - sysino 626 * arg1 - cpu_id 627 * 628 * ret0 - status 629 */ 630 ENTRY(hvio_intr_settarget) 631 mov HVIO_INTR_SETTARGET, %o5 632 ta FAST_TRAP 633 retl 634 nop 635 SET_SIZE(hvio_intr_settarget) 636 637 /* 638 * hv_cpu_yield(void) 639 */ 640 ENTRY(hv_cpu_yield) 641 mov HV_CPU_YIELD, %o5 642 ta FAST_TRAP 643 retl 644 nop 645 SET_SIZE(hv_cpu_yield) 646 647 /* 648 * int hv_cpu_state(uint64_t cpuid, uint64_t *cpu_state); 649 */ 650 ENTRY(hv_cpu_state) 651 mov %o1, %o4 ! save datap 652 mov HV_CPU_STATE, %o5 653 ta FAST_TRAP 654 brz,a %o0, 1f 655 stx %o1, [%o4] 6561: 657 retl 658 nop 659 SET_SIZE(hv_cpu_state) 660 661 /* 662 * HV state dump zone Configure 663 * arg0 real adrs of dump buffer (%o0) 664 * arg1 size of dump buffer (%o1) 665 * ret0 status (%o0) 666 * ret1 size of buffer on success and min size on EINVAL (%o1) 667 * hv_dump_buf_update(uint64_t paddr, uint64_t size, uint64_t *ret_size) 668 */ 669 ENTRY(hv_dump_buf_update) 670 mov DUMP_BUF_UPDATE, %o5 671 ta FAST_TRAP 672 retl 673 stx %o1, [%o2] 674 SET_SIZE(hv_dump_buf_update) 675 676 /* 677 * arg0 - timeout value (%o0) 678 * 679 * ret0 - status (%o0) 680 * ret1 - time_remaining (%o1) 681 * hv_mach_set_watchdog(uint64_t timeout, uint64_t *time_remaining) 682 */ 683 ENTRY(hv_mach_set_watchdog) 684 mov %o1, %o2 685 mov MACH_SET_WATCHDOG, %o5 686 ta FAST_TRAP 687 retl 688 stx %o1, [%o2] 689 SET_SIZE(hv_mach_set_watchdog) 690 691 /* 692 * For memory scrub 693 * int hv_mem_scrub(uint64_t real_addr, uint64_t length, 694 * uint64_t *scrubbed_len); 695 * Retun %o0 -- status 696 * %o1 -- bytes scrubbed 697 */ 698 ENTRY(hv_mem_scrub) 699 mov %o2, %o4 700 mov HV_MEM_SCRUB, %o5 701 ta FAST_TRAP 702 retl 703 stx %o1, [%o4] 704 SET_SIZE(hv_mem_scrub) 705 706 /* 707 * Flush ecache 708 * int hv_mem_sync(uint64_t real_addr, uint64_t length, 709 * uint64_t *flushed_len); 710 * Retun %o0 -- status 711 * %o1 -- bytes flushed 712 */ 713 ENTRY(hv_mem_sync) 714 mov %o2, %o4 715 mov HV_MEM_SYNC, %o5 716 ta FAST_TRAP 717 retl 718 stx %o1, [%o4] 719 SET_SIZE(hv_mem_sync) 720 721 /* 722 * TTRACE_BUF_CONF Configure 723 * arg0 RA base of buffer (%o0) 724 * arg1 buf size in no. of entries (%o1) 725 * ret0 status (%o0) 726 * ret1 minimum size in no. of entries on failure, 727 * actual size in no. of entries on success (%o1) 728 */ 729 ENTRY(hv_ttrace_buf_conf) 730 mov TTRACE_BUF_CONF, %o5 731 ta FAST_TRAP 732 retl 733 stx %o1, [%o2] 734 SET_SIZE(hv_ttrace_buf_conf) 735 736 /* 737 * TTRACE_BUF_INFO 738 * ret0 status (%o0) 739 * ret1 RA base of buffer (%o1) 740 * ret2 size in no. of entries (%o2) 741 */ 742 ENTRY(hv_ttrace_buf_info) 743 mov %o0, %o3 744 mov %o1, %o4 745 mov TTRACE_BUF_INFO, %o5 746 ta FAST_TRAP 747 stx %o1, [%o3] 748 retl 749 stx %o2, [%o4] 750 SET_SIZE(hv_ttrace_buf_info) 751 752 /* 753 * TTRACE_ENABLE 754 * arg0 enable/ disable (%o0) 755 * ret0 status (%o0) 756 * ret1 previous enable state (%o1) 757 */ 758 ENTRY(hv_ttrace_enable) 759 mov %o1, %o2 760 mov TTRACE_ENABLE, %o5 761 ta FAST_TRAP 762 retl 763 stx %o1, [%o2] 764 SET_SIZE(hv_ttrace_enable) 765 766 /* 767 * TTRACE_FREEZE 768 * arg0 enable/ freeze (%o0) 769 * ret0 status (%o0) 770 * ret1 previous freeze state (%o1) 771 */ 772 ENTRY(hv_ttrace_freeze) 773 mov %o1, %o2 774 mov TTRACE_FREEZE, %o5 775 ta FAST_TRAP 776 retl 777 stx %o1, [%o2] 778 SET_SIZE(hv_ttrace_freeze) 779 780 /* 781 * MACH_DESC 782 * arg0 buffer real address 783 * arg1 pointer to uint64_t for size of buffer 784 * ret0 status 785 * ret1 return required size of buffer / returned data size 786 */ 787 ENTRY(hv_mach_desc) 788 mov %o1, %o4 ! save datap 789 ldx [%o1], %o1 790 mov HV_MACH_DESC, %o5 791 ta FAST_TRAP 792 retl 793 stx %o1, [%o4] 794 SET_SIZE(hv_mach_desc) 795 796 /* 797 * hv_ra2pa(uint64_t ra) 798 * 799 * MACH_DESC 800 * arg0 Real address to convert 801 * ret0 Returned physical address or -1 on error 802 */ 803 ENTRY(hv_ra2pa) 804 mov HV_RA2PA, %o5 805 ta FAST_TRAP 806 cmp %o0, 0 807 move %xcc, %o1, %o0 808 movne %xcc, -1, %o0 809 retl 810 nop 811 SET_SIZE(hv_ra2pa) 812 813 /* 814 * hv_hpriv(void *func, uint64_t arg1, uint64_t arg2, uint64_t arg3) 815 * 816 * MACH_DESC 817 * arg0 OS function to call 818 * arg1 First arg to OS function 819 * arg2 Second arg to OS function 820 * arg3 Third arg to OS function 821 * ret0 Returned value from function 822 */ 823 824 ENTRY(hv_hpriv) 825 mov HV_HPRIV, %o5 826 ta FAST_TRAP 827 retl 828 nop 829 SET_SIZE(hv_hpriv) 830 831 /* 832 * hv_ldc_tx_qconf(uint64_t channel, uint64_t ra_base, 833 * uint64_t nentries); 834 */ 835 ENTRY(hv_ldc_tx_qconf) 836 mov LDC_TX_QCONF, %o5 837 ta FAST_TRAP 838 retl 839 nop 840 SET_SIZE(hv_ldc_tx_qconf) 841 842 843 /* 844 * hv_ldc_tx_qinfo(uint64_t channel, uint64_t *ra_base, 845 * uint64_t *nentries); 846 */ 847 ENTRY(hv_ldc_tx_qinfo) 848 mov %o1, %g1 849 mov %o2, %g2 850 mov LDC_TX_QINFO, %o5 851 ta FAST_TRAP 852 stx %o1, [%g1] 853 retl 854 stx %o2, [%g2] 855 SET_SIZE(hv_ldc_tx_qinfo) 856 857 858 /* 859 * hv_ldc_tx_get_state(uint64_t channel, 860 * uint64_t *headp, uint64_t *tailp, uint64_t *state); 861 */ 862 ENTRY(hv_ldc_tx_get_state) 863 mov LDC_TX_GET_STATE, %o5 864 mov %o1, %g1 865 mov %o2, %g2 866 mov %o3, %g3 867 ta FAST_TRAP 868 stx %o1, [%g1] 869 stx %o2, [%g2] 870 retl 871 stx %o3, [%g3] 872 SET_SIZE(hv_ldc_tx_get_state) 873 874 875 /* 876 * hv_ldc_tx_set_qtail(uint64_t channel, uint64_t tail) 877 */ 878 ENTRY(hv_ldc_tx_set_qtail) 879 mov LDC_TX_SET_QTAIL, %o5 880 ta FAST_TRAP 881 retl 882 SET_SIZE(hv_ldc_tx_set_qtail) 883 884 885 /* 886 * hv_ldc_rx_qconf(uint64_t channel, uint64_t ra_base, 887 * uint64_t nentries); 888 */ 889 ENTRY(hv_ldc_rx_qconf) 890 mov LDC_RX_QCONF, %o5 891 ta FAST_TRAP 892 retl 893 nop 894 SET_SIZE(hv_ldc_rx_qconf) 895 896 897 /* 898 * hv_ldc_rx_qinfo(uint64_t channel, uint64_t *ra_base, 899 * uint64_t *nentries); 900 */ 901 ENTRY(hv_ldc_rx_qinfo) 902 mov %o1, %g1 903 mov %o2, %g2 904 mov LDC_RX_QINFO, %o5 905 ta FAST_TRAP 906 stx %o1, [%g1] 907 retl 908 stx %o2, [%g2] 909 SET_SIZE(hv_ldc_rx_qinfo) 910 911 912 /* 913 * hv_ldc_rx_get_state(uint64_t channel, 914 * uint64_t *headp, uint64_t *tailp, uint64_t *state); 915 */ 916 ENTRY(hv_ldc_rx_get_state) 917 mov LDC_RX_GET_STATE, %o5 918 mov %o1, %g1 919 mov %o2, %g2 920 mov %o3, %g3 921 ta FAST_TRAP 922 stx %o1, [%g1] 923 stx %o2, [%g2] 924 retl 925 stx %o3, [%g3] 926 SET_SIZE(hv_ldc_rx_get_state) 927 928 929 /* 930 * hv_ldc_rx_set_qhead(uint64_t channel, uint64_t head) 931 */ 932 ENTRY(hv_ldc_rx_set_qhead) 933 mov LDC_RX_SET_QHEAD, %o5 934 ta FAST_TRAP 935 retl 936 SET_SIZE(hv_ldc_rx_set_qhead) 937 938 /* 939 * hv_ldc_set_map_table(uint64_t channel, uint64_t tbl_ra, 940 * uint64_t tbl_entries) 941 */ 942 ENTRY(hv_ldc_set_map_table) 943 mov LDC_SET_MAP_TABLE, %o5 944 ta FAST_TRAP 945 retl 946 nop 947 SET_SIZE(hv_ldc_set_map_table) 948 949 950 /* 951 * hv_ldc_get_map_table(uint64_t channel, uint64_t *tbl_ra, 952 * uint64_t *tbl_entries) 953 */ 954 ENTRY(hv_ldc_get_map_table) 955 mov %o1, %g1 956 mov %o2, %g2 957 mov LDC_GET_MAP_TABLE, %o5 958 ta FAST_TRAP 959 stx %o1, [%g1] 960 retl 961 stx %o2, [%g2] 962 SET_SIZE(hv_ldc_get_map_table) 963 964 965 /* 966 * hv_ldc_copy(uint64_t channel, uint64_t request, uint64_t cookie, 967 * uint64_t raddr, uint64_t length, uint64_t *lengthp); 968 */ 969 ENTRY(hv_ldc_copy) 970 mov %o5, %g1 971 mov LDC_COPY, %o5 972 ta FAST_TRAP 973 retl 974 stx %o1, [%g1] 975 SET_SIZE(hv_ldc_copy) 976 977 978 /* 979 * hv_ldc_mapin(uint64_t channel, uint64_t cookie, uint64_t *raddr, 980 * uint64_t *perm) 981 */ 982 ENTRY(hv_ldc_mapin) 983 mov %o2, %g1 984 mov %o3, %g2 985 mov LDC_MAPIN, %o5 986 ta FAST_TRAP 987 stx %o1, [%g1] 988 retl 989 stx %o2, [%g2] 990 SET_SIZE(hv_ldc_mapin) 991 992 993 /* 994 * hv_ldc_unmap(uint64_t raddr) 995 */ 996 ENTRY(hv_ldc_unmap) 997 mov LDC_UNMAP, %o5 998 ta FAST_TRAP 999 retl 1000 nop 1001 SET_SIZE(hv_ldc_unmap) 1002 1003 1004 /* 1005 * hv_ldc_revoke(uint64_t raddr) 1006 */ 1007 ENTRY(hv_ldc_revoke) 1008 mov LDC_REVOKE, %o5 1009 ta FAST_TRAP 1010 retl 1011 nop 1012 SET_SIZE(hv_ldc_revoke) 1013 1014 1015 /* 1016 * hvldc_intr_getcookie(uint64_t dev_hdl, uint32_t devino, 1017 * uint64_t *cookie); 1018 */ 1019 ENTRY(hvldc_intr_getcookie) 1020 mov %o2, %g1 1021 mov VINTR_GET_COOKIE, %o5 1022 ta FAST_TRAP 1023 retl 1024 stx %o1, [%g1] 1025 SET_SIZE(hvldc_intr_getcookie) 1026 1027 /* 1028 * hvldc_intr_setcookie(uint64_t dev_hdl, uint32_t devino, 1029 * uint64_t cookie); 1030 */ 1031 ENTRY(hvldc_intr_setcookie) 1032 mov VINTR_SET_COOKIE, %o5 1033 ta FAST_TRAP 1034 retl 1035 nop 1036 SET_SIZE(hvldc_intr_setcookie) 1037 1038 1039 /* 1040 * hvldc_intr_getvalid(uint64_t dev_hdl, uint32_t devino, 1041 * int *intr_valid_state); 1042 */ 1043 ENTRY(hvldc_intr_getvalid) 1044 mov %o2, %g1 1045 mov VINTR_GET_VALID, %o5 1046 ta FAST_TRAP 1047 retl 1048 stuw %o1, [%g1] 1049 SET_SIZE(hvldc_intr_getvalid) 1050 1051 /* 1052 * hvldc_intr_setvalid(uint64_t dev_hdl, uint32_t devino, 1053 * int intr_valid_state); 1054 */ 1055 ENTRY(hvldc_intr_setvalid) 1056 mov VINTR_SET_VALID, %o5 1057 ta FAST_TRAP 1058 retl 1059 nop 1060 SET_SIZE(hvldc_intr_setvalid) 1061 1062 /* 1063 * hvldc_intr_getstate(uint64_t dev_hdl, uint32_t devino, 1064 * int *intr_state); 1065 */ 1066 ENTRY(hvldc_intr_getstate) 1067 mov %o2, %g1 1068 mov VINTR_GET_STATE, %o5 1069 ta FAST_TRAP 1070 retl 1071 stuw %o1, [%g1] 1072 SET_SIZE(hvldc_intr_getstate) 1073 1074 /* 1075 * hvldc_intr_setstate(uint64_t dev_hdl, uint32_t devino, 1076 * int intr_state); 1077 */ 1078 ENTRY(hvldc_intr_setstate) 1079 mov VINTR_SET_STATE, %o5 1080 ta FAST_TRAP 1081 retl 1082 nop 1083 SET_SIZE(hvldc_intr_setstate) 1084 1085 /* 1086 * hvldc_intr_gettarget(uint64_t dev_hdl, uint32_t devino, 1087 * uint32_t *cpuid); 1088 */ 1089 ENTRY(hvldc_intr_gettarget) 1090 mov %o2, %g1 1091 mov VINTR_GET_TARGET, %o5 1092 ta FAST_TRAP 1093 retl 1094 stuw %o1, [%g1] 1095 SET_SIZE(hvldc_intr_gettarget) 1096 1097 /* 1098 * hvldc_intr_settarget(uint64_t dev_hdl, uint32_t devino, 1099 * uint32_t cpuid); 1100 */ 1101 ENTRY(hvldc_intr_settarget) 1102 mov VINTR_SET_TARGET, %o5 1103 ta FAST_TRAP 1104 retl 1105 nop 1106 SET_SIZE(hvldc_intr_settarget) 1107 1108 /* 1109 * hv_api_get_version(uint64_t api_group, uint64_t *majorp, 1110 * uint64_t *minorp) 1111 * 1112 * API_GET_VERSION 1113 * arg0 API group 1114 * ret0 status 1115 * ret1 major number 1116 * ret2 minor number 1117 */ 1118 ENTRY(hv_api_get_version) 1119 mov %o1, %o3 1120 mov %o2, %o4 1121 mov API_GET_VERSION, %o5 1122 ta CORE_TRAP 1123 stx %o1, [%o3] 1124 retl 1125 stx %o2, [%o4] 1126 SET_SIZE(hv_api_get_version) 1127 1128 /* 1129 * hv_api_set_version(uint64_t api_group, uint64_t major, 1130 * uint64_t minor, uint64_t *supported_minor) 1131 * 1132 * API_SET_VERSION 1133 * arg0 API group 1134 * arg1 major number 1135 * arg2 requested minor number 1136 * ret0 status 1137 * ret1 actual minor number 1138 */ 1139 ENTRY(hv_api_set_version) 1140 mov %o3, %o4 1141 mov API_SET_VERSION, %o5 1142 ta CORE_TRAP 1143 retl 1144 stx %o1, [%o4] 1145 SET_SIZE(hv_api_set_version) 1146 1147 /* 1148 * %o0 - buffer real address 1149 * %o1 - buffer size 1150 * %o2 - &characters written 1151 * returns 1152 * status 1153 */ 1154 ENTRY(hv_cnwrite) 1155 mov CONS_WRITE, %o5 1156 ta FAST_TRAP 1157 retl 1158 stx %o1, [%o2] 1159 SET_SIZE(hv_cnwrite) 1160 1161 /* 1162 * %o0 character buffer ra 1163 * %o1 buffer size 1164 * %o2 pointer to returned size 1165 * return values: 1166 * 0 success 1167 * hv_errno failure 1168 */ 1169 ENTRY(hv_cnread) 1170 mov CONS_READ, %o5 1171 ta FAST_TRAP 1172 brnz,a %o0, 1f ! failure, just return error 1173 nop 1174 1175 cmp %o1, H_BREAK 1176 be 1f 1177 mov %o1, %o0 1178 1179 cmp %o1, H_HUP 1180 be 1f 1181 mov %o1, %o0 1182 1183 stx %o1, [%o2] ! success, save count and return 0 1184 mov 0, %o0 11851: 1186 retl 1187 nop 1188 SET_SIZE(hv_cnread) 1189 1190#endif /* lint || __lint */ 1191