diff options
| author | nakayama <nakayama@NetBSD.org> | 2014-12-25 14:02:03 +0000 |
|---|---|---|
| committer | nakayama <nakayama@NetBSD.org> | 2014-12-25 14:02:03 +0000 |
| commit | dcfe48c1909211e35b28bc61824dfd9ef5f3a34a (patch) | |
| tree | d1aa7214ad0240898d1715fce93e273c4ef632b0 | |
| parent | 1d31a635e1f8248dcdfdbd75c546554420d04d5d (diff) | |
Put "memory" to asm inline for reading privilege registers on sun4v
to avoid issuing rdpr %ver before checking cputyp as a result of
code moving by compiler optimization.
| -rw-r--r-- | sys/arch/sparc64/include/psl.h | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/sys/arch/sparc64/include/psl.h b/sys/arch/sparc64/include/psl.h index ed9fa24c626..35ab025be57 100644 --- a/sys/arch/sparc64/include/psl.h +++ b/sys/arch/sparc64/include/psl.h @@ -1,4 +1,4 @@ -/* $NetBSD: psl.h,v 1.55 2014/12/05 11:34:00 nakayama Exp $ */ +/* $NetBSD: psl.h,v 1.56 2014/12/25 14:02:03 nakayama Exp $ */ /* * Copyright (c) 1992, 1993 @@ -284,6 +284,21 @@ #if defined(_KERNEL) && !defined(_LOCORE) +#if defined(_KERNEL_OPT) +#include "opt_sparc_arch.h" +#endif + +/* + * Put "memory" to asm inline on sun4v to avoid issuing rdpr %ver + * before checking cputyp as a result of code moving by compiler + * optimization. + */ +#ifdef SUN4V +#define constasm_clobbers "memory" +#else +#define constasm_clobbers +#endif + /* * Inlines for manipulating privileged and ancillary state registers */ @@ -291,7 +306,7 @@ static __inline __constfunc type get##name(void) \ { \ type _val; \ - __asm(#rd " %" #reg ",%0" : "=r" (_val)); \ + __asm(#rd " %" #reg ",%0" : "=r" (_val) : : constasm_clobbers); \ return _val; \ } #define SPARC64_RD_DEF(rd, name, reg, type) \ @@ -318,7 +333,7 @@ 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)); \ + : "=r" (_hi), "=r" (_lo) : : constasm_clobbers); \ return ((uint64_t)_hi << 32) | _lo; \ } #define SPARC64_RD64_DEF(rd, name, reg) \ |
