From owner-svn-src-projects@FreeBSD.ORG Wed Dec 28 14:48:33 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 E773F1065675; Wed, 28 Dec 2011 14:48:33 +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 D4CFA8FC16; Wed, 28 Dec 2011 14:48:33 +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 pBSEmXK4011076; Wed, 28 Dec 2011 14:48:33 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pBSEmXGa011066; Wed, 28 Dec 2011 14:48:33 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201112281448.pBSEmXGa011066@svn.freebsd.org> From: Grzegorz Bernacki Date: Wed, 28 Dec 2011 14:48:33 +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: r228928 - in projects/armv6/sys/arm: 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 14:48:34 -0000 Author: gber Date: Wed Dec 28 14:48:33 2011 New Revision: 228928 URL: http://svn.freebsd.org/changeset/base/228928 Log: arm: Implement separate per-cpu structures. It's still needs some cleanup. Accessors for pcpu and tls should be moved to some armv6 generic file. Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/arm/bcopyinout.S projects/armv6/sys/arm/arm/bcopyinout_xscale.S projects/armv6/sys/arm/arm/copystr.S projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S projects/armv6/sys/arm/arm/fusu.S projects/armv6/sys/arm/arm/machdep.c projects/armv6/sys/arm/arm/swtch.S projects/armv6/sys/arm/include/asmacros.h projects/armv6/sys/arm/include/cpufunc.h Modified: projects/armv6/sys/arm/arm/bcopyinout.S ============================================================================== --- projects/armv6/sys/arm/arm/bcopyinout.S Wed Dec 28 13:01:12 2011 (r228927) +++ projects/armv6/sys/arm/arm/bcopyinout.S Wed Dec 28 14:48:33 2011 (r228928) @@ -53,14 +53,19 @@ __FBSDID("$FreeBSD$"); .text .align 0 -#ifdef MULTIPROCESSOR -.Lcpu_info: - .word _C_LABEL(cpu_info) +#ifdef _ARM_ARCH_6 +#define GET_PCB(tmp) \ + mrc p15, 0, tmp, c13, c0, 4; \ + add tmp, tmp, #(PC_CURPCB) #else .Lcurpcb: - .word _C_LABEL(__pcpu) + PC_CURPCB + .word _C_LABEL(__pcpu) + PC_CURPCB + +#define GET_PCB(tmp) \ + ldr tmp, .Lcurpcb #endif + #define SAVE_REGS stmfd sp!, {r4-r11} #define RESTORE_REGS ldmfd sp!, {r4-r11} @@ -110,18 +115,9 @@ ENTRY(copyin) .Lnormal: SAVE_REGS -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0-r2, r14} - bl _C_LABEL(cpu_number) - ldr r4, .Lcpu_info - ldr r4, [r4, r0, lsl #2] - ldr r4, [r4, #CI_CURPCB] - ldmfd sp!, {r0-r2, r14} -#else - ldr r4, .Lcurpcb + GET_PCB(r4) ldr r4, [r4] -#endif + ldr r5, [r4, #PCB_ONFAULT] adr r3, .Lcopyfault @@ -356,18 +352,8 @@ ENTRY(copyout) .Lnormale: SAVE_REGS -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0-r2, r14} - bl _C_LABEL(cpu_number) - ldr r4, .Lcpu_info - ldr r4, [r4, r0, lsl #2] - ldr r4, [r4, #CI_CURPCB] - ldmfd sp!, {r0-r2, r14} -#else - ldr r4, .Lcurpcb + GET_PCB(r4) ldr r4, [r4] -#endif ldr r5, [r4, #PCB_ONFAULT] adr r3, .Lcopyfault @@ -560,18 +546,9 @@ ENTRY(copyout) * else EFAULT if a page fault occurred. */ ENTRY(badaddr_read_1) -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0-r1, r14} - bl _C_LABEL(cpu_number) - ldr r2, .Lcpu_info - ldr r2, [r2, r0, lsl #2] - ldr r2, [r2, #CI_CURPCB] - ldmfd sp!, {r0-r1, r14} -#else - ldr r2, .Lcurpcb + GET_PCB(r2) ldr r2, [r2] -#endif + ldr ip, [r2, #PCB_ONFAULT] adr r3, 1f str r3, [r2, #PCB_ONFAULT] @@ -594,18 +571,9 @@ ENTRY(badaddr_read_1) * else EFAULT if a page fault occurred. */ ENTRY(badaddr_read_2) -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0-r1, r14} - bl _C_LABEL(cpu_number) - ldr r2, .Lcpu_info - ldr r2, [r2, r0, lsl #2] - ldr r2, [r2, #CI_CURPCB] - ldmfd sp!, {r0-r1, r14} -#else - ldr r2, .Lcurpcb + GET_PCB(r2) ldr r2, [r2] -#endif + ldr ip, [r2, #PCB_ONFAULT] adr r3, 1f str r3, [r2, #PCB_ONFAULT] @@ -628,18 +596,9 @@ ENTRY(badaddr_read_2) * else EFAULT if a page fault occurred. */ ENTRY(badaddr_read_4) -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0-r1, r14} - bl _C_LABEL(cpu_number) - ldr r2, .Lcpu_info - ldr r2, [r2, r0, lsl #2] - ldr r2, [r2, #CI_CURPCB] - ldmfd sp!, {r0-r1, r14} -#else - ldr r2, .Lcurpcb + GET_PCB(r2) ldr r2, [r2] -#endif + ldr ip, [r2, #PCB_ONFAULT] adr r3, 1f str r3, [r2, #PCB_ONFAULT] Modified: projects/armv6/sys/arm/arm/bcopyinout_xscale.S ============================================================================== --- projects/armv6/sys/arm/arm/bcopyinout_xscale.S Wed Dec 28 13:01:12 2011 (r228927) +++ projects/armv6/sys/arm/arm/bcopyinout_xscale.S Wed Dec 28 14:48:33 2011 (r228928) @@ -41,12 +41,15 @@ __FBSDID("$FreeBSD$"); .text .align 0 -#ifdef MULTIPROCESSOR -.Lcpu_info: - .word _C_LABEL(cpu_info) +#ifdef _ARM_ARCH_6 +#define GET_PCB(tmp) \ + mrc p15, 0, tmp, c13, c0, 4; \ + add tmp, tmp, #(PC_CURPCB) #else .Lcurpcb: .word _C_LABEL(__pcpu) + PC_CURPCB +#define GET_PCB(tmp) \ + ldr tmp, .Lcurpcb #endif /* @@ -85,18 +88,8 @@ ENTRY(copyin) .Lnormal: stmfd sp!, {r10-r11, lr} -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0-r2} - bl _C_LABEL(cpu_number) - ldr r10, .Lcpu_info - ldmfd sp!, {r0-r2} - ldr r10, [r10, r0, lsl #2] - ldr r10, [r10, #CI_CURPCB] -#else - ldr r10, .Lcurpcb + GET_PCB(r10) ldr r10, [r10] -#endif mov r3, #0x00 adr ip, .Lcopyin_fault @@ -536,18 +529,8 @@ ENTRY(copyout) .Lnormale: stmfd sp!, {r10-r11, lr} -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0-r2} - bl _C_LABEL(cpu_number) - ldr r10, .Lcpu_info - ldmfd sp!, {r0-r2} - ldr r10, [r10, r0, lsl #2] - ldr r10, [r10, #CI_CURPCB] -#else - ldr r10, .Lcurpcb + GET_PCB(r10) ldr r10, [r10] -#endif mov r3, #0x00 adr ip, .Lcopyout_fault Modified: projects/armv6/sys/arm/arm/copystr.S ============================================================================== --- projects/armv6/sys/arm/arm/copystr.S Wed Dec 28 13:01:12 2011 (r228927) +++ projects/armv6/sys/arm/arm/copystr.S Wed Dec 28 14:48:33 2011 (r228928) @@ -49,12 +49,17 @@ __FBSDID("$FreeBSD$"); .text .align 0 -#ifdef MULTIPROCESSOR -.Lcpu_info: - .word _C_LABEL(cpu_info) + +#ifdef _ARM_ARCH_6 +#define GET_PCB(tmp) \ + mrc p15, 0, tmp, c13, c0, 4; \ + add tmp, tmp, #(PC_CURPCB) #else .Lpcb: .word _C_LABEL(__pcpu) + PC_CURPCB + +#define GET_PCB(tmp) \ + ldr tmp, .Lpcb #endif /* @@ -108,18 +113,8 @@ ENTRY(copyinstr) moveq r0, #ENAMETOOLONG beq 2f -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0-r3, r14} - bl _C_LABEL(cpu_number) - ldr r4, .Lcpu_info - ldr r4, [r4, r0, lsl #2] - ldr r4, [r4, #CI_CURPCB] - ldmfd sp!, {r0-r3, r14} -#else - ldr r4, .Lpcb + GET_PCB(r4) ldr r4, [r4] -#endif #ifdef DIAGNOSTIC teq r4, #0x00000000 @@ -165,18 +160,8 @@ ENTRY(copyoutstr) moveq r0, #ENAMETOOLONG beq 2f -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0-r3, r14} - bl _C_LABEL(cpu_number) - ldr r4, .Lcpu_info - ldr r4, [r4, r0, lsl #2] - ldr r4, [r4, #CI_CURPCB] - ldmfd sp!, {r0-r3, r14} -#else - ldr r4, .Lpcb + GET_PCB(r4) ldr r4, [r4] -#endif #ifdef DIAGNOSTIC teq r4, #0x00000000 Modified: projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S Wed Dec 28 13:01:12 2011 (r228927) +++ projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S Wed Dec 28 14:48:33 2011 (r228928) @@ -177,6 +177,28 @@ ENTRY(pj4b_sleep) mcr p15, 0, r0, c7, c0, 4 /* wait for interrupt */ RET +ENTRY(get_core_id) + mrc p15, 0, r0, c0, c0, 5 + RET + +/* Use Privileged Thread Id register as a holder for pcpu pointer */ +ENTRY(get_pcpu) + mrc p15, 0, r0, c13, c0, 4 + RET + +ENTRY(set_pcpu) + mcr p15, 0, r0, c13, c0, 4 + RET + +/* Use Privileged Thread Id register as a holder for tls pointer */ +ENTRY(get_tls) + mrc p15, 0, r0, c13, c0, 3 + RET + +ENTRY(set_tls) + mcr p15, 0, r0, c13, c0, 3 + RET + ENTRY(pj4b_config) /* Set Auxiliary Debug Modes Control 2 register */ mrc p15, 1, r0, c15, c1, 2 Modified: projects/armv6/sys/arm/arm/fusu.S ============================================================================== --- projects/armv6/sys/arm/arm/fusu.S Wed Dec 28 13:01:12 2011 (r228927) +++ projects/armv6/sys/arm/arm/fusu.S Wed Dec 28 14:48:33 2011 (r228928) @@ -39,12 +39,15 @@ #include "assym.s" __FBSDID("$FreeBSD$"); -#ifdef MULTIPROCESSOR -.Lcpu_info: - .word _C_LABEL(cpu_info) +#ifdef _ARM_ARCH_6 +#define GET_PCB(tmp) \ + mrc p15, 0, tmp, c13, c0, 4; \ + add tmp, tmp, #(PC_CURPCB) #else .Lcurpcb: .word _C_LABEL(__pcpu) + PC_CURPCB +#define GET_PCB(tmp) \ + ldr tmp, .Lcurpcb #endif /* @@ -54,18 +57,8 @@ __FBSDID("$FreeBSD$"); ENTRY_NP(casuword32) ENTRY(casuword) -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0, r14} - bl _C_LABEL(cpu_number) - ldr r2, .Lcpu_info - ldr r2, [r2, r0, lsl #2] - ldr r2, [r2, #CI_CURPCB] - ldmfd sp!, {r0, r14} -#else - ldr r3, .Lcurpcb + GET_PCB(r3) ldr r3, [r3] -#endif #ifdef DIAGNOSTIC teq r3, #0x00000000 @@ -101,18 +94,8 @@ ENTRY(casuword) ENTRY_NP(fuword32) ENTRY(fuword) -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0, r14} - bl _C_LABEL(cpu_number) - ldr r2, .Lcpu_info - ldr r2, [r2, r0, lsl #2] - ldr r2, [r2, #CI_CURPCB] - ldmfd sp!, {r0, r14} -#else - ldr r2, .Lcurpcb + GET_PCB(r2) ldr r2, [r2] -#endif #ifdef DIAGNOSTIC teq r2, #0x00000000 @@ -135,18 +118,8 @@ ENTRY(fuword) */ ENTRY(fusword) -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0, r14} - bl _C_LABEL(cpu_number) - ldr r2, .Lcpu_info - ldr r2, [r2, r0, lsl #2] - ldr r2, [r2, #CI_CURPCB] - ldmfd sp!, {r0, r14} -#else - ldr r2, .Lcurpcb + GET_PCB(r2) ldr r2, [r2] -#endif #ifdef DIAGNOSTIC teq r2, #0x00000000 @@ -180,18 +153,8 @@ ENTRY(fuswintr) mvnne r0, #0x00000000 RETne -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0, r14} - bl _C_LABEL(cpu_number) - ldr r2, .Lcpu_info - ldr r2, [r2, r0, lsl #2] - ldr r2, [r2, #CI_CURPCB] - ldmfd sp!, {r0, r14} -#else - ldr r2, .Lcurpcb + GET_PCB(r2) ldr r2, [r2] -#endif #ifdef DIAGNOSTIC teq r2, #0x00000000 @@ -229,18 +192,8 @@ _C_LABEL(block_userspace_access): */ ENTRY(fubyte) -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0, r14} - bl _C_LABEL(cpu_number) - ldr r2, .Lcpu_info - ldr r2, [r2, r0, lsl #2] - ldr r2, [r2, #CI_CURPCB] - ldmfd sp!, {r0, r14} -#else - ldr r2, .Lcurpcb + GET_PCB(r2) ldr r2, [r2] -#endif #ifdef DIAGNOSTIC teq r2, #0x00000000 @@ -303,18 +256,8 @@ fusupcbfaulttext: ENTRY_NP(suword32) ENTRY(suword) -#ifdef MULTIPROCESSOR - /* XXX Probably not appropriate for non-Hydra SMPs */ - stmfd sp!, {r0, r1, r14} - bl _C_LABEL(cpu_number) - ldr r2, .Lcpu_info - ldr r2, [r2, r0, lsl #2] - ldr r2, [r2, #CI_CURPCB] - ldmfd sp!, {r0, r1, r14} -#else - ldr r2, .Lcurpcb + GET_PCB(r2) ldr r2, [r2] -#endif #ifdef DIAGNOSTIC teq r2, #0x00000000 @@ -343,17 +286,8 @@ ENTRY(suswintr) mvnne r0, #0x00000000 RETne -#ifdef MULTIPROCESSOR - stmfd sp!, {r0, r1, r14} - bl _C_LABEL(cpu_number) - ldr r2, .Lcpu_info - ldr r2, [r2, r0, lsl #2] - ldr r2, [r2, #CI_CURPCB] - ldmfd sp!, {r0, r1, r14} -#else - ldr r2, .Lcurpcb + GET_PCB(r2) ldr r2, [r2] -#endif #ifdef DIAGNOSTIC teq r2, #0x00000000 @@ -382,17 +316,8 @@ ENTRY(suswintr) */ ENTRY(susword) -#ifdef MULTIPROCESSOR - stmfd sp!, {r0, r1, r14} - bl _C_LABEL(cpu_number) - ldr r2, .Lcpu_info - ldr r2, [r2, r0, lsl #2] - ldr r2, [r2, #CI_CURPCB] - ldmfd sp!, {r0, r1, r14} -#else - ldr r2, .Lcurpcb + GET_PCB(r2) ldr r2, [r2] -#endif #ifdef DIAGNOSTIC teq r2, #0x00000000 @@ -421,17 +346,8 @@ ENTRY(susword) */ ENTRY(subyte) -#ifdef MULTIPROCESSOR - stmfd sp!, {r0, r1, r14} - bl _C_LABEL(cpu_number) - ldr r2, .Lcpu_info - ldr r2, [r2, r0, lsl #2] - ldr r2, [r2, #CI_CURPCB] - ldmfd sp!, {r0, r1, r14} -#else - ldr r2, .Lcurpcb + GET_PCB(r2) ldr r2, [r2] -#endif #ifdef DIAGNOSTIC Modified: projects/armv6/sys/arm/arm/machdep.c ============================================================================== --- projects/armv6/sys/arm/arm/machdep.c Wed Dec 28 13:01:12 2011 (r228927) +++ projects/armv6/sys/arm/arm/machdep.c Wed Dec 28 14:48:33 2011 (r228928) @@ -717,6 +717,7 @@ void pcpu0_init(void) { + set_pcpu(pcpup); pcpu_init(pcpup, 0, sizeof(struct pcpu)); PCPU_SET(curthread, &thread0); } Modified: projects/armv6/sys/arm/arm/swtch.S ============================================================================== --- projects/armv6/sys/arm/arm/swtch.S Wed Dec 28 13:01:12 2011 (r228927) +++ projects/armv6/sys/arm/arm/swtch.S Wed Dec 28 14:48:33 2011 (r228928) @@ -92,41 +92,21 @@ __FBSDID("$FreeBSD$"); */ #define DOMAIN_CLIENT 0x01 -#define IRQdisable \ - mrs r14, cpsr ; \ - orr r14, r14, #(I32_bit) ; \ - msr cpsr_c, r14 ; \ - -#define IRQenable \ - mrs r14, cpsr ; \ - bic r14, r14, #(I32_bit) ; \ - msr cpsr_c, r14 ; \ - -/* - * These are used for switching the translation table/DACR. - * Since the vector page can be invalid for a short time, we must - * disable both regular IRQs *and* FIQs. - * - * XXX: This is not necessary if the vector table is relocated. - */ -#define IRQdisableALL \ - mrs r14, cpsr ; \ - orr r14, r14, #(I32_bit | F32_bit) ; \ - msr cpsr_c, r14 - -#define IRQenableALL \ - mrs r14, cpsr ; \ - bic r14, r14, #(I32_bit | F32_bit) ; \ - msr cpsr_c, r14 - + +#ifdef _ARM_ARCH_6 +#define GET_PCB(tmp) \ + mrc p15, 0, tmp, c13, c0, 4; \ + add tmp, tmp, #(PC_CURPCB) +#else .Lcurpcb: .word _C_LABEL(__pcpu) + PC_CURPCB + +#define GET_PCB(tmp) \ + ldr tmp, .Lcurpcb +#endif + .Lcpufuncs: .word _C_LABEL(cpufuncs) -.Lblock_userspace_access: - .word _C_LABEL(block_userspace_access) -.Lcpu_do_powersave: - .word _C_LABEL(cpu_do_powersave) .Lblocked_lock: .word _C_LABEL(blocked_lock) ENTRY(cpu_throw) @@ -202,7 +182,7 @@ ENTRY(cpu_throw) #endif /* We have a new curthread now so make a note it */ - ldr r6, .Lcurthread + GET_CURTHREAD_PTR(r6) str r5, [r6] /* Set the new tp */ @@ -215,7 +195,7 @@ ENTRY(cpu_throw) str r6, [r4, #8] /* ARM_RAS_END */ /* Hook in a new pcb */ - ldr r6, .Lcurpcb + GET_PCB(r6) str r7, [r6] ldmfd sp!, {r4-r7, pc} @@ -228,20 +208,13 @@ ENTRY(cpu_switch) /* rem: r0 = old lwp */ /* rem: interrupts are disabled */ -#ifdef MULTIPROCESSOR - /* XXX use curcpu() */ - ldr r2, .Lcpu_info_store - str r2, [r6, #(L_CPU)] -#endif - /* Process is now on a processor. */ - /* We have a new curthread now so make a note it */ - ldr r7, .Lcurthread + GET_CURTHREAD_PTR(r7) str r1, [r7] /* Hook in a new pcb */ - ldr r7, .Lcurpcb + GET_PCB(r7) ldr r2, [r1, #TD_PCB] str r2, [r7] @@ -414,7 +387,7 @@ ENTRY(cpu_switch) /* Release the old thread */ str r6, [r4, #TD_LOCK] ldr r6, .Lblocked_lock - ldr r3, .Lcurthread + GET_CURTHREAD_PTR(r3) ldr r3, [r3] 1: @@ -452,15 +425,6 @@ ENTRY(cpu_switch) ldr r13, [r7, #(PCB_SP)] #endif - /* rem: r6 = lock */ - /* rem: r7 = new pcb */ - -#ifdef ARMFPE - add r0, r7, #(USER_SIZE) & 0x00ff - add r0, r0, #(USER_SIZE) & 0xff00 - bl _C_LABEL(arm_fpe_core_changecontext) -#endif - /* rem: r5 = new lwp's proc */ /* rem: r6 = lock */ /* rem: r7 = new PCB */ Modified: projects/armv6/sys/arm/include/asmacros.h ============================================================================== --- projects/armv6/sys/arm/include/asmacros.h Wed Dec 28 13:01:12 2011 (r228927) +++ projects/armv6/sys/arm/include/asmacros.h Wed Dec 28 14:48:33 2011 (r228928) @@ -43,6 +43,7 @@ #ifdef _KERNEL #ifdef LOCORE +#include "opt_global.h" /* * ASM macros for pushing and pulling trapframes from the stack @@ -155,9 +156,20 @@ .type name, %object ; \ name: -#define EMPTY +#ifdef _ARM_ARCH_6 +#define AST_LOCALS +#define GET_CURTHREAD_PTR(tmp) \ + mrc p15, 0, tmp, c13, c0, 4; \ + add tmp, tmp, #(PC_CURTHREAD) +#else +#define AST_LOCALS ;\ +.Lcurthread: ;\ + .word _C_LABEL(__pcpu) + PC_CURTHREAD + +#define GET_CURTHREAD_PTR(tmp) \ + ldr tmp, .Lcurthread +#endif - #define DO_AST \ ldr r0, [sp] /* Get the SPSR from stack */ ;\ mrs r4, cpsr /* save CPSR */ ;\ @@ -167,7 +179,7 @@ name: teq r0, #(PSR_USR32_MODE) ;\ bne 2f /* Nope, get out now */ ;\ bic r4, r4, #(I32_bit|F32_bit) ;\ -1: ldr r5, .Lcurthread ;\ +1: GET_CURTHREAD_PTR(r5) ;\ ldr r5, [r5] ;\ ldr r1, [r5, #(TD_FLAGS)] ;\ and r1, r1, #(TDF_ASTPENDING|TDF_NEEDRESCHED) ;\ @@ -181,11 +193,6 @@ name: b 1b ;\ 2: - -#define AST_LOCALS ;\ -.Lcurthread: ;\ - .word _C_LABEL(__pcpu) + PC_CURTHREAD - #endif /* LOCORE */ #endif /* _KERNEL */ Modified: projects/armv6/sys/arm/include/cpufunc.h ============================================================================== --- projects/armv6/sys/arm/include/cpufunc.h Wed Dec 28 13:01:12 2011 (r228927) +++ projects/armv6/sys/arm/include/cpufunc.h Wed Dec 28 14:48:33 2011 (r228928) @@ -474,6 +474,11 @@ void pj4bv7_setup (char *string); void pj4bv6_setup (char *string); void pj4b_config (void); +int get_core_id (void); +void set_pcpu (void *); +void set_tls (void *); +void *get_tls (void); + void armadaxp_idcache_wbinv_all (void); void cortexa_setup (char *);