Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 28 Dec 2011 15:03:35 +0000 (UTC)
From:      Grzegorz Bernacki <gber@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r228929 - in projects/armv6: lib/libthr/arch/arm/include sys/arm/arm sys/arm/include
Message-ID:  <201112281503.pBSF3ZlM011571@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gber
Date: Wed Dec 28 15:03:34 2011
New Revision: 228929
URL: http://svn.freebsd.org/changeset/base/228929

Log:
  Get rid of shared RAS area for SMP systems.
  
  Obtained from:	Marvell, Semihalf

Modified:
  projects/armv6/lib/libthr/arch/arm/include/pthread_md.h
  projects/armv6/sys/arm/arm/genassym.c
  projects/armv6/sys/arm/arm/machdep.c
  projects/armv6/sys/arm/arm/swtch.S
  projects/armv6/sys/arm/arm/vm_machdep.c
  projects/armv6/sys/arm/include/asmacros.h
  projects/armv6/sys/arm/include/sysarch.h

Modified: projects/armv6/lib/libthr/arch/arm/include/pthread_md.h
==============================================================================
--- projects/armv6/lib/libthr/arch/arm/include/pthread_md.h	Wed Dec 28 14:48:33 2011	(r228928)
+++ projects/armv6/lib/libthr/arch/arm/include/pthread_md.h	Wed Dec 28 15:03:34 2011	(r228929)
@@ -59,7 +59,7 @@ void		_tcb_dtor(struct tcb *);
 static __inline void
 _tcb_set(struct tcb *tcb)
 {
-	*((struct tcb **)ARM_TP_ADDRESS) = tcb;
+	sysarch(ARM_SET_TP, tcb);
 }
 
 /*
@@ -68,7 +68,10 @@ _tcb_set(struct tcb *tcb)
 static __inline struct tcb *
 _tcb_get(void)
 {
-	return (*((struct tcb **)ARM_TP_ADDRESS));
+	struct tcb *tcb;
+	sysarch(ARM_GET_TP, &tcb);
+
+	return (tcb);
 }
 
 extern struct pthread *_thr_initial;

Modified: projects/armv6/sys/arm/arm/genassym.c
==============================================================================
--- projects/armv6/sys/arm/arm/genassym.c	Wed Dec 28 14:48:33 2011	(r228928)
+++ projects/armv6/sys/arm/arm/genassym.c	Wed Dec 28 15:03:34 2011	(r228929)
@@ -105,9 +105,11 @@ ASSYM(TF_PC, offsetof(struct trapframe, 
 ASSYM(P_PID, offsetof(struct proc, p_pid));
 ASSYM(P_FLAG, offsetof(struct proc, p_flag));
 
+#if !defined(SMP)
 ASSYM(ARM_TP_ADDRESS, ARM_TP_ADDRESS);
 ASSYM(ARM_RAS_START, ARM_RAS_START);
 ASSYM(ARM_RAS_END, ARM_RAS_END);
+#endif
 ASSYM(PAGE_SIZE, PAGE_SIZE);
 ASSYM(PDESIZE, PDESIZE);
 ASSYM(PMAP_DOMAIN_KERNEL, PMAP_DOMAIN_KERNEL);

Modified: projects/armv6/sys/arm/arm/machdep.c
==============================================================================
--- projects/armv6/sys/arm/arm/machdep.c	Wed Dec 28 14:48:33 2011	(r228928)
+++ projects/armv6/sys/arm/arm/machdep.c	Wed Dec 28 15:03:34 2011	(r228929)
@@ -264,9 +264,11 @@ static void
 cpu_startup(void *dummy)
 {
 	struct pcb *pcb = thread0.td_pcb;
+#ifndef SMP
 #ifndef ARM_CACHE_LOCK_ENABLE
 	vm_page_t m;
 #endif
+#endif
 
 	cpu_setup("");
 	identify_arm_cpu();
@@ -308,6 +310,7 @@ cpu_startup(void *dummy)
 	vector_page_setprot(VM_PROT_READ);
 	pmap_set_pcb_pagedir(pmap_kernel(), pcb);
 	pmap_postinit();
+#ifndef SMP
 #ifdef ARM_CACHE_LOCK_ENABLE
 	pmap_kenter_user(ARM_TP_ADDRESS, ARM_TP_ADDRESS);
 	arm_lock_cache_line(ARM_TP_ADDRESS);
@@ -317,6 +320,7 @@ cpu_startup(void *dummy)
 #endif
 	*(uint32_t *)ARM_RAS_START = 0;
 	*(uint32_t *)ARM_RAS_END = 0xffffffff;
+#endif
 }
 
 SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL);

Modified: projects/armv6/sys/arm/arm/swtch.S
==============================================================================
--- projects/armv6/sys/arm/arm/swtch.S	Wed Dec 28 14:48:33 2011	(r228928)
+++ projects/armv6/sys/arm/arm/swtch.S	Wed Dec 28 15:03:34 2011	(r228929)
@@ -85,12 +85,6 @@
 #include <machine/armreg.h>
 __FBSDID("$FreeBSD$");
 
-
-/*
- * New experimental definitions of IRQdisable and IRQenable
- * These keep FIQ's enabled since FIQ's are special.
- */
-
 #define DOMAIN_CLIENT	0x01
 
 #ifdef _ARM_ARCH_6
