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