summaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/gsp_rm_emulation.c27
-rw-r--r--kernel/gsp_rm_emulation.h1
-rw-r--r--kernel/main.c2
3 files changed, 25 insertions, 5 deletions
diff --git a/kernel/gsp_rm_emulation.c b/kernel/gsp_rm_emulation.c
index f44c01b..357997c 100644
--- a/kernel/gsp_rm_emulation.c
+++ b/kernel/gsp_rm_emulation.c
@@ -770,6 +770,19 @@ static void gsp_rm_evlog_post(struct nv_vgpu_device *vgpu,
unsigned gsp_rm_ev_seq;
unsigned gsp_rm_ev_nlist;
unsigned gsp_rm_ev_cl;
+/*
+ * r578: reachability probe for the guest-RM event drop. When nonzero, event
+ * records carry this RPC function instead of POST_EVENT (0x1003). Posting a
+ * function with an unmistakable guest-side side effect (e.g.
+ * NV_VGPU_MSG_EVENT_UCODE_LIBOS_PRINT 0x100C with an unsupported ucodeEngDesc
+ * trips NV_ASSERT_FAILED in _kgspRpcUcodeLibosPrint, or
+ * NV_VGPU_MSG_EVENT_OS_ERROR_LOG 0x1006 logs an errString) proves whether
+ * the guest ever DISPATCHES our status-queue event records: visible side
+ * effect => the dispatch works and POST_EVENT is dropped inside
+ * _kgspRpcPostEvent; no side effect => the records are consumed without
+ * dispatch.
+ */
+unsigned gsp_rm_ev_func;
static void gsp_rm_fill_ev_payload(const struct gsp_rm_emu *rm, u32 i,
u8 *payload)
@@ -793,6 +806,11 @@ static u32 gsp_rm_ev_sequence(const struct gsp_rm_emu *rm)
return gsp_rm_ev_seq ? rm->stat_seq : 0;
}
+static u32 gsp_rm_ev_function(void)
+{
+ return gsp_rm_ev_func ? gsp_rm_ev_func : GSPRM_RPC_EVENT_POST_EVENT;
+}
+
/*
* Post the GPU event that tells the guest's CPU-side RM a channel's
* submitted work is complete. A real GPU raises an interrupt, the host GSP
@@ -827,8 +845,7 @@ int gsp_rm_post_channel_event(struct nv_vgpu_device *vgpu, u32 h_src)
gsp_rm_fill_ev_payload(rm, i, payload);
{
- int rc = gsp_rm_send_flags(ctx,
- GSPRM_RPC_EVENT_POST_EVENT,
+ int rc = gsp_rm_send_flags(ctx, gsp_rm_ev_function(),
gsp_rm_ev_sequence(rm), 0,
payload, sizeof(payload),
true);
@@ -854,7 +871,7 @@ int gsp_rm_post_channel_event(struct nv_vgpu_device *vgpu, u32 h_src)
gsp_rm_fill_ev_payload(rm, i, payload);
{
int rc = gsp_rm_send_flags(ctx,
- GSPRM_RPC_EVENT_POST_EVENT,
+ gsp_rm_ev_function(),
gsp_rm_ev_sequence(rm),
0, payload,
sizeof(payload),
@@ -896,7 +913,7 @@ static int gsp_rm_post_event_idx(struct gsp_emu_context *ctx, u32 idx)
gsp_rm_fill_ev_payload(rm, idx, payload);
- rc = gsp_rm_send(ctx, GSPRM_RPC_EVENT_POST_EVENT,
+ rc = gsp_rm_send(ctx, gsp_rm_ev_function(),
gsp_rm_ev_sequence(rm), 0, payload, sizeof(payload));
if (!rc)
rm->events[idx].last_post = jiffies;
@@ -977,7 +994,7 @@ int gsp_rm_post_all_events(struct nv_vgpu_device *vgpu)
gsp_rm_fill_ev_payload(rm, i, payload);
{
- int rc = gsp_rm_send(ctx, GSPRM_RPC_EVENT_POST_EVENT,
+ int rc = gsp_rm_send(ctx, gsp_rm_ev_function(),
gsp_rm_ev_sequence(rm), 0,
payload, sizeof(payload));
diff --git a/kernel/gsp_rm_emulation.h b/kernel/gsp_rm_emulation.h
index 85ee4d9..a0bd4c7 100644
--- a/kernel/gsp_rm_emulation.h
+++ b/kernel/gsp_rm_emulation.h
@@ -224,6 +224,7 @@ extern unsigned gsp_rm_ev_log_max;
extern unsigned gsp_rm_ev_seq;
extern unsigned gsp_rm_ev_nlist;
extern unsigned gsp_rm_ev_cl;
+extern unsigned gsp_rm_ev_func;
int gsp_rm_emu_init(struct nv_vgpu_device *vgpu, struct gsp_emu_context *ctx);
void gsp_rm_emu_fini(struct gsp_emu_context *ctx);
diff --git a/kernel/main.c b/kernel/main.c
index 8d02e5b..d821762 100644
--- a/kernel/main.c
+++ b/kernel/main.c
@@ -2822,6 +2822,8 @@ module_param_named(gsp_rm_ev_nlist, gsp_rm_ev_nlist, uint, 0644);
MODULE_PARM_DESC(gsp_rm_ev_nlist, "set bNotifyList on event records (default 0: specific-hEvent dispatch)");
module_param_named(gsp_rm_ev_cl, gsp_rm_ev_cl, uint, 0644);
MODULE_PARM_DESC(gsp_rm_ev_cl, "override event record hClient (default 0: the allocating client)");
+module_param_named(gsp_rm_ev_func, gsp_rm_ev_func, uint, 0644);
+MODULE_PARM_DESC(gsp_rm_ev_func, "reachability probe: event records carry this RPC function instead of POST_EVENT 0x1003 (default 0)");
module_param_named(gsp_sema_walk_trace, gsp_sema_walk_trace, uint, 0644);
MODULE_PARM_DESC(gsp_sema_walk_trace, "Trace GMMU walks for unresolved high-VA operands (default 0: off)");