Received: by 2002:a05:6a10:a852:0:0:0:0 with SMTP id d18csp890043pxy; Wed, 5 May 2021 17:06:16 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxlHwtoN4bCNTCmYPFRYVcrphZ8xLsKmaA0Uw04DvArsr+H7wBiNj+v+vVC8bMqAaq0q77N X-Received: by 2002:a17:906:9a02:: with SMTP id ai2mr1335351ejc.279.1620259575979; Wed, 05 May 2021 17:06:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620259575; cv=none; d=google.com; s=arc-20160816; b=ROPrc0HZ9HVI3zy3wmbTdn+2ErJ/hU8OeFSrY8O0ZU4MJD/bq6/pXOn7Q5GMEUXgb3 rZqIgmVxzPwcQIsqipCd7hhrOv+WHK5Yk1QxfKfyx7mw9dZak0Gk1owpYdFiZGTmEmMc e4Y/aYvR3InPpIkmLHHZqRWFYguKPx7yhOLLvHqyZPnpacb18zvVXYFJTZX5Yfosb+yx 8bvhV3XlpDkOT8VrECFKDn9v8TrEHTDNI6MSO8EMA2fWLexSGXApvhojtv8MtaWJli8Z oU9AfFtav/GOQ3d+WrjUhREotzyypRl2tG64VDw6/Qk3ZuoxyWt70JrUKLYbjy6TIeIc qBVg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=gP3CQHwk6edNC9psq2Z5GAW67wHruZrlfjBM5+Td6ro=; b=gvw/o6C94SWNMgHcJsQmYsacTaylW2NDE6QSPIK3oDdQ0lBwJJPlxWf7w6QF7rgDIY enP0qNh26ATyQrIhGOi+IzXNIaQDwBgMrRZKnb/IQtc+OOJoe2rKWJh0ERHEPnXKZyLW 6rynUGTJS+T/lyWHGnNT4YIEGr5e/rDM6nIxxhdJYQFx+IrYUBnQvuxTL61RsqDTjAv3 At9rwiYzuARI5XOtqJmxOpckNlTJTIz5tD44+WRXxz2mrQm8sJPtGa9h8gWgEvKldC+z zFNq/O8o6EbnLJK16Cqk4+D2SNrQ34T2zKmHMwjiG5vbtF6yGOAku0utddxC+4fmbfzf 3lhA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=r5oHMC6u; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b1si731624edq.36.2021.05.05.17.05.49; Wed, 05 May 2021 17:06:15 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=r5oHMC6u; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229742AbhEEXXl (ORCPT + 99 others); Wed, 5 May 2021 19:23:41 -0400 Received: from mail.kernel.org ([198.145.29.99]:57944 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229637AbhEEXXk (ORCPT ); Wed, 5 May 2021 19:23:40 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id D85B1613ED for ; Wed, 5 May 2021 23:22:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1620256962; bh=F+mnMMlF78TxCmvF3CvXV4DSs15i/Wd7uu7DampNkVI=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=r5oHMC6uQn0rBeksxQYQ6ORMY/A7fulWtjrZqmMKwQFeNs13fMzlCTBGlgVzlgEx9 HKeQ/ToXjxOzoPGA9iyXXph0f1ZBb7mPn7tqF3An7tmnAzh1cJHltFtdDmujC6q7nq RaMr23uagsa1hinYpVSENgnUwLl/plMGEx3xv4hU6JE2mJhO1DAHYi8Vf6YgTLKS8G rXQd64h4lrbHu5IAU60+8oQcmZI0ljSLnuQLK33IkF34DIxkohxyfJiBOxlvQtC0tK ouqcww5XnHDAI2bD9n3I0N9WhrV9AIB1rrBCA7tPnGMKoS2DcdtVWYwGEF2ZyRhlte InFZ5YXDONLOg== Received: by mail-ed1-f41.google.com with SMTP id i24so3939439edy.8 for ; Wed, 05 May 2021 16:22:42 -0700 (PDT) X-Gm-Message-State: AOAM533KnmzVp+qFSJH9Nz+GwOUDCWzav8hb1nPLO5zRaLJRgjB6c1ah KUWyMo4W1b1idM4OHJOk29vO1g4zT38Cjms2voc+ZQ== X-Received: by 2002:a05:6402:17b0:: with SMTP id j16mr1524042edy.97.1620256961331; Wed, 05 May 2021 16:22:41 -0700 (PDT) MIME-Version: 1.0 References: <8735v3ex3h.ffs@nanos.tec.linutronix.de> <3C41339D-29A2-4AB1-958F-19DB0A92D8D7@amacapital.net> <044d0bad-6888-a211-e1d3-159a4aeed52d@polymtl.ca> <932d65e1-5a8f-c86a-8673-34f0e006c27f@samba.org> <30e248aa-534d-37ff-2954-a70a454391fc@polymtl.ca> In-Reply-To: From: Andy Lutomirski Date: Wed, 5 May 2021 16:22:29 -0700 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH] io_thread/x86: don't reset 'cs', 'ss', 'ds' and 'es' registers for io_threads To: Borislav Petkov Cc: Andy Lutomirski , Simon Marchi , Stefan Metzmacher , Peter Zijlstra , Linus Torvalds , Thomas Gleixner , Jens Axboe , Linux Kernel Mailing List , io-uring , "the arch/x86 maintainers" , linux-toolchains@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, May 5, 2021 at 4:12 PM Borislav Petkov wrote: > > On Wed, May 05, 2021 at 03:11:18PM -0700, Andy Lutomirski wrote: > > Since I'm not holding my breath, please at least keep in mind that > > anything you do here is merely a heuristic, cannot be fully correct, > > and then whenever gdb determines that a thread group or a thread is > > "32-bit", gdb is actually deciding to operate in a degraded mode for > > that task, is not accurately representing the task state, and is at > > risk of crashing, malfunctioning, or crashing the inferior due to its > > incorrect assumptions. If you have ever attached gdb to QEMU's > > gdbserver and tried to debug the early boot process of a 64-bit Linux > > kernel, you may have encountered this class of bugs. gdb works very, > > very poorly for this use case. > > So we were talking about this with toolchain folks today and they gave > me this example: > > Imagine you've stopped the target this way: > > <-- stopped here > > > > > ... > > now, if you dump rIP and say, rIP + the 10 following insns at the place > you've stopped it, gdb cannot know that 2 insns further into the stream > a > > > > is coming and it should change the disassembly of the insns after that > to the new mode. Unless it goes and inspects all > further instructions and disassembles them and analyzes the flow... That's fine. x86 machine code is like this. You also can't disassemble instructions before rIP accurately either. > > So what you can do is > > (gdb) set arch ... > > at the to the mode you're changing to. > > Dunno, maybe I'm missing something but this sounds like without user > help gdb can only assume things. In the tools/testing/x86/selftests directory, edited slightly for brevity: $ gdb ./test_syscall_vdso_32 (gdb) b call64_from_32 Breakpoint 1 at 0x80499ef: file thunks_32.S, line 19. (gdb) display/i $pc 1: x/i $pc (gdb) r Starting program: /home/luto/apps/linux/tools/testing/selftests/x86/test_syscall_vdso_32 ... [RUN] Executing 6-argument 32-bit syscall via VDSO Breakpoint 1, call64_from_32 () at thunks_32.S:19 19 mov 4(%esp), %eax 1: x/i $pc => 0x80499ef : mov 0x4(%esp),%eax (gdb) si 22 push %ecx 1: x/i $pc => 0x80499f3 : push %ecx (gdb) call64_from_32 () at thunks_32.S:23 23 push %edx 1: x/i $pc => 0x80499f4 : push %edx (gdb) call64_from_32 () at thunks_32.S:24 24 push %esi 1: x/i $pc => 0x80499f5 : push %esi (gdb) call64_from_32 () at thunks_32.S:25 25 push %edi 1: x/i $pc => 0x80499f6 : push %edi (gdb) call64_from_32 () at thunks_32.S:28 28 jmp $0x33,$1f 1: x/i $pc => 0x80499f7 : ljmp $0x33,$0x80499fe (gdb) info registers eax 0x80492e8 134517480 ecx 0x3f 63 edx 0x1 1 ebx 0xf7fc8550 -134445744 esp 0xffffc57c 0xffffc57c ebp 0xffffc5e8 0xffffc5e8 esi 0x0 0 edi 0x8049180 134517120 eip 0x80499f7 0x80499f7 eflags 0x292 [ AF SF IF ] cs 0x23 35 ss 0x2b 43 ds 0x2b 43 es 0x2b 43 fs 0x0 0 gs 0x63 99 (gdb) si 32 call *%rax 1: x/i $pc => 0x80499fe : call *%eax (gdb) info registers eax 0x80492e8 134517480 ^^^ Should be rax ecx 0x3f 63 edx 0x1 1 ebx 0xf7fc8550 -134445744 esp 0xffffc57c 0xffffc57c ebp 0xffffc5e8 0xffffc5e8 esi 0x0 0 edi 0x8049180 134517120 eip 0x80499fe 0x80499fe ^^^ r8, etc are all missing eflags 0x292 [ AF SF IF ] cs 0x33 51 ^^^ 64-bit! ss 0x2b 43 ds 0x2b 43 es 0x2b 43 fs 0x0 0 gs 0x63 99 (gdb) si poison_regs64 () at test_syscall_vdso.c:35 35 long syscall_addr; 1: x/i $pc => 0x80492e8 : dec %ecx (gdb) si 36 long get_syscall(char **envp) 1: x/i $pc => 0x80492ef : dec %ecx (gdb) set arch i386:x86-64 warning: Selected architecture i386:x86-64 is not compatible with reported target architecture i386 Architecture `i386:x86-64' not recognized. The target architecture is set to "auto" (currently "i386"). (gdb) set arch i386:x86-64:intel warning: Selected architecture i386:x86-64:intel is not compatible with reported target architecture i386 Architecture `i386:x86-64:intel' not recognized. The target architecture is set to "auto" (currently "i386"). I don't know enough about gdb internals to know precisely what failed here, but this did not work the way it should have. Sure, ptrace should provide a nice API to figure out that CS == 0x33 means long mode, but gdb could do a whole lot better here.