The IA32 Emulation support can be either removed from the kernel,
disabled by default or disabled at runtime. The x86/ldt_gdt selftest
crashes for all of above thus is_32bit_syscall_supported() helper
is added to skip int80 syscalls if they are not supported.
Signed-off-by: Slawomir Rosek <srosek@google.com>
---
tools/testing/selftests/x86/ldt_gdt.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/x86/ldt_gdt.c b/tools/testing/selftests/x86/ldt_gdt.c
index bb99a71380a5..b178392e50c0 100644
--- a/tools/testing/selftests/x86/ldt_gdt.c
+++ b/tools/testing/selftests/x86/ldt_gdt.c
@@ -62,6 +62,18 @@ static struct user_desc *low_user_desc;
static struct user_desc *low_user_desc_clear; /* Use to delete GDT entry */
static int gdt_entry_num;
+static bool is_32bit_syscall_supported(void)
+{
+#ifdef __x86_64__
+ return system("((zcat /proc/config.gz | grep CONFIG_IA32_EMULATION=y) &&"
+ "((test -z $(zcat /proc/config.gz | grep CONFIG_IA32_EMULATION_DEFAULT_DISABLED=y)) || (grep ia32_emulation=true /proc/cmdline)) &&"
+ "(test -z $(grep ia32_emulation=false /proc/cmdline))) >/dev/null 2>&1"
+ ) == 0;
+#else
+ return true;
+#endif
+}
+
static void check_invalid_segment(uint16_t index, int ldt)
{
uint32_t has_limit = 0, has_ar = 0, limit, ar;
@@ -147,6 +159,7 @@ static bool install_valid_mode(const struct user_desc *d, uint32_t ar,
if (!ldt) {
#ifndef __i386__
/* No point testing set_thread_area in a 64-bit build */
+ printf("[SKIP]\tNo point testing set_thread_area in a 64-bit build\n");
return false;
#endif
if (!gdt_entry_num)
@@ -676,6 +689,10 @@ static void setup_counter_page(void)
static int invoke_set_thread_area(void)
{
int ret;
+ if (!is_32bit_syscall_supported()) {
+ printf("[SKIP]\tNo 32bit syscall support in a 64-bit build\n");
+ return -1;
+ }
asm volatile ("int $0x80"
: "=a" (ret), "+m" (low_user_desc) :
"a" (243), "b" (low_user_desc)
@@ -716,8 +733,10 @@ static void setup_low_user_desc(void)
static void test_gdt_invalidation(void)
{
- if (!gdt_entry_num)
+ if (!gdt_entry_num) {
+ printf("[SKIP]\tNo set_thread_area support in a 64-bit only system\n");
return; /* 64-bit only system -- we can't use set_thread_area */
+ }
unsigned short prev_sel;
unsigned short sel;
--
2.52.0.305.g3fc767764a-goog
On Wed, Dec 17, 2025 at 01:59:31PM +0000, Slawomir Rosek wrote:
> The IA32 Emulation support can be either removed from the kernel,
> disabled by default or disabled at runtime. The x86/ldt_gdt selftest
> crashes for all of above thus is_32bit_syscall_supported() helper
> is added to skip int80 syscalls if they are not supported.
>
> Signed-off-by: Slawomir Rosek <srosek@google.com>
> ---
> tools/testing/selftests/x86/ldt_gdt.c | 21 ++++++++++++++++++++-
> 1 file changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/tools/testing/selftests/x86/ldt_gdt.c b/tools/testing/selftests/x86/ldt_gdt.c
> index bb99a71380a5..b178392e50c0 100644
> --- a/tools/testing/selftests/x86/ldt_gdt.c
> +++ b/tools/testing/selftests/x86/ldt_gdt.c
> @@ -62,6 +62,18 @@ static struct user_desc *low_user_desc;
> static struct user_desc *low_user_desc_clear; /* Use to delete GDT entry */
> static int gdt_entry_num;
>
> +static bool is_32bit_syscall_supported(void)
> +{
> +#ifdef __x86_64__
> + return system("((zcat /proc/config.gz | grep CONFIG_IA32_EMULATION=y) &&"
> + "((test -z $(zcat /proc/config.gz | grep CONFIG_IA32_EMULATION_DEFAULT_DISABLED=y)) || (grep ia32_emulation=true /proc/cmdline)) &&"
> + "(test -z $(grep ia32_emulation=false /proc/cmdline))) >/dev/null 2>&1"
> + ) == 0;
> +#else
> + return true;
> +#endif
> +}
Hmmm, so, my gut feeling tells me that we need a proper ia32 emu support
detection in the running kernel. I can't find one after a short grep, maybe it
should be in /proc/cpuinfo, maybe it should be a syscall which fails when
IA32_EMULATION is off or maybe ptrace(2) says somewhere in the depths of its
countless ops that it does support IA32 emulation.
And then you could put that in that helper and then put that helper in
a header and not copy it in every test...
I'd say.
Thx.
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette
On 2026-01-23 08:54, Borislav Petkov wrote: > > Hmmm, so, my gut feeling tells me that we need a proper ia32 emu support > detection in the running kernel. I can't find one after a short grep, maybe it > should be in /proc/cpuinfo, maybe it should be a syscall which fails when > IA32_EMULATION is off or maybe ptrace(2) says somewhere in the depths of its > countless ops that it does support IA32 emulation. > > And then you could put that in that helper and then put that helper in > a header and not copy it in every test... > You can probe for it by trapping SIGSEGV and calling int $0x80. Not exactly pretty, but... Making it a sysfs entry would allow dynamically control it, too... -hpa
On 1/23/26 08:54, Borislav Petkov wrote: > Hmmm, so, my gut feeling tells me that we need a proper ia32 emu support > detection in the running kernel. I can't find one after a short grep, maybe it > should be in /proc/cpuinfo, maybe it should be a syscall which fails when > IA32_EMULATION is off or maybe ptrace(2) says somewhere in the depths of its > countless ops that it does support IA32 emulation. Yeah, a little arch_prctl() that returns supported or not would be nice. I just hope we can manage to keep it used by the selftests and not get abused by anyone else.
© 2016 - 2026 Red Hat, Inc.