Message ID | 1362443590-28191-26-git-send-email-rth@twiddle.net |
---|---|
State | New |
Headers | show |
On Mon, Mar 04, 2013 at 04:33:08PM -0800, Richard Henderson wrote: > Glibc 2.16 includes an easy way to get feature bits previously > buried in /proc or the program startup auxiliary vector. Use it. > > Signed-off-by: Richard Henderson <rth@twiddle.net> > --- > configure | 18 ++++++++++++++++++ > tcg/ppc64/tcg-target.c | 20 +++++++++++++++++++- > 2 files changed, 37 insertions(+), 1 deletion(-) > > diff --git a/configure b/configure > index 19738ac..c876099 100755 > --- a/configure > +++ b/configure > @@ -3214,6 +3214,20 @@ if compile_prog "" "" ; then > int128=yes > fi > > +######################################## > +# check if getauxval is available. > + > +getauxval=no > +cat > $TMPC << EOF > +#include <sys/auxv.h> > +int main(void) { > + return getauxval(AT_HWCAP) == 0; > +} > +EOF > +if compile_prog "" "" ; then > + getauxval=yes > +fi > + > ########################################## > # End of CC checks > # After here, no more $cc or $ld runs > @@ -3767,6 +3781,10 @@ if test "$int128" = "yes" ; then > echo "CONFIG_INT128=y" >> $config_host_mak > fi > > +if test "$getauxval" = "yes" ; then > + echo "CONFIG_GETAUXVAL=y" >> $config_host_mak > +fi > + > if test "$glusterfs" = "yes" ; then > echo "CONFIG_GLUSTERFS=y" >> $config_host_mak > fi > diff --git a/tcg/ppc64/tcg-target.c b/tcg/ppc64/tcg-target.c > index 2acccf6..826726d 100644 > --- a/tcg/ppc64/tcg-target.c > +++ b/tcg/ppc64/tcg-target.c > @@ -44,8 +44,16 @@ static uint8_t *tb_ret_addr; > #define GUEST_BASE 0 > #endif > > +#ifdef CONFIG_GETAUXVAL > +#include <sys/auxv.h> > +static bool have_isa_2_05; > +static bool have_isa_2_06; > +#define HAVE_ISA_2_05 have_isa_2_05 > +#define HAVE_ISEL have_isa_2_06 > +#else > #define HAVE_ISA_2_05 0 > -#define HAVE_ISEL 0 > +#define HAVE_ISA_ISEL 0 > +#endif > > #ifdef CONFIG_USE_GUEST_BASE > #define TCG_GUEST_BASE_REG 30 > @@ -2084,6 +2092,16 @@ static const TCGTargetOpDef ppc_op_defs[] = { > > static void tcg_target_init (TCGContext *s) > { > +#ifdef CONFIG_GETAUXVAL > + unsigned long hwcap = getauxval(AT_HWCAP); > + /* Bizzarely, the linux kernel doesn't set *all* applicable bits. */ > + if (hwcap & PPC_FEATURE_ARCH_2_06) { > + have_isa_2_05 = have_isa_2_06 = true; > + } else if (hwcap & PPC_FEATURE_ARCH_2_05) { > + have_isa_2_05 = true; > + } It's a great idea, but following comments from patch 14, you only have to check for ARCH_2_06. I wonder if the same could be used for arm with AT_PLATFORM to detect ARM v5/v6/v7. > +#endif > + > tcg_regset_set32 (tcg_target_available_regs[TCG_TYPE_I32], 0, 0xffffffff); > tcg_regset_set32 (tcg_target_available_regs[TCG_TYPE_I64], 0, 0xffffffff); > tcg_regset_set32 (tcg_target_call_clobber_regs, 0, > -- > 1.8.1.2 > > >
On 2013-04-01 08:00, Aurelien Jarno wrote: > I wonder if the same could be used for arm with AT_PLATFORM to detect ARM > v5/v6/v7. Yes you can. Once the ppc64 patch set was in, I was planning on seeing what I could infer from the ARM HWCAP bits. E.g. if you have neon then you're at least arm6, etc. I'd sort of forgotten about PLATFORM. r~
diff --git a/configure b/configure index 19738ac..c876099 100755 --- a/configure +++ b/configure @@ -3214,6 +3214,20 @@ if compile_prog "" "" ; then int128=yes fi +######################################## +# check if getauxval is available. + +getauxval=no +cat > $TMPC << EOF +#include <sys/auxv.h> +int main(void) { + return getauxval(AT_HWCAP) == 0; +} +EOF +if compile_prog "" "" ; then + getauxval=yes +fi + ########################################## # End of CC checks # After here, no more $cc or $ld runs @@ -3767,6 +3781,10 @@ if test "$int128" = "yes" ; then echo "CONFIG_INT128=y" >> $config_host_mak fi +if test "$getauxval" = "yes" ; then + echo "CONFIG_GETAUXVAL=y" >> $config_host_mak +fi + if test "$glusterfs" = "yes" ; then echo "CONFIG_GLUSTERFS=y" >> $config_host_mak fi diff --git a/tcg/ppc64/tcg-target.c b/tcg/ppc64/tcg-target.c index 2acccf6..826726d 100644 --- a/tcg/ppc64/tcg-target.c +++ b/tcg/ppc64/tcg-target.c @@ -44,8 +44,16 @@ static uint8_t *tb_ret_addr; #define GUEST_BASE 0 #endif +#ifdef CONFIG_GETAUXVAL +#include <sys/auxv.h> +static bool have_isa_2_05; +static bool have_isa_2_06; +#define HAVE_ISA_2_05 have_isa_2_05 +#define HAVE_ISEL have_isa_2_06 +#else #define HAVE_ISA_2_05 0 -#define HAVE_ISEL 0 +#define HAVE_ISA_ISEL 0 +#endif #ifdef CONFIG_USE_GUEST_BASE #define TCG_GUEST_BASE_REG 30 @@ -2084,6 +2092,16 @@ static const TCGTargetOpDef ppc_op_defs[] = { static void tcg_target_init (TCGContext *s) { +#ifdef CONFIG_GETAUXVAL + unsigned long hwcap = getauxval(AT_HWCAP); + /* Bizzarely, the linux kernel doesn't set *all* applicable bits. */ + if (hwcap & PPC_FEATURE_ARCH_2_06) { + have_isa_2_05 = have_isa_2_06 = true; + } else if (hwcap & PPC_FEATURE_ARCH_2_05) { + have_isa_2_05 = true; + } +#endif + tcg_regset_set32 (tcg_target_available_regs[TCG_TYPE_I32], 0, 0xffffffff); tcg_regset_set32 (tcg_target_available_regs[TCG_TYPE_I64], 0, 0xffffffff); tcg_regset_set32 (tcg_target_call_clobber_regs, 0,
Glibc 2.16 includes an easy way to get feature bits previously buried in /proc or the program startup auxiliary vector. Use it. Signed-off-by: Richard Henderson <rth@twiddle.net> --- configure | 18 ++++++++++++++++++ tcg/ppc64/tcg-target.c | 20 +++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-)