From patchwork Mon Jun 30 13:13:37 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Musta X-Patchwork-Id: 365621 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 1085A140087 for ; Mon, 30 Jun 2014 23:18:12 +1000 (EST) Received: from localhost ([::1]:34307 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X1bTG-0005jr-81 for incoming@patchwork.ozlabs.org; Mon, 30 Jun 2014 09:18:10 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50407) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X1bPQ-00089r-KW for qemu-devel@nongnu.org; Mon, 30 Jun 2014 09:14:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X1bPE-0007X8-Ew for qemu-devel@nongnu.org; Mon, 30 Jun 2014 09:14:12 -0400 Received: from mail-qg0-x234.google.com ([2607:f8b0:400d:c04::234]:57877) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X1bPE-0007X3-BL; Mon, 30 Jun 2014 09:14:00 -0400 Received: by mail-qg0-f52.google.com with SMTP id f51so1893917qge.25 for ; Mon, 30 Jun 2014 06:14:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=nnyfqj7Tu9AJpgvx4HNt3B3adb4jso2jJ/yhYZq+X08=; b=Fv7WrSV+wRE6zMa/6wxHPCOq0eXnLdtN+W2IgbSnshkiKfVe9oxLSi+gypUO6ttHmK I+d+PAvQ4xFi49wWGOswQY91aNrUGsgnYopRei7/S+gc2M3ecRwfePdHnoHzb3cXMx/H dG2duYJZPzsQwcyRCXijqsaXJZuqFPNiTbIoqjw1329fsF+tixiNk9+9oX1WepgZfBPd H+wVoiJGzcMF6U1WyBbLd806QfOCb6MCW1ePC66b+hMEM2YWdCdkpYIEER+9DB1+bx/U hgzyUzMBrPlu/7iomkHDE0M/F9hrlHqjcMFKAtQWoSKj5wxJF3xDTR0+iEu8wyQaPSKM 4t9A== X-Received: by 10.140.94.225 with SMTP id g88mr55989459qge.101.1404134040075; Mon, 30 Jun 2014 06:14:00 -0700 (PDT) Received: from tmusta-sc.rchland.ibm.com (rchp4.rochester.ibm.com. [129.42.161.36]) by mx.google.com with ESMTPSA id u89sm1911122qge.47.2014.06.30.06.13.58 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 30 Jun 2014 06:13:59 -0700 (PDT) From: Tom Musta To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org Date: Mon, 30 Jun 2014 08:13:37 -0500 Message-Id: <1404134022-17946-3-git-send-email-tommusta@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1404134022-17946-1-git-send-email-tommusta@gmail.com> References: <1404134022-17946-1-git-send-email-tommusta@gmail.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:400d:c04::234 Cc: Tom Musta , riku.voipio@linaro.org, agraf@suse.de Subject: [Qemu-devel] [PATCH 2/7] linux-user: Split PPC Trampoline Encoding from Register Save X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Split the encoding of the PowerPC sigreturn trampoline from the saving of register state onto the signal handler stack. This will make it easier in subsequent patches to deal with variations in the stack frame layouts between 32 and 64 bit PowerPC. Signed-off-by: Tom Musta --- linux-user/signal.c | 18 ++++++++++++------ 1 files changed, 12 insertions(+), 6 deletions(-) diff --git a/linux-user/signal.c b/linux-user/signal.c index 256f9b9..00c99b1 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -4480,8 +4480,7 @@ static target_ulong get_sigframe(struct target_sigaction *ka, return newsp; } -static void save_user_regs(CPUPPCState *env, struct target_mcontext *frame, - int sigret) +static void save_user_regs(CPUPPCState *env, struct target_mcontext *frame) { target_ulong msr = env->msr; int i; @@ -4548,11 +4547,14 @@ static void save_user_regs(CPUPPCState *env, struct target_mcontext *frame, /* Store MSR. */ __put_user(msr, &frame->mc_gregs[TARGET_PT_MSR]); +} +static void encode_trampoline(int sigret, uint32_t *tramp) +{ /* Set up the sigreturn trampoline: li r0,sigret; sc. */ if (sigret) { - __put_user(0x38000000UL | sigret, &frame->tramp[0]); - __put_user(0x44000002UL, &frame->tramp[1]); + __put_user(0x38000000 | sigret, &tramp[0]); + __put_user(0x44000002, &tramp[1]); } } @@ -4663,7 +4665,10 @@ static void setup_frame(int sig, struct target_sigaction *ka, __put_user(sig, &sc->signal); /* Save user regs. */ - save_user_regs(env, &frame->mctx, TARGET_NR_sigreturn); + save_user_regs(env, &frame->mctx); + + /* Construct the trampoline code on the stack. */ + encode_trampoline(TARGET_NR_sigreturn, (uint32_t *)&frame->mctx.tramp); /* The kernel checks for the presence of a VDSO here. We don't emulate a vdso, so use a sigreturn system call. */ @@ -4729,7 +4734,8 @@ static void setup_rt_frame(int sig, struct target_sigaction *ka, } frame = &rt_sf->uc.tuc_mcontext; - save_user_regs(env, frame, TARGET_NR_rt_sigreturn); + save_user_regs(env, frame); + encode_trampoline(TARGET_NR_rt_sigreturn, (uint32_t *)&frame->tramp); /* The kernel checks for the presence of a VDSO here. We don't emulate a vdso, so use a sigreturn system call. */