Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Aug 2014 15:56:14 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r270218 - in projects/arm64/sys/arm64: arm64 include
Message-ID:  <201408201556.s7KFuE3e074680@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <sys/lock.h>
 #include <sys/msgbuf.h>
 #include <sys/mutex.h>
+#include <sys/proc.h>
 
 #include <vm/vm.h>
 #include <vm/vm_page.h>
@@ -41,6 +42,7 @@ __FBSDID("$FreeBSD$");
 
 #include <machine/devmap.h>
 #include <machine/machdep.h>
+#include <machine/pcb.h>
 #include <machine/vmparam.h>
 
 /*
@@ -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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201408201556.s7KFuE3e074680>