@@ -109,6 +103,7 @@ __FBSDID("$FreeBSD$");
 	.word	_C_LABEL(cpufuncs)
 .Lblocked_lock:
 	.word	_C_LABEL(blocked_lock)
+
 ENTRY(cpu_throw)
 	mov	r5, r1
 
@@ -187,13 +182,16 @@ ENTRY(cpu_throw)
 
 	/* Set the new tp */
 	ldr	r6, [r5, #(TD_MD + MD_TP)]
+#ifndef SMP
 	ldr	r4, =ARM_TP_ADDRESS
 	str	r6, [r4]
 	ldr	r6, [r5, #(TD_MD + MD_RAS_START)]
 	str	r6, [r4, #4] /* ARM_RAS_START */
 	ldr	r6, [r5, #(TD_MD + MD_RAS_END)]
 	str	r6, [r4, #8] /* ARM_RAS_END */
-
+#else
+	mcr p15, 0, r6, c13, c0, 3
+#endif
 	/* Hook in a new pcb */
 	GET_PCB(r6)
 	str	r7, [r6]
@@ -242,6 +240,7 @@ ENTRY(cpu_switch)
 	 * NOTE: We can now use r8-r13 until it is time to restore
 	 * them for the new process.
 	 */
+#ifndef SMP
 	/* Store the old tp */
 	ldr	r3, =ARM_TP_ADDRESS
 	ldr	r9, [r3]
@@ -258,7 +257,16 @@ ENTRY(cpu_switch)
 	str	r9, [r3, #4]
 	ldr	r9, [r1, #(TD_MD + MD_RAS_END)]
 	str	r9, [r3, #8]
+#else
+	/* Store the old tp */
+	mrc p15, 0, r9, c13, c0, 3
+	str	r9, [r0, #(TD_MD + MD_TP)]
 
+	/* Set the new tp */
+	ldr	r9, [r1, #(TD_MD + MD_TP)]
+	mcr p15, 0, r9, c13, c0, 3
+#endif
+	
 	/* Get the user structure for the new process in r9 */
 	ldr	r9, [r1, #(TD_PCB)]
 

Modified: projects/armv6/sys/arm/arm/vm_machdep.c
==============================================================================
--- projects/armv6/sys/arm/arm/vm_machdep.c	Wed Dec 28 14:48:33 2011	(r228928)
+++ projects/armv6/sys/arm/arm/vm_machdep.c	Wed Dec 28 15:03:34 2011	(r228929)
@@ -146,7 +146,11 @@ cpu_fork(register struct thread *td1, re
 	/* Setup to release spin count in fork_exit(). */
 	td2->td_md.md_spinlock_count = 1;
 	td2->td_md.md_saved_cspr = 0;
+#if !defined(SMP)
 	td2->td_md.md_tp = *(register_t *)ARM_TP_ADDRESS;
+#else
+	td2->td_md.md_tp = (register_t) get_tls();
+#endif
 }
 				
 void
@@ -373,7 +377,11 @@ cpu_set_user_tls(struct thread *td, void
 		td->td_md.md_tp = (register_t)tls_base;
 	else {
 		critical_enter();
+#if !defined(SMP)
 		*(register_t *)ARM_TP_ADDRESS = (register_t)tls_base;
+#else
+		set_tls((void *)tls_base);
+#endif
 		critical_exit();
 	}
 	return (0);

Modified: projects/armv6/sys/arm/include/asmacros.h
==============================================================================
--- projects/armv6/sys/arm/include/asmacros.h	Wed Dec 28 14:48:33 2011	(r228928)
+++ projects/armv6/sys/arm/include/asmacros.h	Wed Dec 28 15:03:34 2011	(r228929)
@@ -59,7 +59,7 @@
  * NOTE: r13 and r14 are stored separately as a work around for the
  * SA110 rev 2 STM^ bug
  */
-
+#ifndef SMP
 #define PUSHFRAME							   \
 	str	lr, [sp, #-4]!;		/* Push the return address */	   \
 	sub	sp, sp, #(4*17);	/* Adjust the stack pointer */	   \
@@ -74,6 +74,17 @@
 	str	r1, [r0];						   \
 	mov	r1, #0xffffffff;					   \
 	str	r1, [r0, #4];
+#else
+#define PUSHFRAME							   \
+	str	lr, [sp, #-4]!;		/* Push the return address */	   \
+	sub	sp, sp, #(4*17);	/* Adjust the stack pointer */	   \
+	stmia	sp, {r0-r12};		/* Push the user mode registers */ \
+	add	r0, sp, #(4*13);	/* Adjust the stack pointer */	   \
+	stmia	r0, {r13-r14}^;		/* Push the user mode registers */ \
+        mov     r0, r0;                 /* NOP for previous instruction */ \
+	mrs	r0, spsr_all;		/* Put the SPSR on the stack */	   \
+	str	r0, [sp, #-4]!;
+#endif
 
 /*
  * PULLFRAME - macro to pull a trap frame from the stack in the current mode
@@ -98,7 +109,7 @@
  * NOTE: r13 and r14 are stored separately as a work around for the
  * SA110 rev 2 STM^ bug
  */
-
+#ifndef SMP
 #define PUSHFRAMEINSVC							   \
 	stmdb	sp, {r0-r3};		/* Save 4 registers */		   \
 	mov	r0, lr;			/* Save xxx32 r14 */		   \
@@ -133,6 +144,30 @@
 	strhi   r3, [r0, #16];          /* the RAS_START location.      */ \
 	mrs     r0, spsr_all;                                              \
 	str     r0, [sp, #-4]!
+#else
+#define PUSHFRAMEINSVC							   \
+	stmdb	sp, {r0-r3};		/* Save 4 registers */		   \
+	mov	r0, lr;			/* Save xxx32 r14 */		   \
+	mov	r1, sp;			/* Save xxx32 sp */		   \
+	mrs	r3, spsr;		/* Save xxx32 spsr */		   \
+	mrs     r2, cpsr;		/* Get the CPSR */		   \
+	bic     r2, r2, #(PSR_MODE);	/* Fix for SVC mode */		   \
+	orr     r2, r2, #(PSR_SVC32_MODE);				   \
+	msr     cpsr_c, r2;		/* Punch into SVC mode */	   \
+	mov	r2, sp;			/* Save	SVC sp */		   \
+	str	r0, [sp, #-4]!;		/* Push return address */	   \
+	str	lr, [sp, #-4]!;		/* Push SVC lr */		   \
+	str	r2, [sp, #-4]!;		/* Push SVC sp */		   \
+	msr     spsr_all, r3;		/* Restore correct spsr */	   \
+	ldmdb	r1, {r0-r3};		/* Restore 4 regs from xxx mode */ \
+	sub	sp, sp, #(4*15);	/* Adjust the stack pointer */	   \
+	stmia	sp, {r0-r12};		/* Push the user mode registers */ \
+	add	r0, sp, #(4*13);	/* Adjust the stack pointer */	   \
+	stmia	r0, {r13-r14}^;		/* Push the user mode registers */ \
+        mov     r0, r0;                 /* NOP for previous instruction */ \
+	mrs	r0, spsr_all;		/* Put the SPSR on the stack */	   \
+	str	r0, [sp, #-4]!
+#endif
 
 /*
  * PULLFRAMEFROMSVCANDEXIT - macro to pull a trap frame from the stack

Modified: projects/armv6/sys/arm/include/sysarch.h
==============================================================================
--- projects/armv6/sys/arm/include/sysarch.h	Wed Dec 28 14:48:33 2011	(r228928)
+++ projects/armv6/sys/arm/include/sysarch.h	Wed Dec 28 15:03:34 2011	(r228929)
@@ -50,9 +50,11 @@
  * if ARM_RAS_END moves in relation to ARM_RAS_START (look for occurrances
  * of ldr/str rm,[rn, #4]).
  */
+#if !defined(SMP)
 #define ARM_TP_ADDRESS		(ARM_VECTORS_HIGH + 0x1000)
 #define ARM_RAS_START		(ARM_TP_ADDRESS + 4)
 #define ARM_RAS_END		(ARM_TP_ADDRESS + 8)
+#endif
 
 #ifndef LOCORE
 



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