Message ID | 20230503070656.1746170-19-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | tcg: Improve atomicity support | expand |
On Wed, 3 May 2023 at 08:19, Richard Henderson <richard.henderson@linaro.org> wrote: > > These features are present for Apple M1. > > Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org> > Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > +#ifdef CONFIG_DARWIN > +static bool sysctl_for_bool(const char *name) > +{ > + int val = 0; > + size_t len = sizeof(val); > + > + if (sysctlbyname(name, &val, &len, NULL, 0) == 0) { > + return val != 0; > + } > + > + /* > + * We might in ask for properties not present in older kernels, "might in ask" is a typo for something, but I'm not sure what. > + * but we're only asking about static properties, all of which > + * should be 'int'. So we shouln't see ENOMEM (val too small), > + * or any of the other more exotic errors. > + */ > + assert(errno == ENOENT); > + return false; > +} > +#endif Otherwise Reviewed-by: Peter Maydell <peter.maydell@linaro.org> thanks -- PMM
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc index fc551a3d10..3adc5fd3a3 100644 --- a/tcg/aarch64/tcg-target.c.inc +++ b/tcg/aarch64/tcg-target.c.inc @@ -16,6 +16,9 @@ #ifdef __linux__ #include <asm/hwcap.h> #endif +#ifdef CONFIG_DARWIN +#include <sys/sysctl.h> +#endif /* We're going to re-use TCGType in setting of the SF bit, which controls the size of the operation performed. If we know the values match, it @@ -2903,6 +2906,27 @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op) } } +#ifdef CONFIG_DARWIN +static bool sysctl_for_bool(const char *name) +{ + int val = 0; + size_t len = sizeof(val); + + if (sysctlbyname(name, &val, &len, NULL, 0) == 0) { + return val != 0; + } + + /* + * We might in ask for properties not present in older kernels, + * but we're only asking about static properties, all of which + * should be 'int'. So we shouln't see ENOMEM (val too small), + * or any of the other more exotic errors. + */ + assert(errno == ENOENT); + return false; +} +#endif + static void tcg_target_init(TCGContext *s) { #ifdef __linux__ @@ -2910,6 +2934,10 @@ static void tcg_target_init(TCGContext *s) have_lse = hwcap & HWCAP_ATOMICS; have_lse2 = hwcap & HWCAP_USCAT; #endif +#ifdef CONFIG_DARWIN + have_lse = sysctl_for_bool("hw.optional.arm.FEAT_LSE"); + have_lse2 = sysctl_for_bool("hw.optional.arm.FEAT_LSE2"); +#endif tcg_target_available_regs[TCG_TYPE_I32] = 0xffffffffu; tcg_target_available_regs[TCG_TYPE_I64] = 0xffffffffu;