1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (c) 2026, Microsoft Corporation. 4 * 5 * Tracepoint declarations for mshv driver. 6 */ 7 8 #undef TRACE_SYSTEM 9 #define TRACE_SYSTEM mshv 10 11 #if !defined(__MSHV_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 12 #define _MSHV_TRACE_H_ 13 14 #include <linux/tracepoint.h> 15 #include <hyperv/hvhdk.h> 16 17 #undef TRACE_INCLUDE_PATH 18 #define TRACE_INCLUDE_PATH ../../drivers/hv 19 20 #undef TRACE_INCLUDE_FILE 21 #define TRACE_INCLUDE_FILE mshv_trace 22 23 TRACE_EVENT(mshv_create_partition, 24 TP_PROTO(u64 partition_id, int vm_fd), 25 TP_ARGS(partition_id, vm_fd), 26 TP_STRUCT__entry( 27 __field(u64, partition_id) 28 __field(int, vm_fd) 29 ), 30 TP_fast_assign( 31 __entry->partition_id = partition_id; 32 __entry->vm_fd = vm_fd; 33 ), 34 TP_printk("partition_id=%llu vm_fd=%d", 35 __entry->partition_id, 36 __entry->vm_fd 37 ) 38 ); 39 40 TRACE_EVENT(mshv_hvcall_create_partition, 41 TP_PROTO(u64 flags, s64 partition_id), 42 TP_ARGS(flags, partition_id), 43 TP_STRUCT__entry( 44 __field(u64, flags) 45 __field(s64, partition_id) 46 ), 47 TP_fast_assign( 48 __entry->flags = flags; 49 __entry->partition_id = partition_id; 50 ), 51 TP_printk("flags=%#llx partition_id=%lld", 52 __entry->flags, 53 __entry->partition_id 54 ) 55 ); 56 57 TRACE_EVENT(mshv_hvcall_initialize_partition, 58 TP_PROTO(u64 partition_id, u64 status), 59 TP_ARGS(partition_id, status), 60 TP_STRUCT__entry( 61 __field(u64, partition_id) 62 __field(u64, status) 63 ), 64 TP_fast_assign( 65 __entry->partition_id = partition_id; 66 __entry->status = status; 67 ), 68 TP_printk("partition_id=%llu status=%#llx", 69 __entry->partition_id, 70 __entry->status 71 ) 72 ); 73 74 TRACE_EVENT(mshv_partition_release, 75 TP_PROTO(u64 partition_id), 76 TP_ARGS(partition_id), 77 TP_STRUCT__entry( 78 __field(u64, partition_id) 79 ), 80 TP_fast_assign( 81 __entry->partition_id = partition_id; 82 ), 83 TP_printk("partition_id=%llu", 84 __entry->partition_id 85 ) 86 ); 87 88 TRACE_EVENT(mshv_destroy_partition, 89 TP_PROTO(u64 partition_id), 90 TP_ARGS(partition_id), 91 TP_STRUCT__entry( 92 __field(u64, partition_id) 93 ), 94 TP_fast_assign( 95 __entry->partition_id = partition_id; 96 ), 97 TP_printk("partition_id=%llu", 98 __entry->partition_id 99 ) 100 ); 101 102 TRACE_EVENT(mshv_hvcall_finalize_partition, 103 TP_PROTO(u64 partition_id, u64 status), 104 TP_ARGS(partition_id, status), 105 TP_STRUCT__entry( 106 __field(u64, partition_id) 107 __field(u64, status) 108 ), 109 TP_fast_assign( 110 __entry->partition_id = partition_id; 111 __entry->status = status; 112 ), 113 TP_printk("partition_id=%llu status=%#llx ", 114 __entry->partition_id, 115 __entry->status 116 ) 117 ); 118 119 TRACE_EVENT(mshv_hvcall_withdraw_memory, 120 TP_PROTO(u64 partition_id, u64 withdrawn, u64 status), 121 TP_ARGS(partition_id, withdrawn, status), 122 TP_STRUCT__entry( 123 __field(u64, partition_id) 124 __field(u64, withdrawn) 125 __field(u64, status) 126 ), 127 TP_fast_assign( 128 __entry->partition_id = partition_id; 129 __entry->withdrawn = withdrawn; 130 __entry->status = status; 131 ), 132 TP_printk("partition_id=%llu withdrawn=%llu status=%#llx", 133 __entry->partition_id, 134 __entry->withdrawn, 135 __entry->status 136 ) 137 ); 138 139 TRACE_EVENT(mshv_hvcall_delete_partition, 140 TP_PROTO(u64 partition_id, u64 status), 141 TP_ARGS(partition_id, status), 142 TP_STRUCT__entry( 143 __field(u64, partition_id) 144 __field(u64, status) 145 ), 146 TP_fast_assign( 147 __entry->partition_id = partition_id; 148 __entry->status = status; 149 ), 150 TP_printk("partition_id=%llu status=%#llx", 151 __entry->partition_id, 152 __entry->status 153 ) 154 ); 155 156 TRACE_EVENT(mshv_create_vp, 157 TP_PROTO(u64 partition_id, u32 vp_index, long vp_fd), 158 TP_ARGS(partition_id, vp_index, vp_fd), 159 TP_STRUCT__entry( 160 __field(u64, partition_id) 161 __field(u32, vp_index) 162 __field(long, vp_fd) 163 ), 164 TP_fast_assign( 165 __entry->partition_id = partition_id; 166 __entry->vp_index = vp_index; 167 __entry->vp_fd = vp_fd; 168 ), 169 TP_printk("partition_id=%llu vp_index=%u vp_fd=%ld", 170 __entry->partition_id, 171 __entry->vp_index, 172 __entry->vp_fd 173 ) 174 ); 175 176 TRACE_EVENT(mshv_hvcall_map_vp_state_page, 177 TP_PROTO(u64 partition_id, u32 vp_index, u32 page_type, u64 status), 178 TP_ARGS(partition_id, vp_index, page_type, status), 179 TP_STRUCT__entry( 180 __field(u64, partition_id) 181 __field(u32, vp_index) 182 __field(u32, page_type) 183 __field(u64, status) 184 ), 185 TP_fast_assign( 186 __entry->partition_id = partition_id; 187 __entry->vp_index = vp_index; 188 __entry->page_type = page_type; 189 __entry->status = status; 190 ), 191 TP_printk("partition_id=%llu vp_index=%u page_type=%u status=%#llx", 192 __entry->partition_id, 193 __entry->vp_index, 194 __entry->page_type, 195 __entry->status 196 ) 197 ); 198 199 TRACE_EVENT(mshv_drain_vp_signals, 200 TP_PROTO(u64 partition_id, u32 vp_index), 201 TP_ARGS(partition_id, vp_index), 202 TP_STRUCT__entry( 203 __field(u64, partition_id) 204 __field(u32, vp_index) 205 ), 206 TP_fast_assign( 207 __entry->partition_id = partition_id; 208 __entry->vp_index = vp_index; 209 ), 210 TP_printk("partition_id=%llu vp_index=%u", 211 __entry->partition_id, 212 __entry->vp_index 213 ) 214 ); 215 216 TRACE_EVENT(mshv_disable_vp_dispatch, 217 TP_PROTO(u64 partition_id, u32 vp_index, int ret), 218 TP_ARGS(partition_id, vp_index, ret), 219 TP_STRUCT__entry( 220 __field(u64, partition_id) 221 __field(u32, vp_index) 222 __field(int, ret) 223 ), 224 TP_fast_assign( 225 __entry->partition_id = partition_id; 226 __entry->vp_index = vp_index; 227 __entry->ret = ret; 228 ), 229 TP_printk("partition_id=%llu vp_index=%u ret=%d", 230 __entry->partition_id, 231 __entry->vp_index, 232 __entry->ret 233 ) 234 ); 235 236 TRACE_EVENT(mshv_vp_release, 237 TP_PROTO(u64 partition_id, u32 vp_index), 238 TP_ARGS(partition_id, vp_index), 239 TP_STRUCT__entry( 240 __field(u64, partition_id) 241 __field(u32, vp_index) 242 ), 243 TP_fast_assign( 244 __entry->partition_id = partition_id; 245 __entry->vp_index = vp_index; 246 ), 247 TP_printk("partition_id=%llu vp_index=%u", 248 __entry->partition_id, 249 __entry->vp_index 250 ) 251 ); 252 253 TRACE_EVENT(mshv_run_vp_entry, 254 TP_PROTO(u64 partition_id, u32 vp_index), 255 TP_ARGS(partition_id, vp_index), 256 TP_STRUCT__entry( 257 __field(u64, partition_id) 258 __field(u32, vp_index) 259 ), 260 TP_fast_assign( 261 __entry->partition_id = partition_id; 262 __entry->vp_index = vp_index; 263 ), 264 TP_printk("partition_id=%llu vp_index=%u", 265 __entry->partition_id, 266 __entry->vp_index 267 ) 268 ); 269 270 TRACE_EVENT(mshv_run_vp_exit, 271 TP_PROTO(u64 partition_id, u32 vp_index, u64 hv_message_type, long ret), 272 TP_ARGS(partition_id, vp_index, hv_message_type, ret), 273 TP_STRUCT__entry( 274 __field(u64, partition_id) 275 __field(u32, vp_index) 276 __field(u64, hv_message_type) 277 __field(long, ret) 278 ), 279 TP_fast_assign( 280 __entry->partition_id = partition_id; 281 __entry->vp_index = vp_index; 282 __entry->hv_message_type = hv_message_type; 283 __entry->ret = ret; 284 ), 285 TP_printk("partition_id=%llu vp_index=%u hv_message_type=%#llx ret=%ld", 286 __entry->partition_id, 287 __entry->vp_index, 288 __entry->hv_message_type, 289 __entry->ret 290 ) 291 ); 292 293 TRACE_EVENT(mshv_vp_clear_explicit_suspend, 294 TP_PROTO(u64 partition_id, u32 vp_index, int ret), 295 TP_ARGS(partition_id, vp_index, ret), 296 TP_STRUCT__entry( 297 __field(u64, partition_id) 298 __field(u32, vp_index) 299 __field(int, ret) 300 ), 301 TP_fast_assign( 302 __entry->partition_id = partition_id; 303 __entry->vp_index = vp_index; 304 __entry->ret = ret; 305 ), 306 TP_printk("partition_id=%llu vp_index=%u ret=%d", 307 __entry->partition_id, 308 __entry->vp_index, 309 __entry->ret 310 ) 311 ); 312 313 TRACE_EVENT(mshv_xfer_to_guest_mode_work, 314 TP_PROTO(u64 partition_id, u32 vp_index, unsigned long thread_info_flag, long ret), 315 TP_ARGS(partition_id, vp_index, thread_info_flag, ret), 316 TP_STRUCT__entry( 317 __field(u64, partition_id) 318 __field(u32, vp_index) 319 __field(unsigned long, thread_info_flag) 320 __field(long, ret) 321 ), 322 TP_fast_assign( 323 __entry->partition_id = partition_id; 324 __entry->vp_index = vp_index; 325 __entry->thread_info_flag = thread_info_flag; 326 __entry->ret = ret; 327 ), 328 TP_printk("partition_id=%llu vp_index=%u thread_info_flag=%#lx ret=%ld", 329 __entry->partition_id, 330 __entry->vp_index, 331 __entry->thread_info_flag, 332 __entry->ret 333 ) 334 ); 335 336 TRACE_EVENT(mshv_hvcall_dispatch_vp, 337 TP_PROTO(u64 partition_id, u32 vp_index, u32 flags, 338 u32 dispatch_state, u32 dispatch_event, u64 irq_vectors, u64 status), 339 TP_ARGS(partition_id, vp_index, flags, dispatch_state, dispatch_event, irq_vectors, 340 status), 341 TP_STRUCT__entry( 342 __field(u64, partition_id) 343 __field(u32, vp_index) 344 __field(u32, flags) 345 __field(u32, dispatch_state) 346 __field(u32, dispatch_event) 347 __field(u64, irq_vectors) 348 __field(u64, status) 349 ), 350 TP_fast_assign( 351 __entry->partition_id = partition_id; 352 __entry->vp_index = vp_index; 353 __entry->flags = flags; 354 __entry->dispatch_state = dispatch_state; 355 __entry->dispatch_event = dispatch_event; 356 __entry->irq_vectors = irq_vectors; 357 __entry->status = status; 358 ), 359 TP_printk("partition_id=%llu vp_index=%u flags=%#x dispatch_state=%#x dispatch_event=%#x irq_vectors=%#016llx status=%#llx", 360 __entry->partition_id, 361 __entry->vp_index, 362 __entry->flags, 363 __entry->dispatch_state, 364 __entry->dispatch_event, 365 __entry->irq_vectors, 366 __entry->status 367 ) 368 ); 369 370 TRACE_EVENT(mshv_update_routing_table, 371 TP_PROTO(u64 partition_id, void *old, void *new, u32 numents), 372 TP_ARGS(partition_id, old, new, numents), 373 TP_STRUCT__entry( 374 __field(u64, partition_id) 375 __field(struct mshv_girq_routing_table *, old) 376 __field(struct mshv_girq_routing_table *, new) 377 __field(u32, numents) 378 ), 379 TP_fast_assign( 380 __entry->partition_id = partition_id; 381 __entry->old = old; 382 __entry->new = new; 383 __entry->numents = numents; 384 ), 385 TP_printk("partition_id=%llu old=%p new=%p numents=%u", 386 __entry->partition_id, 387 __entry->old, 388 __entry->new, 389 __entry->numents 390 ) 391 ); 392 393 TRACE_EVENT(mshv_map_user_memory, 394 TP_PROTO(u64 partition_id, u64 start_uaddr, u64 start_gfn, u64 nr_pages, u32 map_flags, 395 long ret), 396 TP_ARGS(partition_id, start_uaddr, start_gfn, nr_pages, map_flags, ret), 397 TP_STRUCT__entry( 398 __field(u64, partition_id) 399 __field(u64, start_uaddr) 400 __field(u64, start_gfn) 401 __field(u64, nr_pages) 402 __field(u32, map_flags) 403 __field(long, ret) 404 ), 405 TP_fast_assign( 406 __entry->partition_id = partition_id; 407 __entry->start_uaddr = start_uaddr; 408 __entry->start_gfn = start_gfn; 409 __entry->nr_pages = nr_pages; 410 __entry->map_flags = map_flags; 411 __entry->ret = ret; 412 ), 413 TP_printk("partition_id=%llu start_uaddr=%#llx start_gfn=%#llx nr_pages=%llu map_flags=%#x ret=%ld", 414 __entry->partition_id, 415 __entry->start_uaddr, 416 __entry->start_gfn, 417 __entry->nr_pages, 418 __entry->map_flags, 419 __entry->ret 420 ) 421 ); 422 423 TRACE_EVENT(mshv_assign_ioeventfd, 424 TP_PROTO(u64 partition_id, u64 addr, u64 length, u64 datamatch, bool wildcard, 425 void *eventfd, int ret), 426 TP_ARGS(partition_id, addr, length, datamatch, wildcard, eventfd, ret), 427 TP_STRUCT__entry( 428 __field(u64, partition_id) 429 __field(u64, addr) 430 __field(u64, length) 431 __field(u64, datamatch) 432 __field(bool, wildcard) 433 __field(struct eventfd_ctx *, eventfd) 434 __field(int, ret) 435 ), 436 TP_fast_assign( 437 __entry->partition_id = partition_id; 438 __entry->addr = addr; 439 __entry->length = length; 440 __entry->datamatch = datamatch; 441 __entry->wildcard = wildcard; 442 __entry->eventfd = eventfd; 443 __entry->ret = ret; 444 ), 445 TP_printk("partition_id=%llu addr=%#016llx length=%#llx datamatch=%#llx wildcard=%d eventfd=%p ret=%d", 446 __entry->partition_id, 447 __entry->addr, 448 __entry->length, 449 __entry->datamatch, 450 __entry->wildcard, 451 __entry->eventfd, 452 __entry->ret 453 ) 454 ); 455 456 TRACE_EVENT(mshv_deassign_ioeventfd, 457 TP_PROTO(u64 partition_id, u64 addr, u64 length, u64 datamatch, bool wildcard, 458 void *eventfd), 459 TP_ARGS(partition_id, addr, length, datamatch, wildcard, eventfd), 460 TP_STRUCT__entry( 461 __field(u64, partition_id) 462 __field(u64, addr) 463 __field(u64, length) 464 __field(u64, datamatch) 465 __field(bool, wildcard) 466 __field(struct eventfd_ctx *, eventfd) 467 ), 468 TP_fast_assign( 469 __entry->partition_id = partition_id; 470 __entry->addr = addr; 471 __entry->length = length; 472 __entry->datamatch = datamatch; 473 __entry->wildcard = wildcard; 474 __entry->eventfd = eventfd; 475 ), 476 TP_printk("partition_id=%llu addr=%#016llx length=%#llx datamatch=%#llx wildcard=%d eventfd=%p", 477 __entry->partition_id, 478 __entry->addr, 479 __entry->length, 480 __entry->datamatch, 481 __entry->wildcard, 482 __entry->eventfd 483 ) 484 ); 485 486 TRACE_EVENT(mshv_vp_wait_for_hv_kick, 487 TP_PROTO(u64 partition_id, u32 vp_index, bool kicked_by_hv, bool blocked, 488 bool irq_pending), 489 TP_ARGS(partition_id, vp_index, kicked_by_hv, blocked, irq_pending), 490 TP_STRUCT__entry( 491 __field(u64, partition_id) 492 __field(u32, vp_index) 493 __field(bool, kicked_by_hv) 494 __field(bool, blocked) 495 __field(bool, irq_pending) 496 ), 497 TP_fast_assign( 498 __entry->partition_id = partition_id; 499 __entry->vp_index = vp_index; 500 __entry->kicked_by_hv = kicked_by_hv; 501 __entry->blocked = blocked; 502 __entry->irq_pending = irq_pending; 503 ), 504 TP_printk("partition_id=%llu vp_index=%u kicked_by_hv=%d blocked=%d irq_pending=%d", 505 __entry->partition_id, 506 __entry->vp_index, 507 __entry->kicked_by_hv, 508 __entry->blocked, 509 __entry->irq_pending 510 ) 511 ); 512 513 TRACE_EVENT(mshv_handle_gpa_intercept, 514 TP_PROTO(u64 partition_id, u32 vp_index, u64 gfn, u8 access_type, bool handled), 515 TP_ARGS(partition_id, vp_index, gfn, access_type, handled), 516 TP_STRUCT__entry( 517 __field(u64, partition_id) 518 __field(u32, vp_index) 519 __field(u64, gfn) 520 __field(u8, access_type) 521 __field(bool, handled) 522 ), 523 TP_fast_assign( 524 __entry->partition_id = partition_id; 525 __entry->vp_index = vp_index; 526 __entry->gfn = gfn; 527 __entry->access_type = access_type == HV_INTERCEPT_ACCESS_READ ? 'R' : 528 (access_type == HV_INTERCEPT_ACCESS_WRITE ? 'W' : 529 (access_type == HV_INTERCEPT_ACCESS_EXECUTE ? 'X' : '?')); 530 __entry->handled = handled; 531 ), 532 TP_printk("partition_id=%llu vp_index=%u gfn=0x%llx access_type=%c handled=%d", 533 __entry->partition_id, 534 __entry->vp_index, 535 __entry->gfn, 536 __entry->access_type, 537 __entry->handled 538 ) 539 ); 540 541 #endif /* _MSHV_TRACE_H_ */ 542 543 /* This part must be outside protection */ 544 #include <trace/define_trace.h> 545