Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 1 Sep 2014 18:25:46 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r270939 - in projects/arm64: lib/libc/arm64/gen sys/arm64/arm64 sys/arm64/include
Message-ID:  <201409011825.s81IPkim081501@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Mon Sep  1 18:25:46 2014
New Revision: 270939
URL: http://svnweb.freebsd.org/changeset/base/270939

Log:
  Start to support tls using the tpidr_el0 register

Modified:
  projects/arm64/lib/libc/arm64/gen/_set_tp.c
  projects/arm64/sys/arm64/arm64/swtch.S
  projects/arm64/sys/arm64/include/pcb.h

Modified: projects/arm64/lib/libc/arm64/gen/_set_tp.c
==============================================================================
--- projects/arm64/lib/libc/arm64/gen/_set_tp.c	Mon Sep  1 18:25:41 2014	(r270938)
+++ projects/arm64/lib/libc/arm64/gen/_set_tp.c	Mon Sep  1 18:25:46 2014	(r270939)
@@ -37,5 +37,5 @@ void
 _set_tp(void *tp)
 {
 
-	//sysarch(ARM_SET_TP, tp);
+	asm volatile("msr	tpidr_el0, %0" : : "r"(tp));
 }

Modified: projects/arm64/sys/arm64/arm64/swtch.S
==============================================================================
--- projects/arm64/sys/arm64/arm64/swtch.S	Mon Sep  1 18:25:41 2014	(r270938)
+++ projects/arm64/sys/arm64/arm64/swtch.S	Mon Sep  1 18:25:46 2014	(r270939)
@@ -90,9 +90,8 @@ ENTRY(cpu_switch)
 	str	x30, [x4, #PCB_REGS + 30 * 8]
 	/* And the old stack pointer */
 	mov	x5, sp
-	str	x5, [x4, #PCB_SP]
-
-	/* TODO: Save/restore the tls thread pointer */
+	mrs	x6, tpidr_el0
+	stp	x5, x6, [x4, #PCB_SP]
 
 	/*
 	 * Restore the saved context.
@@ -119,8 +118,9 @@ ENTRY(cpu_switch)
 #endif
 
 	/* Restore the registers */
-	ldr	x5, [x4, #PCB_SP]
+	ldp	x5, x6, [x4, #PCB_SP]
 	mov	sp, x5
+	msr	tpidr_el0, x6
 	ldp	x8, x9, [x4, #PCB_REGS + 8 * 8]
 	ldp	x10, x11, [x4, #PCB_REGS + 10 * 8]
 	ldp	x12, x13, [x4, #PCB_REGS + 12 * 8]

Modified: projects/arm64/sys/arm64/include/pcb.h
==============================================================================
--- projects/arm64/sys/arm64/include/pcb.h	Mon Sep  1 18:25:41 2014	(r270938)
+++ projects/arm64/sys/arm64/include/pcb.h	Mon Sep  1 18:25:46 2014	(r270939)
@@ -36,7 +36,9 @@ struct trapframe;
 #define	PCB_LR		30
 struct pcb {
 	uint64_t	pcb_x[31];
+	/* These need to be in order as we access them together */
 	uint64_t	pcb_sp;
+	uint64_t	pcb_tpidr_el0;
 	vm_offset_t	pcb_l1addr;
 } __aligned(64);
 



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