From owner-svn-src-projects@FreeBSD.ORG Wed Aug 20 15:56:15 2014 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 71B5621D; Wed, 20 Aug 2014 15:56:15 +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 480683019; Wed, 20 Aug 2014 15:56:15 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id s7KFuFJ2074686; Wed, 20 Aug 2014 15:56:15 GMT (envelope-from andrew@FreeBSD.org) Received: (from andrew@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id s7KFuE3e074680; Wed, 20 Aug 2014 15:56:14 GMT (envelope-from andrew@FreeBSD.org) Message-Id: <201408201556.s7KFuE3e074680@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: andrew set sender to andrew@FreeBSD.org using -f From: Andrew Turner Date: Wed, 20 Aug 2014 15:56:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r270218 - in projects/arm64/sys/arm64: arm64 include 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: Wed, 20 Aug 2014 15:56:15 -0000 Author: andrew Date: Wed Aug 20 15:56:13 2014 New Revision: 270218 URL: http://svnweb.freebsd.org/changeset/base/270218 Log: Use the l1 physical address to set ttbr0. This allows us to map user programs in in their address space. Modified: projects/arm64/sys/arm64/arm64/genassym.c projects/arm64/sys/arm64/arm64/pmap.c projects/arm64/sys/arm64/arm64/swtch.S projects/arm64/sys/arm64/arm64/vm_machdep.c projects/arm64/sys/arm64/include/pcb.h Modified: projects/arm64/sys/arm64/arm64/genassym.c ============================================================================== --- projects/arm64/sys/arm64/arm64/genassym.c Wed Aug 20 15:56:10 2014 (r270217) +++ projects/arm64/sys/arm64/arm64/genassym.c Wed Aug 20 15:56:13 2014 (r270218) @@ -44,6 +44,7 @@ ASSYM(PC_CURTHREAD, offsetof(struct pcpu ASSYM(PCB_REGS, offsetof(struct pcb, pcb_x)); ASSYM(PCB_SP, offsetof(struct pcb, pcb_sp)); +ASSYM(PCB_L1ADDR, offsetof(struct pcb, pcb_l1addr)); ASSYM(TD_PCB, offsetof(struct thread, td_pcb)); ASSYM(TD_LOCK, offsetof(struct thread, td_lock)); Modified: projects/arm64/sys/arm64/arm64/pmap.c ============================================================================== --- projects/arm64/sys/arm64/arm64/pmap.c Wed Aug 20 15:56:10 2014 (r270217) +++ projects/arm64/sys/arm64/arm64/pmap.c Wed Aug 20 15:56:13 2014 (r270218) @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -41,6 +42,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include /* @@ -1124,8 +1126,16 @@ pmap_mincore(pmap_t pmap, vm_offset_t ad void pmap_activate(struct thread *td) { + struct pcb *pcb; + pmap_t pmap; + + critical_enter(); + pmap = vmspace_pmap(td->td_proc->p_vmspace); + pcb = td->td_pcb; + + pcb->pcb_l1addr = vtophys(pmap->pm_l1); - panic("pmap_activate"); + critical_exit(); } void Modified: projects/arm64/sys/arm64/arm64/swtch.S ============================================================================== --- projects/arm64/sys/arm64/arm64/swtch.S Wed Aug 20 15:56:10 2014 (r270217) +++ projects/arm64/sys/arm64/arm64/swtch.S Wed Aug 20 15:56:13 2014 (r270218) @@ -104,6 +104,14 @@ ENTRY(cpu_switch) * to a user process. */ + /* Switch to the new pmap */ + ldr x5, [x4, #PCB_L1ADDR] + msr ttbr0_el1, x5 + isb + + /* Invalidate the TLB */ + tlbi vmalle1is + /* Release the old thread */ str x2, [x0, #TD_LOCK] #if defined(SCHED_ULE) && defined(SMP) Modified: projects/arm64/sys/arm64/arm64/vm_machdep.c ============================================================================== --- projects/arm64/sys/arm64/arm64/vm_machdep.c Wed Aug 20 15:56:10 2014 (r270217) +++ projects/arm64/sys/arm64/arm64/vm_machdep.c Wed Aug 20 15:56:13 2014 (r270218) @@ -63,6 +63,8 @@ cpu_fork(struct thread *td1, struct proc td2->td_pcb = pcb2; bcopy(td1->td_pcb, pcb2, sizeof(*pcb2)); + pmap_activate(td2); + /* Set the return value registers for fork() */ td2->td_pcb->pcb_x[8] = (uintptr_t)fork_return; td2->td_pcb->pcb_x[9] = (uintptr_t)td2; Modified: projects/arm64/sys/arm64/include/pcb.h ============================================================================== --- projects/arm64/sys/arm64/include/pcb.h Wed Aug 20 15:56:10 2014 (r270217) +++ projects/arm64/sys/arm64/include/pcb.h Wed Aug 20 15:56:13 2014 (r270218) @@ -37,6 +37,7 @@ struct trapframe; struct pcb { uint64_t pcb_x[31]; uint64_t pcb_sp; + vm_offset_t pcb_l1addr; } __aligned(64); #ifdef _KERNEL