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 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26#pragma ident "%Z%%M% %I% %E% SMI" 27 28/* 29 * Hypervisor calls 30 */ 31 32#include <sys/asm_linkage.h> 33#include <sys/machasi.h> 34#include <sys/machparam.h> 35#include <sys/hypervisor_api.h> 36 37#if defined(lint) || defined(__lint) 38 39/*ARGSUSED*/ 40int64_t 41hv_cnputchar(uint8_t ch) 42{ return (0); } 43 44/*ARGSUSED*/ 45int64_t 46hv_cngetchar(uint8_t *ch) 47{ return (0); } 48 49/*ARGSUSED*/ 50uint64_t 51hv_tod_get(uint64_t *seconds) 52{ return (0); } 53 54/*ARGSUSED*/ 55uint64_t 56hv_tod_set(uint64_t seconds) 57{ return (0);} 58 59/*ARGSUSED*/ 60uint64_t 61hv_mmu_map_perm_addr(void *vaddr, int ctx, uint64_t tte, int flags) 62{ return (0); } 63 64/*ARGSUSED*/ 65uint64_t 66hv_mmu_unmap_perm_addr(void *vaddr, int ctx, int flags) 67{ return (0); } 68 69/*ARGSUSED*/ 70uint64_t 71hv_set_ctx0(uint64_t ntsb_descriptor, uint64_t desc_ra) 72{ return (0); } 73 74/*ARGSUSED*/ 75uint64_t 76hv_set_ctxnon0(uint64_t ntsb_descriptor, uint64_t desc_ra) 77{ return (0); } 78 79#ifdef SET_MMU_STATS 80/*ARGSUSED*/ 81uint64_t 82hv_mmu_set_stat_area(uint64_t rstatarea, uint64_t size) 83{ return (0); } 84#endif /* SET_MMU_STATS */ 85 86/*ARGSUSED*/ 87uint64_t 88hv_cpu_qconf(int queue, uint64_t paddr, int size) 89{ return (0); } 90 91/*ARGSUSED*/ 92uint64_t 93hvio_intr_devino_to_sysino(uint64_t dev_hdl, uint32_t devino, uint64_t *sysino) 94{ return (0); } 95 96/*ARGSUSED*/ 97uint64_t 98hvio_intr_getvalid(uint64_t sysino, int *intr_valid_state) 99{ return (0); } 100 101/*ARGSUSED*/ 102uint64_t 103hvio_intr_setvalid(uint64_t sysino, int intr_valid_state) 104{ return (0); } 105 106/*ARGSUSED*/ 107uint64_t 108hvio_intr_getstate(uint64_t sysino, int *intr_state) 109{ return (0); } 110 111/*ARGSUSED*/ 112uint64_t 113hvio_intr_setstate(uint64_t sysino, int intr_state) 114{ return (0); } 115 116/*ARGSUSED*/ 117uint64_t 118hvio_intr_gettarget(uint64_t sysino, uint32_t *cpuid) 119{ return (0); } 120 121/*ARGSUSED*/ 122uint64_t 123hvio_intr_settarget(uint64_t sysino, uint32_t cpuid) 124{ return (0); } 125 126uint64_t 127hv_cpu_yield(void) 128{ return (0); } 129 130/*ARGSUSED*/ 131uint64_t 132hv_service_recv(uint64_t s_id, uint64_t buf_pa, uint64_t size, 133 uint64_t *recv_bytes) 134{ return (0); } 135 136/*ARGSUSED*/ 137uint64_t 138hv_service_send(uint64_t s_id, uint64_t buf_pa, uint64_t size, 139 uint64_t *send_bytes) 140{ return (0); } 141 142/*ARGSUSED*/ 143uint64_t 144hv_service_getstatus(uint64_t s_id, uint64_t *vreg) 145{ return (0); } 146 147/*ARGSUSED*/ 148uint64_t 149hv_service_setstatus(uint64_t s_id, uint64_t bits) 150{ return (0); } 151 152/*ARGSUSED*/ 153uint64_t 154hv_service_clrstatus(uint64_t s_id, uint64_t bits) 155{ return (0); } 156 157/*ARGSUSED*/ 158uint64_t 159hv_cpu_state(uint64_t cpuid, uint64_t *cpu_state) 160{ return (0); } 161 162/*ARGSUSED*/ 163uint64_t 164hv_dump_buf_update(uint64_t paddr, uint64_t size, uint64_t *minsize) 165{ return (0); } 166 167/*ARGSUSED*/ 168uint64_t 169hv_mem_scrub(uint64_t real_addr, uint64_t length, uint64_t *scrubbed_len) 170{ return (0); } 171 172/*ARGSUSED*/ 173uint64_t 174hv_mem_sync(uint64_t real_addr, uint64_t length, uint64_t *flushed_len) 175{ return (0); } 176 177/*ARGSUSED*/ 178uint64_t 179hv_ttrace_buf_conf(uint64_t paddr, uint64_t size, uint64_t *size1) 180{ return (0); } 181 182/*ARGSUSED*/ 183uint64_t 184hv_ttrace_buf_info(uint64_t *paddr, uint64_t *size) 185{ return (0); } 186 187/*ARGSUSED*/ 188uint64_t 189hv_ttrace_enable(uint64_t enable, uint64_t *prev_enable) 190{ return (0); } 191 192/*ARGSUSED*/ 193uint64_t 194hv_ttrace_freeze(uint64_t freeze, uint64_t *prev_freeze) 195{ return (0); } 196 197/*ARGSUSED*/ 198uint64_t 199hv_mach_desc(uint64_t buffer_ra, uint64_t *buffer_sizep) 200{ return (0); } 201 202/*ARGSUSED*/ 203uint64_t 204hv_ncs_request(int cmd, uint64_t realaddr, size_t sz) 205{ return (0); } 206 207/*ARGSUSED*/ 208uint64_t 209hv_ra2pa(uint64_t ra) 210{ return (0); } 211 212/*ARGSUSED*/ 213uint64_t 214hv_hpriv(void *func, uint64_t arg1, uint64_t arg2, uint64_t arg3) 215{ return (0); } 216 217#else /* lint || __lint */ 218 219 /* 220 * %o0 - character 221 */ 222 ENTRY(hv_cnputchar) 223 mov CONS_WRITE, %o5 224 ta FAST_TRAP 225 tst %o0 226 retl 227 movnz %xcc, -1, %o0 228 SET_SIZE(hv_cnputchar) 229 230 /* 231 * %o0 pointer to character buffer 232 * return values: 233 * 0 success 234 * hv_errno failure 235 */ 236 ENTRY(hv_cngetchar) 237 mov %o0, %o2 238 mov CONS_READ, %o5 239 ta FAST_TRAP 240 brnz,a %o0, 1f ! failure, just return error 241 mov 1, %o0 242 243 cmp %o1, H_BREAK 244 be 1f 245 mov %o1, %o0 246 247 cmp %o1, H_HUP 248 be 1f 249 mov %o1, %o0 250 251 stb %o1, [%o2] ! success, save character and return 0 252 mov 0, %o0 2531: 254 retl 255 nop 256 SET_SIZE(hv_cngetchar) 257 258 ENTRY(hv_tod_get) 259 mov %o0, %o4 260 mov TOD_GET, %o5 261 ta FAST_TRAP 262 retl 263 stx %o1, [%o4] 264 SET_SIZE(hv_tod_get) 265 266 ENTRY(hv_tod_set) 267 mov TOD_SET, %o5 268 ta FAST_TRAP 269 retl 270 nop 271 SET_SIZE(hv_tod_set) 272 273 /* 274 * Map permanent address 275 * arg0 vaddr (%o0) 276 * arg1 context (%o1) 277 * arg2 tte (%o2) 278 * arg3 flags (%o3) 0x1=d 0x2=i 279 */ 280 ENTRY(hv_mmu_map_perm_addr) 281 mov MAP_PERM_ADDR, %o5 282 ta FAST_TRAP 283 retl 284 nop 285 SET_SIZE(hv_mmu_map_perm_addr) 286 287 /* 288 * Unmap permanent address 289 * arg0 vaddr (%o0) 290 * arg1 context (%o1) 291 * arg2 flags (%o2) 0x1=d 0x2=i 292 */ 293 ENTRY(hv_mmu_unmap_perm_addr) 294 mov UNMAP_PERM_ADDR, %o5 295 ta FAST_TRAP 296 retl 297 nop 298 SET_SIZE(hv_mmu_unmap_perm_addr) 299 300 /* 301 * Set TSB for context 0 302 * arg0 ntsb_descriptor (%o0) 303 * arg1 desc_ra (%o1) 304 */ 305 ENTRY(hv_set_ctx0) 306 mov MMU_TSB_CTX0, %o5 307 ta FAST_TRAP 308 retl 309 nop 310 SET_SIZE(hv_set_ctx0) 311 312 /* 313 * Set TSB for context non0 314 * arg0 ntsb_descriptor (%o0) 315 * arg1 desc_ra (%o1) 316 */ 317 ENTRY(hv_set_ctxnon0) 318 mov MMU_TSB_CTXNON0, %o5 319 ta FAST_TRAP 320 retl 321 nop 322 SET_SIZE(hv_set_ctxnon0) 323 324#ifdef SET_MMU_STATS 325 /* 326 * Returns old stat area on success 327 */ 328 ENTRY(hv_mmu_set_stat_area) 329 mov MMU_STAT_AREA, %o5 330 ta FAST_TRAP 331 retl 332 nop 333 SET_SIZE(hv_mmu_set_stat_area) 334#endif /* SET_MMU_STATS */ 335 336 /* 337 * CPU Q Configure 338 * arg0 queue (%o0) 339 * arg1 Base address RA (%o1) 340 * arg2 Size (%o2) 341 */ 342 ENTRY(hv_cpu_qconf) 343 mov CPU_QCONF, %o5 344 ta FAST_TRAP 345 retl 346 nop 347 SET_SIZE(hv_cpu_qconf) 348 349 /* 350 * arg0 - devhandle 351 * arg1 - devino 352 * 353 * ret0 - status 354 * ret1 - sysino 355 */ 356 ENTRY(hvio_intr_devino_to_sysino) 357 mov HVIO_INTR_DEVINO2SYSINO, %o5 358 ta FAST_TRAP 359 brz,a %o0, 1f 360 stx %o1, [%o2] 3611: retl 362 nop 363 SET_SIZE(hvio_intr_devino_to_sysino) 364 365 /* 366 * arg0 - sysino 367 * 368 * ret0 - status 369 * ret1 - intr_valid_state 370 */ 371 ENTRY(hvio_intr_getvalid) 372 mov %o1, %o2 373 mov HVIO_INTR_GETVALID, %o5 374 ta FAST_TRAP 375 brz,a %o0, 1f 376 stuw %o1, [%o2] 3771: retl 378 nop 379 SET_SIZE(hvio_intr_getvalid) 380 381 /* 382 * arg0 - sysino 383 * arg1 - intr_valid_state 384 * 385 * ret0 - status 386 */ 387 ENTRY(hvio_intr_setvalid) 388 mov HVIO_INTR_SETVALID, %o5 389 ta FAST_TRAP 390 retl 391 nop 392 SET_SIZE(hvio_intr_setvalid) 393 394 /* 395 * arg0 - sysino 396 * 397 * ret0 - status 398 * ret1 - intr_state 399 */ 400 ENTRY(hvio_intr_getstate) 401 mov %o1, %o2 402 mov HVIO_INTR_GETSTATE, %o5 403 ta FAST_TRAP 404 brz,a %o0, 1f 405 stuw %o1, [%o2] 4061: retl 407 nop 408 SET_SIZE(hvio_intr_getstate) 409 410 /* 411 * arg0 - sysino 412 * arg1 - intr_state 413 * 414 * ret0 - status 415 */ 416 ENTRY(hvio_intr_setstate) 417 mov HVIO_INTR_SETSTATE, %o5 418 ta FAST_TRAP 419 retl 420 nop 421 SET_SIZE(hvio_intr_setstate) 422 423 /* 424 * arg0 - sysino 425 * 426 * ret0 - status 427 * ret1 - cpu_id 428 */ 429 ENTRY(hvio_intr_gettarget) 430 mov %o1, %o2 431 mov HVIO_INTR_GETTARGET, %o5 432 ta FAST_TRAP 433 brz,a %o0, 1f 434 stuw %o1, [%o2] 4351: retl 436 nop 437 SET_SIZE(hvio_intr_gettarget) 438 439 /* 440 * arg0 - sysino 441 * arg1 - cpu_id 442 * 443 * ret0 - status 444 */ 445 ENTRY(hvio_intr_settarget) 446 mov HVIO_INTR_SETTARGET, %o5 447 ta FAST_TRAP 448 retl 449 nop 450 SET_SIZE(hvio_intr_settarget) 451 452 /* 453 * hv_cpu_yield(void) 454 */ 455 ENTRY(hv_cpu_yield) 456 mov HV_CPU_YIELD, %o5 457 ta FAST_TRAP 458 retl 459 nop 460 SET_SIZE(hv_cpu_yield) 461 462 /* 463 * hv_service_recv(uint64_t s_id, uint64_t buf_pa, 464 * uint64_t size, uint64_t *recv_bytes); 465 */ 466 ENTRY(hv_service_recv) 467 save %sp, -SA(MINFRAME), %sp 468 mov %i0, %o0 469 mov %i1, %o1 470 mov %i2, %o2 471 mov %i3, %o3 472 mov SVC_RECV, %o5 473 ta FAST_TRAP 474 brnz %o0, 1f 475 mov %o0, %i0 476 stx %o1, [%i3] 4771: 478 ret 479 restore 480 SET_SIZE(hv_service_recv) 481 482 /* 483 * hv_service_send(uint64_t s_id, uint64_t buf_pa, 484 * uint64_t size, uint64_t *recv_bytes); 485 */ 486 ENTRY(hv_service_send) 487 save %sp, -SA(MINFRAME), %sp 488 mov %i0, %o0 489 mov %i1, %o1 490 mov %i2, %o2 491 mov %i3, %o3 492 mov SVC_SEND, %o5 493 ta FAST_TRAP 494 brnz %o0, 1f 495 mov %o0, %i0 496 stx %o1, [%i3] 4971: 498 ret 499 restore 500 SET_SIZE(hv_service_send) 501 502 /* 503 * hv_service_getstatus(uint64_t s_id, uint64_t *vreg); 504 */ 505 ENTRY(hv_service_getstatus) 506 mov %o1, %o4 ! save datap 507 mov SVC_GETSTATUS, %o5 508 ta FAST_TRAP 509 brz,a %o0, 1f 510 stx %o1, [%o4] 5111: 512 retl 513 nop 514 SET_SIZE(hv_service_getstatus) 515 516 /* 517 * hv_service_setstatus(uint64_t s_id, uint64_t bits); 518 */ 519 ENTRY(hv_service_setstatus) 520 mov SVC_SETSTATUS, %o5 521 ta FAST_TRAP 522 retl 523 nop 524 SET_SIZE(hv_service_setstatus) 525 526 /* 527 * hv_service_clrstatus(uint64_t s_id, uint64_t bits); 528 */ 529 ENTRY(hv_service_clrstatus) 530 mov SVC_CLRSTATUS, %o5 531 ta FAST_TRAP 532 retl 533 nop 534 SET_SIZE(hv_service_clrstatus) 535 536 /* 537 * int hv_cpu_state(uint64_t cpuid, uint64_t *cpu_state); 538 */ 539 ENTRY(hv_cpu_state) 540 mov %o1, %o4 ! save datap 541 mov HV_CPU_STATE, %o5 542 ta FAST_TRAP 543 brz,a %o0, 1f 544 stx %o1, [%o4] 5451: 546 retl 547 nop 548 SET_SIZE(hv_cpu_state) 549 550 /* 551 * HV state dump zone Configure 552 * arg0 real adrs of dump buffer (%o0) 553 * arg1 size of dump buffer (%o1) 554 * ret0 status (%o0) 555 * ret1 size of buffer on success and min size on EINVAL (%o1) 556 * hv_dump_buf_update(uint64_t paddr, uint64_t size, uint64_t *ret_size) 557 */ 558 ENTRY(hv_dump_buf_update) 559 mov DUMP_BUF_UPDATE, %o5 560 ta FAST_TRAP 561 retl 562 stx %o1, [%o2] 563 SET_SIZE(hv_dump_buf_update) 564 565 566 /* 567 * For memory scrub 568 * int hv_mem_scrub(uint64_t real_addr, uint64_t length, 569 * uint64_t *scrubbed_len); 570 * Retun %o0 -- status 571 * %o1 -- bytes scrubbed 572 */ 573 ENTRY(hv_mem_scrub) 574 mov %o2, %o4 575 mov HV_MEM_SCRUB, %o5 576 ta FAST_TRAP 577 retl 578 stx %o1, [%o4] 579 SET_SIZE(hv_mem_scrub) 580 581 /* 582 * Flush ecache 583 * int hv_mem_sync(uint64_t real_addr, uint64_t length, 584 * uint64_t *flushed_len); 585 * Retun %o0 -- status 586 * %o1 -- bytes flushed 587 */ 588 ENTRY(hv_mem_sync) 589 mov %o2, %o4 590 mov HV_MEM_SYNC, %o5 591 ta FAST_TRAP 592 retl 593 stx %o1, [%o4] 594 SET_SIZE(hv_mem_sync) 595 596 /* 597 * TTRACE_BUF_CONF Configure 598 * arg0 RA base of buffer (%o0) 599 * arg1 buf size in no. of entries (%o1) 600 * ret0 status (%o0) 601 * ret1 minimum size in no. of entries on failure, 602 * actual size in no. of entries on success (%o1) 603 */ 604 ENTRY(hv_ttrace_buf_conf) 605 mov TTRACE_BUF_CONF, %o5 606 ta FAST_TRAP 607 retl 608 stx %o1, [%o2] 609 SET_SIZE(hv_ttrace_buf_conf) 610 611 /* 612 * TTRACE_BUF_INFO 613 * ret0 status (%o0) 614 * ret1 RA base of buffer (%o1) 615 * ret2 size in no. of entries (%o2) 616 */ 617 ENTRY(hv_ttrace_buf_info) 618 mov %o0, %o3 619 mov %o1, %o4 620 mov TTRACE_BUF_INFO, %o5 621 ta FAST_TRAP 622 stx %o1, [%o3] 623 retl 624 stx %o2, [%o4] 625 SET_SIZE(hv_ttrace_buf_info) 626 627 /* 628 * TTRACE_ENABLE 629 * arg0 enable/ disable (%o0) 630 * ret0 status (%o0) 631 * ret1 previous enable state (%o1) 632 */ 633 ENTRY(hv_ttrace_enable) 634 mov %o1, %o2 635 mov TTRACE_ENABLE, %o5 636 ta FAST_TRAP 637 retl 638 stx %o1, [%o2] 639 SET_SIZE(hv_ttrace_enable) 640 641 /* 642 * TTRACE_FREEZE 643 * arg0 enable/ freeze (%o0) 644 * ret0 status (%o0) 645 * ret1 previous freeze state (%o1) 646 */ 647 ENTRY(hv_ttrace_freeze) 648 mov %o1, %o2 649 mov TTRACE_FREEZE, %o5 650 ta FAST_TRAP 651 retl 652 stx %o1, [%o2] 653 SET_SIZE(hv_ttrace_freeze) 654 655 /* 656 * MACH_DESC 657 * arg0 buffer real address 658 * arg1 pointer to uint64_t for size of buffer 659 * ret0 status 660 * ret1 return required size of buffer / returned data size 661 */ 662 ENTRY(hv_mach_desc) 663 mov %o1, %o4 ! save datap 664 ldx [%o1], %o1 665 mov HV_MACH_DESC, %o5 666 ta FAST_TRAP 667 retl 668 stx %o1, [%o4] 669 SET_SIZE(hv_mach_desc) 670 671 /* 672 * hv_ncs_request(int cmd, uint64_t realaddr, size_t sz) 673 */ 674 ENTRY(hv_ncs_request) 675 mov HV_NCS_REQUEST, %o5 676 ta FAST_TRAP 677 retl 678 nop 679 SET_SIZE(hv_ncs_request) 680 681 /* 682 * hv_ra2pa(uint64_t ra) 683 * 684 * MACH_DESC 685 * arg0 Real address to convert 686 * ret0 Returned physical address or -1 on error 687 */ 688 ENTRY(hv_ra2pa) 689 mov HV_RA2PA, %o5 690 ta FAST_TRAP 691 cmp %o0, 0 692 move %xcc, %o1, %o0 693 movne %xcc, -1, %o0 694 retl 695 nop 696 SET_SIZE(hv_ra2pa) 697 698 /* 699 * hv_hpriv(void *func, uint64_t arg1, uint64_t arg2, uint64_t arg3) 700 * 701 * MACH_DESC 702 * arg0 OS function to call 703 * arg1 First arg to OS function 704 * arg2 Second arg to OS function 705 * arg3 Third arg to OS function 706 * ret0 Returned value from function 707 */ 708 709 ENTRY(hv_hpriv) 710 mov HV_HPRIV, %o5 711 ta FAST_TRAP 712 retl 713 nop 714 SET_SIZE(hv_hpriv) 715 716#endif /* lint || __lint */ 717