summaryrefslogtreecommitdiffstats
path: root/tools/gdb_scripts/nvidia_init.gdb
blob: c2174195a0c8e1350dddba59351a8d4203c565a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# nvidia_init.gdb - GDB script for debugging NVIDIA driver initialization in guest
# Usage: gdb -x nvidia_init.gdb ./vmlinux
# Then: (gdb) target remote localhost:1234

# ============================================================
# CONFIGURATION
# ============================================================
# Path to guest kernel vmlinux with debug symbols
# set pagination off
# set confirm off

# ============================================================
# BREAKPOINTS - NVIDIA Driver Probe/Init
# ============================================================

# Core probe entry points
break nvidia_probe
break nvidia_init_module
break nvidia_exit_module

# GSP/RM initialization
break nv_init_gsp
break nv_gsp_init
break nv_gsp_firmware_load
break nv_gsp_bootstrap
break nv_gsp_rpc_init

# VFIO/mdev integration
break nvidia_vgpu_vfio_get_ops
break nvidia_vgpu_vfio_set_ops
break nv_vgpu_mdev_register_parent
break nv_vgpu_mdev_unregister_parent
break nv_vgpu_create_callback
break nv_vgpu_delete_callback
break nv_vgpu_bar_info_callback
break nv_vgpu_start_callback

# PCI config space
break nvidia_pci_probe
break nvidia_pci_remove
break pci_enable_device
break pci_request_regions

# MSI/MSI-X
break pci_enable_msi_block
break pci_enable_msix_range
break nvidia_setup_msi
break nvidia_setup_msix

# BAR mapping
break pci_iomap
break pci_iounmap
break nvidia_map_bars

# Interrupt handling
break request_threaded_irq
break free_irq
break nvidia_isr
break nvidia_msi_isr
break nvidia_msix_isr

# DMA mapping
break dma_map_page
break dma_unmap_page
break dma_map_sg
break dma_unmap_sg

# GSP RPC communication (OpenRM internal)
break nv_gsp_rpc_send
break nv_gsp_rpc_recv
break nv_gsp_doorbell_ring
break nv_gsp_doorbell_poll

# ============================================================
# WATCHPOINTS - Key Data Structures
# ============================================================

# Watch for GSP firmware load completion
# watch *(int*)nv_gsp_fw_loaded

# Watch for MSI-X table setup
# watch *(int*)nv_msix_table_configured

# ============================================================
# COMMANDS - Helper Functions
# ============================================================

define nvidia_backtrace
    bt
    printf "\n=== NVIDIA Driver Stack ===\n"
    info registers
end
document nvidia_backtrace
    Show backtrace with register state for NVIDIA driver
end

define nvidia_pci_state
    printf "=== PCI Config Space ===\n"
    # Requires access to pci_dev structure
    # p/x ((struct pci_dev*)$rdi)->vendor
    # p/x ((struct pci_dev*)$rdi)->device
    # p/x ((struct pci_dev*)$rdi)->command
    # p/x ((struct pci_dev*)$rdi)->status
end
document nvidia_pci_state
    Print PCI device state
end

define nvidia_gsp_state
    printf "=== GSP State ===\n"
    # p/x nv_gsp_fw_version
    # p/x nv_gsp_fw_loaded
    # p/x nv_gsp_rpc_initialized
end
document nvidia_gsp_state
    Print GSP firmware state
end

define nvidia_vfio_state
    printf "=== VFIO/mdev State ===\n"
    # p/x nv_vgpu_mdev_registered
    # p/x nv_vgpu_vfio_ops
end
document nvidia_vfio_state
    Print VFIO/mdev registration state
end

# ============================================================
# TRACEPOINTS (if kernel has tracepoints enabled)
# ============================================================

# trace nvidia:nvidia_probe_entry
# trace nvidia:nvidia_probe_exit
# trace nvidia:gsp_firmware_load
# trace nvidia:gsp_rpc_send
# trace nvidia:gsp_rpc_recv

# ============================================================
# AUTOMATION - Continue and Log
# ============================================================

# Log all breakpoint hits to file
set logging file nvidia_init_debug.log
set logging on

# Auto-continue after logging (uncomment for automated runs)
# set confirm off
# commands 1
#   nvidia_backtrace
#   continue
# end

# ============================================================
# CONVENIENCE ALIASES
# ============================================================

define hook-stop
    # Print current function on every stop
    printf "\n=== STOPPED at %s ===\n", __func__
    # Print key state
    # nvidia_gsp_state
end

# ============================================================
# USAGE NOTES
# ============================================================
# 1. Compile guest kernel with CONFIG_DEBUG_INFO=y CONFIG_GDB_SCRIPTS=y
# 2. Copy vmlinux from guest to host
# 3. Launch QEMU: ./scripts/qemu_gdb_attach.sh
# 4. In another terminal: gdb -x tools/gdb_scripts/nvidia_init.gdb ./vmlinux
# 5. (gdb) target remote localhost:1234
# 6. (gdb) continue
# 
# For specific debugging:
# - PCI probe issues: break nvidia_probe
# - GSP firmware load: break nv_gsp_firmware_load
# - MSI-X setup: break pci_enable_msix_range
# - BAR mapping: break pci_iomap
# - RPC communication: break nv_gsp_rpc_send