Module Name: src
Committed By: martin
Date: Sat Dec 13 19:29:28 UTC 2014
Modified Files:
src/sys/arch/sparc64/include [netbsd-7]: psl.h
src/sys/arch/sparc64/sparc64 [netbsd-7]: cpu.c
Log Message:
Pull up following revision(s) (requested by nakayama in ticket #318):
sys/arch/sparc64/include/psl.h: revision 1.54
sys/arch/sparc64/include/psl.h: revision 1.55
sys/arch/sparc64/sparc64/cpu.c: revision 1.121
Make getver() into a constant function since Version Register (%ver)
is read only and its value is constant.
This change reduces multipule %ver reads to one in the functions
which uses a number of CPU_IS_* macros.
Use GETVER_CPU_* macros.
To generate a diff of this commit:
cvs rdiff -u -r1.53 -r1.53.4.1 src/sys/arch/sparc64/include/psl.h
cvs rdiff -u -r1.116 -r1.116.2.1 src/sys/arch/sparc64/sparc64/cpu.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sparc64/include/psl.h
diff -u src/sys/arch/sparc64/include/psl.h:1.53 src/sys/arch/sparc64/include/psl.h:1.53.4.1
--- src/sys/arch/sparc64/include/psl.h:1.53 Sun Aug 18 09:31:38 2013
+++ src/sys/arch/sparc64/include/psl.h Sat Dec 13 19:29:28 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: psl.h,v 1.53 2013/08/18 09:31:38 martin Exp $ */
+/* $NetBSD: psl.h,v 1.53.4.1 2014/12/13 19:29:28 martin Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -287,6 +287,13 @@
/*
* Inlines for manipulating privileged and ancillary state registers
*/
+#define SPARC64_RDCONST_DEF(rd, name, reg, type) \
+static __inline __constfunc type get##name(void) \
+{ \
+ type _val; \
+ __asm(#rd " %" #reg ",%0" : "=r" (_val)); \
+ return _val; \
+}
#define SPARC64_RD_DEF(rd, name, reg, type) \
static __inline type get##name(void) \
{ \
@@ -301,9 +308,19 @@ static __inline void set##name(type _val
}
#ifdef __arch64__
+#define SPARC64_RDCONST64_DEF(rd, name, reg) \
+ SPARC64_RDCONST_DEF(rd, name, reg, uint64_t)
#define SPARC64_RD64_DEF(rd, name, reg) SPARC64_RD_DEF(rd, name, reg, uint64_t)
#define SPARC64_WR64_DEF(wr, name, reg) SPARC64_WR_DEF(wr, name, reg, uint64_t)
#else
+#define SPARC64_RDCONST64_DEF(rd, name, reg) \
+static __inline __constfunc uint64_t get##name(void) \
+{ \
+ uint32_t _hi, _lo; \
+ __asm(#rd " %" #reg ",%0; srl %0,0,%1; srlx %0,32,%0" \
+ : "=r" (_hi), "=r" (_lo)); \
+ return ((uint64_t)_hi << 32) | _lo; \
+}
#define SPARC64_RD64_DEF(rd, name, reg) \
static __inline uint64_t get##name(void) \
{ \
@@ -345,13 +362,14 @@ SPARC64_RDPR_DEF(cwp, %cwp, int) /* get
SPARC64_WRPR_DEF(cwp, %cwp, int) /* setcwp() */
/* Version Register (PR 31) */
-SPARC64_RDPR64_DEF(ver, %ver) /* getver() */
+SPARC64_RDCONST64_DEF(rdpr, ver, %ver) /* getver() */
/* System Tick Register (ASR 24) */
SPARC64_RDASR64_DEF(stick, STICK) /* getstick() */
SPARC64_WRASR64_DEF(stick, STICK) /* setstick() */
/* Some simple macros to check the cpu type. */
+#define GETVER_CPU_MASK() ((getver() & VER_MASK) >> VER_MASK_SHIFT)
#define GETVER_CPU_IMPL() ((getver() & VER_IMPL) >> VER_IMPL_SHIFT)
#define GETVER_CPU_MANUF() ((getver() & VER_MANUF) >> VER_MANUF_SHIFT)
#define CPU_IS_SPITFIRE() (GETVER_CPU_IMPL() == IMPL_SPITFIRE)
Index: src/sys/arch/sparc64/sparc64/cpu.c
diff -u src/sys/arch/sparc64/sparc64/cpu.c:1.116 src/sys/arch/sparc64/sparc64/cpu.c:1.116.2.1
--- src/sys/arch/sparc64/sparc64/cpu.c:1.116 Fri Jul 25 18:29:45 2014
+++ src/sys/arch/sparc64/sparc64/cpu.c Sat Dec 13 19:29:28 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.c,v 1.116 2014/07/25 18:29:45 nakayama Exp $ */
+/* $NetBSD: cpu.c,v 1.116.2.1 2014/12/13 19:29:28 martin Exp $ */
/*
* Copyright (c) 1996
@@ -52,7 +52,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.116 2014/07/25 18:29:45 nakayama Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.116.2.1 2014/12/13 19:29:28 martin Exp $");
#include "opt_multiprocessor.h"
@@ -284,7 +284,6 @@ cpu_attach(device_t parent, device_t dev
struct cpu_info *ci;
const char *sep;
register int i, l;
- uint64_t ver;
int bigcache, cachesize;
char buf[100];
int totalsize = 0;
@@ -349,11 +348,10 @@ cpu_attach(device_t parent, device_t dev
aprint_normal(": %s, CPU id %d\n", buf, ci->ci_cpuid);
aprint_naive("\n");
if (CPU_ISSUN4U || CPU_ISSUN4US) {
- ver = getver();
aprint_normal_dev(dev, "manuf %x, impl %x, mask %x\n",
- (u_int)((ver & VER_MANUF) >> VER_MANUF_SHIFT),
- (u_int)((ver & VER_IMPL) >> VER_IMPL_SHIFT),
- (u_int)((ver & VER_MASK) >> VER_MASK_SHIFT));
+ (u_int)GETVER_CPU_MANUF(),
+ (u_int)GETVER_CPU_IMPL(),
+ (u_int)GETVER_CPU_MASK());
}
if (ci->ci_system_clockrate[0] != 0) {
@@ -495,7 +493,6 @@ int
cpu_myid(void)
{
char buf[32];
- int impl;
#ifdef SUN4V
if (CPU_ISSUN4V) {
@@ -507,8 +504,7 @@ cpu_myid(void)
if (OF_getprop(findroot(), "name", buf, sizeof(buf)) > 0 &&
strcmp(buf, "SUNW,Ultra-Enterprise-10000") == 0)
return lduwa(0x1fff40000d0UL, ASI_PHYS_NON_CACHED);
- impl = (getver() & VER_IMPL) >> VER_IMPL_SHIFT;
- switch (impl) {
+ switch (GETVER_CPU_IMPL()) {
case IMPL_OLYMPUS_C:
case IMPL_JUPITER:
return CPU_JUPITERID;