From owner-svn-src-projects@FreeBSD.ORG Wed Dec 28 15:03:35 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AE5B3106566B; Wed, 28 Dec 2011 15:03:35 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9B3688FC14; Wed, 28 Dec 2011 15:03:35 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pBSF3Z3k011579; Wed, 28 Dec 2011 15:03:35 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pBSF3ZlM011571; Wed, 28 Dec 2011 15:03:35 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201112281503.pBSF3ZlM011571@svn.freebsd.org> From: Grzegorz Bernacki Date: Wed, 28 Dec 2011 15:03:35 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r228929 - in projects/armv6: lib/libthr/arch/arm/include sys/arm/arm sys/arm/include X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 28 Dec 2011 15:03:35 -0000 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 __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