Loading arch/arc/Kconfig +7 −0 Original line number Diff line number Diff line Loading @@ -264,6 +264,13 @@ config LINUX_LINK_BASE endmenu # "Platform Board Configuration" config ARC_CURR_IN_REG bool "Dedicate Register r25 for current_task pointer" default y help This reserved Register R25 to point to Current Task in kernel mode. This saves memory access for each such access config ARC_STACK_NONEXEC bool "Make stack non-executable" default n Loading arch/arc/Makefile +9 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,15 @@ export PLATFORM cflags-y += -Iarch/arc/plat-$(PLATFORM)/include cflags-y += -mA7 -fno-common -pipe -fno-builtin -D__linux__ ifdef CONFIG_ARC_CURR_IN_REG # For a global register defintion, make sure it gets passed to every file # We had a customer reported bug where some code built in kernel was NOT using # any kernel headers, and missing the r25 global register # Can't do unconditionally (like above) because of recursive include issues # due to <linux/thread_info.h> LINUXINCLUDE += -include ${src}/arch/arc/include/asm/current.h endif atleast_gcc44 := $(call cc-ifversion, -gt, 0402, y) cflags-$(atleast_gcc44) += -fsection-anchors Loading arch/arc/include/asm/Kbuild +0 −1 Original line number Diff line number Diff line Loading @@ -11,7 +11,6 @@ generic-y += bugs.h generic-y += bitsperlong.h generic-y += clkdev.h generic-y += cputime.h generic-y += current.h generic-y += device.h generic-y += div64.h generic-y += emergency-restart.h Loading arch/arc/include/asm/current.h 0 → 100644 +32 −0 Original line number Diff line number Diff line /* * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Vineetg: May 16th, 2008 * - Current macro is now implemented as "global register" r25 */ #ifndef _ASM_ARC_CURRENT_H #define _ASM_ARC_CURRENT_H #ifdef __KERNEL__ #ifndef __ASSEMBLY__ #ifdef CONFIG_ARC_CURR_IN_REG register struct task_struct *curr_arc asm("r25"); #define current (curr_arc) #else #include <asm-generic/current.h> #endif /* ! CONFIG_ARC_CURR_IN_REG */ #endif /* ! __ASSEMBLY__ */ #endif /* __KERNEL__ */ #endif /* _ASM_ARC_CURRENT_H */ arch/arc/include/asm/entry.h +45 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,8 @@ * was being "CLEARED" rather then "SET". Actually "SET" clears ZOL context * * Vineetg: May 5th 2008 * -Modified CALLEE_REG save/restore macros to handle the fact that * r25 contains the kernel current task ptr * - Defined Stack Switching Macro to be reused in all intr/excp hdlrs * - Shaved off 11 instructions from RESTORE_ALL_INT1 by using the * address Write back load ld.ab instead of seperate ld/add instn Loading @@ -28,6 +30,7 @@ #include <asm/asm-offsets.h> #include <asm/arcregs.h> #include <asm/ptrace.h> #include <asm/processor.h> /* For VMALLOC_START */ #include <asm/thread_info.h> /* For THREAD_SIZE */ /* Note on the LD/ST addr modes with addr reg wback Loading Loading @@ -106,7 +109,14 @@ st.a r22, [sp, -4] st.a r23, [sp, -4] st.a r24, [sp, -4] #ifdef CONFIG_ARC_CURR_IN_REG ; Retrieve orig r25 and save it on stack ld r12, [r25, TASK_THREAD + THREAD_USER_R25] st.a r12, [sp, -4] #else st.a r25, [sp, -4] #endif /* move up by 1 word to "create" callee_regs->"stack_place_holder" */ sub sp, sp, 4 Loading @@ -131,8 +141,12 @@ st.a r22, [sp, -4] st.a r23, [sp, -4] st.a r24, [sp, -4] #ifdef CONFIG_ARC_CURR_IN_REG sub sp, sp, 8 #else st.a r25, [sp, -4] sub sp, sp, 4 #endif .endm /*-------------------------------------------------------------- Loading @@ -148,8 +162,14 @@ *-------------------------------------------------------------*/ .macro RESTORE_CALLEE_SAVED_KERNEL #ifdef CONFIG_ARC_CURR_IN_REG add sp, sp, 8 /* skip callee_reg gutter and user r25 placeholder */ #else add sp, sp, 4 /* skip "callee_regs->stack_place_holder" */ ld.ab r25, [sp, 4] #endif ld.ab r24, [sp, 4] ld.ab r23, [sp, 4] ld.ab r22, [sp, 4] Loading Loading @@ -235,6 +255,7 @@ * * Entry : r9 contains pre-IRQ/exception/trap status32 * Exit : SP is set to kernel mode stack pointer * If CURR_IN_REG, r25 set to "current" task pointer * Clobbers: r9 *-------------------------------------------------------------*/ Loading @@ -259,6 +280,16 @@ GET_CURR_TASK_ON_CPU r9 #ifdef CONFIG_ARC_CURR_IN_REG /* If current task pointer cached in r25, time to * -safekeep USER r25 in task->thread_struct->user_r25 * -load r25 with current task ptr */ st.as r25, [r9, (TASK_THREAD + THREAD_USER_R25)/4] mov r25, r9 #endif /* With current tsk in r9, get it's kernel mode stack base */ GET_TSK_STACK_BASE r9, r9 Loading Loading @@ -519,17 +550,31 @@ .macro SET_CURR_TASK_ON_CPU tsk, tmp st \tsk, [@_current_task] #ifdef CONFIG_ARC_CURR_IN_REG mov r25, \tsk #endif .endm /* ------------------------------------------------------------------ * Get the ptr to some field of Current Task at @off in task struct * -Uses r25 for Current task ptr if that is enabled */ #ifdef CONFIG_ARC_CURR_IN_REG .macro GET_CURR_TASK_FIELD_PTR off, reg add \reg, r25, \off .endm #else .macro GET_CURR_TASK_FIELD_PTR off, reg GET_CURR_TASK_ON_CPU \reg add \reg, \reg, \off .endm #endif /* CONFIG_ARC_CURR_IN_REG */ #endif /* __ASSEMBLY__ */ #endif /* __ASM_ARC_ENTRY_H */ Loading
arch/arc/Kconfig +7 −0 Original line number Diff line number Diff line Loading @@ -264,6 +264,13 @@ config LINUX_LINK_BASE endmenu # "Platform Board Configuration" config ARC_CURR_IN_REG bool "Dedicate Register r25 for current_task pointer" default y help This reserved Register R25 to point to Current Task in kernel mode. This saves memory access for each such access config ARC_STACK_NONEXEC bool "Make stack non-executable" default n Loading
arch/arc/Makefile +9 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,15 @@ export PLATFORM cflags-y += -Iarch/arc/plat-$(PLATFORM)/include cflags-y += -mA7 -fno-common -pipe -fno-builtin -D__linux__ ifdef CONFIG_ARC_CURR_IN_REG # For a global register defintion, make sure it gets passed to every file # We had a customer reported bug where some code built in kernel was NOT using # any kernel headers, and missing the r25 global register # Can't do unconditionally (like above) because of recursive include issues # due to <linux/thread_info.h> LINUXINCLUDE += -include ${src}/arch/arc/include/asm/current.h endif atleast_gcc44 := $(call cc-ifversion, -gt, 0402, y) cflags-$(atleast_gcc44) += -fsection-anchors Loading
arch/arc/include/asm/Kbuild +0 −1 Original line number Diff line number Diff line Loading @@ -11,7 +11,6 @@ generic-y += bugs.h generic-y += bitsperlong.h generic-y += clkdev.h generic-y += cputime.h generic-y += current.h generic-y += device.h generic-y += div64.h generic-y += emergency-restart.h Loading
arch/arc/include/asm/current.h 0 → 100644 +32 −0 Original line number Diff line number Diff line /* * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Vineetg: May 16th, 2008 * - Current macro is now implemented as "global register" r25 */ #ifndef _ASM_ARC_CURRENT_H #define _ASM_ARC_CURRENT_H #ifdef __KERNEL__ #ifndef __ASSEMBLY__ #ifdef CONFIG_ARC_CURR_IN_REG register struct task_struct *curr_arc asm("r25"); #define current (curr_arc) #else #include <asm-generic/current.h> #endif /* ! CONFIG_ARC_CURR_IN_REG */ #endif /* ! __ASSEMBLY__ */ #endif /* __KERNEL__ */ #endif /* _ASM_ARC_CURRENT_H */
arch/arc/include/asm/entry.h +45 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,8 @@ * was being "CLEARED" rather then "SET". Actually "SET" clears ZOL context * * Vineetg: May 5th 2008 * -Modified CALLEE_REG save/restore macros to handle the fact that * r25 contains the kernel current task ptr * - Defined Stack Switching Macro to be reused in all intr/excp hdlrs * - Shaved off 11 instructions from RESTORE_ALL_INT1 by using the * address Write back load ld.ab instead of seperate ld/add instn Loading @@ -28,6 +30,7 @@ #include <asm/asm-offsets.h> #include <asm/arcregs.h> #include <asm/ptrace.h> #include <asm/processor.h> /* For VMALLOC_START */ #include <asm/thread_info.h> /* For THREAD_SIZE */ /* Note on the LD/ST addr modes with addr reg wback Loading Loading @@ -106,7 +109,14 @@ st.a r22, [sp, -4] st.a r23, [sp, -4] st.a r24, [sp, -4] #ifdef CONFIG_ARC_CURR_IN_REG ; Retrieve orig r25 and save it on stack ld r12, [r25, TASK_THREAD + THREAD_USER_R25] st.a r12, [sp, -4] #else st.a r25, [sp, -4] #endif /* move up by 1 word to "create" callee_regs->"stack_place_holder" */ sub sp, sp, 4 Loading @@ -131,8 +141,12 @@ st.a r22, [sp, -4] st.a r23, [sp, -4] st.a r24, [sp, -4] #ifdef CONFIG_ARC_CURR_IN_REG sub sp, sp, 8 #else st.a r25, [sp, -4] sub sp, sp, 4 #endif .endm /*-------------------------------------------------------------- Loading @@ -148,8 +162,14 @@ *-------------------------------------------------------------*/ .macro RESTORE_CALLEE_SAVED_KERNEL #ifdef CONFIG_ARC_CURR_IN_REG add sp, sp, 8 /* skip callee_reg gutter and user r25 placeholder */ #else add sp, sp, 4 /* skip "callee_regs->stack_place_holder" */ ld.ab r25, [sp, 4] #endif ld.ab r24, [sp, 4] ld.ab r23, [sp, 4] ld.ab r22, [sp, 4] Loading Loading @@ -235,6 +255,7 @@ * * Entry : r9 contains pre-IRQ/exception/trap status32 * Exit : SP is set to kernel mode stack pointer * If CURR_IN_REG, r25 set to "current" task pointer * Clobbers: r9 *-------------------------------------------------------------*/ Loading @@ -259,6 +280,16 @@ GET_CURR_TASK_ON_CPU r9 #ifdef CONFIG_ARC_CURR_IN_REG /* If current task pointer cached in r25, time to * -safekeep USER r25 in task->thread_struct->user_r25 * -load r25 with current task ptr */ st.as r25, [r9, (TASK_THREAD + THREAD_USER_R25)/4] mov r25, r9 #endif /* With current tsk in r9, get it's kernel mode stack base */ GET_TSK_STACK_BASE r9, r9 Loading Loading @@ -519,17 +550,31 @@ .macro SET_CURR_TASK_ON_CPU tsk, tmp st \tsk, [@_current_task] #ifdef CONFIG_ARC_CURR_IN_REG mov r25, \tsk #endif .endm /* ------------------------------------------------------------------ * Get the ptr to some field of Current Task at @off in task struct * -Uses r25 for Current task ptr if that is enabled */ #ifdef CONFIG_ARC_CURR_IN_REG .macro GET_CURR_TASK_FIELD_PTR off, reg add \reg, r25, \off .endm #else .macro GET_CURR_TASK_FIELD_PTR off, reg GET_CURR_TASK_ON_CPU \reg add \reg, \reg, \off .endm #endif /* CONFIG_ARC_CURR_IN_REG */ #endif /* __ASSEMBLY__ */ #endif /* __ASM_ARC_ENTRY_H */