From owner-svn-src-projects@FreeBSD.ORG Sun Aug 24 10:36:05 2014 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id B02B8556; Sun, 24 Aug 2014 10:36:05 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 825D03F3F; Sun, 24 Aug 2014 10:36:05 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id s7OAa5rn026686; Sun, 24 Aug 2014 10:36:05 GMT (envelope-from andrew@FreeBSD.org) Received: (from andrew@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id s7OAa5th026684; Sun, 24 Aug 2014 10:36:05 GMT (envelope-from andrew@FreeBSD.org) Message-Id: <201408241036.s7OAa5th026684@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: andrew set sender to andrew@FreeBSD.org using -f From: Andrew Turner Date: Sun, 24 Aug 2014 10:36:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r270452 - projects/arm64/sys/arm64/arm64 X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 24 Aug 2014 10:36:05 -0000 Author: andrew Date: Sun Aug 24 10:36:04 2014 New Revision: 270452 URL: http://svnweb.freebsd.org/changeset/base/270452 Log: Return to userland at the end of fork_trampoline. Signal handling is missing as we don't yet support signals. Modified: projects/arm64/sys/arm64/arm64/genassym.c projects/arm64/sys/arm64/arm64/swtch.S Modified: projects/arm64/sys/arm64/arm64/genassym.c ============================================================================== --- projects/arm64/sys/arm64/arm64/genassym.c Sun Aug 24 10:33:54 2014 (r270451) +++ projects/arm64/sys/arm64/arm64/genassym.c Sun Aug 24 10:36:04 2014 (r270452) @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include @@ -49,3 +50,4 @@ ASSYM(PCB_L1ADDR, offsetof(struct pcb, p ASSYM(TD_PCB, offsetof(struct thread, td_pcb)); ASSYM(TD_LOCK, offsetof(struct thread, td_lock)); +ASSYM(TF_X, offsetof(struct trapframe, tf_x)); Modified: projects/arm64/sys/arm64/arm64/swtch.S ============================================================================== --- projects/arm64/sys/arm64/arm64/swtch.S Sun Aug 24 10:33:54 2014 (r270451) +++ projects/arm64/sys/arm64/arm64/swtch.S Sun Aug 24 10:36:04 2014 (r270452) @@ -146,7 +146,40 @@ ENTRY(fork_trampoline) mov x2, sp bl _C_LABEL(fork_exit) - brk 1 + /* Back up the stack pointer */ + mov x0, sp + + /* Restore sp and lr */ + ldp x2, x3, [x0] + msr sp_el0, x2 + mov lr, x3 + + /* Restore elr and spsr */ + ldp x2, x3, [x0, #16] + msr elr_el1, x2 + msr spsr_el1, x3 + + /* Restore the registers other than x0 and x1 */ + ldp x2, x3, [x0, #TF_X + 2 * 8] + ldp x4, x5, [x0, #TF_X + 4 * 8] + ldp x6, x7, [x0, #TF_X + 6 * 8] + ldp x8, x9, [x0, #TF_X + 8 * 8] + ldp x10, x11, [x0, #TF_X + 10 * 8] + ldp x12, x13, [x0, #TF_X + 12 * 8] + ldp x14, x15, [x0, #TF_X + 14 * 8] + ldp x16, x17, [x0, #TF_X + 16 * 8] + ldp x18, x19, [x0, #TF_X + 18 * 8] + ldp x20, x21, [x0, #TF_X + 20 * 8] + ldp x22, x23, [x0, #TF_X + 22 * 8] + ldp x24, x25, [x0, #TF_X + 24 * 8] + ldp x26, x27, [x0, #TF_X + 26 * 8] + ldp x28, x29, [x0, #TF_X + 28 * 8] + ldr x30, [x0, #TF_X + 30 * 8] + + /* Finally x0 and x1 */ + ldp x0, x1, [x0, #TF_X + 0 * 8] + + eret END(fork_trampoline)