AI Trajectory


Trajectory: (Expand/Collapse All)
Seq Timestamp Type Name Duration
0/0 2026/08/03 04:57 flow patch-triage
1m Args:
null

Results:
{
  "EnableConfigs": null,
  "FocusSymbols": [],
  "Reasoning": "The patch contains a compilation error: `cpu-\u003earch.doorbell_request = 0;` should be `vcpu-\u003earch.doorbell_request = 0;`. Since it fails to compile, it cannot be fuzzed.",
  "WorthFuzzing": false
}

1/1 2026/08/03 04:57 action read-patch-diff
0m Args:
null

Results:
{
  "PatchDiff": "commit 40da08e58514343fcb885b8a82ad01e28bc319c4\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate:   Mon Aug 3 04:57:37 2026 +0000\n\n    syz-cluster: applied patch under review\n\ndiff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c\nindex 61dbeea317f3b..40f8717b8a7d5 100644\n--- a/arch/powerpc/kvm/book3s_hv.c\n+++ b/arch/powerpc/kvm/book3s_hv.c\n@@ -15,6 +15,7 @@\n  * by Alexander Graf \u003cagraf@suse.de\u003e.\n  */\n \n+#include \"asm/guest-state-buffer.h\"\n #include \u003clinux/kvm_host.h\u003e\n #include \u003clinux/kernel.h\u003e\n #include \u003clinux/err.h\u003e\n@@ -4253,11 +4254,6 @@ static int kvmhv_vcpu_entry_nestedv2(struct kvm_vcpu *vcpu, u64 time_limit,\n \tint trap;\n \tlong rc;\n \n-\tif (vcpu-\u003earch.doorbell_request) {\n-\t\tvcpu-\u003earch.doorbell_request = 0;\n-\t\tkvmppc_set_dpdes(vcpu, 1);\n-\t}\n-\n \tio = \u0026vcpu-\u003earch.nestedv2_io;\n \n \tmsr = mfmsr();\n@@ -4265,6 +4261,9 @@ static int kvmhv_vcpu_entry_nestedv2(struct kvm_vcpu *vcpu, u64 time_limit,\n \tif (lazy_irq_pending())\n \t\treturn 0;\n \n+\tif (vcpu-\u003earch.doorbell_request)\n+\t\tkvmppc_set_dpdes(vcpu, 1);\n+\n \trc = kvmhv_nestedv2_flush_vcpu(vcpu, time_limit);\n \tif (rc \u003c 0)\n \t\treturn -EINVAL;\n@@ -4296,6 +4295,17 @@ static int kvmhv_vcpu_entry_nestedv2(struct kvm_vcpu *vcpu, u64 time_limit,\n \tif (rc \u003c 0)\n \t\treturn -EINVAL;\n \n+\t/* Check if privileged door bell was requested and handled */\n+\tif (vcpu-\u003earch.vcore-\u003edpdes) {\n+\t\tkvmhv_nestedv2_cached_reload(vcpu, KVMPPC_GSID_DPDES);\n+\t\tif (vcpu-\u003earch.vcore-\u003edpdes)\n+\t\t\tvcpu-\u003earch.doorbell_request |= vcpu-\u003earch.vcore-\u003edpdes;\n+\t\telse\n+\t\t\tcpu-\u003earch.doorbell_request = 0;\n+\t} else {\n+\t\tvcpu-\u003earch.doorbell_request = 0;\n+\t}\n+\n \ttimer_rearm_host_dec(*tb);\n \n \t/* Record context switch and guest_run_time data */\n"
}

2/1 2026/08/03 04:57 agent patch-evaluator
1m Model:
best-expensive

Args:
null

Results:
{
  "EnableConfigs": null,
  "FocusSymbols": [],
  "Reasoning": "The patch contains a compilation error: `cpu-\u003earch.doorbell_request = 0;` should be `vcpu-\u003earch.doorbell_request = 0;`. Since it fails to compile, it cannot be fuzzed.",
  "WorthFuzzing": false
}

Instruction:
You are an expert Linux kernel maintainer.
Your job is to review a provided patch series and determine
if it makes functional changes to the kernel that should be fuzzed.

IMPORTANT: The changes have ALREADY been applied and committed as the HEAD commit in
your workspace. Do NOT rely on your internal knowledge of the kernel. You must actively
use your code access tools to examine the actual source code and confirm any assumptions.

Return WorthFuzzing=false if the patch only contains:
- Modifications to Documentation/, Kconfig files, or code comments.
- Purely decorative changes, such as logging (e.g., pr_err, printk) or tracepoints.
- Changes to numeric constants or macros that do not functionally alter execution flow.
- Code paths that are impossible to reach in virtualized environments like GCE or QEMU,
  even when utilizing software-emulated hardware (e.g., usb gadget, mac80211_hwsim).
- Code in vendor-specific PCIe switch, SmartNIC, or GPU drivers (e.g., mlxsw, pds_core, qed,
  ionic, amdgpu) that require physical PCIe hardware cards not emulated in standard QEMU.
- Driver .remove, .shutdown, or pci_unregister_driver teardown callbacks (e.g., igb_remove)
  that are executed only during PCI hot-unplug or sysfs driver unbind operations.

If it modifies reachable core kernel logic, drivers, or architectures, use your code search
tools to verify the code can be executed, then return WorthFuzzing=true.

When returning WorthFuzzing=true, you MUST ALSO:
1. Extract any specific kernel functions that should be heavily fuzzed into FocusSymbols.
   Avoid listing generic hot-path functions to prevent skewed test distributions.
   Prefer non-static, non-inlined API entrypoint functions over internal static helper functions
   (which are inlined by the compiler and do not have distinct symbol addresses).
2. Identify any specific CONFIG_ options required to properly test this new/modified feature.
   Go and look into the Kconfig files and check for ifdefs around the code, do not make assumptions.
   Also check "depends on" lines in Kconfig to include any non-standard parent subsystem configs
   needed for Kbuild to compile the code statically into vmlinux. List them in the EnableConfigs
   output array, and DO NOT add a 'CONFIG_' prefix (e.g., return "NET_IPV4" instead of "CONFIG_NET_IPV4").
Prefer calling several tools at the same time to save round-trips.


Use set-results tool to provide results of the analysis.
It must be called exactly once before the final reply.
Ignore results of this tool.

Prompt:
For your convenience, here is the diff of the changes:
commit 40da08e58514343fcb885b8a82ad01e28bc319c4
Author: syz-cluster <triage@syzkaller.com>
Date:   Mon Aug 3 04:57:37 2026 +0000

    syz-cluster: applied patch under review

diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index 61dbeea317f3b..40f8717b8a7d5 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -15,6 +15,7 @@
  * by Alexander Graf <agraf@suse.de>.
  */
 
+#include "asm/guest-state-buffer.h"
 #include <linux/kvm_host.h>
 #include <linux/kernel.h>
 #include <linux/err.h>
