svn commit: r228929 - in projects/armv6:
lib/libthr/arch/arm/include sys/arm/arm sys/arm/include
Grzegorz Bernacki
gber at FreeBSD.org
Wed Dec 28 15:03:35 UTC 2011
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
More information about the svn-src-projects
mailing list