From patchwork Thu Feb 29 03:59:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Flavio Cruz X-Patchwork-Id: 86561 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id AA73B3858419 for ; Thu, 29 Feb 2024 03:59:39 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-vs1-xe33.google.com (mail-vs1-xe33.google.com [IPv6:2607:f8b0:4864:20::e33]) by sourceware.org (Postfix) with ESMTPS id 5B2B93858C52 for ; Thu, 29 Feb 2024 03:59:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5B2B93858C52 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 5B2B93858C52 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::e33 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1709179154; cv=none; b=DTxpGlFvM3mqvDm0HT65w9oXVdJWz0sahJG23hQ/GIWDUK36RPwPguN9ORrpvtFhjBc22s4wSzqk2U6yj2Bt2CB9aaEB5J1vxR4R09B+6Pux9SHhAR/qsTb1yV3FFapcF1V9lo9xMzdIthZ2sWQiV09WYaeW734kp9HCbrhvE60= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1709179154; c=relaxed/simple; bh=83GIG9xwAhNIv+12sz3ojhSpEUDCdzr+jYL6iUn6RWw=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=VsYgVM0BbFO81U72kG2pLdoNa2w2y+IEQFaD2+IaiLom4MBL2C9NN07nmvUTZF1rIhTFmEtymjzxvlKxysJtEAC9jYy1ZD9RnMDS7OualKO5Z/Lbp6Sl5s+oFMz8piJWG1mJVevFaUsnG26zeDcBbnBQznC9aF92WG58G98B7nw= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-vs1-xe33.google.com with SMTP id ada2fe7eead31-47278322783so85985137.2 for ; Wed, 28 Feb 2024 19:59:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709179151; x=1709783951; darn=gcc.gnu.org; h=content-disposition:mime-version:message-id:subject:cc:to:from:date :from:to:cc:subject:date:message-id:reply-to; bh=r5f2hRkc2G1u3RX8TWKiCirFt5WvaYLJQ6rZ9L14uZ4=; b=JX/5gm0ZeWeooiNmF2lXQMgCN6Va4ZtaK/uGsHJMEqVo4IQtt7Dr245WR0/lgTjvux EK0RE8ZkHmtV3EkJKrN+oX7LopD8EiRm81UO0vkmEZOxHGZGUGXa0vBtQy9tpIA1fhbh Hyj2wbpNAW0g6VH5HrwvbE6itll5+4aYasls2xD6qcQUSyf3Pa00DdiVRPfoE8HizQ41 ATMG/MZm+PIPKFqSIubIX8jddEMTnzWPuLi0AV4c58Lf2h+G/ivQXFO3OKwukL0mWyUT SWFa/nVVZpF2kWlc+VC/irhpmA4mTU/58E6vqfaL3q0Gg+uFD6EbehfWPvaBO7cxSfTh Egtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709179151; x=1709783951; h=content-disposition:mime-version:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=r5f2hRkc2G1u3RX8TWKiCirFt5WvaYLJQ6rZ9L14uZ4=; b=fr907lSAGYyV0UsvGs9Q+3TFSX08fZ9dsaREFc3AV+g7isz9ppMUL3g/Sj/eM4Y+zt ZM4nP8twDJZAaW+1TRd5hEiEV/Kg2D7ojSB2WL1iBAHwCjur3Hn/dqwCPKdwI3iWxsPp vl6xMwnW/o7FN6zrDuGoQVn8TpY6Rjdvgq456c1jT4emy7m/jGRXBWxpznVyEZKRrK44 8mWkuqkDuV/fglFUTRKrYZXLaw5DI6HiNfckPbwfdLwAFfTvmvZxhYOcSFsAxKC9EgGs DnxcRfNIS9FfIr0ztvs8yAt+ObvWn3S6C9S6505/mWxW19uYTndegehHP5e+pFFMfPyE FpGg== X-Forwarded-Encrypted: i=1; AJvYcCXFAXQr+VSPLrra5VcpxanWEBZJkY4NL2zgMlQGHH8J9vWQGJ/D2X/RdvFP67FNq9hspvfphFJfs7fI4qFgw2OZpjavmpp1wQ== X-Gm-Message-State: AOJu0YxiacV7k99H+fT1RfEhtehZFsCPmiQ6kgArL8LCDZgRsSPkLpjE rmaJvSA/6AtcH4KrEhmtsufFkYmXUc7+kyj8INPKWyu0oCh4MwS/bV23AA8= X-Google-Smtp-Source: AGHT+IFlwh/YPbBNXklPtpyUOlOw1Yk7W6atMmk7VANn77PEYzKRCsaCqR4mEV3EaWGCwnKgvOv5Ww== X-Received: by 2002:a05:6102:3170:b0:471:bf12:208d with SMTP id l16-20020a056102317000b00471bf12208dmr653018vsm.17.1709179151479; Wed, 28 Feb 2024 19:59:11 -0800 (PST) Received: from mars.tail36e24.ts.net ([24.154.253.225]) by smtp.gmail.com with ESMTPSA id z27-20020ac87cbb000000b0042e7fa57dd6sm318510qtv.37.2024.02.28.19.59.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 19:59:10 -0800 (PST) Date: Wed, 28 Feb 2024 22:59:09 -0500 From: Flavio Cruz To: bug-hurd@gnu.org, gcc-patches@gcc.gnu.org Cc: thomas@codesourcery.com Subject: [PATCH gcc] Hurd x86_64: add unwind support for signal trampoline code Message-ID: MIME-Version: 1.0 Content-Disposition: inline X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Tested with some simple toy examples where an exception is thrown in the signal handler. libgcc/ChangeLog: * config/i386/gnu-unwind.h: Support unwinding x86_64 signal frames. Signed-off-by: Flavio Cruz Reviewed-by: Samuel Thibault --- libgcc/config/i386/gnu-unwind.h | 97 ++++++++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 3 deletions(-) diff --git a/libgcc/config/i386/gnu-unwind.h b/libgcc/config/i386/gnu-unwind.h index 0751b5593d4..02b060ab4a5 100644 --- a/libgcc/config/i386/gnu-unwind.h +++ b/libgcc/config/i386/gnu-unwind.h @@ -32,9 +32,100 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #ifdef __x86_64__ -/* - * TODO: support for 64 bits needs to be implemented. - */ +#define MD_FALLBACK_FRAME_STATE_FOR x86_gnu_fallback_frame_state + +static _Unwind_Reason_Code +x86_gnu_fallback_frame_state +(struct _Unwind_Context *context, _Unwind_FrameState *fs) +{ + static const unsigned char gnu_sigtramp_code[] = + { + /* rpc_wait_trampoline: */ + 0x48, 0xc7, 0xc0, 0xe7, 0xff, 0xff, 0xff, /* mov $-25,%rax */ + 0x0f, 0x05, /* syscall */ + 0x49, 0x89, 0x04, 0x24, /* mov %rax,(%r12) */ + 0x48, 0x89, 0xdc, /* mov %rbx,%rsp */ + + /* trampoline: */ + 0x5f, /* pop %rdi */ + 0x5e, /* pop %rsi */ + 0x5a, /* pop %rdx */ + 0x48, 0x83, 0xc4, 0x08, /* add $0x8,%rsp */ + 0x41, 0xff, 0xd5, /* call *%r13 */ + + /* RA HERE */ + 0x48, 0x8b, 0x7c, 0x24, 0x10, /* mov 0x10(%rsp),%rdi */ + 0xc3, /* ret */ + + /* firewall: */ + 0xf4, /* hlt */ + }; + + const size_t gnu_sigtramp_len = sizeof gnu_sigtramp_code; + const size_t gnu_sigtramp_tail = 7; /* length of tail after RA */ + + struct stack_contents { + void *sigreturn_addr; + void *sigreturn_returns_here; + struct sigcontext *return_scp; + } *stack_contents; + struct sigcontext *scp; + unsigned long usp; + + unsigned char *adjusted_pc = (unsigned char*)(context->ra) + + gnu_sigtramp_tail - gnu_sigtramp_len; + if (memcmp (adjusted_pc, gnu_sigtramp_code, gnu_sigtramp_len)) + return _URC_END_OF_STACK; + + stack_contents = context->cfa; + + scp = stack_contents->return_scp; + usp = scp->sc_ursp; + + fs->regs.reg[0].loc.offset = (unsigned long)&scp->sc_rax - usp; + fs->regs.reg[1].loc.offset = (unsigned long)&scp->sc_rdx - usp; + fs->regs.reg[2].loc.offset = (unsigned long)&scp->sc_rcx - usp; + fs->regs.reg[3].loc.offset = (unsigned long)&scp->sc_rbx - usp; + fs->regs.reg[4].loc.offset = (unsigned long)&scp->sc_rsi - usp; + fs->regs.reg[5].loc.offset = (unsigned long)&scp->sc_rdi - usp; + fs->regs.reg[6].loc.offset = (unsigned long)&scp->sc_rbp - usp; + fs->regs.reg[8].loc.offset = (unsigned long)&scp->sc_r8 - usp; + fs->regs.reg[9].loc.offset = (unsigned long)&scp->sc_r9 - usp; + fs->regs.reg[10].loc.offset = (unsigned long)&scp->sc_r10 - usp; + fs->regs.reg[11].loc.offset = (unsigned long)&scp->sc_r11 - usp; + fs->regs.reg[12].loc.offset = (unsigned long)&scp->sc_r12 - usp; + fs->regs.reg[13].loc.offset = (unsigned long)&scp->sc_r13 - usp; + fs->regs.reg[14].loc.offset = (unsigned long)&scp->sc_r14 - usp; + fs->regs.reg[15].loc.offset = (unsigned long)&scp->sc_r15 - usp; + fs->regs.reg[16].loc.offset = (unsigned long)&scp->sc_rip - usp; + + /* Register 7 is rsp */ + fs->regs.cfa_how = CFA_REG_OFFSET; + fs->regs.cfa_reg = 7; + fs->regs.cfa_offset = usp - (unsigned long) context->cfa; + + fs->regs.how[0] = REG_SAVED_OFFSET; + fs->regs.how[1] = REG_SAVED_OFFSET; + fs->regs.how[2] = REG_SAVED_OFFSET; + fs->regs.how[3] = REG_SAVED_OFFSET; + fs->regs.how[4] = REG_SAVED_OFFSET; + fs->regs.how[5] = REG_SAVED_OFFSET; + fs->regs.how[6] = REG_SAVED_OFFSET; + fs->regs.how[8] = REG_SAVED_OFFSET; + fs->regs.how[9] = REG_SAVED_OFFSET; + fs->regs.how[10] = REG_SAVED_OFFSET; + fs->regs.how[11] = REG_SAVED_OFFSET; + fs->regs.how[12] = REG_SAVED_OFFSET; + fs->regs.how[13] = REG_SAVED_OFFSET; + fs->regs.how[14] = REG_SAVED_OFFSET; + fs->regs.how[15] = REG_SAVED_OFFSET; + fs->regs.how[16] = REG_SAVED_OFFSET; + + fs->retaddr_column = 16; + fs->signal_frame = 1; + + return _URC_NO_REASON; +} #else /* ifdef __x86_64__ */