@@ -4253,11 +4254,6 @@ static int kvmhv_vcpu_entry_nestedv2(struct kvm_vcpu *vcpu, u64 time_limit,
 	int trap;
 	long rc;
 
-	if (vcpu->arch.doorbell_request) {
-		vcpu->arch.doorbell_request = 0;
-		kvmppc_set_dpdes(vcpu, 1);
-	}
-
 	io = &vcpu->arch.nestedv2_io;
 
 	msr = mfmsr();
@@ -4265,6 +4261,9 @@ static int kvmhv_vcpu_entry_nestedv2(struct kvm_vcpu *vcpu, u64 time_limit,
 	if (lazy_irq_pending())
 		return 0;
 
+	if (vcpu->arch.doorbell_request)
+		kvmppc_set_dpdes(vcpu, 1);
+
 	rc = kvmhv_nestedv2_flush_vcpu(vcpu, time_limit);
 	if (rc < 0)
 		return -EINVAL;
@@ -4296,6 +4295,17 @@ static int kvmhv_vcpu_entry_nestedv2(struct kvm_vcpu *vcpu, u64 time_limit,
 	if (rc < 0)
 		return -EINVAL;
 
+	/* Check if privileged door bell was requested and handled */
+	if (vcpu->arch.vcore->dpdes) {
+		kvmhv_nestedv2_cached_reload(vcpu, KVMPPC_GSID_DPDES);
+		if (vcpu->arch.vcore->dpdes)
+			vcpu->arch.doorbell_request |= vcpu->arch.vcore->dpdes;
+		else
+			cpu->arch.doorbell_request = 0;
+	} else {
+		vcpu->arch.doorbell_request = 0;
+	}
+
 	timer_rearm_host_dec(*tb);
 
 	/* Record context switch and guest_run_time data */

3/2 2026/08/03 04:57 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 2582
							output: 47
							thoughts: 183
						

Thoughts:
**Analyzing the KVM/PowerPC Patch**

Okay, so this patch is touching `arch/powerpc/kvm/book3s_hv.c`, specifically the `kvmhv_vcpu_entry_nestedv2` function. It seems like we're moving some logic around related to `vcpu->arch.doorbell_request` and `kvmppc_set_dpdes`. Hmm, also looks like there's an added check for `vcpu->arch.vcore->dpdes` and an update to `vcpu->arch.doorbell_request` there too. This could be interesting from a performance perspective, or maybe related to some new feature.

Let me just quickly scan for potential typos or subtle bugs. Ah, wait a second. I see this line: `cpu->arch.doorbell_request = 0;`. That looks a bit odd; is `cpu` actually in scope within `kvmhv_vcpu_entry_nestedv2`? I don't recall seeing it defined there. Better double-check the context, especially around that area of `arch/powerpc/kvm/book3s_hv.c` around line 4295. This could be a simple typo, or it might point to a bigger issue with how that variable is being used. Let's see...



4/2 2026/08/03 04:57 tool grepper
0m Args:
{
  "Expression": "kvmhv_vcpu_entry_nestedv2",
  "PathPrefix": "arch/powerpc/kvm/book3s_hv.c"
}

Results:
{
  "Output": "arch/powerpc/kvm/book3s_hv.c=4244=static void do_trace_nested_cs_time(struct kvm_vcpu *vcpu)\n--\narch/powerpc/kvm/book3s_hv.c-4248-\narch/powerpc/kvm/book3s_hv.c:4249:static int kvmhv_vcpu_entry_nestedv2(struct kvm_vcpu *vcpu, u64 time_limit,\narch/powerpc/kvm/book3s_hv.c-4250-\t\t\t\t     unsigned long lpcr, u64 *tb)\n--\narch/powerpc/kvm/book3s_hv.c=4423=static int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit,\n--\narch/powerpc/kvm/book3s_hv.c-4446-\t\telse\narch/powerpc/kvm/book3s_hv.c:4447:\t\t\ttrap = kvmhv_vcpu_entry_nestedv2(vcpu, time_limit, lpcr, tb);\narch/powerpc/kvm/book3s_hv.c-4448-\n"
}

5/2 2026/08/03 04:57 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 3423
							output: 45
							thoughts: 21
						

Thoughts:
Here's my take on the thought process, as requested:

**Diving into `kvmhv_vcpu_entry_nestedv2`**

Alright, time to dig into `kvmhv_vcpu_entry_nestedv2`. My immediate thought is, what are we really looking at here? It's clearly a critical entry point – the name screams nested virtualization – so this is where a virtual CPU (vCPU) of a guest is entering a nested hypervisor (likely KVM-HV). I need to understand the control flow. What's the context switching happening? What state is being saved and restored? Is there anything clever going on related to shadow paging or other memory management tricks?

My initial questions involve:

*   **Synchronization:** How is this function protected against concurrent access? Is it reentrant? Any locks or atomic operations being used to keep things sane when multiple vCPUs potentially enter this routine simultaneously?
*   **Registers:** What registers are being saved, and why? Is it a complete save of the guest's context, or a partial save with optimizations? What architectural considerations are driving the choice?
*   **EPT/Shadow Paging:** I need to look closely at whether and how extended page tables (EPT) or any kind of shadow paging mechanism is being manipulated. Nested virtualization demands efficient translation between guest physical addresses, host physical addresses, and potentially, the nested hypervisor's physical addresses. The core of the performance is frequently the paging path.
*   **VM Exit/Entry:** How does this function relate to the VM entry and exit mechanisms? Is this function called after a VM exit, and if so, how does it handle the exception that caused the exit? What about the reverse?
*   **Error Handling:** What's the error handling look like? Are there any potential failure points that need careful consideration in a production setting? What logging or debugging facilities are implemented here?
*   **Virtualization Instructions:** The function's use of virtualization instructions is, of course, critical. VM-Enter and VM-Exit instructions are the heart of this. It will be important to confirm the correct handling of any control registers involved (e.g., VMCS).

Ultimately, I expect this function to be a linchpin in the nested virtualization stack. Understanding it thoroughly is the key to both optimizing performance and ensuring robustness. Let's see what's actually in it...



6/2 2026/08/03 04:57 tool read-file
0m Args:
{
  "File": "arch/powerpc/kvm/book3s_hv.c",
  "FirstLine": 4249,
  "LineCount": 100
}

Results:
{
  "Contents": "4249:\tstatic int kvmhv_vcpu_entry_nestedv2(struct kvm_vcpu *vcpu, u64 time_limit,\n4250:\t\t\t\t\t     unsigned long lpcr, u64 *tb)\n4251:\t{\n4252:\t\tstruct kvmhv_nestedv2_io *io;\n4253:\t\tunsigned long msr, i;\n4254:\t\tint trap;\n4255:\t\tlong rc;\n4256:\t\n4257:\t\tio = \u0026vcpu-\u003earch.nestedv2_io;\n4258:\t\n4259:\t\tmsr = mfmsr();\n4260:\t\tkvmppc_msr_hard_disable_set_facilities(vcpu, msr);\n4261:\t\tif (lazy_irq_pending())\n4262:\t\t\treturn 0;\n4263:\t\n4264:\t\tif (vcpu-\u003earch.doorbell_request)\n4265:\t\t\tkvmppc_set_dpdes(vcpu, 1);\n4266:\t\n4267:\t\trc = kvmhv_nestedv2_flush_vcpu(vcpu, time_limit);\n4268:\t\tif (rc \u003c 0)\n4269:\t\t\treturn -EINVAL;\n4270:\t\n4271:\t\tkvmppc_gse_put_u64(io-\u003evcpu_run_input, KVMPPC_GSID_LPCR, lpcr);\n4272:\t\n4273:\t\taccumulate_time(vcpu, \u0026vcpu-\u003earch.in_guest);\n4274:\t\trc = plpar_guest_run_vcpu(0, vcpu-\u003ekvm-\u003earch.lpid, vcpu-\u003evcpu_id,\n4275:\t\t\t\t\t  \u0026trap, \u0026i);\n4276:\t\n4277:\t\tif (rc != H_SUCCESS) {\n4278:\t\t\tpr_err(\"KVM Guest Run VCPU hcall failed\\n\");\n4279:\t\t\tif (rc == H_INVALID_ELEMENT_ID)\n4280:\t\t\t\tpr_err(\"KVM: Guest Run VCPU invalid element id at %ld\\n\", i);\n4281:\t\t\telse if (rc == H_INVALID_ELEMENT_SIZE)\n4282:\t\t\t\tpr_err(\"KVM: Guest Run VCPU invalid element size at %ld\\n\", i);\n4283:\t\t\telse if (rc == H_INVALID_ELEMENT_VALUE)\n4284:\t\t\t\tpr_err(\"KVM: Guest Run VCPU invalid element value at %ld\\n\", i);\n4285:\t\t\treturn -EINVAL;\n4286:\t\t}\n4287:\t\taccumulate_time(vcpu, \u0026vcpu-\u003earch.guest_exit);\n4288:\t\n4289:\t\t*tb = mftb();\n4290:\t\tkvmppc_gsm_reset(io-\u003evcpu_message);\n4291:\t\tkvmppc_gsm_reset(io-\u003evcore_message);\n4292:\t\tkvmppc_gsbm_zero(\u0026io-\u003evalids);\n4293:\t\n4294:\t\trc = kvmhv_nestedv2_parse_output(vcpu);\n4295:\t\tif (rc \u003c 0)\n4296:\t\t\treturn -EINVAL;\n4297:\t\n4298:\t\t/* Check if privileged door bell was requested and handled */\n4299:\t\tif (vcpu-\u003earch.vcore-\u003edpdes) {\n4300:\t\t\tkvmhv_nestedv2_cached_reload(vcpu, KVMPPC_GSID_DPDES);\n4301:\t\t\tif (vcpu-\u003earch.vcore-\u003edpdes)\n4302:\t\t\t\tvcpu-\u003earch.doorbell_request |= vcpu-\u003earch.vcore-\u003edpdes;\n4303:\t\t\telse\n4304:\t\t\t\tcpu-\u003earch.doorbell_request = 0;\n4305:\t\t} else {\n4306:\t\t\tvcpu-\u003earch.doorbell_request = 0;\n4307:\t\t}\n4308:\t\n4309:\t\ttimer_rearm_host_dec(*tb);\n4310:\t\n4311:\t\t/* Record context switch and guest_run_time data */\n4312:\t\tif (kvmhv_get_l2_counters_status())\n4313:\t\t\tdo_trace_nested_cs_time(vcpu);\n4314:\t\n4315:\t\treturn trap;\n4316:\t}\n4317:\t\n4318:\t/* call our hypervisor to load up HV regs and go */\n4319:\tstatic int kvmhv_vcpu_entry_p9_nested(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpcr, u64 *tb)\n4320:\t{\n4321:\t\tunsigned long host_psscr;\n4322:\t\tunsigned long msr;\n4323:\t\tstruct hv_guest_state hvregs;\n4324:\t\tstruct p9_host_os_sprs host_os_sprs;\n4325:\t\ts64 dec;\n4326:\t\tint trap;\n4327:\t\n4328:\t\tmsr = mfmsr();\n4329:\t\n4330:\t\tsave_p9_host_os_sprs(\u0026host_os_sprs);\n4331:\t\n4332:\t\t/*\n4333:\t\t * We need to save and restore the guest visible part of the\n4334:\t\t * psscr (i.e. using SPRN_PSSCR_PR) since the hypervisor\n4335:\t\t * doesn't do this for us. Note only required if pseries since\n4336:\t\t * this is done in kvmhv_vcpu_entry_p9() below otherwise.\n4337:\t\t */\n4338:\t\thost_psscr = mfspr(SPRN_PSSCR_PR);\n4339:\t\n4340:\t\tkvmppc_msr_hard_disable_set_facilities(vcpu, msr);\n4341:\t\tif (lazy_irq_pending())\n4342:\t\t\treturn 0;\n4343:\t\n4344:\t\tif (unlikely(load_vcpu_state(vcpu, \u0026host_os_sprs)))\n4345:\t\t\tmsr = mfmsr(); /* TM restore can update msr */\n4346:\t\n4347:\t\tif (vcpu-\u003earch.psscr != host_psscr)\n4348:\t\t\tmtspr(SPRN_PSSCR_PR, vcpu-\u003earch.psscr);\n"
}

7/2 2026/08/03 04:57 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 5723
							output: 36
							thoughts: 52
						

Thoughts:
Okay, here's my take on those thoughts, tailored for an expert audience:

**Debugging a Potential Race Condition**

Alright, right there, line 4304 – `cpu->arch.doorbell_request = 0;`. I'm focusing in on that bit of code. Specifically, the assignment. My initial hunch is that we are trying to set the `doorbell_request` flag to zero on a particular CPU's architecture. Sounds straightforward enough, but my internal alarm bells are already starting to ring.

The critical question immediately surfacing in my mind is: where is `cpu` coming from? Before I dive too deep, I need to verify that `cpu` is properly declared and initialized. Is this a local variable within a function, or perhaps a global variable defined somewhere else in the codebase? It's crucial to understand the scope and lifetime of this variable. Alternatively, could it even be a macro? Macros are tricky and can introduce subtle bugs if you are not very careful. I need to trace back how it's defined and when/where it's used. This quick check will save a lot of head-scratching later if it's not what I expect it to be.



8/2 2026/08/03 04:57 tool grepper
0m Args:
{
  "Expression": "cpu",
  "PathPrefix": "arch/powerpc/kvm/book3s_hv.c"
}

Results:
{
  "Output": "\nFull output is too long, showing 500 out of 3518 lines.\nUse more precise expression if possible.\n\narch/powerpc/kvm/book3s_hv.c-29-#include \u003clinux/anon_inodes.h\u003e\narch/powerpc/kvm/book3s_hv.c:30:#include \u003clinux/cpu.h\u003e\narch/powerpc/kvm/book3s_hv.c:31:#include \u003clinux/cpumask.h\u003e\narch/powerpc/kvm/book3s_hv.c-32-#include \u003clinux/spinlock.h\u003e\n--\narch/powerpc/kvm/book3s_hv.c-54-#include \u003casm/disassemble.h\u003e\narch/powerpc/kvm/book3s_hv.c:55:#include \u003casm/cputable.h\u003e\narch/powerpc/kvm/book3s_hv.c-56-#include \u003casm/cacheflush.h\u003e\n--\narch/powerpc/kvm/book3s_hv.c-65-#include \u003casm/processor.h\u003e\narch/powerpc/kvm/book3s_hv.c:66:#include \u003casm/cputhreads.h\u003e\narch/powerpc/kvm/book3s_hv.c-67-#include \u003casm/page.h\u003e\n--\narch/powerpc/kvm/book3s_hv.c=133=MODULE_PARM_DESC(nested, \"Enable nested virtualization (only on POWER9)\");\narch/powerpc/kvm/book3s_hv.c-134-\narch/powerpc/kvm/book3s_hv.c:135:static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu);\narch/powerpc/kvm/book3s_hv.c-136-\n--\narch/powerpc/kvm/book3s_hv.c=151=static unsigned long p8_rwmr_values[MAX_SMT_THREADS + 1] = {\n--\narch/powerpc/kvm/book3s_hv.c-162-\narch/powerpc/kvm/book3s_hv.c:163:static inline struct kvm_vcpu *next_runnable_thread(struct kvmppc_vcore *vc,\narch/powerpc/kvm/book3s_hv.c-164-\t\tint *ip)\n--\narch/powerpc/kvm/book3s_hv.c-166-\tint i = *ip;\narch/powerpc/kvm/book3s_hv.c:167:\tstruct kvm_vcpu *vcpu;\narch/powerpc/kvm/book3s_hv.c-168-\narch/powerpc/kvm/book3s_hv.c-169-\twhile (++i \u003c MAX_SMT_THREADS) {\narch/powerpc/kvm/book3s_hv.c:170:\t\tvcpu = READ_ONCE(vc-\u003erunnable_threads[i]);\narch/powerpc/kvm/book3s_hv.c:171:\t\tif (vcpu) {\narch/powerpc/kvm/book3s_hv.c-172-\t\t\t*ip = i;\narch/powerpc/kvm/book3s_hv.c:173:\t\t\treturn vcpu;\narch/powerpc/kvm/book3s_hv.c-174-\t\t}\n--\narch/powerpc/kvm/book3s_hv.c-179-/* Used to traverse the list of runnable threads for a given vcore */\narch/powerpc/kvm/book3s_hv.c:180:#define for_each_runnable_thread(i, vcpu, vc) \\\narch/powerpc/kvm/book3s_hv.c:181:\tfor (i = -1; (vcpu = next_runnable_thread(vc, \u0026i)); )\narch/powerpc/kvm/book3s_hv.c-182-\narch/powerpc/kvm/book3s_hv.c:183:static bool kvmppc_ipi_thread(int cpu)\narch/powerpc/kvm/book3s_hv.c-184-{\n--\narch/powerpc/kvm/book3s_hv.c-190-\narch/powerpc/kvm/book3s_hv.c:191:\t/* On POWER9 we can use msgsnd to IPI any cpu */\narch/powerpc/kvm/book3s_hv.c:192:\tif (cpu_has_feature(CPU_FTR_ARCH_300)) {\narch/powerpc/kvm/book3s_hv.c:193:\t\tmsg |= get_hard_smp_processor_id(cpu);\narch/powerpc/kvm/book3s_hv.c-194-\t\tsmp_mb();\n--\narch/powerpc/kvm/book3s_hv.c-199-\t/* On POWER8 for IPIs to threads in the same core, use msgsnd */\narch/powerpc/kvm/book3s_hv.c:200:\tif (cpu_has_feature(CPU_FTR_ARCH_207S)) {\narch/powerpc/kvm/book3s_hv.c-201-\t\tpreempt_disable();\narch/powerpc/kvm/book3s_hv.c:202:\t\tif (cpu_first_thread_sibling(cpu) ==\narch/powerpc/kvm/book3s_hv.c:203:\t\t    cpu_first_thread_sibling(smp_processor_id())) {\narch/powerpc/kvm/book3s_hv.c:204:\t\t\tmsg |= cpu_thread_in_core(cpu);\narch/powerpc/kvm/book3s_hv.c-205-\t\t\tsmp_mb();\n--\narch/powerpc/kvm/book3s_hv.c-213-#if defined(CONFIG_PPC_ICP_NATIVE) \u0026\u0026 defined(CONFIG_SMP)\narch/powerpc/kvm/book3s_hv.c:214:\tif (cpu \u003e= 0 \u0026\u0026 cpu \u003c nr_cpu_ids) {\narch/powerpc/kvm/book3s_hv.c:215:\t\tif (paca_ptrs[cpu]-\u003ekvm_hstate.xics_phys) {\narch/powerpc/kvm/book3s_hv.c:216:\t\t\txics_wake_cpu(cpu);\narch/powerpc/kvm/book3s_hv.c-217-\t\t\treturn true;\narch/powerpc/kvm/book3s_hv.c-218-\t\t}\narch/powerpc/kvm/book3s_hv.c:219:\t\topal_int_set_mfrr(get_hard_smp_processor_id(cpu), IPI_PRIORITY);\narch/powerpc/kvm/book3s_hv.c-220-\t\treturn true;\n--\narch/powerpc/kvm/book3s_hv.c-226-\narch/powerpc/kvm/book3s_hv.c:227:static void kvmppc_fast_vcpu_kick_hv(struct kvm_vcpu *vcpu)\narch/powerpc/kvm/book3s_hv.c-228-{\narch/powerpc/kvm/book3s_hv.c:229:\tint cpu;\narch/powerpc/kvm/book3s_hv.c-230-\tstruct rcuwait *waitp;\n--\narch/powerpc/kvm/book3s_hv.c-233-\t * rcuwait_wake_up contains smp_mb() which orders prior stores that\narch/powerpc/kvm/book3s_hv.c:234:\t * create pending work vs below loads of cpu fields. The other side\narch/powerpc/kvm/book3s_hv.c:235:\t * is the barrier in vcpu run that orders setting the cpu fields vs\narch/powerpc/kvm/book3s_hv.c-236-\t * testing for pending work.\n--\narch/powerpc/kvm/book3s_hv.c-238-\narch/powerpc/kvm/book3s_hv.c:239:\twaitp = kvm_arch_vcpu_get_wait(vcpu);\narch/powerpc/kvm/book3s_hv.c-240-\tif (rcuwait_wake_up(waitp))\narch/powerpc/kvm/book3s_hv.c:241:\t\t++vcpu-\u003estat.generic.halt_wakeup;\narch/powerpc/kvm/book3s_hv.c-242-\narch/powerpc/kvm/book3s_hv.c:243:\tcpu = READ_ONCE(vcpu-\u003earch.thread_cpu);\narch/powerpc/kvm/book3s_hv.c:244:\tif (cpu \u003e= 0 \u0026\u0026 kvmppc_ipi_thread(cpu))\narch/powerpc/kvm/book3s_hv.c-245-\t\treturn;\n--\narch/powerpc/kvm/book3s_hv.c-247-\t/* CPU points to the first thread of the core */\narch/powerpc/kvm/book3s_hv.c:248:\tcpu = vcpu-\u003ecpu;\narch/powerpc/kvm/book3s_hv.c:249:\tif (cpu \u003e= 0 \u0026\u0026 cpu \u003c nr_cpu_ids \u0026\u0026 cpu_online(cpu))\narch/powerpc/kvm/book3s_hv.c:250:\t\tsmp_send_reschedule(cpu);\narch/powerpc/kvm/book3s_hv.c-251-}\n--\narch/powerpc/kvm/book3s_hv.c-253-/*\narch/powerpc/kvm/book3s_hv.c:254: * We use the vcpu_load/put functions to measure stolen time.\narch/powerpc/kvm/book3s_hv.c-255- *\narch/powerpc/kvm/book3s_hv.c:256: * Stolen time is counted as time when either the vcpu is able to\narch/powerpc/kvm/book3s_hv.c-257- * run as part of a virtual core, but the task running the vcore\narch/powerpc/kvm/book3s_hv.c:258: * is preempted or sleeping, or when the vcpu needs something done\narch/powerpc/kvm/book3s_hv.c:259: * in the kernel by the task running the vcpu, but that task is\narch/powerpc/kvm/book3s_hv.c-260- * preempted or sleeping.  Those two things have to be counted\narch/powerpc/kvm/book3s_hv.c:261: * separately, since one of the vcpu tasks will take on the job\narch/powerpc/kvm/book3s_hv.c:262: * of running the core, and the other vcpu tasks in the vcore will\narch/powerpc/kvm/book3s_hv.c-263- * sleep waiting for it to do that, but that sleep shouldn't count\n--\narch/powerpc/kvm/book3s_hv.c-265- *\narch/powerpc/kvm/book3s_hv.c:266: * Hence we accumulate stolen time when the vcpu can run as part of\narch/powerpc/kvm/book3s_hv.c:267: * a vcore using vc-\u003estolen_tb, and the stolen time when the vcpu\narch/powerpc/kvm/book3s_hv.c-268- * needs its task to do other things in the kernel (for example,\narch/powerpc/kvm/book3s_hv.c-269- * service a page fault) in busy_stolen.  We don't accumulate\narch/powerpc/kvm/book3s_hv.c:270: * stolen time for a vcore when it is inactive, or for a vcpu\narch/powerpc/kvm/book3s_hv.c-271- * when it is in state RUNNING or NOTREADY.  NOTREADY is a bit of\narch/powerpc/kvm/book3s_hv.c:272: * a misnomer; it means that the vcpu task is not executing in\narch/powerpc/kvm/book3s_hv.c-273- * the KVM_VCPU_RUN ioctl, i.e. it is in userspace or elsewhere in\narch/powerpc/kvm/book3s_hv.c-274- * the kernel.  We don't have any way of dividing up that time\narch/powerpc/kvm/book3s_hv.c:275: * between time that the vcpu is genuinely stopped, time that\narch/powerpc/kvm/book3s_hv.c:276: * the task is actively working on behalf of the vcpu, and time\narch/powerpc/kvm/book3s_hv.c-277- * that the task is preempted, so we don't count any of it as\n--\narch/powerpc/kvm/book3s_hv.c-285- *\narch/powerpc/kvm/book3s_hv.c:286: * The POWER9 path is simpler, one vcpu per virtual core so the\narch/powerpc/kvm/book3s_hv.c:287: * former case does not exist. If a vcpu is preempted when it is\narch/powerpc/kvm/book3s_hv.c-288- * BUSY_IN_HOST and not ceded or otherwise blocked, then accumulate\n--\narch/powerpc/kvm/book3s_hv.c=293=static void kvmppc_core_start_stolen(struct kvmppc_vcore *vc, u64 tb)\n--\narch/powerpc/kvm/book3s_hv.c-296-\narch/powerpc/kvm/book3s_hv.c:297:\tWARN_ON_ONCE(cpu_has_feature(CPU_FTR_ARCH_300));\narch/powerpc/kvm/book3s_hv.c-298-\n--\narch/powerpc/kvm/book3s_hv.c=304=static void kvmppc_core_end_stolen(struct kvmppc_vcore *vc, u64 tb)\n--\narch/powerpc/kvm/book3s_hv.c-307-\narch/powerpc/kvm/book3s_hv.c:308:\tWARN_ON_ONCE(cpu_has_feature(CPU_FTR_ARCH_300));\narch/powerpc/kvm/book3s_hv.c-309-\n--\narch/powerpc/kvm/book3s_hv.c-317-\narch/powerpc/kvm/book3s_hv.c:318:static void kvmppc_core_vcpu_load_hv(struct kvm_vcpu *vcpu, int cpu)\narch/powerpc/kvm/book3s_hv.c-319-{\narch/powerpc/kvm/book3s_hv.c:320:\tstruct kvmppc_vcore *vc = vcpu-\u003earch.vcore;\narch/powerpc/kvm/book3s_hv.c-321-\tunsigned long flags;\n--\narch/powerpc/kvm/book3s_hv.c-323-\narch/powerpc/kvm/book3s_hv.c:324:\tif (cpu_has_feature(CPU_FTR_ARCH_300)) {\narch/powerpc/kvm/book3s_hv.c:325:\t\tif (vcpu-\u003earch.busy_preempt != TB_NIL) {\narch/powerpc/kvm/book3s_hv.c:326:\t\t\tWARN_ON_ONCE(vcpu-\u003earch.state != KVMPPC_VCPU_BUSY_IN_HOST);\narch/powerpc/kvm/book3s_hv.c:327:\t\t\tvc-\u003estolen_tb += mftb() - vcpu-\u003earch.busy_preempt;\narch/powerpc/kvm/book3s_hv.c:328:\t\t\tvcpu-\u003earch.busy_preempt = TB_NIL;\narch/powerpc/kvm/book3s_hv.c-329-\t\t}\n--\narch/powerpc/kvm/book3s_hv.c-337-\t * because only this task ever sets vc-\u003erunner to this\narch/powerpc/kvm/book3s_hv.c:338:\t * vcpu, and once it is set to this vcpu, only this task\narch/powerpc/kvm/book3s_hv.c-339-\t * ever sets it to NULL.\narch/powerpc/kvm/book3s_hv.c-340-\t */\narch/powerpc/kvm/book3s_hv.c:341:\tif (vc-\u003erunner == vcpu \u0026\u0026 vc-\u003evcore_state \u003e= VCORE_SLEEPING)\narch/powerpc/kvm/book3s_hv.c-342-\t\tkvmppc_core_end_stolen(vc, now);\narch/powerpc/kvm/book3s_hv.c-343-\narch/powerpc/kvm/book3s_hv.c:344:\tspin_lock_irqsave(\u0026vcpu-\u003earch.tbacct_lock, flags);\narch/powerpc/kvm/book3s_hv.c:345:\tif (vcpu-\u003earch.state == KVMPPC_VCPU_BUSY_IN_HOST \u0026\u0026\narch/powerpc/kvm/book3s_hv.c:346:\t    vcpu-\u003earch.busy_preempt != TB_NIL) {\narch/powerpc/kvm/book3s_hv.c:347:\t\tvcpu-\u003earch.busy_stolen += now - vcpu-\u003earch.busy_preempt;\narch/powerpc/kvm/book3s_hv.c:348:\t\tvcpu-\u003earch.busy_preempt = TB_NIL;\narch/powerpc/kvm/book3s_hv.c-349-\t}\narch/powerpc/kvm/book3s_hv.c:350:\tspin_unlock_irqrestore(\u0026vcpu-\u003earch.tbacct_lock, flags);\narch/powerpc/kvm/book3s_hv.c-351-}\narch/powerpc/kvm/book3s_hv.c-352-\narch/powerpc/kvm/book3s_hv.c:353:static void kvmppc_core_vcpu_put_hv(struct kvm_vcpu *vcpu)\narch/powerpc/kvm/book3s_hv.c-354-{\narch/powerpc/kvm/book3s_hv.c:355:\tstruct kvmppc_vcore *vc = vcpu-\u003earch.vcore;\narch/powerpc/kvm/book3s_hv.c-356-\tunsigned long flags;\n--\narch/powerpc/kvm/book3s_hv.c-358-\narch/powerpc/kvm/book3s_hv.c:359:\tif (cpu_has_feature(CPU_FTR_ARCH_300)) {\narch/powerpc/kvm/book3s_hv.c-360-\t\t/*\n--\narch/powerpc/kvm/book3s_hv.c-363-\t\t */\narch/powerpc/kvm/book3s_hv.c:364:\t\tWARN_ON_ONCE(vcpu-\u003earch.state == KVMPPC_VCPU_RUNNABLE);\narch/powerpc/kvm/book3s_hv.c-365-\t\t/*\narch/powerpc/kvm/book3s_hv.c:366:\t\t * Account stolen time when preempted while the vcpu task is\narch/powerpc/kvm/book3s_hv.c-367-\t\t * running in the kernel (but not in qemu, which is INACTIVE).\n--\narch/powerpc/kvm/book3s_hv.c-369-\t\tif (task_is_running(current) \u0026\u0026\narch/powerpc/kvm/book3s_hv.c:370:\t\t\t\tvcpu-\u003earch.state == KVMPPC_VCPU_BUSY_IN_HOST)\narch/powerpc/kvm/book3s_hv.c:371:\t\t\tvcpu-\u003earch.busy_preempt = mftb();\narch/powerpc/kvm/book3s_hv.c-372-\t\treturn;\n--\narch/powerpc/kvm/book3s_hv.c-376-\narch/powerpc/kvm/book3s_hv.c:377:\tif (vc-\u003erunner == vcpu \u0026\u0026 vc-\u003evcore_state \u003e= VCORE_SLEEPING)\narch/powerpc/kvm/book3s_hv.c-378-\t\tkvmppc_core_start_stolen(vc, now);\narch/powerpc/kvm/book3s_hv.c-379-\narch/powerpc/kvm/book3s_hv.c:380:\tspin_lock_irqsave(\u0026vcpu-\u003earch.tbacct_lock, flags);\narch/powerpc/kvm/book3s_hv.c:381:\tif (vcpu-\u003earch.state == KVMPPC_VCPU_BUSY_IN_HOST)\narch/powerpc/kvm/book3s_hv.c:382:\t\tvcpu-\u003earch.busy_preempt = now;\narch/powerpc/kvm/book3s_hv.c:383:\tspin_unlock_irqrestore(\u0026vcpu-\u003earch.tbacct_lock, flags);\narch/powerpc/kvm/book3s_hv.c-384-}\narch/powerpc/kvm/book3s_hv.c-385-\narch/powerpc/kvm/book3s_hv.c:386:static void kvmppc_set_pvr_hv(struct kvm_vcpu *vcpu, u32 pvr)\narch/powerpc/kvm/book3s_hv.c-387-{\narch/powerpc/kvm/book3s_hv.c:388:\tvcpu-\u003earch.pvr = pvr;\narch/powerpc/kvm/book3s_hv.c-389-}\n--\narch/powerpc/kvm/book3s_hv.c=394=static inline unsigned long map_pcr_to_cap(unsigned long pcr)\n--\narch/powerpc/kvm/book3s_hv.c-402-\tcase PCR_ARCH_31:\narch/powerpc/kvm/book3s_hv.c:403:\t\tif (cpu_has_feature(CPU_FTR_P11_PVR))\narch/powerpc/kvm/book3s_hv.c-404-\t\t\tcap = H_GUEST_CAP_POWER11;\n--\narch/powerpc/kvm/book3s_hv.c-414-\narch/powerpc/kvm/book3s_hv.c:415:static int kvmppc_set_arch_compat(struct kvm_vcpu *vcpu, u32 arch_compat)\narch/powerpc/kvm/book3s_hv.c-416-{\narch/powerpc/kvm/book3s_hv.c-417-\tunsigned long host_pcr_bit = 0, guest_pcr_bit = 0, cap = 0;\narch/powerpc/kvm/book3s_hv.c:418:\tstruct kvmppc_vcore *vc = vcpu-\u003earch.vcore;\narch/powerpc/kvm/book3s_hv.c-419-\narch/powerpc/kvm/book3s_hv.c-420-\t/* We can (emulate) our own architecture version and anything older */\narch/powerpc/kvm/book3s_hv.c:421:\tif (cpu_has_feature(CPU_FTR_P11_PVR) || cpu_has_feature(CPU_FTR_ARCH_31))\narch/powerpc/kvm/book3s_hv.c-422-\t\thost_pcr_bit = PCR_ARCH_31;\narch/powerpc/kvm/book3s_hv.c:423:\telse if (cpu_has_feature(CPU_FTR_ARCH_300))\narch/powerpc/kvm/book3s_hv.c-424-\t\thost_pcr_bit = PCR_ARCH_300;\narch/powerpc/kvm/book3s_hv.c:425:\telse if (cpu_has_feature(CPU_FTR_ARCH_207S))\narch/powerpc/kvm/book3s_hv.c-426-\t\thost_pcr_bit = PCR_ARCH_207;\narch/powerpc/kvm/book3s_hv.c:427:\telse if (cpu_has_feature(CPU_FTR_ARCH_206))\narch/powerpc/kvm/book3s_hv.c-428-\t\thost_pcr_bit = PCR_ARCH_206;\n--\narch/powerpc/kvm/book3s_hv.c-474-\tvc-\u003earch_compat = arch_compat;\narch/powerpc/kvm/book3s_hv.c:475:\tkvmhv_nestedv2_mark_dirty(vcpu, KVMPPC_GSID_LOGICAL_PVR);\narch/powerpc/kvm/book3s_hv.c-476-\t/*\n--\narch/powerpc/kvm/book3s_hv.c-485-\narch/powerpc/kvm/book3s_hv.c:486:static void kvmppc_dump_regs(struct kvm_vcpu *vcpu)\narch/powerpc/kvm/book3s_hv.c-487-{\n--\narch/powerpc/kvm/book3s_hv.c-489-\narch/powerpc/kvm/book3s_hv.c:490:\tpr_err(\"vcpu %p (%d):\\n\", vcpu, vcpu-\u003evcpu_id);\narch/powerpc/kvm/book3s_hv.c-491-\tpr_err(\"pc  = %.16lx  msr = %.16llx  trap = %x\\n\",\narch/powerpc/kvm/book3s_hv.c:492:\t       vcpu-\u003earch.regs.nip, vcpu-\u003earch.shregs.msr, vcpu-\u003earch.trap);\narch/powerpc/kvm/book3s_hv.c-493-\tfor (r = 0; r \u003c 16; ++r)\narch/powerpc/kvm/book3s_hv.c-494-\t\tpr_err(\"r%2d = %.16lx  r%d = %.16lx\\n\",\narch/powerpc/kvm/book3s_hv.c:495:\t\t       r, kvmppc_get_gpr(vcpu, r),\narch/powerpc/kvm/book3s_hv.c:496:\t\t       r+16, kvmppc_get_gpr(vcpu, r+16));\narch/powerpc/kvm/book3s_hv.c-497-\tpr_err(\"ctr = %.16lx  lr  = %.16lx\\n\",\narch/powerpc/kvm/book3s_hv.c:498:\t       vcpu-\u003earch.regs.ctr, vcpu-\u003earch.regs.link);\narch/powerpc/kvm/book3s_hv.c-499-\tpr_err(\"srr0 = %.16llx srr1 = %.16llx\\n\",\narch/powerpc/kvm/book3s_hv.c:500:\t       vcpu-\u003earch.shregs.srr0, vcpu-\u003earch.shregs.srr1);\narch/powerpc/kvm/book3s_hv.c-501-\tpr_err(\"sprg0 = %.16llx sprg1 = %.16llx\\n\",\narch/powerpc/kvm/book3s_hv.c:502:\t       vcpu-\u003earch.shregs.sprg0, vcpu-\u003earch.shregs.sprg1);\narch/powerpc/kvm/book3s_hv.c-503-\tpr_err(\"sprg2 = %.16llx sprg3 = %.16llx\\n\",\narch/powerpc/kvm/book3s_hv.c:504:\t       vcpu-\u003earch.shregs.sprg2, vcpu-\u003earch.shregs.sprg3);\narch/powerpc/kvm/book3s_hv.c-505-\tpr_err(\"cr = %.8lx  xer = %.16lx  dsisr = %.8x\\n\",\narch/powerpc/kvm/book3s_hv.c:506:\t       vcpu-\u003earch.regs.ccr, vcpu-\u003earch.regs.xer, vcpu-\u003earch.shregs.dsisr);\narch/powerpc/kvm/book3s_hv.c:507:\tpr_err(\"dar = %.16llx\\n\", vcpu-\u003earch.shregs.dar);\narch/powerpc/kvm/book3s_hv.c-508-\tpr_err(\"fault dar = %.16lx dsisr = %.8x\\n\",\narch/powerpc/kvm/book3s_hv.c:509:\t       vcpu-\u003earch.fault_dar, vcpu-\u003earch.fault_dsisr);\narch/powerpc/kvm/book3s_hv.c:510:\tpr_err(\"SLB (%d entries):\\n\", vcpu-\u003earch.slb_max);\narch/powerpc/kvm/book3s_hv.c:511:\tfor (r = 0; r \u003c vcpu-\u003earch.slb_max; ++r)\narch/powerpc/kvm/book3s_hv.c-512-\t\tpr_err(\"  ESID = %.16llx VSID = %.16llx\\n\",\narch/powerpc/kvm/book3s_hv.c:513:\t\t       vcpu-\u003earch.slb[r].orige, vcpu-\u003earch.slb[r].origv);\narch/powerpc/kvm/book3s_hv.c-514-\tpr_err(\"lpcr = %.16lx sdr1 = %.16lx last_inst = %.16lx\\n\",\narch/powerpc/kvm/book3s_hv.c:515:\t       vcpu-\u003earch.vcore-\u003elpcr, vcpu-\u003ekvm-\u003earch.sdr1,\narch/powerpc/kvm/book3s_hv.c:516:\t       vcpu-\u003earch.last_inst);\narch/powerpc/kvm/book3s_hv.c-517-}\narch/powerpc/kvm/book3s_hv.c-518-\narch/powerpc/kvm/book3s_hv.c:519:static struct kvm_vcpu *kvmppc_find_vcpu(struct kvm *kvm, int id)\narch/powerpc/kvm/book3s_hv.c-520-{\narch/powerpc/kvm/book3s_hv.c:521:\treturn kvm_get_vcpu_by_id(kvm, id);\narch/powerpc/kvm/book3s_hv.c-522-}\narch/powerpc/kvm/book3s_hv.c-523-\narch/powerpc/kvm/book3s_hv.c:524:static void init_vpa(struct kvm_vcpu *vcpu, struct lppaca *vpa)\narch/powerpc/kvm/book3s_hv.c-525-{\narch/powerpc/kvm/book3s_hv.c-526-\tvpa-\u003e__old_status |= LPPACA_OLD_SHARED_PROC;\narch/powerpc/kvm/book3s_hv.c:527:\tvpa-\u003eyield_count = cpu_to_be32(1);\narch/powerpc/kvm/book3s_hv.c-528-}\narch/powerpc/kvm/book3s_hv.c-529-\narch/powerpc/kvm/book3s_hv.c:530:static int set_vpa(struct kvm_vcpu *vcpu, struct kvmppc_vpa *v,\narch/powerpc/kvm/book3s_hv.c-531-\t\t   unsigned long addr, unsigned long len)\n--\narch/powerpc/kvm/book3s_hv.c-535-\t\treturn -EINVAL;\narch/powerpc/kvm/book3s_hv.c:536:\tspin_lock(\u0026vcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c-537-\tif (v-\u003enext_gpa != addr || v-\u003elen != len) {\n--\narch/powerpc/kvm/book3s_hv.c-541-\t}\narch/powerpc/kvm/book3s_hv.c:542:\tspin_unlock(\u0026vcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c-543-\treturn 0;\n--\narch/powerpc/kvm/book3s_hv.c=555=static int vpa_is_registered(struct kvmppc_vpa *vpap)\n--\narch/powerpc/kvm/book3s_hv.c-561-\narch/powerpc/kvm/book3s_hv.c:562:static unsigned long do_h_register_vpa(struct kvm_vcpu *vcpu,\narch/powerpc/kvm/book3s_hv.c-563-\t\t\t\t       unsigned long flags,\narch/powerpc/kvm/book3s_hv.c:564:\t\t\t\t       unsigned long vcpuid, unsigned long vpa)\narch/powerpc/kvm/book3s_hv.c-565-{\narch/powerpc/kvm/book3s_hv.c:566:\tstruct kvm *kvm = vcpu-\u003ekvm;\narch/powerpc/kvm/book3s_hv.c-567-\tunsigned long len, nb;\narch/powerpc/kvm/book3s_hv.c-568-\tvoid *va;\narch/powerpc/kvm/book3s_hv.c:569:\tstruct kvm_vcpu *tvcpu;\narch/powerpc/kvm/book3s_hv.c-570-\tint err;\n--\narch/powerpc/kvm/book3s_hv.c-573-\narch/powerpc/kvm/book3s_hv.c:574:\ttvcpu = kvmppc_find_vcpu(kvm, vcpuid);\narch/powerpc/kvm/book3s_hv.c:575:\tif (!tvcpu)\narch/powerpc/kvm/book3s_hv.c-576-\t\treturn H_PARAMETER;\n--\narch/powerpc/kvm/book3s_hv.c-589-\t\tif (subfunc == H_VPA_REG_VPA)\narch/powerpc/kvm/book3s_hv.c:590:\t\t\tlen = be16_to_cpu(((struct reg_vpa *)va)-\u003elength.hword);\narch/powerpc/kvm/book3s_hv.c-591-\t\telse\narch/powerpc/kvm/book3s_hv.c:592:\t\t\tlen = be32_to_cpu(((struct reg_vpa *)va)-\u003elength.word);\narch/powerpc/kvm/book3s_hv.c-593-\t\tkvmppc_unpin_guest_page(kvm, va, vpa, false);\n--\narch/powerpc/kvm/book3s_hv.c-604-\tvpap = NULL;\narch/powerpc/kvm/book3s_hv.c:605:\tspin_lock(\u0026tvcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c-606-\n--\narch/powerpc/kvm/book3s_hv.c-617-\t\t\tbreak;\narch/powerpc/kvm/book3s_hv.c:618:\t\tvpap = \u0026tvcpu-\u003earch.vpa;\narch/powerpc/kvm/book3s_hv.c-619-\t\terr = 0;\n--\narch/powerpc/kvm/book3s_hv.c-628-\t\terr = H_RESOURCE;\narch/powerpc/kvm/book3s_hv.c:629:\t\tif (!vpa_is_registered(\u0026tvcpu-\u003earch.vpa))\narch/powerpc/kvm/book3s_hv.c-630-\t\t\tbreak;\narch/powerpc/kvm/book3s_hv.c-631-\narch/powerpc/kvm/book3s_hv.c:632:\t\tvpap = \u0026tvcpu-\u003earch.dtl;\narch/powerpc/kvm/book3s_hv.c-633-\t\terr = 0;\n--\narch/powerpc/kvm/book3s_hv.c-638-\t\terr = H_RESOURCE;\narch/powerpc/kvm/book3s_hv.c:639:\t\tif (!vpa_is_registered(\u0026tvcpu-\u003earch.vpa))\narch/powerpc/kvm/book3s_hv.c-640-\t\t\tbreak;\narch/powerpc/kvm/book3s_hv.c-641-\narch/powerpc/kvm/book3s_hv.c:642:\t\tvpap = \u0026tvcpu-\u003earch.slb_shadow;\narch/powerpc/kvm/book3s_hv.c-643-\t\terr = 0;\n--\narch/powerpc/kvm/book3s_hv.c-648-\t\terr = H_RESOURCE;\narch/powerpc/kvm/book3s_hv.c:649:\t\tif (vpa_is_registered(\u0026tvcpu-\u003earch.dtl) ||\narch/powerpc/kvm/book3s_hv.c:650:\t\t    vpa_is_registered(\u0026tvcpu-\u003earch.slb_shadow))\narch/powerpc/kvm/book3s_hv.c-651-\t\t\tbreak;\narch/powerpc/kvm/book3s_hv.c-652-\narch/powerpc/kvm/book3s_hv.c:653:\t\tvpap = \u0026tvcpu-\u003earch.vpa;\narch/powerpc/kvm/book3s_hv.c-654-\t\terr = 0;\n--\narch/powerpc/kvm/book3s_hv.c-657-\tcase H_VPA_DEREG_DTL:\t\t/* deregister DTL */\narch/powerpc/kvm/book3s_hv.c:658:\t\tvpap = \u0026tvcpu-\u003earch.dtl;\narch/powerpc/kvm/book3s_hv.c-659-\t\terr = 0;\n--\narch/powerpc/kvm/book3s_hv.c-662-\tcase H_VPA_DEREG_SLB:\t\t/* deregister SLB shadow buffer */\narch/powerpc/kvm/book3s_hv.c:663:\t\tvpap = \u0026tvcpu-\u003earch.slb_shadow;\narch/powerpc/kvm/book3s_hv.c-664-\t\terr = 0;\n--\narch/powerpc/kvm/book3s_hv.c-673-\narch/powerpc/kvm/book3s_hv.c:674:\tspin_unlock(\u0026tvcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c-675-\n--\narch/powerpc/kvm/book3s_hv.c-678-\narch/powerpc/kvm/book3s_hv.c:679:static void kvmppc_update_vpa(struct kvm_vcpu *vcpu, struct kvmppc_vpa *vpap,\narch/powerpc/kvm/book3s_hv.c-680-\t\t\t       struct kvmppc_vpa *old_vpap)\narch/powerpc/kvm/book3s_hv.c-681-{\narch/powerpc/kvm/book3s_hv.c:682:\tstruct kvm *kvm = vcpu-\u003ekvm;\narch/powerpc/kvm/book3s_hv.c-683-\tvoid *va;\n--\narch/powerpc/kvm/book3s_hv.c-696-\t\tgpa = vpap-\u003enext_gpa;\narch/powerpc/kvm/book3s_hv.c:697:\t\tspin_unlock(\u0026vcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c-698-\t\tva = NULL;\n--\narch/powerpc/kvm/book3s_hv.c-701-\t\t\tva = kvmppc_pin_guest_page(kvm, gpa, \u0026nb);\narch/powerpc/kvm/book3s_hv.c:702:\t\tspin_lock(\u0026vcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c-703-\t\tif (gpa == vpap-\u003enext_gpa)\n--\narch/powerpc/kvm/book3s_hv.c-728-\narch/powerpc/kvm/book3s_hv.c:729:static void kvmppc_update_vpas(struct kvm_vcpu *vcpu)\narch/powerpc/kvm/book3s_hv.c-730-{\narch/powerpc/kvm/book3s_hv.c:731:\tstruct kvm *kvm = vcpu-\u003ekvm;\narch/powerpc/kvm/book3s_hv.c-732-\tstruct kvmppc_vpa old_vpa = { 0 };\narch/powerpc/kvm/book3s_hv.c-733-\narch/powerpc/kvm/book3s_hv.c:734:\tif (!(vcpu-\u003earch.vpa.update_pending ||\narch/powerpc/kvm/book3s_hv.c:735:\t      vcpu-\u003earch.slb_shadow.update_pending ||\narch/powerpc/kvm/book3s_hv.c:736:\t      vcpu-\u003earch.dtl.update_pending))\narch/powerpc/kvm/book3s_hv.c-737-\t\treturn;\narch/powerpc/kvm/book3s_hv.c-738-\narch/powerpc/kvm/book3s_hv.c:739:\tspin_lock(\u0026vcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c:740:\tif (vcpu-\u003earch.vpa.update_pending) {\narch/powerpc/kvm/book3s_hv.c:741:\t\tkvmppc_update_vpa(vcpu, \u0026vcpu-\u003earch.vpa, \u0026old_vpa);\narch/powerpc/kvm/book3s_hv.c-742-\t\tif (old_vpa.pinned_addr) {\narch/powerpc/kvm/book3s_hv.c-743-\t\t\tif (kvmhv_is_nestedv2())\narch/powerpc/kvm/book3s_hv.c:744:\t\t\t\tkvmhv_nestedv2_set_vpa(vcpu, ~0ull);\narch/powerpc/kvm/book3s_hv.c-745-\t\t\tkvmppc_unpin_guest_page(kvm, old_vpa.pinned_addr, old_vpa.gpa,\n--\narch/powerpc/kvm/book3s_hv.c-747-\t\t}\narch/powerpc/kvm/book3s_hv.c:748:\t\tif (vcpu-\u003earch.vpa.pinned_addr) {\narch/powerpc/kvm/book3s_hv.c:749:\t\t\tinit_vpa(vcpu, vcpu-\u003earch.vpa.pinned_addr);\narch/powerpc/kvm/book3s_hv.c-750-\t\t\tif (kvmhv_is_nestedv2())\narch/powerpc/kvm/book3s_hv.c:751:\t\t\t\tkvmhv_nestedv2_set_vpa(vcpu, __pa(vcpu-\u003earch.vpa.pinned_addr));\narch/powerpc/kvm/book3s_hv.c-752-\t\t}\narch/powerpc/kvm/book3s_hv.c-753-\t}\narch/powerpc/kvm/book3s_hv.c:754:\tif (vcpu-\u003earch.dtl.update_pending) {\narch/powerpc/kvm/book3s_hv.c:755:\t\tkvmppc_update_vpa(vcpu, \u0026vcpu-\u003earch.dtl, \u0026old_vpa);\narch/powerpc/kvm/book3s_hv.c-756-\t\tif (old_vpa.pinned_addr)\n--\narch/powerpc/kvm/book3s_hv.c-758-\t\t\t\t\t\told_vpa.dirty);\narch/powerpc/kvm/book3s_hv.c:759:\t\tvcpu-\u003earch.dtl_ptr = vcpu-\u003earch.dtl.pinned_addr;\narch/powerpc/kvm/book3s_hv.c:760:\t\tvcpu-\u003earch.dtl_index = 0;\narch/powerpc/kvm/book3s_hv.c-761-\t}\narch/powerpc/kvm/book3s_hv.c:762:\tif (vcpu-\u003earch.slb_shadow.update_pending) {\narch/powerpc/kvm/book3s_hv.c:763:\t\tkvmppc_update_vpa(vcpu, \u0026vcpu-\u003earch.slb_shadow, \u0026old_vpa);\narch/powerpc/kvm/book3s_hv.c-764-\t\tif (old_vpa.pinned_addr)\n--\narch/powerpc/kvm/book3s_hv.c-768-\narch/powerpc/kvm/book3s_hv.c:769:\tspin_unlock(\u0026vcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c-770-}\n--\narch/powerpc/kvm/book3s_hv.c=776=static u64 vcore_stolen_time(struct kvmppc_vcore *vc, u64 now)\n--\narch/powerpc/kvm/book3s_hv.c-780-\narch/powerpc/kvm/book3s_hv.c:781:\tWARN_ON_ONCE(cpu_has_feature(CPU_FTR_ARCH_300));\narch/powerpc/kvm/book3s_hv.c-782-\n--\narch/powerpc/kvm/book3s_hv.c-791-\narch/powerpc/kvm/book3s_hv.c:792:static void __kvmppc_create_dtl_entry(struct kvm_vcpu *vcpu,\narch/powerpc/kvm/book3s_hv.c-793-\t\t\t\t\tstruct lppaca *vpa,\narch/powerpc/kvm/book3s_hv.c:794:\t\t\t\t\tunsigned int pcpu, u64 now,\narch/powerpc/kvm/book3s_hv.c-795-\t\t\t\t\tunsigned long stolen)\n--\narch/powerpc/kvm/book3s_hv.c-798-\narch/powerpc/kvm/book3s_hv.c:799:\tdt = vcpu-\u003earch.dtl_ptr;\narch/powerpc/kvm/book3s_hv.c-800-\n--\narch/powerpc/kvm/book3s_hv.c-805-\tdt-\u003epreempt_reason = 0;\narch/powerpc/kvm/book3s_hv.c:806:\tdt-\u003eprocessor_id = cpu_to_be16(pcpu + vcpu-\u003earch.ptid);\narch/powerpc/kvm/book3s_hv.c:807:\tdt-\u003eenqueue_to_dispatch_time = cpu_to_be32(stolen);\narch/powerpc/kvm/book3s_hv.c-808-\tdt-\u003eready_to_enqueue_time = 0;\narch/powerpc/kvm/book3s_hv.c-809-\tdt-\u003ewaiting_to_ready_time = 0;\narch/powerpc/kvm/book3s_hv.c:810:\tdt-\u003etimebase = cpu_to_be64(now);\narch/powerpc/kvm/book3s_hv.c-811-\tdt-\u003efault_addr = 0;\narch/powerpc/kvm/book3s_hv.c:812:\tdt-\u003esrr0 = cpu_to_be64(kvmppc_get_pc(vcpu));\narch/powerpc/kvm/book3s_hv.c:813:\tdt-\u003esrr1 = cpu_to_be64(vcpu-\u003earch.shregs.msr);\narch/powerpc/kvm/book3s_hv.c-814-\narch/powerpc/kvm/book3s_hv.c-815-\t++dt;\narch/powerpc/kvm/book3s_hv.c:816:\tif (dt == vcpu-\u003earch.dtl.pinned_end)\narch/powerpc/kvm/book3s_hv.c:817:\t\tdt = vcpu-\u003earch.dtl.pinned_addr;\narch/powerpc/kvm/book3s_hv.c:818:\tvcpu-\u003earch.dtl_ptr = dt;\narch/powerpc/kvm/book3s_hv.c-819-\t/* order writing *dt vs. writing vpa-\u003edtl_idx */\narch/powerpc/kvm/book3s_hv.c-820-\tsmp_wmb();\narch/powerpc/kvm/book3s_hv.c:821:\tvpa-\u003edtl_idx = cpu_to_be64(++vcpu-\u003earch.dtl_index);\narch/powerpc/kvm/book3s_hv.c-822-\narch/powerpc/kvm/book3s_hv.c:823:\t/* vcpu-\u003earch.dtl.dirty is set by the caller */\narch/powerpc/kvm/book3s_hv.c-824-}\narch/powerpc/kvm/book3s_hv.c-825-\narch/powerpc/kvm/book3s_hv.c:826:static void kvmppc_update_vpa_dispatch(struct kvm_vcpu *vcpu,\narch/powerpc/kvm/book3s_hv.c-827-\t\t\t\t       struct kvmppc_vcore *vc)\n--\narch/powerpc/kvm/book3s_hv.c-834-\narch/powerpc/kvm/book3s_hv.c:835:\tvpa = vcpu-\u003earch.vpa.pinned_addr;\narch/powerpc/kvm/book3s_hv.c-836-\tif (!vpa)\n--\narch/powerpc/kvm/book3s_hv.c-841-\tcore_stolen = vcore_stolen_time(vc, now);\narch/powerpc/kvm/book3s_hv.c:842:\tstolen = core_stolen - vcpu-\u003earch.stolen_logged;\narch/powerpc/kvm/book3s_hv.c:843:\tvcpu-\u003earch.stolen_logged = core_stolen;\narch/powerpc/kvm/book3s_hv.c:844:\tspin_lock_irqsave(\u0026vcpu-\u003earch.tbacct_lock, flags);\narch/powerpc/kvm/book3s_hv.c:845:\tstolen += vcpu-\u003earch.busy_stolen;\narch/powerpc/kvm/book3s_hv.c:846:\tvcpu-\u003earch.busy_stolen = 0;\narch/powerpc/kvm/book3s_hv.c:847:\tspin_unlock_irqrestore(\u0026vcpu-\u003earch.tbacct_lock, flags);\narch/powerpc/kvm/book3s_hv.c-848-\narch/powerpc/kvm/book3s_hv.c:849:\tvpa-\u003eenqueue_dispatch_tb = cpu_to_be64(be64_to_cpu(vpa-\u003eenqueue_dispatch_tb) + stolen);\narch/powerpc/kvm/book3s_hv.c-850-\narch/powerpc/kvm/book3s_hv.c:851:\t__kvmppc_create_dtl_entry(vcpu, vpa, vc-\u003epcpu, now + kvmppc_get_tb_offset(vcpu), stolen);\narch/powerpc/kvm/book3s_hv.c-852-\narch/powerpc/kvm/book3s_hv.c:853:\tvcpu-\u003earch.vpa.dirty = true;\narch/powerpc/kvm/book3s_hv.c-854-}\narch/powerpc/kvm/book3s_hv.c-855-\narch/powerpc/kvm/book3s_hv.c:856:static void kvmppc_update_vpa_dispatch_p9(struct kvm_vcpu *vcpu,\narch/powerpc/kvm/book3s_hv.c-857-\t\t\t\t       struct kvmppc_vcore *vc,\n--\narch/powerpc/kvm/book3s_hv.c-863-\narch/powerpc/kvm/book3s_hv.c:864:\tvpa = vcpu-\u003earch.vpa.pinned_addr;\narch/powerpc/kvm/book3s_hv.c-865-\tif (!vpa)\n--\narch/powerpc/kvm/book3s_hv.c-868-\tstolen = vc-\u003estolen_tb;\narch/powerpc/kvm/book3s_hv.c:869:\tstolen_delta = stolen - vcpu-\u003earch.stolen_logged;\narch/powerpc/kvm/book3s_hv.c:870:\tvcpu-\u003earch.stolen_logged = stolen;\narch/powerpc/kvm/book3s_hv.c-871-\narch/powerpc/kvm/book3s_hv.c:872:\tvpa-\u003eenqueue_dispatch_tb = cpu_to_be64(stolen);\narch/powerpc/kvm/book3s_hv.c-873-\narch/powerpc/kvm/book3s_hv.c:874:\t__kvmppc_create_dtl_entry(vcpu, vpa, vc-\u003epcpu, now, stolen_delta);\narch/powerpc/kvm/book3s_hv.c-875-\narch/powerpc/kvm/book3s_hv.c:876:\tvcpu-\u003earch.vpa.dirty = true;\narch/powerpc/kvm/book3s_hv.c-877-}\narch/powerpc/kvm/book3s_hv.c-878-\narch/powerpc/kvm/book3s_hv.c:879:/* See if there is a doorbell interrupt pending for a vcpu */\narch/powerpc/kvm/book3s_hv.c:880:static bool kvmppc_doorbell_pending(struct kvm_vcpu *vcpu)\narch/powerpc/kvm/book3s_hv.c-881-{\n--\narch/powerpc/kvm/book3s_hv.c-884-\narch/powerpc/kvm/book3s_hv.c:885:\tif (vcpu-\u003earch.doorbell_request)\narch/powerpc/kvm/book3s_hv.c-886-\t\treturn true;\narch/powerpc/kvm/book3s_hv.c:887:\tif (cpu_has_feature(CPU_FTR_ARCH_300))\narch/powerpc/kvm/book3s_hv.c-888-\t\treturn false;\n--\narch/powerpc/kvm/book3s_hv.c-890-\t * Ensure that the read of vcore-\u003edpdes comes after the read\narch/powerpc/kvm/book3s_hv.c:891:\t * of vcpu-\u003edoorbell_request.  This barrier matches the\narch/powerpc/kvm/book3s_hv.c-892-\t * smp_wmb() in kvmppc_guest_entry_inject().\n--\narch/powerpc/kvm/book3s_hv.c-894-\tsmp_rmb();\narch/powerpc/kvm/book3s_hv.c:895:\tvc = vcpu-\u003earch.vcore;\narch/powerpc/kvm/book3s_hv.c:896:\tthr = vcpu-\u003evcpu_id - vc-\u003efirst_vcpuid;\narch/powerpc/kvm/book3s_hv.c-897-\treturn !!(vc-\u003edpdes \u0026 (1 \u003c\u003c thr));\n--\narch/powerpc/kvm/book3s_hv.c-899-\n\n"
}

9/2 2026/08/03 04:57 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 20867
							output: 28
							thoughts: 507
						

Thoughts:
**Debugging a Typosquatting Bug in Nested Virtualization Code**

Okay, so I'm looking at this code in `kvmhv_vcpu_entry_nestedv2` and immediately I see a red flag. The compiler's complaining that `cpu` is undefined. Let's trace it back to the patch in question. Ah, here it is:

```c
+	/* Check if privileged door bell was requested and handled */
+	if (vcpu->arch.vcore->dpdes) {
+		kvmhv_nestedv2_cached_reload(vcpu, KVMPPC_GSID_DPDES);
+		if (vcpu->arch.vcore->dpdes)
+			vcpu->arch.doorbell_request |= vcpu->arch.vcore->dpdes;
+		else
+			cpu->arch.doorbell_request = 0;
+	} else {
+		vcpu->arch.doorbell_request = 0;
+	}
```

Yep, that's definitely a typo. It *should* be `vcpu->arch.doorbell_request = 0;` not `cpu->arch.doorbell_request = 0;`. I can immediately tell that's an error. The variable `cpu` isn't declared within the scope of `kvmhv_vcpu_entry_nestedv2`. Let me quickly confirm by checking the function definition.

```c
4249:	static int kvmhv_vcpu_entry_nestedv2(struct kvm_vcpu *vcpu, u64 time_limit,
4250:					     unsigned long lpcr, u64 *tb)
4251:	{
4252:		struct kvmhv_nestedv2_io *io;
4253:		unsigned long msr, i;
4254:		int trap;
4255:		long rc;
```

Nope, definitely no `cpu` variable declared there. The compiler should be throwing a fit. Now, the question is, if it's broken and won't compile, does it even *make sense* to fuzz this? Well, the prompt says the changes have already been applied, meaning the code must have *somehow* compiled.

Let me think for a second... could `cpu` be a macro? That's the only way I can see this actually working. So, I need to check if `cpu` is defined as a macro in this context. If it's not a macro, then it is a dead end. We need to assess if this makes the commit useless for a fuzzing test. It's a trivial error in the case that it does not compile as is.



10/2 2026/08/03 04:58 tool grepper
0m Args:
{
  "Expression": "#define cpu",
  "PathPrefix": "arch/powerpc/"
}

Results:
{
  "Output": "arch/powerpc/boot/libfdt_env.h=18=typedef __be64 fdt64_t;\n--\narch/powerpc/boot/libfdt_env.h-20-#define fdt16_to_cpu(x)\t\tbe16_to_cpu(x)\narch/powerpc/boot/libfdt_env.h:21:#define cpu_to_fdt16(x)\t\tcpu_to_be16(x)\narch/powerpc/boot/libfdt_env.h-22-#define fdt32_to_cpu(x)\t\tbe32_to_cpu(x)\narch/powerpc/boot/libfdt_env.h:23:#define cpu_to_fdt32(x)\t\tcpu_to_be32(x)\narch/powerpc/boot/libfdt_env.h-24-#define fdt64_to_cpu(x)\t\tbe64_to_cpu(x)\narch/powerpc/boot/libfdt_env.h:25:#define cpu_to_fdt64(x)\t\tcpu_to_be64(x)\narch/powerpc/boot/libfdt_env.h-26-\n--\narch/powerpc/boot/of.h=27=typedef u64\t\t\t__be64;\n--\narch/powerpc/boot/of.h-29-#ifdef __LITTLE_ENDIAN__\narch/powerpc/boot/of.h:30:#define cpu_to_be16(x) swab16(x)\narch/powerpc/boot/of.h-31-#define be16_to_cpu(x) swab16(x)\narch/powerpc/boot/of.h:32:#define cpu_to_be32(x) swab32(x)\narch/powerpc/boot/of.h-33-#define be32_to_cpu(x) swab32(x)\narch/powerpc/boot/of.h:34:#define cpu_to_be64(x) swab64(x)\narch/powerpc/boot/of.h-35-#define be64_to_cpu(x) swab64(x)\narch/powerpc/boot/of.h-36-#else\narch/powerpc/boot/of.h:37:#define cpu_to_be16(x) (x)\narch/powerpc/boot/of.h-38-#define be16_to_cpu(x) (x)\narch/powerpc/boot/of.h:39:#define cpu_to_be32(x) (x)\narch/powerpc/boot/of.h-40-#define be32_to_cpu(x) (x)\narch/powerpc/boot/of.h:41:#define cpu_to_be64(x) (x)\narch/powerpc/boot/of.h-42-#define be64_to_cpu(x) (x)\n--\narch/powerpc/boot/xz_config.h=14=static inline uint32_t swab32p(void *p)\n--\narch/powerpc/boot/xz_config.h-22-#define get_le32(p) (*((uint32_t *) (p)))\narch/powerpc/boot/xz_config.h:23:#define cpu_to_be32(x) swab32(x)\narch/powerpc/boot/xz_config.h-24-static inline u32 be32_to_cpup(const u32 *p)\n--\narch/powerpc/boot/xz_config.h-29-#define get_le32(p) swab32p(p)\narch/powerpc/boot/xz_config.h:30:#define cpu_to_be32(x) (x)\narch/powerpc/boot/xz_config.h-31-static inline u32 be32_to_cpup(const u32 *p)\n--\narch/powerpc/include/asm/cpufeature.h-26-\narch/powerpc/include/asm/cpufeature.h:27:#define cpu_feature(x)\t\t(x)\narch/powerpc/include/asm/cpufeature.h-28-\n--\narch/powerpc/include/asm/cputime.h-24-#ifdef __KERNEL__\narch/powerpc/include/asm/cputime.h:25:#define cputime_to_nsecs(cputime) tb_to_ns(cputime)\narch/powerpc/include/asm/cputime.h-26-\n--\narch/powerpc/include/asm/smp.h=138=extern bool thread_group_shares_l3;\narch/powerpc/include/asm/smp.h-139-\narch/powerpc/include/asm/smp.h:140:#define cpu_smt_mask cpu_smt_mask\narch/powerpc/include/asm/smp.h-141-#ifdef CONFIG_SCHED_SMT\n--\narch/powerpc/include/asm/topology.h=9=struct drmem_lmb;\n--\narch/powerpc/include/asm/topology.h-20-\narch/powerpc/include/asm/topology.h:21:#define cpumask_of_node(node) ((node) == -1 ?\t\t\t\t\\\narch/powerpc/include/asm/topology.h-22-\t\t\t       cpu_all_mask :\t\t\t\t\\\n--\narch/powerpc/include/asm/topology.h=29=static inline int pcibus_to_node(struct pci_bus *bus)\n--\narch/powerpc/include/asm/topology.h-34-\narch/powerpc/include/asm/topology.h:35:#define cpumask_of_pcibus(bus)\t(pcibus_to_node(bus) == -1 ?\t\t\\\narch/powerpc/include/asm/topology.h-36-\t\t\t\t cpu_all_mask :\t\t\t\t\\\n--\narch/powerpc/include/asm/vdso/processor.h-27-#ifdef CONFIG_PPC64\narch/powerpc/include/asm/vdso/processor.h:28:#define cpu_relax()\t\t\t\t\t\t\t\\\narch/powerpc/include/asm/vdso/processor.h-29-\tasm volatile(ASM_FTR_IFCLR(\t\t\t\t\t\\\n--\narch/powerpc/include/asm/vdso/processor.h-35-#else\narch/powerpc/include/asm/vdso/processor.h:36:#define cpu_relax()\tbarrier()\narch/powerpc/include/asm/vdso/processor.h-37-#endif\n--\narch/powerpc/kexec/core.c-24-\narch/powerpc/kexec/core.c:25:#define cpu_to_be_ulong __PASTE(cpu_to_be, BITS_PER_LONG)\narch/powerpc/kexec/core.c-26-#define __be_word __PASTE(__be, BITS_PER_LONG)\n"
}

11/2 2026/08/03 04:58 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 23766
							output: 43
							thoughts: 65
						

Thoughts:
**Debugging a Potential Compilation Failure**

Okay, hold on a second. I just realized that this patch I'm looking at likely won't compile. I was thinking `cpu` was a macro, but clearly, it's not. That's a major oversight on my part. I should have caught that earlier.

But wait a minute, before I completely dismiss this, let's not jump to conclusions. It's possible, albeit unlikely, that `cpu` is declared as a global variable somewhere. Perhaps it's defined within this architecture-specific context, or maybe it's pulled in from another header. Let me just quickly check within `arch/powerpc/kvm/book3s_hv.c` to see if that's the case. That should give me a definitive answer before I start rewriting code. I need to be sure I'm not missing something obvious before I raise a flag.



12/2 2026/08/03 04:58 tool grepper
0m Error:
no matches

Args:
{
  "Expression": "struct kvm_vcpu \\*cpu",
  "PathPrefix": "arch/powerpc/kvm/book3s_hv.c"
}

Results:
{
  "error": "no matches"
}

13/2 2026/08/03 04:58 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 24082
							output: 36
							thoughts: 29
						

Thoughts:
Okay, here's my thought process rendered in the first person, assuming I'm an expert:

**Investigating Global Variable Scope in PowerPC KVM Code**

Alright, before I dive into the heart of this problem, let's just make absolutely sure we haven't got a global variable issue causing the trouble. I need to quickly verify the scope of the `cpu` variable within `arch/powerpc/kvm/book3s_hv.c`. It's a fundamental step; I can't afford to overlook a simple scope problem and start chasing my tail with complex debugging techniques if it's not absolutely necessary. Let me pull up that file and double-check its declaration. Global variables, while sometimes necessary, can be a source of headaches if not properly managed, so I need to know definitively if this instance is intended to be global, and if it's being accessed in the appropriate manner by other functions/files. I need to identify where `cpu` is *declared*. Then, I need to understand its access from any other files. Let's do this methodically and see what we come up with.



14/2 2026/08/03 04:58 tool grepper
0m Args:
{
  "Expression": "cpu",
  "PathPrefix": "arch/powerpc/kvm/book3s_hv.c"
}

Results:
{
  "Output": "\nFull output is too long, showing 500 out of 3518 lines.\nUse more precise expression if possible.\n\narch/powerpc/kvm/book3s_hv.c-29-#include \u003clinux/anon_inodes.h\u003e\narch/powerpc/kvm/book3s_hv.c:30:#include \u003clinux/cpu.h\u003e\narch/powerpc/kvm/book3s_hv.c:31:#include \u003clinux/cpumask.h\u003e\narch/powerpc/kvm/book3s_hv.c-32-#include \u003clinux/spinlock.h\u003e\n--\narch/powerpc/kvm/book3s_hv.c-54-#include \u003casm/disassemble.h\u003e\narch/powerpc/kvm/book3s_hv.c:55:#include \u003casm/cputable.h\u003e\narch/powerpc/kvm/book3s_hv.c-56-#include \u003casm/cacheflush.h\u003e\n--\narch/powerpc/kvm/book3s_hv.c-65-#include \u003casm/processor.h\u003e\narch/powerpc/kvm/book3s_hv.c:66:#include \u003casm/cputhreads.h\u003e\narch/powerpc/kvm/book3s_hv.c-67-#include \u003casm/page.h\u003e\n--\narch/powerpc/kvm/book3s_hv.c=133=MODULE_PARM_DESC(nested, \"Enable nested virtualization (only on POWER9)\");\narch/powerpc/kvm/book3s_hv.c-134-\narch/powerpc/kvm/book3s_hv.c:135:static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu);\narch/powerpc/kvm/book3s_hv.c-136-\n--\narch/powerpc/kvm/book3s_hv.c=151=static unsigned long p8_rwmr_values[MAX_SMT_THREADS + 1] = {\n--\narch/powerpc/kvm/book3s_hv.c-162-\narch/powerpc/kvm/book3s_hv.c:163:static inline struct kvm_vcpu *next_runnable_thread(struct kvmppc_vcore *vc,\narch/powerpc/kvm/book3s_hv.c-164-\t\tint *ip)\n--\narch/powerpc/kvm/book3s_hv.c-166-\tint i = *ip;\narch/powerpc/kvm/book3s_hv.c:167:\tstruct kvm_vcpu *vcpu;\narch/powerpc/kvm/book3s_hv.c-168-\narch/powerpc/kvm/book3s_hv.c-169-\twhile (++i \u003c MAX_SMT_THREADS) {\narch/powerpc/kvm/book3s_hv.c:170:\t\tvcpu = READ_ONCE(vc-\u003erunnable_threads[i]);\narch/powerpc/kvm/book3s_hv.c:171:\t\tif (vcpu) {\narch/powerpc/kvm/book3s_hv.c-172-\t\t\t*ip = i;\narch/powerpc/kvm/book3s_hv.c:173:\t\t\treturn vcpu;\narch/powerpc/kvm/book3s_hv.c-174-\t\t}\n--\narch/powerpc/kvm/book3s_hv.c-179-/* Used to traverse the list of runnable threads for a given vcore */\narch/powerpc/kvm/book3s_hv.c:180:#define for_each_runnable_thread(i, vcpu, vc) \\\narch/powerpc/kvm/book3s_hv.c:181:\tfor (i = -1; (vcpu = next_runnable_thread(vc, \u0026i)); )\narch/powerpc/kvm/book3s_hv.c-182-\narch/powerpc/kvm/book3s_hv.c:183:static bool kvmppc_ipi_thread(int cpu)\narch/powerpc/kvm/book3s_hv.c-184-{\n--\narch/powerpc/kvm/book3s_hv.c-190-\narch/powerpc/kvm/book3s_hv.c:191:\t/* On POWER9 we can use msgsnd to IPI any cpu */\narch/powerpc/kvm/book3s_hv.c:192:\tif (cpu_has_feature(CPU_FTR_ARCH_300)) {\narch/powerpc/kvm/book3s_hv.c:193:\t\tmsg |= get_hard_smp_processor_id(cpu);\narch/powerpc/kvm/book3s_hv.c-194-\t\tsmp_mb();\n--\narch/powerpc/kvm/book3s_hv.c-199-\t/* On POWER8 for IPIs to threads in the same core, use msgsnd */\narch/powerpc/kvm/book3s_hv.c:200:\tif (cpu_has_feature(CPU_FTR_ARCH_207S)) {\narch/powerpc/kvm/book3s_hv.c-201-\t\tpreempt_disable();\narch/powerpc/kvm/book3s_hv.c:202:\t\tif (cpu_first_thread_sibling(cpu) ==\narch/powerpc/kvm/book3s_hv.c:203:\t\t    cpu_first_thread_sibling(smp_processor_id())) {\narch/powerpc/kvm/book3s_hv.c:204:\t\t\tmsg |= cpu_thread_in_core(cpu);\narch/powerpc/kvm/book3s_hv.c-205-\t\t\tsmp_mb();\n--\narch/powerpc/kvm/book3s_hv.c-213-#if defined(CONFIG_PPC_ICP_NATIVE) \u0026\u0026 defined(CONFIG_SMP)\narch/powerpc/kvm/book3s_hv.c:214:\tif (cpu \u003e= 0 \u0026\u0026 cpu \u003c nr_cpu_ids) {\narch/powerpc/kvm/book3s_hv.c:215:\t\tif (paca_ptrs[cpu]-\u003ekvm_hstate.xics_phys) {\narch/powerpc/kvm/book3s_hv.c:216:\t\t\txics_wake_cpu(cpu);\narch/powerpc/kvm/book3s_hv.c-217-\t\t\treturn true;\narch/powerpc/kvm/book3s_hv.c-218-\t\t}\narch/powerpc/kvm/book3s_hv.c:219:\t\topal_int_set_mfrr(get_hard_smp_processor_id(cpu), IPI_PRIORITY);\narch/powerpc/kvm/book3s_hv.c-220-\t\treturn true;\n--\narch/powerpc/kvm/book3s_hv.c-226-\narch/powerpc/kvm/book3s_hv.c:227:static void kvmppc_fast_vcpu_kick_hv(struct kvm_vcpu *vcpu)\narch/powerpc/kvm/book3s_hv.c-228-{\narch/powerpc/kvm/book3s_hv.c:229:\tint cpu;\narch/powerpc/kvm/book3s_hv.c-230-\tstruct rcuwait *waitp;\n--\narch/powerpc/kvm/book3s_hv.c-233-\t * rcuwait_wake_up contains smp_mb() which orders prior stores that\narch/powerpc/kvm/book3s_hv.c:234:\t * create pending work vs below loads of cpu fields. The other side\narch/powerpc/kvm/book3s_hv.c:235:\t * is the barrier in vcpu run that orders setting the cpu fields vs\narch/powerpc/kvm/book3s_hv.c-236-\t * testing for pending work.\n--\narch/powerpc/kvm/book3s_hv.c-238-\narch/powerpc/kvm/book3s_hv.c:239:\twaitp = kvm_arch_vcpu_get_wait(vcpu);\narch/powerpc/kvm/book3s_hv.c-240-\tif (rcuwait_wake_up(waitp))\narch/powerpc/kvm/book3s_hv.c:241:\t\t++vcpu-\u003estat.generic.halt_wakeup;\narch/powerpc/kvm/book3s_hv.c-242-\narch/powerpc/kvm/book3s_hv.c:243:\tcpu = READ_ONCE(vcpu-\u003earch.thread_cpu);\narch/powerpc/kvm/book3s_hv.c:244:\tif (cpu \u003e= 0 \u0026\u0026 kvmppc_ipi_thread(cpu))\narch/powerpc/kvm/book3s_hv.c-245-\t\treturn;\n--\narch/powerpc/kvm/book3s_hv.c-247-\t/* CPU points to the first thread of the core */\narch/powerpc/kvm/book3s_hv.c:248:\tcpu = vcpu-\u003ecpu;\narch/powerpc/kvm/book3s_hv.c:249:\tif (cpu \u003e= 0 \u0026\u0026 cpu \u003c nr_cpu_ids \u0026\u0026 cpu_online(cpu))\narch/powerpc/kvm/book3s_hv.c:250:\t\tsmp_send_reschedule(cpu);\narch/powerpc/kvm/book3s_hv.c-251-}\n--\narch/powerpc/kvm/book3s_hv.c-253-/*\narch/powerpc/kvm/book3s_hv.c:254: * We use the vcpu_load/put functions to measure stolen time.\narch/powerpc/kvm/book3s_hv.c-255- *\narch/powerpc/kvm/book3s_hv.c:256: * Stolen time is counted as time when either the vcpu is able to\narch/powerpc/kvm/book3s_hv.c-257- * run as part of a virtual core, but the task running the vcore\narch/powerpc/kvm/book3s_hv.c:258: * is preempted or sleeping, or when the vcpu needs something done\narch/powerpc/kvm/book3s_hv.c:259: * in the kernel by the task running the vcpu, but that task is\narch/powerpc/kvm/book3s_hv.c-260- * preempted or sleeping.  Those two things have to be counted\narch/powerpc/kvm/book3s_hv.c:261: * separately, since one of the vcpu tasks will take on the job\narch/powerpc/kvm/book3s_hv.c:262: * of running the core, and the other vcpu tasks in the vcore will\narch/powerpc/kvm/book3s_hv.c-263- * sleep waiting for it to do that, but that sleep shouldn't count\n--\narch/powerpc/kvm/book3s_hv.c-265- *\narch/powerpc/kvm/book3s_hv.c:266: * Hence we accumulate stolen time when the vcpu can run as part of\narch/powerpc/kvm/book3s_hv.c:267: * a vcore using vc-\u003estolen_tb, and the stolen time when the vcpu\narch/powerpc/kvm/book3s_hv.c-268- * needs its task to do other things in the kernel (for example,\narch/powerpc/kvm/book3s_hv.c-269- * service a page fault) in busy_stolen.  We don't accumulate\narch/powerpc/kvm/book3s_hv.c:270: * stolen time for a vcore when it is inactive, or for a vcpu\narch/powerpc/kvm/book3s_hv.c-271- * when it is in state RUNNING or NOTREADY.  NOTREADY is a bit of\narch/powerpc/kvm/book3s_hv.c:272: * a misnomer; it means that the vcpu task is not executing in\narch/powerpc/kvm/book3s_hv.c-273- * the KVM_VCPU_RUN ioctl, i.e. it is in userspace or elsewhere in\narch/powerpc/kvm/book3s_hv.c-274- * the kernel.  We don't have any way of dividing up that time\narch/powerpc/kvm/book3s_hv.c:275: * between time that the vcpu is genuinely stopped, time that\narch/powerpc/kvm/book3s_hv.c:276: * the task is actively working on behalf of the vcpu, and time\narch/powerpc/kvm/book3s_hv.c-277- * that the task is preempted, so we don't count any of it as\n--\narch/powerpc/kvm/book3s_hv.c-285- *\narch/powerpc/kvm/book3s_hv.c:286: * The POWER9 path is simpler, one vcpu per virtual core so the\narch/powerpc/kvm/book3s_hv.c:287: * former case does not exist. If a vcpu is preempted when it is\narch/powerpc/kvm/book3s_hv.c-288- * BUSY_IN_HOST and not ceded or otherwise blocked, then accumulate\n--\narch/powerpc/kvm/book3s_hv.c=293=static void kvmppc_core_start_stolen(struct kvmppc_vcore *vc, u64 tb)\n--\narch/powerpc/kvm/book3s_hv.c-296-\narch/powerpc/kvm/book3s_hv.c:297:\tWARN_ON_ONCE(cpu_has_feature(CPU_FTR_ARCH_300));\narch/powerpc/kvm/book3s_hv.c-298-\n--\narch/powerpc/kvm/book3s_hv.c=304=static void kvmppc_core_end_stolen(struct kvmppc_vcore *vc, u64 tb)\n--\narch/powerpc/kvm/book3s_hv.c-307-\narch/powerpc/kvm/book3s_hv.c:308:\tWARN_ON_ONCE(cpu_has_feature(CPU_FTR_ARCH_300));\narch/powerpc/kvm/book3s_hv.c-309-\n--\narch/powerpc/kvm/book3s_hv.c-317-\narch/powerpc/kvm/book3s_hv.c:318:static void kvmppc_core_vcpu_load_hv(struct kvm_vcpu *vcpu, int cpu)\narch/powerpc/kvm/book3s_hv.c-319-{\narch/powerpc/kvm/book3s_hv.c:320:\tstruct kvmppc_vcore *vc = vcpu-\u003earch.vcore;\narch/powerpc/kvm/book3s_hv.c-321-\tunsigned long flags;\n--\narch/powerpc/kvm/book3s_hv.c-323-\narch/powerpc/kvm/book3s_hv.c:324:\tif (cpu_has_feature(CPU_FTR_ARCH_300)) {\narch/powerpc/kvm/book3s_hv.c:325:\t\tif (vcpu-\u003earch.busy_preempt != TB_NIL) {\narch/powerpc/kvm/book3s_hv.c:326:\t\t\tWARN_ON_ONCE(vcpu-\u003earch.state != KVMPPC_VCPU_BUSY_IN_HOST);\narch/powerpc/kvm/book3s_hv.c:327:\t\t\tvc-\u003estolen_tb += mftb() - vcpu-\u003earch.busy_preempt;\narch/powerpc/kvm/book3s_hv.c:328:\t\t\tvcpu-\u003earch.busy_preempt = TB_NIL;\narch/powerpc/kvm/book3s_hv.c-329-\t\t}\n--\narch/powerpc/kvm/book3s_hv.c-337-\t * because only this task ever sets vc-\u003erunner to this\narch/powerpc/kvm/book3s_hv.c:338:\t * vcpu, and once it is set to this vcpu, only this task\narch/powerpc/kvm/book3s_hv.c-339-\t * ever sets it to NULL.\narch/powerpc/kvm/book3s_hv.c-340-\t */\narch/powerpc/kvm/book3s_hv.c:341:\tif (vc-\u003erunner == vcpu \u0026\u0026 vc-\u003evcore_state \u003e= VCORE_SLEEPING)\narch/powerpc/kvm/book3s_hv.c-342-\t\tkvmppc_core_end_stolen(vc, now);\narch/powerpc/kvm/book3s_hv.c-343-\narch/powerpc/kvm/book3s_hv.c:344:\tspin_lock_irqsave(\u0026vcpu-\u003earch.tbacct_lock, flags);\narch/powerpc/kvm/book3s_hv.c:345:\tif (vcpu-\u003earch.state == KVMPPC_VCPU_BUSY_IN_HOST \u0026\u0026\narch/powerpc/kvm/book3s_hv.c:346:\t    vcpu-\u003earch.busy_preempt != TB_NIL) {\narch/powerpc/kvm/book3s_hv.c:347:\t\tvcpu-\u003earch.busy_stolen += now - vcpu-\u003earch.busy_preempt;\narch/powerpc/kvm/book3s_hv.c:348:\t\tvcpu-\u003earch.busy_preempt = TB_NIL;\narch/powerpc/kvm/book3s_hv.c-349-\t}\narch/powerpc/kvm/book3s_hv.c:350:\tspin_unlock_irqrestore(\u0026vcpu-\u003earch.tbacct_lock, flags);\narch/powerpc/kvm/book3s_hv.c-351-}\narch/powerpc/kvm/book3s_hv.c-352-\narch/powerpc/kvm/book3s_hv.c:353:static void kvmppc_core_vcpu_put_hv(struct kvm_vcpu *vcpu)\narch/powerpc/kvm/book3s_hv.c-354-{\narch/powerpc/kvm/book3s_hv.c:355:\tstruct kvmppc_vcore *vc = vcpu-\u003earch.vcore;\narch/powerpc/kvm/book3s_hv.c-356-\tunsigned long flags;\n--\narch/powerpc/kvm/book3s_hv.c-358-\narch/powerpc/kvm/book3s_hv.c:359:\tif (cpu_has_feature(CPU_FTR_ARCH_300)) {\narch/powerpc/kvm/book3s_hv.c-360-\t\t/*\n--\narch/powerpc/kvm/book3s_hv.c-363-\t\t */\narch/powerpc/kvm/book3s_hv.c:364:\t\tWARN_ON_ONCE(vcpu-\u003earch.state == KVMPPC_VCPU_RUNNABLE);\narch/powerpc/kvm/book3s_hv.c-365-\t\t/*\narch/powerpc/kvm/book3s_hv.c:366:\t\t * Account stolen time when preempted while the vcpu task is\narch/powerpc/kvm/book3s_hv.c-367-\t\t * running in the kernel (but not in qemu, which is INACTIVE).\n--\narch/powerpc/kvm/book3s_hv.c-369-\t\tif (task_is_running(current) \u0026\u0026\narch/powerpc/kvm/book3s_hv.c:370:\t\t\t\tvcpu-\u003earch.state == KVMPPC_VCPU_BUSY_IN_HOST)\narch/powerpc/kvm/book3s_hv.c:371:\t\t\tvcpu-\u003earch.busy_preempt = mftb();\narch/powerpc/kvm/book3s_hv.c-372-\t\treturn;\n--\narch/powerpc/kvm/book3s_hv.c-376-\narch/powerpc/kvm/book3s_hv.c:377:\tif (vc-\u003erunner == vcpu \u0026\u0026 vc-\u003evcore_state \u003e= VCORE_SLEEPING)\narch/powerpc/kvm/book3s_hv.c-378-\t\tkvmppc_core_start_stolen(vc, now);\narch/powerpc/kvm/book3s_hv.c-379-\narch/powerpc/kvm/book3s_hv.c:380:\tspin_lock_irqsave(\u0026vcpu-\u003earch.tbacct_lock, flags);\narch/powerpc/kvm/book3s_hv.c:381:\tif (vcpu-\u003earch.state == KVMPPC_VCPU_BUSY_IN_HOST)\narch/powerpc/kvm/book3s_hv.c:382:\t\tvcpu-\u003earch.busy_preempt = now;\narch/powerpc/kvm/book3s_hv.c:383:\tspin_unlock_irqrestore(\u0026vcpu-\u003earch.tbacct_lock, flags);\narch/powerpc/kvm/book3s_hv.c-384-}\narch/powerpc/kvm/book3s_hv.c-385-\narch/powerpc/kvm/book3s_hv.c:386:static void kvmppc_set_pvr_hv(struct kvm_vcpu *vcpu, u32 pvr)\narch/powerpc/kvm/book3s_hv.c-387-{\narch/powerpc/kvm/book3s_hv.c:388:\tvcpu-\u003earch.pvr = pvr;\narch/powerpc/kvm/book3s_hv.c-389-}\n--\narch/powerpc/kvm/book3s_hv.c=394=static inline unsigned long map_pcr_to_cap(unsigned long pcr)\n--\narch/powerpc/kvm/book3s_hv.c-402-\tcase PCR_ARCH_31:\narch/powerpc/kvm/book3s_hv.c:403:\t\tif (cpu_has_feature(CPU_FTR_P11_PVR))\narch/powerpc/kvm/book3s_hv.c-404-\t\t\tcap = H_GUEST_CAP_POWER11;\n--\narch/powerpc/kvm/book3s_hv.c-414-\narch/powerpc/kvm/book3s_hv.c:415:static int kvmppc_set_arch_compat(struct kvm_vcpu *vcpu, u32 arch_compat)\narch/powerpc/kvm/book3s_hv.c-416-{\narch/powerpc/kvm/book3s_hv.c-417-\tunsigned long host_pcr_bit = 0, guest_pcr_bit = 0, cap = 0;\narch/powerpc/kvm/book3s_hv.c:418:\tstruct kvmppc_vcore *vc = vcpu-\u003earch.vcore;\narch/powerpc/kvm/book3s_hv.c-419-\narch/powerpc/kvm/book3s_hv.c-420-\t/* We can (emulate) our own architecture version and anything older */\narch/powerpc/kvm/book3s_hv.c:421:\tif (cpu_has_feature(CPU_FTR_P11_PVR) || cpu_has_feature(CPU_FTR_ARCH_31))\narch/powerpc/kvm/book3s_hv.c-422-\t\thost_pcr_bit = PCR_ARCH_31;\narch/powerpc/kvm/book3s_hv.c:423:\telse if (cpu_has_feature(CPU_FTR_ARCH_300))\narch/powerpc/kvm/book3s_hv.c-424-\t\thost_pcr_bit = PCR_ARCH_300;\narch/powerpc/kvm/book3s_hv.c:425:\telse if (cpu_has_feature(CPU_FTR_ARCH_207S))\narch/powerpc/kvm/book3s_hv.c-426-\t\thost_pcr_bit = PCR_ARCH_207;\narch/powerpc/kvm/book3s_hv.c:427:\telse if (cpu_has_feature(CPU_FTR_ARCH_206))\narch/powerpc/kvm/book3s_hv.c-428-\t\thost_pcr_bit = PCR_ARCH_206;\n--\narch/powerpc/kvm/book3s_hv.c-474-\tvc-\u003earch_compat = arch_compat;\narch/powerpc/kvm/book3s_hv.c:475:\tkvmhv_nestedv2_mark_dirty(vcpu, KVMPPC_GSID_LOGICAL_PVR);\narch/powerpc/kvm/book3s_hv.c-476-\t/*\n--\narch/powerpc/kvm/book3s_hv.c-485-\narch/powerpc/kvm/book3s_hv.c:486:static void kvmppc_dump_regs(struct kvm_vcpu *vcpu)\narch/powerpc/kvm/book3s_hv.c-487-{\n--\narch/powerpc/kvm/book3s_hv.c-489-\narch/powerpc/kvm/book3s_hv.c:490:\tpr_err(\"vcpu %p (%d):\\n\", vcpu, vcpu-\u003evcpu_id);\narch/powerpc/kvm/book3s_hv.c-491-\tpr_err(\"pc  = %.16lx  msr = %.16llx  trap = %x\\n\",\narch/powerpc/kvm/book3s_hv.c:492:\t       vcpu-\u003earch.regs.nip, vcpu-\u003earch.shregs.msr, vcpu-\u003earch.trap);\narch/powerpc/kvm/book3s_hv.c-493-\tfor (r = 0; r \u003c 16; ++r)\narch/powerpc/kvm/book3s_hv.c-494-\t\tpr_err(\"r%2d = %.16lx  r%d = %.16lx\\n\",\narch/powerpc/kvm/book3s_hv.c:495:\t\t       r, kvmppc_get_gpr(vcpu, r),\narch/powerpc/kvm/book3s_hv.c:496:\t\t       r+16, kvmppc_get_gpr(vcpu, r+16));\narch/powerpc/kvm/book3s_hv.c-497-\tpr_err(\"ctr = %.16lx  lr  = %.16lx\\n\",\narch/powerpc/kvm/book3s_hv.c:498:\t       vcpu-\u003earch.regs.ctr, vcpu-\u003earch.regs.link);\narch/powerpc/kvm/book3s_hv.c-499-\tpr_err(\"srr0 = %.16llx srr1 = %.16llx\\n\",\narch/powerpc/kvm/book3s_hv.c:500:\t       vcpu-\u003earch.shregs.srr0, vcpu-\u003earch.shregs.srr1);\narch/powerpc/kvm/book3s_hv.c-501-\tpr_err(\"sprg0 = %.16llx sprg1 = %.16llx\\n\",\narch/powerpc/kvm/book3s_hv.c:502:\t       vcpu-\u003earch.shregs.sprg0, vcpu-\u003earch.shregs.sprg1);\narch/powerpc/kvm/book3s_hv.c-503-\tpr_err(\"sprg2 = %.16llx sprg3 = %.16llx\\n\",\narch/powerpc/kvm/book3s_hv.c:504:\t       vcpu-\u003earch.shregs.sprg2, vcpu-\u003earch.shregs.sprg3);\narch/powerpc/kvm/book3s_hv.c-505-\tpr_err(\"cr = %.8lx  xer = %.16lx  dsisr = %.8x\\n\",\narch/powerpc/kvm/book3s_hv.c:506:\t       vcpu-\u003earch.regs.ccr, vcpu-\u003earch.regs.xer, vcpu-\u003earch.shregs.dsisr);\narch/powerpc/kvm/book3s_hv.c:507:\tpr_err(\"dar = %.16llx\\n\", vcpu-\u003earch.shregs.dar);\narch/powerpc/kvm/book3s_hv.c-508-\tpr_err(\"fault dar = %.16lx dsisr = %.8x\\n\",\narch/powerpc/kvm/book3s_hv.c:509:\t       vcpu-\u003earch.fault_dar, vcpu-\u003earch.fault_dsisr);\narch/powerpc/kvm/book3s_hv.c:510:\tpr_err(\"SLB (%d entries):\\n\", vcpu-\u003earch.slb_max);\narch/powerpc/kvm/book3s_hv.c:511:\tfor (r = 0; r \u003c vcpu-\u003earch.slb_max; ++r)\narch/powerpc/kvm/book3s_hv.c-512-\t\tpr_err(\"  ESID = %.16llx VSID = %.16llx\\n\",\narch/powerpc/kvm/book3s_hv.c:513:\t\t       vcpu-\u003earch.slb[r].orige, vcpu-\u003earch.slb[r].origv);\narch/powerpc/kvm/book3s_hv.c-514-\tpr_err(\"lpcr = %.16lx sdr1 = %.16lx last_inst = %.16lx\\n\",\narch/powerpc/kvm/book3s_hv.c:515:\t       vcpu-\u003earch.vcore-\u003elpcr, vcpu-\u003ekvm-\u003earch.sdr1,\narch/powerpc/kvm/book3s_hv.c:516:\t       vcpu-\u003earch.last_inst);\narch/powerpc/kvm/book3s_hv.c-517-}\narch/powerpc/kvm/book3s_hv.c-518-\narch/powerpc/kvm/book3s_hv.c:519:static struct kvm_vcpu *kvmppc_find_vcpu(struct kvm *kvm, int id)\narch/powerpc/kvm/book3s_hv.c-520-{\narch/powerpc/kvm/book3s_hv.c:521:\treturn kvm_get_vcpu_by_id(kvm, id);\narch/powerpc/kvm/book3s_hv.c-522-}\narch/powerpc/kvm/book3s_hv.c-523-\narch/powerpc/kvm/book3s_hv.c:524:static void init_vpa(struct kvm_vcpu *vcpu, struct lppaca *vpa)\narch/powerpc/kvm/book3s_hv.c-525-{\narch/powerpc/kvm/book3s_hv.c-526-\tvpa-\u003e__old_status |= LPPACA_OLD_SHARED_PROC;\narch/powerpc/kvm/book3s_hv.c:527:\tvpa-\u003eyield_count = cpu_to_be32(1);\narch/powerpc/kvm/book3s_hv.c-528-}\narch/powerpc/kvm/book3s_hv.c-529-\narch/powerpc/kvm/book3s_hv.c:530:static int set_vpa(struct kvm_vcpu *vcpu, struct kvmppc_vpa *v,\narch/powerpc/kvm/book3s_hv.c-531-\t\t   unsigned long addr, unsigned long len)\n--\narch/powerpc/kvm/book3s_hv.c-535-\t\treturn -EINVAL;\narch/powerpc/kvm/book3s_hv.c:536:\tspin_lock(\u0026vcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c-537-\tif (v-\u003enext_gpa != addr || v-\u003elen != len) {\n--\narch/powerpc/kvm/book3s_hv.c-541-\t}\narch/powerpc/kvm/book3s_hv.c:542:\tspin_unlock(\u0026vcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c-543-\treturn 0;\n--\narch/powerpc/kvm/book3s_hv.c=555=static int vpa_is_registered(struct kvmppc_vpa *vpap)\n--\narch/powerpc/kvm/book3s_hv.c-561-\narch/powerpc/kvm/book3s_hv.c:562:static unsigned long do_h_register_vpa(struct kvm_vcpu *vcpu,\narch/powerpc/kvm/book3s_hv.c-563-\t\t\t\t       unsigned long flags,\narch/powerpc/kvm/book3s_hv.c:564:\t\t\t\t       unsigned long vcpuid, unsigned long vpa)\narch/powerpc/kvm/book3s_hv.c-565-{\narch/powerpc/kvm/book3s_hv.c:566:\tstruct kvm *kvm = vcpu-\u003ekvm;\narch/powerpc/kvm/book3s_hv.c-567-\tunsigned long len, nb;\narch/powerpc/kvm/book3s_hv.c-568-\tvoid *va;\narch/powerpc/kvm/book3s_hv.c:569:\tstruct kvm_vcpu *tvcpu;\narch/powerpc/kvm/book3s_hv.c-570-\tint err;\n--\narch/powerpc/kvm/book3s_hv.c-573-\narch/powerpc/kvm/book3s_hv.c:574:\ttvcpu = kvmppc_find_vcpu(kvm, vcpuid);\narch/powerpc/kvm/book3s_hv.c:575:\tif (!tvcpu)\narch/powerpc/kvm/book3s_hv.c-576-\t\treturn H_PARAMETER;\n--\narch/powerpc/kvm/book3s_hv.c-589-\t\tif (subfunc == H_VPA_REG_VPA)\narch/powerpc/kvm/book3s_hv.c:590:\t\t\tlen = be16_to_cpu(((struct reg_vpa *)va)-\u003elength.hword);\narch/powerpc/kvm/book3s_hv.c-591-\t\telse\narch/powerpc/kvm/book3s_hv.c:592:\t\t\tlen = be32_to_cpu(((struct reg_vpa *)va)-\u003elength.word);\narch/powerpc/kvm/book3s_hv.c-593-\t\tkvmppc_unpin_guest_page(kvm, va, vpa, false);\n--\narch/powerpc/kvm/book3s_hv.c-604-\tvpap = NULL;\narch/powerpc/kvm/book3s_hv.c:605:\tspin_lock(\u0026tvcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c-606-\n--\narch/powerpc/kvm/book3s_hv.c-617-\t\t\tbreak;\narch/powerpc/kvm/book3s_hv.c:618:\t\tvpap = \u0026tvcpu-\u003earch.vpa;\narch/powerpc/kvm/book3s_hv.c-619-\t\terr = 0;\n--\narch/powerpc/kvm/book3s_hv.c-628-\t\terr = H_RESOURCE;\narch/powerpc/kvm/book3s_hv.c:629:\t\tif (!vpa_is_registered(\u0026tvcpu-\u003earch.vpa))\narch/powerpc/kvm/book3s_hv.c-630-\t\t\tbreak;\narch/powerpc/kvm/book3s_hv.c-631-\narch/powerpc/kvm/book3s_hv.c:632:\t\tvpap = \u0026tvcpu-\u003earch.dtl;\narch/powerpc/kvm/book3s_hv.c-633-\t\terr = 0;\n--\narch/powerpc/kvm/book3s_hv.c-638-\t\terr = H_RESOURCE;\narch/powerpc/kvm/book3s_hv.c:639:\t\tif (!vpa_is_registered(\u0026tvcpu-\u003earch.vpa))\narch/powerpc/kvm/book3s_hv.c-640-\t\t\tbreak;\narch/powerpc/kvm/book3s_hv.c-641-\narch/powerpc/kvm/book3s_hv.c:642:\t\tvpap = \u0026tvcpu-\u003earch.slb_shadow;\narch/powerpc/kvm/book3s_hv.c-643-\t\terr = 0;\n--\narch/powerpc/kvm/book3s_hv.c-648-\t\terr = H_RESOURCE;\narch/powerpc/kvm/book3s_hv.c:649:\t\tif (vpa_is_registered(\u0026tvcpu-\u003earch.dtl) ||\narch/powerpc/kvm/book3s_hv.c:650:\t\t    vpa_is_registered(\u0026tvcpu-\u003earch.slb_shadow))\narch/powerpc/kvm/book3s_hv.c-651-\t\t\tbreak;\narch/powerpc/kvm/book3s_hv.c-652-\narch/powerpc/kvm/book3s_hv.c:653:\t\tvpap = \u0026tvcpu-\u003earch.vpa;\narch/powerpc/kvm/book3s_hv.c-654-\t\terr = 0;\n--\narch/powerpc/kvm/book3s_hv.c-657-\tcase H_VPA_DEREG_DTL:\t\t/* deregister DTL */\narch/powerpc/kvm/book3s_hv.c:658:\t\tvpap = \u0026tvcpu-\u003earch.dtl;\narch/powerpc/kvm/book3s_hv.c-659-\t\terr = 0;\n--\narch/powerpc/kvm/book3s_hv.c-662-\tcase H_VPA_DEREG_SLB:\t\t/* deregister SLB shadow buffer */\narch/powerpc/kvm/book3s_hv.c:663:\t\tvpap = \u0026tvcpu-\u003earch.slb_shadow;\narch/powerpc/kvm/book3s_hv.c-664-\t\terr = 0;\n--\narch/powerpc/kvm/book3s_hv.c-673-\narch/powerpc/kvm/book3s_hv.c:674:\tspin_unlock(\u0026tvcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c-675-\n--\narch/powerpc/kvm/book3s_hv.c-678-\narch/powerpc/kvm/book3s_hv.c:679:static void kvmppc_update_vpa(struct kvm_vcpu *vcpu, struct kvmppc_vpa *vpap,\narch/powerpc/kvm/book3s_hv.c-680-\t\t\t       struct kvmppc_vpa *old_vpap)\narch/powerpc/kvm/book3s_hv.c-681-{\narch/powerpc/kvm/book3s_hv.c:682:\tstruct kvm *kvm = vcpu-\u003ekvm;\narch/powerpc/kvm/book3s_hv.c-683-\tvoid *va;\n--\narch/powerpc/kvm/book3s_hv.c-696-\t\tgpa = vpap-\u003enext_gpa;\narch/powerpc/kvm/book3s_hv.c:697:\t\tspin_unlock(\u0026vcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c-698-\t\tva = NULL;\n--\narch/powerpc/kvm/book3s_hv.c-701-\t\t\tva = kvmppc_pin_guest_page(kvm, gpa, \u0026nb);\narch/powerpc/kvm/book3s_hv.c:702:\t\tspin_lock(\u0026vcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c-703-\t\tif (gpa == vpap-\u003enext_gpa)\n--\narch/powerpc/kvm/book3s_hv.c-728-\narch/powerpc/kvm/book3s_hv.c:729:static void kvmppc_update_vpas(struct kvm_vcpu *vcpu)\narch/powerpc/kvm/book3s_hv.c-730-{\narch/powerpc/kvm/book3s_hv.c:731:\tstruct kvm *kvm = vcpu-\u003ekvm;\narch/powerpc/kvm/book3s_hv.c-732-\tstruct kvmppc_vpa old_vpa = { 0 };\narch/powerpc/kvm/book3s_hv.c-733-\narch/powerpc/kvm/book3s_hv.c:734:\tif (!(vcpu-\u003earch.vpa.update_pending ||\narch/powerpc/kvm/book3s_hv.c:735:\t      vcpu-\u003earch.slb_shadow.update_pending ||\narch/powerpc/kvm/book3s_hv.c:736:\t      vcpu-\u003earch.dtl.update_pending))\narch/powerpc/kvm/book3s_hv.c-737-\t\treturn;\narch/powerpc/kvm/book3s_hv.c-738-\narch/powerpc/kvm/book3s_hv.c:739:\tspin_lock(\u0026vcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c:740:\tif (vcpu-\u003earch.vpa.update_pending) {\narch/powerpc/kvm/book3s_hv.c:741:\t\tkvmppc_update_vpa(vcpu, \u0026vcpu-\u003earch.vpa, \u0026old_vpa);\narch/powerpc/kvm/book3s_hv.c-742-\t\tif (old_vpa.pinned_addr) {\narch/powerpc/kvm/book3s_hv.c-743-\t\t\tif (kvmhv_is_nestedv2())\narch/powerpc/kvm/book3s_hv.c:744:\t\t\t\tkvmhv_nestedv2_set_vpa(vcpu, ~0ull);\narch/powerpc/kvm/book3s_hv.c-745-\t\t\tkvmppc_unpin_guest_page(kvm, old_vpa.pinned_addr, old_vpa.gpa,\n--\narch/powerpc/kvm/book3s_hv.c-747-\t\t}\narch/powerpc/kvm/book3s_hv.c:748:\t\tif (vcpu-\u003earch.vpa.pinned_addr) {\narch/powerpc/kvm/book3s_hv.c:749:\t\t\tinit_vpa(vcpu, vcpu-\u003earch.vpa.pinned_addr);\narch/powerpc/kvm/book3s_hv.c-750-\t\t\tif (kvmhv_is_nestedv2())\narch/powerpc/kvm/book3s_hv.c:751:\t\t\t\tkvmhv_nestedv2_set_vpa(vcpu, __pa(vcpu-\u003earch.vpa.pinned_addr));\narch/powerpc/kvm/book3s_hv.c-752-\t\t}\narch/powerpc/kvm/book3s_hv.c-753-\t}\narch/powerpc/kvm/book3s_hv.c:754:\tif (vcpu-\u003earch.dtl.update_pending) {\narch/powerpc/kvm/book3s_hv.c:755:\t\tkvmppc_update_vpa(vcpu, \u0026vcpu-\u003earch.dtl, \u0026old_vpa);\narch/powerpc/kvm/book3s_hv.c-756-\t\tif (old_vpa.pinned_addr)\n--\narch/powerpc/kvm/book3s_hv.c-758-\t\t\t\t\t\told_vpa.dirty);\narch/powerpc/kvm/book3s_hv.c:759:\t\tvcpu-\u003earch.dtl_ptr = vcpu-\u003earch.dtl.pinned_addr;\narch/powerpc/kvm/book3s_hv.c:760:\t\tvcpu-\u003earch.dtl_index = 0;\narch/powerpc/kvm/book3s_hv.c-761-\t}\narch/powerpc/kvm/book3s_hv.c:762:\tif (vcpu-\u003earch.slb_shadow.update_pending) {\narch/powerpc/kvm/book3s_hv.c:763:\t\tkvmppc_update_vpa(vcpu, \u0026vcpu-\u003earch.slb_shadow, \u0026old_vpa);\narch/powerpc/kvm/book3s_hv.c-764-\t\tif (old_vpa.pinned_addr)\n--\narch/powerpc/kvm/book3s_hv.c-768-\narch/powerpc/kvm/book3s_hv.c:769:\tspin_unlock(\u0026vcpu-\u003earch.vpa_update_lock);\narch/powerpc/kvm/book3s_hv.c-770-}\n--\narch/powerpc/kvm/book3s_hv.c=776=static u64 vcore_stolen_time(struct kvmppc_vcore *vc, u64 now)\n--\narch/powerpc/kvm/book3s_hv.c-780-\narch/powerpc/kvm/book3s_hv.c:781:\tWARN_ON_ONCE(cpu_has_feature(CPU_FTR_ARCH_300));\narch/powerpc/kvm/book3s_hv.c-782-\n--\narch/powerpc/kvm/book3s_hv.c-791-\narch/powerpc/kvm/book3s_hv.c:792:static void __kvmppc_create_dtl_entry(struct kvm_vcpu *vcpu,\narch/powerpc/kvm/book3s_hv.c-793-\t\t\t\t\tstruct lppaca *vpa,\narch/powerpc/kvm/book3s_hv.c:794:\t\t\t\t\tunsigned int pcpu, u64 now,\narch/powerpc/kvm/book3s_hv.c-795-\t\t\t\t\tunsigned long stolen)\n--\narch/powerpc/kvm/book3s_hv.c-798-\narch/powerpc/kvm/book3s_hv.c:799:\tdt = vcpu-\u003earch.dtl_ptr;\narch/powerpc/kvm/book3s_hv.c-800-\n--\narch/powerpc/kvm/book3s_hv.c-805-\tdt-\u003epreempt_reason = 0;\narch/powerpc/kvm/book3s_hv.c:806:\tdt-\u003eprocessor_id = cpu_to_be16(pcpu + vcpu-\u003earch.ptid);\narch/powerpc/kvm/book3s_hv.c:807:\tdt-\u003eenqueue_to_dispatch_time = cpu_to_be32(stolen);\narch/powerpc/kvm/book3s_hv.c-808-\tdt-\u003eready_to_enqueue_time = 0;\narch/powerpc/kvm/book3s_hv.c-809-\tdt-\u003ewaiting_to_ready_time = 0;\narch/powerpc/kvm/book3s_hv.c:810:\tdt-\u003etimebase = cpu_to_be64(now);\narch/powerpc/kvm/book3s_hv.c-811-\tdt-\u003efault_addr = 0;\narch/powerpc/kvm/book3s_hv.c:812:\tdt-\u003esrr0 = cpu_to_be64(kvmppc_get_pc(vcpu));\narch/powerpc/kvm/book3s_hv.c:813:\tdt-\u003esrr1 = cpu_to_be64(vcpu-\u003earch.shregs.msr);\narch/powerpc/kvm/book3s_hv.c-814-\narch/powerpc/kvm/book3s_hv.c-815-\t++dt;\narch/powerpc/kvm/book3s_hv.c:816:\tif (dt == vcpu-\u003earch.dtl.pinned_end)\narch/powerpc/kvm/book3s_hv.c:817:\t\tdt = vcpu-\u003earch.dtl.pinned_addr;\narch/powerpc/kvm/book3s_hv.c:818:\tvcpu-\u003earch.dtl_ptr = dt;\narch/powerpc/kvm/book3s_hv.c-819-\t/* order writing *dt vs. writing vpa-\u003edtl_idx */\narch/powerpc/kvm/book3s_hv.c-820-\tsmp_wmb();\narch/powerpc/kvm/book3s_hv.c:821:\tvpa-\u003edtl_idx = cpu_to_be64(++vcpu-\u003earch.dtl_index);\narch/powerpc/kvm/book3s_hv.c-822-\narch/powerpc/kvm/book3s_hv.c:823:\t/* vcpu-\u003earch.dtl.dirty is set by the caller */\narch/powerpc/kvm/book3s_hv.c-824-}\narch/powerpc/kvm/book3s_hv.c-825-\narch/powerpc/kvm/book3s_hv.c:826:static void kvmppc_update_vpa_dispatch(struct kvm_vcpu *vcpu,\narch/powerpc/kvm/book3s_hv.c-827-\t\t\t\t       struct kvmppc_vcore *vc)\n--\narch/powerpc/kvm/book3s_hv.c-834-\narch/powerpc/kvm/book3s_hv.c:835:\tvpa = vcpu-\u003earch.vpa.pinned_addr;\narch/powerpc/kvm/book3s_hv.c-836-\tif (!vpa)\n--\narch/powerpc/kvm/book3s_hv.c-841-\tcore_stolen = vcore_stolen_time(vc, now);\narch/powerpc/kvm/book3s_hv.c:842:\tstolen = core_stolen - vcpu-\u003earch.stolen_logged;\narch/powerpc/kvm/book3s_hv.c:843:\tvcpu-\u003earch.stolen_logged = core_stolen;\narch/powerpc/kvm/book3s_hv.c:844:\tspin_lock_irqsave(\u0026vcpu-\u003earch.tbacct_lock, flags);\narch/powerpc/kvm/book3s_hv.c:845:\tstolen += vcpu-\u003earch.busy_stolen;\narch/powerpc/kvm/book3s_hv.c:846:\tvcpu-\u003earch.busy_stolen = 0;\narch/powerpc/kvm/book3s_hv.c:847:\tspin_unlock_irqrestore(\u0026vcpu-\u003earch.tbacct_lock, flags);\narch/powerpc/kvm/book3s_hv.c-848-\narch/powerpc/kvm/book3s_hv.c:849:\tvpa-\u003eenqueue_dispatch_tb = cpu_to_be64(be64_to_cpu(vpa-\u003eenqueue_dispatch_tb) + stolen);\narch/powerpc/kvm/book3s_hv.c-850-\narch/powerpc/kvm/book3s_hv.c:851:\t__kvmppc_create_dtl_entry(vcpu, vpa, vc-\u003epcpu, now + kvmppc_get_tb_offset(vcpu), stolen);\narch/powerpc/kvm/book3s_hv.c-852-\narch/powerpc/kvm/book3s_hv.c:853:\tvcpu-\u003earch.vpa.dirty = true;\narch/powerpc/kvm/book3s_hv.c-854-}\narch/powerpc/kvm/book3s_hv.c-855-\narch/powerpc/kvm/book3s_hv.c:856:static void kvmppc_update_vpa_dispatch_p9(struct kvm_vcpu *vcpu,\narch/powerpc/kvm/book3s_hv.c-857-\t\t\t\t       struct kvmppc_vcore *vc,\n--\narch/powerpc/kvm/book3s_hv.c-863-\narch/powerpc/kvm/book3s_hv.c:864:\tvpa = vcpu-\u003earch.vpa.pinned_addr;\narch/powerpc/kvm/book3s_hv.c-865-\tif (!vpa)\n--\narch/powerpc/kvm/book3s_hv.c-868-\tstolen = vc-\u003estolen_tb;\narch/powerpc/kvm/book3s_hv.c:869:\tstolen_delta = stolen - vcpu-\u003earch.stolen_logged;\narch/powerpc/kvm/book3s_hv.c:870:\tvcpu-\u003earch.stolen_logged = stolen;\narch/powerpc/kvm/book3s_hv.c-871-\narch/powerpc/kvm/book3s_hv.c:872:\tvpa-\u003eenqueue_dispatch_tb = cpu_to_be64(stolen);\narch/powerpc/kvm/book3s_hv.c-873-\narch/powerpc/kvm/book3s_hv.c:874:\t__kvmppc_create_dtl_entry(vcpu, vpa, vc-\u003epcpu, now, stolen_delta);\narch/powerpc/kvm/book3s_hv.c-875-\narch/powerpc/kvm/book3s_hv.c:876:\tvcpu-\u003earch.vpa.dirty = true;\narch/powerpc/kvm/book3s_hv.c-877-}\narch/powerpc/kvm/book3s_hv.c-878-\narch/powerpc/kvm/book3s_hv.c:879:/* See if there is a doorbell interrupt pending for a vcpu */\narch/powerpc/kvm/book3s_hv.c:880:static bool kvmppc_doorbell_pending(struct kvm_vcpu *vcpu)\narch/powerpc/kvm/book3s_hv.c-881-{\n--\narch/powerpc/kvm/book3s_hv.c-884-\narch/powerpc/kvm/book3s_hv.c:885:\tif (vcpu-\u003earch.doorbell_request)\narch/powerpc/kvm/book3s_hv.c-886-\t\treturn true;\narch/powerpc/kvm/book3s_hv.c:887:\tif (cpu_has_feature(CPU_FTR_ARCH_300))\narch/powerpc/kvm/book3s_hv.c-888-\t\treturn false;\n--\narch/powerpc/kvm/book3s_hv.c-890-\t * Ensure that the read of vcore-\u003edpdes comes after the read\narch/powerpc/kvm/book3s_hv.c:891:\t * of vcpu-\u003edoorbell_request.  This barrier matches the\narch/powerpc/kvm/book3s_hv.c-892-\t * smp_wmb() in kvmppc_guest_entry_inject().\n--\narch/powerpc/kvm/book3s_hv.c-894-\tsmp_rmb();\narch/powerpc/kvm/book3s_hv.c:895:\tvc = vcpu-\u003earch.vcore;\narch/powerpc/kvm/book3s_hv.c:896:\tthr = vcpu-\u003evcpu_id - vc-\u003efirst_vcpuid;\narch/powerpc/kvm/book3s_hv.c-897-\treturn !!(vc-\u003edpdes \u0026 (1 \u003c\u003c thr));\n--\narch/powerpc/kvm/book3s_hv.c-899-\n\n"
}

15/2 2026/08/03 04:58 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 39187
							output: 33
							thoughts: 57
						

Thoughts:
**Debugging the Compilation Failure**

Okay, here's the situation. The build just choked, and the error message clearly points to a missing `cpu` variable. That's a classic - I can't imagine this is an intentional oversight. It's not a global, and I'm betting that's the core issue. The patch is probably referencing it somewhere.

But hold on, this is where I need to be more careful. It's *possible* `cpu` is a macro defined in a header file. I've been burned by that before. Always check the includes! So, rather than assume it's just a variable, let me quickly glance at the usual suspects in the `arch/powerpc/include/asm/` directory. That's where I expect to find any processor-specific definitions on a PowerPC system. Let's see if `cpu` is defined as a macro in one of those headers. I need to know if this is a simple macro expansion issue, or if this is a deeper problem with the patch itself. I'm going to start with the most likely candidates, like the main architecture header.



16/2 2026/08/03 04:58 tool grepper
0m Error:
no matches

Args:
{
  "Expression": "#define cpu ",
  "PathPrefix": "arch/powerpc/include/asm/"
}

Results:
{
  "error": "no matches"
}

17/2 2026/08/03 04:58 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 39533
							output: 28
							thoughts: 18
						

Thoughts:
Okay, here's my thought process, rendered as a first-person account suitable for a fellow expert:

**Investigating the `cpu` Macro in Linux Header Files**

Alright, I'm thinking I need to see if the symbol `cpu` is defined as a macro within the `include/linux/` directory. That's the obvious place to start. Given the context of Linux kernel development and performance, `cpu` could be anything from a simple macro expanding to register names, to more complex logic related to CPU architecture detection, or even a component in a power management scheme. I'll need to confirm what it actually *is*, and that will determine how I proceed. Time to dive into the includes.



18/2 2026/08/03 04:58 tool grepper
0m Error:
no matches

Args:
{
  "Expression": "#define cpu ",
  "PathPrefix": "include/linux/"
}

Results:
{
  "error": "no matches"
}

19/2 2026/08/03 04:58 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 39743
							output: 25
							thoughts: 208
						

Thoughts:
**Debugging a Compilation Failure**

Okay, so I've got this patch, and it's failing to compile. The error looks like a typo: `cpu->arch.doorbell_request = 0;`. That's a classic, I've seen it a thousand times. A missing or incorrect member access is a pretty obvious compilation stopper. The thing is, if it doesn't compile, I can't even fuzz it, which is the immediate next step.

First, let me confirm that `cpu` isn't declared in the function `kvmhv_vcpu_entry_nestedv2`. Let's take a quick look at the code block provided in the patch... Yep, I'm right. It's not declared there.

Now, wait a second... is there a chance `cpu` is a macro? It's not uncommon to use macros like `cpu` to expand to something like `smp_processor_id()` in this kind of kernel code. Let's dig in and see if `cpu` is defined anywhere as a macro. That would be a sneaky little bug. I need to be thorough.



20/2 2026/08/03 04:58 tool grepper
0m Error:
no matches

Args:
{
  "Expression": "#define cpu\\b",
  "PathPrefix": ""
}

Results:
{
  "error": "no matches"
}

21/2 2026/08/03 04:58 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 40234
							output: 28
							thoughts: 238
						

Thoughts:
**Analyzing the Fuzzing Worthiness of a Committed Patch**

Okay, this seems straightforward, but let me think this through. No, the patch *doesn't* look right. This makes me suspect a compilation error. If the patch introduces a compilation error, obviously I can't compile or test it. But hold on, the prompt says the changes have *already* been applied and committed. If that's the case, *maybe* it compiled already?

Ah, but then I remember: the prompt's condition: "Return WorthFuzzing=false if the patch only contains... code paths that are impossible to reach in virtualized environments". If it *doesn't* compile, it's definitely not fuzz-worthy because it's unusable; there's no way to even start testing. There is no explicit rule for "does not compile".

So, if it fails to compile, I should probably return `WorthFuzzing=false`. Let's just make sure there aren't any other factors I'm overlooking. Okay, let me quickly double check if there are other files modified in the diff. Ah, the diff only shows changes to `arch/powerpc/kvm/book3s_hv.c`. Is there any possible global variable usage here? Could `cpu` be a global variable? Let's search the kernel codebase for instances of `struct kvm_vcpu *cpu` and make sure. This will help determine if it's fuzz-worthy.



22/2 2026/08/03 04:58 tool grepper
0m Args:
{
  "Expression": "struct kvm_vcpu \\*cpu",
  "PathPrefix": ""
}

Results:
{
  "Output": "tools/testing/selftests/kvm/lib/x86/sev.c=161=struct kvm_vm *vm_sev_create_with_one_vcpu(u32 type, void *guest_code,\n--\ntools/testing/selftests/kvm/lib/x86/sev.c-168-\tstruct kvm_vm *vm;\ntools/testing/selftests/kvm/lib/x86/sev.c:169:\tstruct kvm_vcpu *cpus[1];\ntools/testing/selftests/kvm/lib/x86/sev.c-170-\n"
}

23/2 2026/08/03 04:58 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 40987
							output: 38
							thoughts: 252
						

Thoughts:
**Debugging a Potential Typo**

Okay, there's no global `cpu` variable in sight. That's immediately obvious. Let's re-examine this code patch closely.

```c
+	/* Check if privileged door bell was requested and handled */
+	if (vcpu->arch.vcore->dpdes) {
+		kvmhv_nestedv2_cached_reload(vcpu, KVMPPC_GSID_DPDES);
+		if (vcpu->arch.vcore->dpdes)
+			vcpu->arch.doorbell_request |= vcpu->arch.vcore->dpdes;
+		else
+			cpu->arch.doorbell_request = 0;
+	} else {
+		vcpu->arch.doorbell_request = 0;
+	}
```

Right, it's pretty clear that `cpu` in that `else` block should be `vcpu`. That's a classic typo.  The compiler would definitely catch this, so it's not functional as written.

But wait, hold on. Could it be that `cpu` is *actually* a macro? I should check the file where this is defined, `arch/powerpc/kvm/book3s_hv.c`, just to be certain. Macros can be sneaky.



24/2 2026/08/03 04:58 tool grepper
0m Error:
no matches

Args:
{
  "Expression": "#define cpu",
  "PathPrefix": "arch/powerpc/kvm/book3s_hv.c"
}

Results:
{
  "error": "no matches"
}

25/2 2026/08/03 04:58 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 41586
							output: 43
							thoughts: 80
						

Thoughts:
**Compilation Error Found - Rethinking Approach**

Alright, no. This isn't a simple oversight; it's a compilation error. My initial instinct is to mark `WorthFuzzing=false` and clearly state that the patch introduces a compilation issue – the code uses `cpu` where it should use `vcpu`. That's the obvious route.

But hold on a second. Before I rush to judgment, is there even a *remote* possibility that `cpu` is a valid variable in this context? I need to be absolutely certain. Just because it's *likely* a typo doesn't mean it *is* one. Let me go back and re-examine `arch/powerpc/kvm/book3s_hv.c`. I need to rule out any subtle nuances in that section of code.



26/2 2026/08/03 04:58 tool grepper
0m Args:
{
  "Expression": "cpu-\u003earch.doorbell_request",
  "PathPrefix": "arch/powerpc/kvm/book3s_hv.c"
}

Results:
{
  "Output": "arch/powerpc/kvm/book3s_hv.c=880=static bool kvmppc_doorbell_pending(struct kvm_vcpu *vcpu)\n--\narch/powerpc/kvm/book3s_hv.c-884-\narch/powerpc/kvm/book3s_hv.c:885:\tif (vcpu-\u003earch.doorbell_request)\narch/powerpc/kvm/book3s_hv.c-886-\t\treturn true;\n--\narch/powerpc/kvm/book3s_hv.c=1535=static int kvmppc_emulate_doorbell_instr(struct kvm_vcpu *vcpu)\n--\narch/powerpc/kvm/book3s_hv.c-1560-\t\t\tbreak;\narch/powerpc/kvm/book3s_hv.c:1561:\t\tif (!tvcpu-\u003earch.doorbell_request) {\narch/powerpc/kvm/book3s_hv.c:1562:\t\t\ttvcpu-\u003earch.doorbell_request = 1;\narch/powerpc/kvm/book3s_hv.c-1563-\t\t\tkvmppc_fast_vcpu_kick_hv(tvcpu);\n--\narch/powerpc/kvm/book3s_hv.c-1570-\t\tvcpu-\u003earch.vcore-\u003edpdes = 0;\narch/powerpc/kvm/book3s_hv.c:1571:\t\tvcpu-\u003earch.doorbell_request = 0;\narch/powerpc/kvm/book3s_hv.c-1572-\t\tbreak;\n--\narch/powerpc/kvm/book3s_hv.c=2230=static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,\n--\narch/powerpc/kvm/book3s_hv.c-2316-\t\tif (cpu_has_feature(CPU_FTR_ARCH_300))\narch/powerpc/kvm/book3s_hv.c:2317:\t\t\t*val = get_reg_val(id, vcpu-\u003earch.doorbell_request);\narch/powerpc/kvm/book3s_hv.c-2318-\t\telse\n--\narch/powerpc/kvm/book3s_hv.c=2488=static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,\n--\narch/powerpc/kvm/book3s_hv.c-2568-\t\tif (cpu_has_feature(CPU_FTR_ARCH_300))\narch/powerpc/kvm/book3s_hv.c:2569:\t\t\tvcpu-\u003earch.doorbell_request = set_reg_val(id, *val) \u0026 1;\narch/powerpc/kvm/book3s_hv.c-2570-\t\telse\n--\narch/powerpc/kvm/book3s_hv.c=4249=static int kvmhv_vcpu_entry_nestedv2(struct kvm_vcpu *vcpu, u64 time_limit,\n--\narch/powerpc/kvm/book3s_hv.c-4263-\narch/powerpc/kvm/book3s_hv.c:4264:\tif (vcpu-\u003earch.doorbell_request)\narch/powerpc/kvm/book3s_hv.c-4265-\t\tkvmppc_set_dpdes(vcpu, 1);\n--\narch/powerpc/kvm/book3s_hv.c-4301-\t\tif (vcpu-\u003earch.vcore-\u003edpdes)\narch/powerpc/kvm/book3s_hv.c:4302:\t\t\tvcpu-\u003earch.doorbell_request |= vcpu-\u003earch.vcore-\u003edpdes;\narch/powerpc/kvm/book3s_hv.c-4303-\t\telse\narch/powerpc/kvm/book3s_hv.c:4304:\t\t\tcpu-\u003earch.doorbell_request = 0;\narch/powerpc/kvm/book3s_hv.c-4305-\t} else {\narch/powerpc/kvm/book3s_hv.c:4306:\t\tvcpu-\u003earch.doorbell_request = 0;\narch/powerpc/kvm/book3s_hv.c-4307-\t}\n--\narch/powerpc/kvm/book3s_hv.c=4319=static int kvmhv_vcpu_entry_p9_nested(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpcr, u64 *tb)\n--\narch/powerpc/kvm/book3s_hv.c-4369-\narch/powerpc/kvm/book3s_hv.c:4370:\tif (vcpu-\u003earch.doorbell_request)\narch/powerpc/kvm/book3s_hv.c:4371:\t\tvcpu-\u003earch.doorbell_request = 0;\narch/powerpc/kvm/book3s_hv.c-4372-\n"
}

27/2 2026/08/03 04:58 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 43212
							output: 82
							thoughts: 61
						

Thoughts:
Here's my take on the situation:

**Addressing a Likely Typos and Fuzzing Inaccessibility**

Okay, I've got it. That line, `cpu->arch.doorbell_request = 0;`... yeah, that's almost certainly a typo. It should be `vcpu->arch.doorbell_request = 0;`, I'm pretty confident about that. I mean, it's not even compiling as it is, which is a pretty clear indicator. And that's a problem because if it doesn't compile, it's completely inaccessible for any kind of fuzzing. So, given that immediate roadblock, there's no point in further analysis. I need to flag it accordingly, I'll set WorthFuzzing=false.



28/2 2026/08/03 04:58 tool set-results
0m Args:
{
  "EnableConfigs": [],
  "FocusSymbols": [],
  "Reasoning": "The patch contains a compilation error: `cpu-\u003earch.doorbell_request = 0;` should be `vcpu-\u003earch.doorbell_request = 0;`. Since it fails to compile, it cannot be fuzzed.",
  "WorthFuzzing": false
}

Results:
{
  "EnableConfigs": null,
  "FocusSymbols": [],
  "Reasoning": "The patch contains a compilation error: `cpu-\u003earch.doorbell_request = 0;` should be `vcpu-\u003earch.doorbell_request = 0;`. Since it fails to compile, it cannot be fuzzed.",
  "WorthFuzzing": false
}

LLM Calls Summary:
Total Calls Total Tokens Avg Tokens Total Duration (Seconds) Avg Duration (Seconds)
Tool Calls Summary:
Total Calls Total Duration (Seconds) Avg Duration (Seconds)