summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_rm_emulation.c
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-23 03:24:05 -0400
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-23 03:24:05 -0400
commit1cd0671aae148221cde0cf1c90853926e1dde5c3 (patch)
treeb64db88c5d9065f9f843708984647bf5c9cce0f9 /kernel/gsp_rm_emulation.c
parentd940dd1dee888c21799fa1e103de2477f337fc54 (diff)
downloadopen-iov-1cd0671aae148221cde0cf1c90853926e1dde5c3.tar.gz
open-iov-1cd0671aae148221cde0cf1c90853926e1dde5c3.zip
r522 the BINAPI-07 oracle parent fix: the guest allocates class 0x2081 under the SUBDEVICE (0xbeef0004 is the class-0x2080 child), so mirror that on the backend - the device parent answered NV_ERR_INVALID_OBJECT_PARENT (0x36)
Diffstat (limited to 'kernel/gsp_rm_emulation.c')
-rw-r--r--kernel/gsp_rm_emulation.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/kernel/gsp_rm_emulation.c b/kernel/gsp_rm_emulation.c
index b4c2872..6996469 100644
--- a/kernel/gsp_rm_emulation.c
+++ b/kernel/gsp_rm_emulation.c
@@ -3076,9 +3076,12 @@ static bool gsp_rm_ctrl_forward(struct gsp_emu_context *ctx,
/*
* Allocate the backend's BINAPI object: rpc_gsp_rm_alloc_v03_00
* { hClient, hParent, hObject=0, hClass, status, paramsSize=0,
- * flags, reserved[4] }. The guest's own alloc used the DEVICE
- * as parent (hParent=0xbeef0004), so mirror that. The reply
- * carries status at +16 and the chosen handle at +32.
+ * flags, reserved[4] }. The guest's own alloc used the
+ * SUBDEVICE as parent (hParent=0xbeef0004 where 0xbeef0004 is
+ * the class-0x2080 child 0xbeef0003; the first attempt with the
+ * device parent came back NV_ERR_INVALID_OBJECT_PARENT, 0x36),
+ * so mirror that. The reply carries status at +16 and the
+ * chosen handle at +32.
*/
u8 *areq;
void *arsp = NULL;
@@ -3089,7 +3092,7 @@ static bool gsp_rm_ctrl_forward(struct gsp_emu_context *ctx,
if (!areq)
goto fallback;
memcpy(areq + 0, &snap.h_internal_client, 4);
- memcpy(areq + 4, &snap.h_internal_device, 4);
+ memcpy(areq + 4, &snap.h_internal_subdevice, 4);
memcpy(areq + 12, &acls, 4);
ret = gsp_phys_backend_rpc(GSPRM_RPC_FUNC_GSP_RM_ALLOC, areq,
32, &arsp, &arsp_len, 500);