svn commit: r270218 - in projects/arm64/sys/arm64: arm64 include
Andrew Turner
andrew at FreeBSD.org
Wed Aug 20 15:56:15 UTC 2014
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
More information about the svn-src-projects
mailing list