svn commit: r322786 - in head/sys/arm64: arm64 include

Andrew Turner andrew at FreeBSD.org
Tue Aug 22 13:16:16 UTC 2017


Author: andrew
Date: Tue Aug 22 13:16:14 2017
New Revision: 322786
URL: https://svnweb.freebsd.org/changeset/base/322786

Log:
  Move the l0 pagetable address to struct mdproc. It is a property of the
  whole process so should live there.
  
  Sponsored by:	DARPA, AFRL

Modified:
  head/sys/arm64/arm64/genassym.c
  head/sys/arm64/arm64/pmap.c
  head/sys/arm64/arm64/swtch.S
  head/sys/arm64/arm64/vm_machdep.c
  head/sys/arm64/include/pcb.h
  head/sys/arm64/include/proc.h

Modified: head/sys/arm64/arm64/genassym.c
==============================================================================
--- head/sys/arm64/arm64/genassym.c	Tue Aug 22 13:08:22 2017	(r322785)
+++ head/sys/arm64/arm64/genassym.c	Tue Aug 22 13:16:14 2017	(r322786)
@@ -50,12 +50,15 @@ ASSYM(PCB_SINGLE_STEP_SHIFT, PCB_SINGLE_STEP_SHIFT);
 ASSYM(PCB_REGS, offsetof(struct pcb, pcb_x));
 ASSYM(PCB_SP, offsetof(struct pcb, pcb_sp));
 ASSYM(PCB_TPIDRRO, offsetof(struct pcb, pcb_tpidrro_el0));
-ASSYM(PCB_L0ADDR, offsetof(struct pcb, pcb_l0addr));
 ASSYM(PCB_ONFAULT, offsetof(struct pcb, pcb_onfault));
 ASSYM(PCB_FLAGS, offsetof(struct pcb, pcb_flags));
 
+ASSYM(P_MD, offsetof(struct proc, p_md));
+ASSYM(MD_L0ADDR, offsetof(struct mdproc, md_l0addr));
+
 ASSYM(SF_UC, offsetof(struct sigframe, sf_uc));
 
+ASSYM(TD_PROC, offsetof(struct thread, td_proc));
 ASSYM(TD_PCB, offsetof(struct thread, td_pcb));
 ASSYM(TD_FLAGS, offsetof(struct thread, td_flags));
 ASSYM(TD_FRAME, offsetof(struct thread, td_frame));

Modified: head/sys/arm64/arm64/pmap.c
==============================================================================
--- head/sys/arm64/arm64/pmap.c	Tue Aug 22 13:08:22 2017	(r322785)
+++ head/sys/arm64/arm64/pmap.c	Tue Aug 22 13:16:14 2017	(r322786)
@@ -4662,8 +4662,9 @@ pmap_activate(struct thread *td)
 
 	critical_enter();
 	pmap = vmspace_pmap(td->td_proc->p_vmspace);
-	td->td_pcb->pcb_l0addr = vtophys(pmap->pm_l0);
-	__asm __volatile("msr ttbr0_el1, %0" : : "r"(td->td_pcb->pcb_l0addr));
+	td->td_proc->p_md.md_l0addr = vtophys(pmap->pm_l0);
+	__asm __volatile("msr ttbr0_el1, %0" : :
+	    "r"(td->td_proc->p_md.md_l0addr));
 	pmap_invalidate_all(pmap);
 	critical_exit();
 }

Modified: head/sys/arm64/arm64/swtch.S
==============================================================================
--- head/sys/arm64/arm64/swtch.S	Tue Aug 22 13:08:22 2017	(r322785)
+++ head/sys/arm64/arm64/swtch.S	Tue Aug 22 13:16:14 2017	(r322786)
@@ -86,7 +86,8 @@ ENTRY(cpu_throw)
 	 */
 
 	/* Switch to the new pmap */
-	ldr	x5, [x4, #PCB_L0ADDR]
+	ldr	x28, [x1, #TD_PROC]
+	ldr	x5, [x28, #(P_MD + MD_L0ADDR)]
 	msr	ttbr0_el1, x5
 	isb
 
@@ -186,8 +187,15 @@ ENTRY(cpu_switch)
 	 * to a user process.
 	 */
 
+	/*
+	 * Load the proc pointers. If these are the same then we are in the
+	 * same process so don't need to switch page tables or issue a
+	 * TLB invalidate.
+	 */
+	ldr	x28, [x1, #TD_PROC]
+
 	/* Switch to the new pmap */
-	ldr	x5, [x4, #PCB_L0ADDR]
+	ldr	x5, [x28, #(P_MD + MD_L0ADDR)]
 	msr	ttbr0_el1, x5
 	isb
 

Modified: head/sys/arm64/arm64/vm_machdep.c
==============================================================================
--- head/sys/arm64/arm64/vm_machdep.c	Tue Aug 22 13:08:22 2017	(r322785)
+++ head/sys/arm64/arm64/vm_machdep.c	Tue Aug 22 13:16:14 2017	(r322786)
@@ -91,7 +91,7 @@ cpu_fork(struct thread *td1, struct proc *p2, struct t
 	td2->td_pcb = pcb2;
 	bcopy(td1->td_pcb, pcb2, sizeof(*pcb2));
 
-	td2->td_pcb->pcb_l0addr =
+	td2->td_proc->p_md.md_l0addr =
 	    vtophys(vmspace_pmap(td2->td_proc->p_vmspace)->pm_l0);
 
 	tf = (struct trapframe *)STACKALIGN((struct trapframe *)pcb2 - 1);

Modified: head/sys/arm64/include/pcb.h
==============================================================================
--- head/sys/arm64/include/pcb.h	Tue Aug 22 13:08:22 2017	(r322785)
+++ head/sys/arm64/include/pcb.h	Tue Aug 22 13:16:14 2017	(r322786)
@@ -43,7 +43,6 @@ struct pcb {
 	uint64_t	pcb_sp;
 	uint64_t	pcb_tpidr_el0;
 	uint64_t	pcb_tpidrro_el0;
-	vm_offset_t	pcb_l0addr;
 
 	/* Fault handler, the error value is passed in x0 */
 	vm_offset_t	pcb_onfault;

Modified: head/sys/arm64/include/proc.h
==============================================================================
--- head/sys/arm64/include/proc.h	Tue Aug 22 13:08:22 2017	(r322785)
+++ head/sys/arm64/include/proc.h	Tue Aug 22 13:16:14 2017	(r322786)
@@ -40,7 +40,7 @@ struct mdthread {
 };
 
 struct mdproc {
-	int dummy;
+	vm_offset_t	md_l0addr;
 };
 
 #define	KINFO_PROC_SIZE	1088


More information about the svn-src-head mailing list