1/* $NetBSD: hvcall.S,v 1.5 2021/04/27 19:09:56 palle Exp $ */ 2/* $OpenBSD: hvcall.S,v 1.10 2011/06/25 20:45:00 kettenis Exp $ */ 3 4/* 5 * Copyright (c) 2008 Mark Kettenis 6 * 7 * Permission to use, copy, modify, and distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20#include <machine/asm.h> 21#include <machine/trap.h> 22 23 24#define MACH_EXIT 0x00 25#define MACH_DESC 0x01 26#define MACH_SIR 0x02 27#define MACH_SET_WATCHDOG 0x05 28 29#define CPU_START 0x10 30#define CPU_STOP 0x11 31#define CPU_YIELD 0x12 32#define CPU_QCONF 0x14 33#define CPU_QINFO 0x15 34#define CPU_MYID 0x16 35#define CPU_STATE 0x17 36#define CPU_SET_RTBA 0x18 37#define CPU_GET_RTBA 0x19 38 39#define MMU_TSB_CTX0 0x20 40#define MMU_TSB_CTXNON0 0x21 41#define MMU_DEMAP_PAGE 0x22 42#define MMU_DEMAP_CTX 0x23 43#define MMU_DEMAP_ALL 0x24 44#define MMU_MAP_PERM_ADDR 0x25 45#define MMU_FAULT_AREA_CONF 0x26 46#define MMU_ENABLE 0x27 47#define MMU_UNMAP_PERM_ADDR 0x28 48#define MMU_TSB_CTX0_INFO 0x29 49#define MMU_TSB_CTXNON0_INFO 0x2a 50#define MMU_FAULT_AREA_INFO 0x2b 51 52#define MEM_SCRUB 0x30 53#define MEM_SYNC 0x31 54 55#define CPU_MONDO_SEND 0x42 56 57#define TOD_GET 0x50 58#define TOD_SET 0x51 59 60#define CONS_GETCHAR 0x60 61#define CONS_PUTCHAR 0x61 62 63#define SOFT_STATE_SET 0x70 64#define SOFT_STATE_GET 0x71 65 66#define INTR_DEVINO2SYSINO 0xa0 67#define INTR_GETENABLED 0xa1 68#define INTR_SETENABLED 0xa2 69#define INTR_GETSTATE 0xa3 70#define INTR_SETSTATE 0xa4 71#define INTR_GETTARGET 0xa5 72#define INTR_SETTARGET 0xa6 73 74#define VINTR_GETCOOKIE 0xa7 75#define VINTR_SETCOOKIE 0xa8 76#define VINTR_GETENABLED 0xa9 77#define VINTR_SETENABLED 0xaa 78#define VINTR_GETSTATE 0xab 79#define VINTR_SETSTATE 0xac 80#define VINTR_GETTARGET 0xad 81#define VINTR_SETTARGET 0xae 82 83#define PCI_IOMMU_MAP 0xb0 84#define PCI_IOMMU_DEMAP 0xb1 85#define PCI_IOMMU_GETMAP 0xb2 86#define PCI_IOMMU_GETBYPASS 0xb3 87#define PCI_CONFIG_GET 0xb4 88#define PCI_CONFIG_PUT 0xb5 89 90#define PCI_MSIQ_CONF 0xc0 91#define PCI_MSIQ_INFO 0xc1 92#define PCI_MSIQ_GETVALID 0xc2 93#define PCI_MSIQ_SETVALID 0xc3 94#define PCI_MSIQ_GETSTATE 0xc4 95#define PCI_MSIQ_SETSTATE 0xc5 96#define PCI_MSIQ_GETHEAD 0xc6 97#define PCI_MSIQ_SETHEAD 0xc7 98#define PCI_MSIQ_GETTAIL 0xc8 99#define PCI_MSI_GETVALID 0xc9 100#define PCI_MSI_SETVALID 0xca 101#define PCI_MSI_GETMSIQ 0xcb 102#define PCI_MSI_SETMSIQ 0xcc 103#define PCI_MSI_GETSTATE 0xcd 104#define PCI_MSI_SETSTATE 0xce 105#define PCI_MSG_GETMSIQ 0xd0 106#define PCI_MSG_SETMSIQ 0xd1 107#define PCI_MSG_GETSTATE 0xd2 108#define PCI_MSG_SETSTATE 0xd3 109 110#define LDC_TX_QCONF 0xe0 111#define LDC_TX_QINFO 0xe1 112#define LDC_TX_GET_STATE 0xe2 113#define LDC_TX_SET_QTAIL 0xe3 114#define LDC_RX_QCONF 0xe4 115#define LDC_RX_QINFO 0xe5 116#define LDC_RX_GET_STATE 0xe6 117#define LDC_RX_SET_QHEAD 0xe7 118 119#define LDC_SET_MAP_TABLE 0xea 120#define LDC_GET_MAP_TABLE 0xeb 121#define LDC_COPY 0xec 122 123#define LDC_MAPIN 0xed 124#define LDC_UNMAP 0xee 125#define LDC_REVOKE 0xef 126 127#define RNG_GET_DIAG_CONTROL 0x130 128#define RNG_CTL_READ 0x131 129#define RNG_CTL_WRITE 0x132 130#define RNG_DATA_READ_DIAG 0x133 131#define RNG_DATA_READ 0x134 132 133#define API_SET_VERSION 0x00 134#define API_PUTCHAR 0x01 135#define API_EXIT 0x02 136#define API_GET_VERSION 0x03 137 138 139ENTRY(hv_api_putchar) 140 mov API_PUTCHAR, %o5 141 ta ST_CORE_TRAP 142 retl 143 nop 144 145ENTRY(hv_api_get_version) 146 mov %o2, %o4 147 mov %o1, %o3 148 mov API_GET_VERSION, %o5 149 ta ST_CORE_TRAP 150 stx %o1, [%o3] 151 retl 152 stx %o2, [%o4] 153 154ENTRY(hv_api_set_version) 155 mov %o3, %o4 156 mov API_SET_VERSION, %o5 157 ta ST_CORE_TRAP 158 retl 159 stx %o1, [%o4] 160 161ENTRY(hv_mach_desc) 162 mov %o1, %o2 163 ldx [%o2], %o1 164 mov MACH_DESC, %o5 165 ta ST_FAST_TRAP 166 retl 167 stx %o1, [%o2] 168 169ENTRY(hv_cpu_yield) 170 mov CPU_YIELD, %o5 171 ta ST_FAST_TRAP 172 retl 173 nop 174 175ENTRY(hv_cpu_qconf) 176 mov CPU_QCONF, %o5 177 ta ST_FAST_TRAP 178 retl 179 nop 180 181ENTRY(hv_cpu_mondo_send) 182 mov CPU_MONDO_SEND, %o5 183 ta ST_FAST_TRAP 184 retl 185 nop 186 187ENTRY(hv_cpu_myid) 188 mov %o0, %o2 189 mov CPU_MYID, %o5 190 ta ST_FAST_TRAP 191 retl 192 stx %o1, [%o2] 193 194ENTRY(hv_mmu_tsb_ctx0) 195 mov MMU_TSB_CTX0, %o5 196 ta ST_FAST_TRAP 197 retl 198 nop 199 200ENTRY(hv_mmu_tsb_ctxnon0) 201 mov MMU_TSB_CTXNON0, %o5 202 ta ST_FAST_TRAP 203 retl 204 nop 205 206ENTRY(hv_mmu_demap_page) 207 mov %o2, %o4 208 mov %o1, %o3 209 mov %o0, %o2 210 clr %o1 211 clr %o0 212 mov MMU_DEMAP_PAGE, %o5 213 ta ST_FAST_TRAP 214 retl 215 nop 216 217ENTRY(hv_mmu_demap_ctx) 218 mov %o1, %o3 219 mov %o0, %o2 220 clr %o1 221 clr %o0 222 mov MMU_DEMAP_CTX, %o5 223 ta ST_FAST_TRAP 224 retl 225 nop 226 227ENTRY(hv_mmu_demap_all) 228 mov %o1, %o3 229 mov %o0, %o2 230 clr %o1 231 clr %o0 232 mov MMU_DEMAP_CTX, %o5 233 ta ST_FAST_TRAP 234 retl 235 nop 236 237ENTRY(hv_mmu_map_perm_addr) 238 mov %o2, %o3 239 mov %o1, %o2 240 clr %o1 241 mov MMU_MAP_PERM_ADDR, %o5 242 ta ST_FAST_TRAP 243 retl 244 nop 245 246ENTRY(hv_mmu_unmap_perm_addr) 247 mov %o1, %o2 248 clr %o1 249 mov MMU_UNMAP_PERM_ADDR, %o5 250 ta ST_FAST_TRAP 251 retl 252 nop 253 254ENTRY(hv_mmu_map_addr) 255 ta ST_MMU_MAP_ADDR 256 retl 257 nop 258 259ENTRY(hv_mmu_unmap_addr) 260 ta ST_MMU_UNMAP_ADDR 261 retl 262 nop 263 264ENTRY(hv_mem_scrub) 265 mov MEM_SCRUB, %o5 266 ta ST_FAST_TRAP 267 retl 268 nop 269 270ENTRY(hv_mem_sync) 271 mov MEM_SYNC, %o5 272 ta ST_FAST_TRAP 273 retl 274 nop 275 276ENTRY(hv_tod_get) 277 mov %o0, %o2 278 mov TOD_GET, %o5 279 ta ST_FAST_TRAP 280 retl 281 stx %o1, [%o2] 282 283ENTRY(hv_tod_set) 284 mov TOD_SET, %o5 285 ta ST_FAST_TRAP 286 retl 287 nop 288 289ENTRY(hv_cons_getchar) 290 mov %o0, %o2 291 mov CONS_GETCHAR, %o5 292 ta ST_FAST_TRAP 293 retl 294 stx %o1, [%o2] 295 296ENTRY(hv_cons_putchar) 297 mov CONS_PUTCHAR, %o5 298 ta ST_FAST_TRAP 299 retl 300 nop 301 302ENTRY(hv_soft_state_set) 303 mov SOFT_STATE_SET, %o5 304 ta ST_FAST_TRAP 305 retl 306 nop 307 308ENTRY(hv_intr_devino_to_sysino) 309 mov INTR_DEVINO2SYSINO, %o5 310 ta ST_FAST_TRAP 311 retl 312 stx %o1, [%o2] 313 314ENTRY(hv_intr_getenabled) 315 mov %o1, %o2 316 mov INTR_GETENABLED, %o5 317 ta ST_FAST_TRAP 318 retl 319 stx %o1, [%o2] 320 321ENTRY(hv_intr_setenabled) 322 mov INTR_SETENABLED, %o5 323 ta ST_FAST_TRAP 324 retl 325 nop 326 327ENTRY(hv_intr_getstate) 328 mov %o1, %o2 329 mov INTR_GETSTATE, %o5 330 ta ST_FAST_TRAP 331 retl 332 stx %o1, [%o2] 333 334ENTRY(hv_intr_setstate) 335 mov INTR_SETSTATE, %o5 336 ta ST_FAST_TRAP 337 retl 338 nop 339 340ENTRY(hv_intr_gettarget) 341 mov %o1, %o2 342 mov INTR_GETTARGET, %o5 343 ta ST_FAST_TRAP 344 retl 345 stx %o1, [%o2] 346 347ENTRY(hv_intr_settarget) 348 mov INTR_SETTARGET, %o5 349 ta ST_FAST_TRAP 350 retl 351 nop 352 353ENTRY(hv_vintr_getcookie) 354 mov VINTR_GETCOOKIE, %o5 355 ta ST_FAST_TRAP 356 retl 357 stx %o1, [%o2] 358 359ENTRY(hv_vintr_setcookie) 360 mov VINTR_SETCOOKIE, %o5 361 ta ST_FAST_TRAP 362 retl 363 nop 364 365ENTRY(hv_vintr_getenabled) 366 mov VINTR_GETENABLED, %o5 367 ta ST_FAST_TRAP 368 retl 369 stx %o1, [%o2] 370 371ENTRY(hv_vintr_setenabled) 372 mov VINTR_SETENABLED, %o5 373 ta ST_FAST_TRAP 374 retl 375 nop 376 377ENTRY(hv_vintr_getstate) 378 mov VINTR_GETSTATE, %o5 379 ta ST_FAST_TRAP 380 retl 381 stx %o1, [%o2] 382 383ENTRY(hv_vintr_setstate) 384 mov VINTR_SETSTATE, %o5 385 ta ST_FAST_TRAP 386 retl 387 nop 388 389ENTRY(hv_vintr_gettarget) 390 mov VINTR_GETTARGET, %o5 391 ta ST_FAST_TRAP 392 retl 393 stx %o1, [%o2] 394 395ENTRY(hv_vintr_settarget) 396 mov VINTR_SETTARGET, %o5 397 ta ST_FAST_TRAP 398 retl 399 nop 400 401ENTRY(hv_pci_iommu_map) 402 mov %o5, %g5 403 mov PCI_IOMMU_MAP, %o5 404 ta ST_FAST_TRAP 405 retl 406 stx %o1, [%g5] 407 408ENTRY(hv_pci_iommu_demap) 409 mov PCI_IOMMU_DEMAP, %o5 410 ta ST_FAST_TRAP 411 retl 412 stx %o1, [%o3] 413 414ENTRY(hv_pci_iommu_getmap) 415 mov %o2, %o4 416 mov PCI_IOMMU_GETMAP, %o5 417 ta ST_FAST_TRAP 418 stx %o1, [%o4] 419 retl 420 stx %o2, [%o3] 421 422ENTRY(hv_pci_iommu_getbypass) 423 mov PCI_IOMMU_GETBYPASS, %o5 424 ta ST_FAST_TRAP 425 retl 426 stx %o1, [%o3] 427 428ENTRY(hv_pci_config_get) 429 mov %o5, %g5 430 mov PCI_CONFIG_GET, %o5 431 ta ST_FAST_TRAP 432 stx %o1, [%o4] 433 retl 434 stx %o2, [%g5] 435 436ENTRY(hv_pci_config_put) 437 mov %o5, %g5 438 mov PCI_CONFIG_PUT, %o5 439 ta ST_FAST_TRAP 440 retl 441 stx %o1, [%g5] 442 443ENTRY(hv_pci_msiq_conf) 444 mov PCI_MSIQ_CONF, %o5 445 ta ST_FAST_TRAP 446 retl 447 nop 448 449ENTRY(hv_pci_msiq_info) 450 mov %o2, %o4 451 mov PCI_MSIQ_INFO, %o5 452 ta ST_FAST_TRAP 453 stx %o1, [%o4] 454 retl 455 stx %o2, [%o3] 456 457ENTRY(hv_pci_msiq_getvalid) 458 mov PCI_MSIQ_GETVALID, %o5 459 ta ST_FAST_TRAP 460 retl 461 stx %o1, [%o2] 462 463ENTRY(hv_pci_msiq_setvalid) 464 mov PCI_MSIQ_SETVALID, %o5 465 ta ST_FAST_TRAP 466 retl 467 nop 468 469ENTRY(hv_pci_msiq_getstate) 470 mov PCI_MSIQ_GETSTATE, %o5 471 ta ST_FAST_TRAP 472 retl 473 stx %o1, [%o2] 474 475ENTRY(hv_pci_msiq_setstate) 476 mov PCI_MSIQ_SETSTATE, %o5 477 ta ST_FAST_TRAP 478 retl 479 nop 480 481ENTRY(hv_pci_msiq_gethead) 482 mov PCI_MSIQ_GETHEAD, %o5 483 ta ST_FAST_TRAP 484 retl 485 stx %o1, [%o2] 486 487ENTRY(hv_pci_msiq_sethead) 488 mov PCI_MSIQ_SETHEAD, %o5 489 ta ST_FAST_TRAP 490 retl 491 nop 492 493ENTRY(hv_pci_msiq_gettail) 494 mov PCI_MSIQ_GETTAIL, %o5 495 ta ST_FAST_TRAP 496 retl 497 stx %o1, [%o2] 498 499ENTRY(hv_pci_msi_getvalid) 500 mov PCI_MSI_GETVALID, %o5 501 ta ST_FAST_TRAP 502 retl 503 stx %o1, [%o2] 504 505ENTRY(hv_pci_msi_setvalid) 506 mov PCI_MSI_SETVALID, %o5 507 ta ST_FAST_TRAP 508 retl 509 nop 510 511ENTRY(hv_pci_msi_getmsiq) 512 mov PCI_MSI_GETMSIQ, %o5 513 ta ST_FAST_TRAP 514 retl 515 stx %o1, [%o2] 516 517ENTRY(hv_pci_msi_setmsiq) 518 mov PCI_MSI_SETMSIQ, %o5 519 ta ST_FAST_TRAP 520 retl 521 nop 522 523ENTRY(hv_pci_msi_getstate) 524 mov PCI_MSI_GETSTATE, %o5 525 ta ST_FAST_TRAP 526 retl 527 stx %o1, [%o2] 528 529ENTRY(hv_pci_msi_setstate) 530 mov PCI_MSI_SETSTATE, %o5 531 ta ST_FAST_TRAP 532 retl 533 nop 534 535ENTRY(hv_pci_msg_getmsiq) 536 mov PCI_MSG_GETMSIQ, %o5 537 ta ST_FAST_TRAP 538 retl 539 stx %o1, [%o2] 540 541ENTRY(hv_pci_msg_setmsiq) 542 mov PCI_MSG_SETMSIQ, %o5 543 ta ST_FAST_TRAP 544 retl 545 nop 546 547ENTRY(hv_pci_msg_getstate) 548 mov PCI_MSG_GETSTATE, %o5 549 ta ST_FAST_TRAP 550 retl 551 stx %o1, [%o2] 552 553ENTRY(hv_pci_msg_setstate) 554 mov PCI_MSG_SETSTATE, %o5 555 ta ST_FAST_TRAP 556 retl 557 nop 558 559ENTRY(hv_ldc_tx_qconf) 560 mov LDC_TX_QCONF, %o5 561 ta ST_FAST_TRAP 562 retl 563 nop 564 565ENTRY(hv_ldc_tx_qinfo) 566 mov %o2, %o4 567 mov %o1, %o3 568 mov LDC_TX_QINFO, %o5 569 ta ST_FAST_TRAP 570 stx %o1, [%o3] 571 retl 572 stx %o2, [%o4] 573 574ENTRY(hv_ldc_tx_get_state) 575 mov %o3, %g5 576 mov %o2, %g4 577 mov %o1, %o4 578 mov LDC_TX_GET_STATE, %o5 579 ta ST_FAST_TRAP 580 stx %o1, [%o4] 581 stx %o2, [%g4] 582 retl 583 stx %o3, [%g5] 584 585ENTRY(hv_ldc_tx_set_qtail) 586 mov LDC_TX_SET_QTAIL, %o5 587 ta ST_FAST_TRAP 588 retl 589 nop 590 591ENTRY(hv_ldc_rx_qconf) 592 mov LDC_RX_QCONF, %o5 593 ta ST_FAST_TRAP 594 retl 595 nop 596 597ENTRY(hv_ldc_rx_qinfo) 598 mov %o2, %o4 599 mov %o1, %o3 600 mov LDC_RX_QINFO, %o5 601 ta ST_FAST_TRAP 602 stx %o1, [%o3] 603 retl 604 stx %o2, [%o4] 605 606ENTRY(hv_ldc_rx_get_state) 607 mov %o3, %g5 608 mov %o2, %g4 609 mov %o1, %o4 610 mov LDC_RX_GET_STATE, %o5 611 ta ST_FAST_TRAP 612 stx %o1, [%o4] 613 stx %o2, [%g4] 614 retl 615 stx %o3, [%g5] 616 617ENTRY(hv_ldc_rx_set_qhead) 618 mov LDC_RX_SET_QHEAD, %o5 619 ta ST_FAST_TRAP 620 retl 621 nop 622 623ENTRY(hv_ldc_set_map_table) 624 mov LDC_SET_MAP_TABLE, %o5 625 ta ST_FAST_TRAP 626 retl 627 nop 628 629ENTRY(hv_ldc_get_map_table) 630 mov %o2, %o4 631 mov %o1, %o3 632 mov LDC_GET_MAP_TABLE, %o5 633 ta ST_FAST_TRAP 634 stx %o1, [%o3] 635 retl 636 stx %o2, [%o4] 637 638ENTRY(hv_ldc_copy) 639 mov %o5, %g5 640 mov LDC_COPY, %o5 641 ta ST_FAST_TRAP 642 retl 643 stx %o1, [%g5] 644 645ENTRY(hv_ldc_mapin) 646 mov %o2, %o4 647 mov LDC_MAPIN, %o5 648 ta ST_FAST_TRAP 649 stx %o1, [%o4] 650 retl 651 stx %o2, [%o3] 652 653ENTRY(hv_ldc_unmap) 654 mov %o1, %o2 655 mov LDC_UNMAP, %o5 656 ta ST_FAST_TRAP 657 retl 658 stx %o1, [%o2] 659 660ENTRY(hv_rng_get_diag_control) 661 mov RNG_GET_DIAG_CONTROL, %o5 662 ta ST_FAST_TRAP 663 retl 664 nop 665 666ENTRY(hv_rng_ctl_read) 667 mov %o2, %o4 668 mov %o1, %o3 669 mov RNG_CTL_READ, %o5 670 ta ST_FAST_TRAP 671 stx %o1, [%o3] 672 retl 673 stx %o2, [%o4] 674 675ENTRY(hv_rng_ctl_write) 676 mov RNG_CTL_WRITE, %o5 677 ta ST_FAST_TRAP 678 retl 679 stx %o1, [%o3] 680 681ENTRY(hv_rng_data_read_diag) 682 mov RNG_DATA_READ_DIAG, %o5 683 ta ST_FAST_TRAP 684 retl 685 stx %o1, [%o2] 686 687ENTRY(hv_rng_data_read) 688 mov %o1, %o2 689 mov RNG_DATA_READ, %o5 690 ta ST_FAST_TRAP 691 retl 692 stx %o1, [%o2] 693