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>