| Commit message (Collapse) | Author | Age |
| |
|
|
| |
accepts -1g/-2g
|
| |
|
|
| |
offset span 33 pages; tails read the next reloc record)
|
| |
|
|
| |
passes; targets the guest cudaMalloc stall class)
|
| |
|
|
| |
corrupted vadd blockDim -> one-CTA result); pre-rewrite/final header dumps
|
| |
|
|
| |
replay (inline records restored the original guest pointers into the engine-mapped page; root cause of the param-read wall)
|
| |
|
|
| |
0x190..0x197) + win0 content and PT-slot diagnostics (the slot-0x108 line reads stale to the SM data path)
|
| |
|
|
| |
reach for probes)
|
| |
|
|
| |
patch land?)
|
| |
|
|
| |
c[0x0] reads the guest page, not the shadow)
|
| |
|
|
| |
success path)
|
| |
|
|
| |
collided with the bounce window)
|
| |
|
|
| |
before the bounce cap
|
| |
|
|
| |
logging + param 0x150 dump + main-PT slot dump
|
| |
|
|
|
|
|
|
|
| |
pointer page)
m110 collected candidate windows at 2 MB granularity, so the 64-page runs
started at the window base and never covered the pointer pages themselves -
the bank/param pointers matched no record and were never rewritten (m117:
only 2 relocations, trap unchanged). Collect candidate pages instead.
|
| |
|
|
|
|
|
| |
m116's param dump exposed the m103 4-byte-stride scan corrupting small
adjacent fields (0x40/1 rewritten into relocated-looking values). Use
8-byte stride, require 256-byte-aligned values (all device pointers), and
skip records without a reloc VA.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
copy-in/out)
Decisive evidence: the SM walker resolves only the commit-time tree (every
late write/install fails: m94, m99-m113; UNSET refused 0x1f). Plant a
112-page bounce window into the main small-PT at stage 3 (slots
0x110..0x17f - the proven win0 pattern), copy the launch's resolved data
pages in, pointers are already rewritten to those VAs, and copy results
back after the release. The mail message lives at bounce page 100
(c[0x4][0x0]=0x174000). Data cap 100 pages (440 KB), matching the shrunk
victory_mail (3 x 128 KB).
|
| |
|
|
|
|
|
|
|
|
| |
(re-commit probe)
All late engine-tree writes are invisible to the SM walker (only the
commit-time snapshot resolves); the mail injection at a main-window fresh
slot also fails (m112). Probe whether UNSET+SET_PAGE_DIRECTORY on the
ladder VAS after planting forces the server walker to re-snapshot the tree;
gated by gr_recommit.
|
| |
|
|
|
| |
m111's mret=-34: mva was BASE+0x1f0000 = 0x200000, outside the 2 MB main
window. Use the absolute VA 0x1f0000.
|
| |
|
|
|
|
| |
m110 ran without gr_data_prewin, and the mail prep was nested inside that
block - mail.pages stayed 0 and the injection failed with EINVAL. Move the
mail page preparation out; it is 4 KB and harmless.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
the demo
All UPDATE_PDE_2 installs (post- or pre-commit) are invisible to the SM
walker; the only window it honours is the commit-time main small-PT page
(VA 0x100000+, the proven win0/const window). Relocate each candidate data
pointer's first 64 pages into slots 0x110..0x1f0 of that window (fresh PTE
lines, direct leaf writes), rewrite bank pointers per page record, and put
the mail page at the reserved slot 0x1f0 (c[0x4][0x0]=0x1f0000). Shrink
victory_mail's buffers (n=1<<15, 128 KB each) to fit the 2 MB window.
|
| |
|
|
|
|
| |
m108's mret=-34 (ERANGE): the shift bound tighter than expected in the
written expression, making mva = (0x100000000 + 31) << 21, outside the
pool. Parenthesize.
|
| |
|
|
|
|
|
|
| |
m107's inject entry showed mail.pages=0 after the launch-time
dma_alloc_coherent attempt: the allocation fails silently there. Allocate
and fill the message page in stage 3 alongside the data PT pool (proven to
allocate fine), and at launch only map it into pool window 31 and patch
c[0x4][0x0]; log the map result either way.
|
| |
|
|
|
|
|
|
|
|
| |
unconditional inject
m106's bank-4 injection silently did not fire although the insmod args
carried mail_patch=1 and the stage-3 data pool installed. Print the getter
values at launch and log the injection entry (w0/w1/mail.pages/pt31.pages),
then inject unconditionally when bank-4 is processed so the pool-backed
mail page (window 31) is exercised either way.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Post-commit UPDATE_PDE_2 installs are accepted (status 0x0) but ineffective
(m94's scratch windows, m101-m105's reloc windows: the SM never resolves
them), while the stage-3 ctx-window installs are honoured. Add a fixed
32-window pool at GSP_PHYS_RMCALL_VA_GR_DATA_BASE (0x100000000 + k<<21,
inside the server-managed region), each backed by a module PT page
installed through UPDATE_PDE_2 during stage 3; the engine data map then
only writes leaf PTEs into those fresh PT pages at launch (the P6b-proven
'direct leaf write into a walker-installed fresh table' pattern). The mail
injection uses the reserved last window (k=31); service data windows cap
at 31 and use the same fixed layout.
|
| |
|
|
|
|
|
|
|
| |
Only QMD words 32 (param) and 48 (program) went to the engine-proven
window-0 pool; banks 1/3/4/7 (words 34..46) fell to the window-1 scratch
path, which the SM appears not to resolve (m94's pre-SM failure, and the
bank-4 value never reaching the kernel: m104's injected base read back as
zero through the ULDC). Route all bank pages to window-0 (5 of 8 slots
used: 32/34/40/46/48).
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The forwarded mail_kernel reads __device__ kMail through c[0x4][0x0] (the
driver-provided module-data base), but the guest's bank-4 page content is
zero in the launch (the driver's value never lands in the resolved page).
With gr_mail_patch set, when bank 4's first 8 bytes are zero, allocate a
module page holding the demo message, map it at server-managed VA
0x11ff00000 (UPDATE_PDE_2, inside [0x100000000,0x11fffffff)) and point
c[0x4][0x0] there. The kernel then reads the message from device memory and
writes out[i] through the already-relocated bank-0 pointer; vadd (params
only) becomes the real relocated-data acceptance test.
|
| |
|
|
|
|
|
|
|
| |
m102 relocated the server-installed data windows (UPDATE_PDE_2 pdeIndex
2060.. accepted, status 0x0) and rewrote bank 0 (10 pointers) and bank 1
(1) - but the LDG's base in c[0x4][0x0] (bank 4) produced no hit: its
pointer sits at a 4-aligned offset that the 8-stride scan skipped. Scan
every 4-byte boundary and dump the first 16 words of every bank page
(2..7) for verification.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
rewrite bank pointers
The server refuses UPDATE_PDE_2 (status 0x1f) for guest CUDA VAs: they are
client-managed, while the golden VAS reserves the server-managed region
[0x100000000, 0x11fffffff) (gsp_phys_booter.c:8455). Map each resolved data
page there at an affine-relocated VA (identity HPA, no copies), rewrite every
8-byte pointer value inside the shadowed const-bank pages (banks 0..7) that
falls inside a mapped guest window to the relocated VA, and raise the Tier-1
window pool to 32 windows x 512 PTEs so the relocated pages fit. The kernel
now reaches its real data through the server-installed windows.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
map_va_locked)
The scratch-window comment is decisive: on the shared-management VAS the
client PD0 entries built by pdb_build are NOT preserved by the server's
root migration, so every engine-visible mapping must be installed through
DMA_UPDATE_PDE_2 - the m99/m100 direct plants were invisible (same NACK
with 16381 pages 'mapped'). Route each data page through
gsp_phys_rmcall_gr_map_va_locked (same call the request pages use) and log
the per-window acceptance/refusal (server 0x1f) so the high-VA install
behavior is measured. The window pool is currently 8 windows x 32 PTEs.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
default
The +0x880 trap instruction disassembles (nvdisasm on the m98b prologue
bytes) to LDG.E.U8.CONSTANT.SYS R5, [R2.64+UR4] with UR4 = c[0x4][0x0] -
the first global load's base comes from const bank 4, not the c[0x0] param
page the m99 scan covered. svc_gr_data_fill now scans every bank page the
launch carries (QMD words 32..47, even LO words: banks 0..7), deduping up
to 16 windows. Data PTEs use the gr_pte_kind param (default 0 = the kind
proven SM-visible via the const reads) instead of a hardcoded 6.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
engine tree
The m97/m98 decode proved the SM instruction fetch and const reads work;
the wall is the kernel's first global data access (prologue instruction at
+0x80) to a guest-VA device pointer (param page words 6..9 carry the demo's
two 16MB buffers at 0x763dXXXXXXXX), which is not mapped in the engine's
page tables. The walker walks OUR root->PD2->PD1->PD0->PT tree (SC PDB ==
our VASPDB chunk, proven by matching the same-run INST base to the PDB-root
DMA log), and fresh direct-planted tables are visible at first fetch.
Service side (gsp_sema_service.c): svc_gr_data_fill() scans the param
(c[0x0]) page for plausible device VAs, resolves the containing 2MB windows
(-1..+16 windows, early stop when a window resolves nothing) via
svc_resolve_va on the service thread, and carries {va, pa} in
svc_fwd_req.gr_data; svc_fwd_gr_work() converts PA->HPA and attaches the
list to the submit.
Backend (gsp_phys_booter.c): gsp_phys_rmcall_gr_data_map() plants VA->HPA
leaf PTEs (GENERIC_MEMORY kind 0x06, like UVM/RM on Turing) into lazily
allocated PD1/PD0/PT chunk branches under root[0] (VAs < 2^47), caching
branches per index; the submit maps all req->data pages before publish and
logs the count.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
page at launch
m97 settled the fetch question: zeros planted at the QMD's program offset
executed and trapped ILLEGAL_INSTR_ENCODING (0x9) at PC=0x109800 - the SM
instruction fetch and const reads through our shadows work; the m90-m96
MMU_NACK at PC=0x109880 is a memory access by the prologue instruction at
+0x80, almost certainly the first global load using a guest-VA device
pointer from the param buffer (c[0x0]). Dump the program page from the
entry offset (40 words) and the param page (16 words) so the access
instruction and its pointer arguments are visible in the log.
|
| |
|
|
|
|
|
|
|
|
|
| |
UVM's Turing PTE maker sets KIND=GENERIC_MEMORY (0x06) in PTE bits 63:56
because PITCH no longer exists on Turing (uvm_turing_mmu.c:32-34,106;
NV_MMU_PTE_KIND_GENERIC_MEMORY=0x06, NV_MMU_VER2_PTE_KIND=63:56). Our
shadow PTEs encode kind=0. The SM I-fetch refuses the kind-0 PTE with
MMU_NACK while the FE tolerates it, so gr_pte_kind (default 0) selects the
KIND for the window-0 pool. Also log the VASPDB root DMA at
SET_PAGE_DIRECTORY time (settles whether the SC PDB the server programs is
our chunk).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
The real RM initialises every GPC's NV_PGPC_PRI_MMU_CTRL (0x500880 +
gpc*0x8000) from NV_PFB_PRI_MMU_CTRL (0x100C80) using the TU102
hub-to-GPC matching fields (VM_PG_SIZE, COMP_FAULT, MISS_GRAN, CACHE_MODE,
USE_PDB_BIG_PAGE_SIZE, ATOMIC_CAPABILITY_MODE, ATOMIC_CAPABILITY_SYS_NCOH;
ext-tree gr_gk104.c:3340-3380 + gr_tu102.c:229-238). Our ladder never
programmed it (grep-verified). The m93 INST dump shows the server's SC(0)
PDB carries USE_VER2_PT_FORMAT + BIG_PAGE_SIZE=1, so a GPC/hub MMU_CTRL
mismatch is a candidate for the GPC-side walker refusing the SM I-fetch
with MMU_NACK while hub-side reads resolve. Gated by
gsp_phys_rmcall_gr_gpc_mmu_init (default 0); sampler now reads
GPC0/GPC1_MMU_CTRL (0x500880/0x508880) and PFB_MMU_CTRL (0x100C80).
|
| |
|
|
|
|
|
|
|
|
| |
The m90/m91 decode pinned the SM I-fetch failure to WARP_ESR MMU_NACK at
the window-0 shadow VA, while everything FE-side resolves the same small-PT
line. The SC array (RAMIN words 166+: VALID mask, then per-VEID
SC_PAGE_DIR_BASE LO/HI/flags) is the page directory the SMs' walk is
expected to use; log it raw at launch time so the next cycle shows which
base/target/flags the server actually programmed (and whether it is the
module VASPDB root).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
guest VAs
The m90/m91 trap decoded the SM I-fetch failure precisely: GPC0/GPC1 TPC0
SM0 WARP_ESR ERROR=0x20 ADDR_ERROR_TYPE=0xb = MMU_NACK, PC=0x109880 (the
rewritten window-0 shadow program VA). The FE reads the same small-PT line
fine (the forwarded inline QMD in the qmdwin page is processed to CWD
ACTIVE), so the SM walk is not using the channel/ladder VAS the shadow
lives in - it appears to use the guest subctx page directory (instance
SC_PAGE_DIRECTORY_BASE 0x10956b000), which maps the guest VAs the real
client's captured QMD points at, and not our window.
Add gr_ptr_guest: when set, the forwarded launch leaves the QMD pointer
pairs (param w32/33, program w48/49, prefetch w8/w31) exactly as the guest
driver wrote them (as the real driver's captured QMD carries), and only
relocates the QMD page itself (qmdwin, a proven FE read). Shadows are still
copied for logging but unused.
|
| |
|
|
|
|
|
|
|
|
| |
PGRAPH_EXCEPTION bit24 (GPC) with EXCEPTION1 GPC1:0=0b11 fires at every
forwarded QMD activation and the engine then saves/unloads. The per-GPC PRI
window (BAR0 0x500000 + gpc*0x8000) carries NV_PGPC_PRI_GPCCS_GPC_EXCEPTION
(0x2c90: PROP/ZCULL/GCC/SETUP/PES/TPC/GPCMMU0/GPCCS bits),
GPC_ACTIVITY1.GPCMMU0 (0x2c84: FAULTED=6) and the GPCMMU GLOBAL_ESR (0x324):
the post-mortem and the external sampler now record them to name the failing
GPC sub-unit (or the GPC MMU).
|
| |
|
|
|
|
|
|
|
| |
The override blob can now be supplied at load (hex string, <= 1 page) and is
parsed at the first forwarded launch, so the minimal-kernel experiment no
longer depends on a debugfs write racing the guest's launch. Also observed in
the m86 attempt: after many failed launches the forwarded ring desynced
(USERD GP_PUT rewound to 1 while the engine's GP_GET was 513; IQ2M sentinel
intact, no FE fetch) - a fresh boot is required per experiment.
|
| |
|
|
|
|
|
|
|
| |
context image
The probe now copies the header, VEID0 subctx header and ten pages spread from
0x1000 to 0xf0000, printing a nonzero-word count and first words per page, so
one ladder run shows whether the golden image is actually populated across its
0xf2d00 span (the GPC slices load from it).
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
program page
debugfs gsp-phys-gr-override (write-only, <= 1 page) stores bytes that the
forwarded launch places at the QMD's program offset inside the shadowed
program page, before any relocation. Intended use: a hand-assembled minimal
SM75 kernel (MOV R1, c[0x0][0x28]; EXIT) to prove native GR execution and the
release path independent of the guest kernel's SASS; the guest kernel's own
entry words observed in the shadow (00017a02 00000a00) are the same standard
prologue MOV encoding, so this isolates execution-path faults from code
content.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
subctx header
gsp_phys_rmcall_gr_img_probe=1: after the stage-4 GR sem proof the ladder
re-binds the rmcall channel to COPY0, copies image VA 0x2200000 and the subctx
header VA 0x22f3000 into the DST sysmem chunk through the real CE, dumps the
header pointers, and re-binds GR0. This is the missing read path for the
FBMEM context image (the GPC exception at QMD activation needs the image's
PATCH/PM/ZCULL/priv-map/global pointers and the subctx header content to be
compared against the expected VAs).
|
| |
|
|
|
|
|
|
|
|
|
|
| |
records
NV_PGRAPH_EXCEPTION reads 0x01000000 (GPC) with EXCEPTION1 GPC1:0=0b11 at the
QMD activation; the fault record the engine writes goes to the channel's error
notifier, which is server FBMEM today and unreadable. gsp_phys_rmcall_gr_notifier_sys=1
registers a host sysmem chunk as the hObjectError memory object and carries it
in the channel's errorNotifierMem with the SYS aperture, so the RM's
asynchronous channel-error report is dumped in the launch post-mortem
(the m35 lane still uses the captured substitute object shape).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
The m80 window shows PGRAPH_INTR=0x00000010 (ILLEGAL_METHOD, the reserved-SW
prelude methods, same as the real driver) clearing, then 0x00200002
(SEMAPHORE|EXCEPTION) pending exactly when the QMD activates, followed by the
FECS save/unload. The real driver's launch transient carries the same
ILLEGAL_METHOD without ever setting EXCEPTION, so the exception is the
ctx-restore difference. The one R1-booked ctx VA with no PTE is PM
(0x2370000): the golden9 range mapping covers PATCH/FECS/PRIV/UNR and the four
globals (windows 17..22 after the golden9k 1->6 extension) but never PM, and
R1-before-F2 makes the image carry that VA as the PM pointer. Map it through
the ctx PT window right after the mode-35 PM FBMEM allocation, before any
engine context load and before the PTE line's first fetch.
|
| |
|
|
|
|
|
|
|
|
| |
The m75/m78/m79 launch windows show FECS_CTXSW_STATUS_FE_0.GR_INTR_REQ
(bit17) asserted through the SKED CWD ACTIVE state and a following CTXSW_REQ
(bit0) that results in the context save/unload. The real driver carries
GR_INTR only transiently during its context load and clears it before ACTIVE.
The PGRAPH interrupt latch (0x400100) names what the engine is signaling
(e.g. ILLEGAL_METHOD bit4, SEMAPHORE bit1, NOTIFY); sampled by the external
sampler and dumped in the launch post-mortem.
|
| |
|
|
|
|
|
|
|
|
| |
aborts it)
gsp_phys_rmcall_gr_lane_skip: bit0 skips #1059 CILP mode, bit1 skips #1061
timeslice, bit2 skips #1063 device-sched. Used to bisect which lane-enable
control arms the forwarded QMD enqueue and which one leaves the scheduling
state that ends in the dispatch-time context save. Also makes the m76 lane
tail independent of #1063 (always refused 0x1f by the server).
|
| |
|
|
|
|
|
|
|
|
|
| |
The real client's context-creation tail after the lane-enable trio is
#1073 NVA06C_CTRL_CMD_PREEMPT on the TSG with bWait=1, #1075
NV0080 device-sched disable, #1077 PERF_BOOST_SET_2X. The explicit preempt
makes the RM perform a clean context save/switch-out at setup time so the
first dispatch loads the context normally; without it our lane's context sits
loaded from the ladder and task activation ends in a save/unload instead of
execution (m72/m73/m75 signature). Gated by gsp_phys_rmcall_gr_lane_tail
(default 0).
|
| |
|
|
|
|
|
|
|
|
|
|
| |
CWD_FS readback
The one-shot GR context-image initializer (0x52a94f8, pEngCtx+0x135) runs in
F2's mapped-MAIN promote and consumes the per-VAS vaLists at that moment. With
R1 after F2 the image carries zero PATCH/PM/priv-map/global pointers; the
m72/m73 sampler signature (QMD ACTIVE then freed, FECS unloads exactly at
dispatch, no fault) is consistent with the engine context restore failing on
the empty image. gsp_phys_rmcall_gr_r1_first=1 sends R1 before F2 (default 0 =
legacy order). Post-mortem now also reads CWD_FS (0x405b00).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
transition recorder, sysmem instance selector
m72: append the vendor turingLocalMemUpdate block (SET_SHADER_LOCAL_MEMORY_A/B
0x790/0x794, NON_THROTTLED_A/B 0x2e4/0x2e8, WINDOW_A/B 0x7b0/0x7b4) to the
forwarded GR launch prelude; without it the channel local-memory state is zero
and the m64-m69 sampler shows SKED_HWW_ESR bit12 = SKEDCHECK05
LOCAL_MEMORY_TOTAL_SIZE latching while the CWD entry is allocated then
deallocated. Base/per-TPC size are module params for A/B.
m72: change-detecting SKED transition recorder in the launch poll (CWD_T0/1/2,
HWW_INFO_1/2, ACTIVITY, HWW_ESR, GRFIFO, FECS current/new/ctxsw status) and
extended post-mortem readbacks (HWW_ESR_EN, INFO_1/2/3, CWD_T2, watermarks).
m72-r2 sampler result: the QMD enters SKED (CWD_T0=0x11300 STATUS=ACTIVE,
CWD_T1=0x1070) and HWW_ESR stays 0 with the lmem block, but the FECS context
load never completes: NEW_CTX=0x001f42b0 (V7 FBMEM instance, VALID=0) then
CURRENT=0; the task frees (CWD_T0=0x12000 DEP=PENDING_TASK_COMPLETE). m63
(sysmem instance) had VALID=1 on the same load. m73 adds the sysmem
instance/RAMFC selector (gsp_phys_rmcall_gr_inst_sys; default 0 = FBMEM
capture shape) for the A/B.
|
| |
|
|
|
|
|
|
|
|
| |
readback deviation)
The m62 sysmem-chunk instance/ramfc made the server's writes host-readable
(job done: FECS showed V7's instance loaded with VALID=1, TARGET=3 sysmem),
but the captured real lane uses FBMEM slices and the GR engine core's
context restore may require VIDMEM instance/RAMFC. Keep every fix
(R1/E2/m68 prefetch/m69 win0) and restore the capture shape.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
m68 proved the program page's shadow copy contains real SASS (SASS_version
0x75) and the prefetch pair is fixed, yet the engine still never completes
and never writes its release anywhere - including a window-0 module sem.
Best remaining suspect: the window-1 scratch VA range (PT chain installed by
DMA_UPDATE_PDE_2 pdeIndex=1) has never been proven readable by the GR engine
core, unlike the window-0 GPFIFO/PB/QMDWIN small-PT line. m69 plants 8
module pages at VAs 0x108000..0x10f000 (slots 0x108..0x10f, same 128 B PT
fetch line, planted before first fetch like qmdwin), copies the resolved
program/param page content into them at launch and rewrites the QMD pointer
pairs there (param=32, program=48). Param: gsp_phys_rmcall_gr_shadow_win0.
|