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