@@ -44,7 +44,18 @@
void tcg_cpu_init_cflags(CPUState *cpu, bool parallel)
{
- uint32_t cflags = cpu->cluster_index << CF_CLUSTER_SHIFT;
+ uint32_t cflags;
+
+ /*
+ * Include the cluster number in the hash we use to look up TBs.
+ * This is important because a TB that is valid for one cluster at
+ * a given physical address and set of CPU flags is not necessarily
+ * valid for another:
+ * the two clusters may have different views of physical memory, or
+ * may have different CPU features (eg FPU present or absent).
+ */
+ cflags = cpu->cluster_index << CF_CLUSTER_SHIFT;
+
cflags |= parallel ? CF_PARALLEL : 0;
cflags |= icount_enabled() ? CF_USE_ICOUNT : 0;
cpu->tcg_cflags = cflags;
@@ -272,6 +272,8 @@ struct qemu_work_item;
* to a cluster this will be UNASSIGNED_CLUSTER_INDEX; otherwise it will
* be the same as the cluster-id property of the CPU object's TYPE_CPU_CLUSTER
* QOM parent.
+ * Under TCG this value is propagated to @tcg_cflags.
+ * See TranslationBlock::TCG CF_CLUSTER_MASK.
* @tcg_cflags: Pre-computed cflags for this cpu.
* @nr_cores: Number of cores within this CPU package.
* @nr_threads: Number of threads within this CPU.