Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Feb 2018 02:51:28 +0000 (UTC)
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r329258 - head/sys/powerpc/pseries
Message-ID:  <201802140251.w1E2pSoA074475@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhibbits
Date: Wed Feb 14 02:51:28 2018
New Revision: 329258
URL: https://svnweb.freebsd.org/changeset/base/329258

Log:
  PPC64: Get the timestap from the proper OF field
  
  Summary:
  After revision rS328534('PPC64: use hwref instead of cpuid'), FreeBSD on
  powerpc64 virtual machine panics since it is unable to read the
  timebase, showing the following error:
  
       get-property for timebase-frequency on zero phandle
  
       panic: Unable to determine timebase frequency!
  
  With the change above,  cpuref->cr_hwref does not contain the phandle
  anymore, thus, it never reads the proper CPU entry in OF.
  
  Submitted by:	Breno Leitao
  Differential Revision:	https://reviews.freebsd.org/D14204

Modified:
  head/sys/powerpc/pseries/platform_chrp.c

Modified: head/sys/powerpc/pseries/platform_chrp.c
==============================================================================
--- head/sys/powerpc/pseries/platform_chrp.c	Wed Feb 14 02:48:27 2018	(r329257)
+++ head/sys/powerpc/pseries/platform_chrp.c	Wed Feb 14 02:51:28 2018	(r329258)
@@ -285,12 +285,24 @@ chrp_real_maxaddr(platform_t plat)
 static u_long
 chrp_timebase_freq(platform_t plat, struct cpuref *cpuref)
 {
-	phandle_t phandle;
+	phandle_t cpus, cpunode;
 	int32_t ticks = -1;
+	int res;
+	char buf[8];
 
-	phandle = cpuref->cr_hwref;
+	cpus = OF_finddevice("/cpus");
+	if (cpus <= 0)
+		panic("CPU tree not found on Open Firmware\n");
 
-	OF_getencprop(phandle, "timebase-frequency", &ticks, sizeof(ticks));
+	for (cpunode = OF_child(cpus); cpunode != 0; cpunode = OF_peer(cpunode)) {
+		res = OF_getprop(cpunode, "device_type", buf, sizeof(buf));
+		if (res > 0 && strcmp(buf, "cpu") == 0)
+			break;
+	}
+	if (cpunode <= 0)
+		panic("CPU node not found on Open Firmware\n");
+
+	OF_getencprop(cpunode, "timebase-frequency", &ticks, sizeof(ticks));
 
 	if (ticks <= 0)
 		panic("Unable to determine timebase frequency!");



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201802140251.w1E2pSoA074475>