瀏覽代碼

[SPARC64]: Do not try to write to %tick or %stick on SUN4V.

Writes by privileged code are disallowed.  The hypervisor manages
the non-privileged bit.

Signed-off-by: David S. Miller <davem@davemloft.net>
David S. Miller 19 年之前
父節點
當前提交
7aa6264543
共有 1 個文件被更改,包括 16 次插入10 次删除
  1. 16 10
      arch/sparc64/kernel/time.c

+ 16 - 10
arch/sparc64/kernel/time.c

@@ -193,16 +193,22 @@ struct sparc64_tick_ops *tick_ops __read_mostly = &tick_operations;
 
 
 static void stick_init_tick(unsigned long offset)
 static void stick_init_tick(unsigned long offset)
 {
 {
-	tick_disable_protection();
-
-	/* Let the user get at STICK too. */
-	__asm__ __volatile__(
-	"	rd	%%asr24, %%g2\n"
-	"	andn	%%g2, %0, %%g2\n"
-	"	wr	%%g2, 0, %%asr24"
-	: /* no outputs */
-	: "r" (TICK_PRIV_BIT)
-	: "g1", "g2");
+	/* Writes to the %tick and %stick register are not
+	 * allowed on sun4v.  The Hypervisor controls that
+	 * bit, per-strand.
+	 */
+	if (tlb_type != hypervisor) {
+		tick_disable_protection();
+
+		/* Let the user get at STICK too. */
+		__asm__ __volatile__(
+		"	rd	%%asr24, %%g2\n"
+		"	andn	%%g2, %0, %%g2\n"
+		"	wr	%%g2, 0, %%asr24"
+		: /* no outputs */
+		: "r" (TICK_PRIV_BIT)
+		: "g1", "g2");
+	}
 
 
 	__asm__ __volatile__(
 	__asm__ __volatile__(
 	"	rd	%%asr24, %%g1\n"
 	"	rd	%%asr24, %%g1\n"